Merge pull request #5763 from tb365/automated-cherry-pick-of-#5759-upstream-release-3.1

Automated cherry pick of #5759: aws elb bugfix
This commit is contained in:
Zexi Li
2020-04-13 11:27:46 +08:00
committed by GitHub
2 changed files with 48 additions and 2 deletions
+40 -2
View File
@@ -38,6 +38,7 @@ import (
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/choices"
"yunion.io/x/onecloud/pkg/util/rand"
"yunion.io/x/onecloud/pkg/util/rbacutils"
)
type SAwsRegionDriver struct {
@@ -53,6 +54,20 @@ func (self *SAwsRegionDriver) GetProvider() string {
return api.CLOUD_PROVIDER_AWS
}
func networkCheck(network *models.SNetwork) error {
total := network.GetPorts()
used, err := network.GetTotalNicCount()
if err != nil {
return errors.Wrap(err, "validateAwsLbNetwork.GetTotalNicCount")
}
if (total - used) < 8 {
return fmt.Errorf("network %s free ip is less than 8", network.GetId())
}
return nil
}
func validateAwsLbNetwork(ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict, requiredMin int) (*jsonutils.JSONDict, error) {
var networkIds []string
if ns, err := data.GetString("network"); err != nil {
@@ -74,22 +89,45 @@ func validateAwsLbNetwork(ownerId mcclient.IIdentityProvider, data *jsonutils.JS
}
network := networkV.Model.(*models.SNetwork)
err := networkCheck(network)
if err != nil {
return nil, errors.Wrap(err, "validateAwsLbNetwork.networkCheck")
}
region, zone, vpc, _, err := network.ValidateElbNetwork(nil)
if err != nil {
return nil, err
} else {
//随机选择一个子网
if requiredMin == 2 && len(networkIds) == 1 {
var nets []models.SNetwork
wires := models.WireManager.Query().SubQuery()
q := models.NetworkManager.Query().IsFalse("pending_deleted")
q = models.NetworkManager.FilterByOwner(q, network.GetOwnerId(), rbacutils.ScopeProject)
q = q.Join(wires, sqlchemy.Equals(q.Field("wire_id"), wires.Field("id")))
q = q.Filter(sqlchemy.Equals(wires.Field("vpc_id"), vpc.GetId()))
q = q.Filter(sqlchemy.NotEquals(wires.Field("zone_id"), zone.GetId()))
q = q.Equals("project_id", network.ProjectId)
err := q.First(secondNet)
err := q.All(&nets)
if err != nil {
return nil, httperrors.NewInputParameterError("required at least %d subnet.", requiredMin)
}
secondNetFound := false
for i := range nets {
net := nets[i]
err := networkCheck(&net)
if err != nil {
continue
}
secondNet = &net
secondNetFound = true
break
}
if !secondNetFound {
return nil, httperrors.NewInputParameterError("required at least %d subnet with at least 8 free ip.", requiredMin)
}
}
}
@@ -282,7 +282,15 @@ func (region *SRegion) constructHTTPCreateListenerParams(params map[string]strin
}
params["HealthCheckTimeout"] = fmt.Sprintf("%d", listener.HealthCheckTimeout)
}
if listener.ClientRequestTimeout < 1 || listener.ClientRequestTimeout > 180 {
listener.ClientRequestTimeout = 60
}
params["RequestTimeout"] = fmt.Sprintf("%d", listener.ClientRequestTimeout)
if listener.ClientIdleTimeout < 1 || listener.ClientIdleTimeout > 60 {
listener.ClientIdleTimeout = 15
}
params["IdleTimeout"] = fmt.Sprintf("%d", listener.ClientIdleTimeout)
params["StickySession"] = listener.StickySession