diff --git a/pkg/compute/regiondrivers/aws.go b/pkg/compute/regiondrivers/aws.go index a4d42f6674..42b36b6512 100644 --- a/pkg/compute/regiondrivers/aws.go +++ b/pkg/compute/regiondrivers/aws.go @@ -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) + } } } diff --git a/pkg/multicloud/aliyun/loadbalancerhttpslistener.go b/pkg/multicloud/aliyun/loadbalancerhttpslistener.go index 51e0641d6a..b665f05066 100644 --- a/pkg/multicloud/aliyun/loadbalancerhttpslistener.go +++ b/pkg/multicloud/aliyun/loadbalancerhttpslistener.go @@ -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