From eebd15e0d57b5233e38650a05ab04e93c2521702 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Fri, 15 May 2020 11:57:19 +0800 Subject: [PATCH] vpcs: add ExternalAccessMode field --- pkg/apis/compute/vpc.go | 13 +++++++ pkg/apis/compute/vpcs_ovn.go | 14 +++++++ pkg/apis/compute/zz_generated.model.go | 2 + pkg/compute/models/vpcs.go | 53 ++++++++++++++++++++++---- 4 files changed, 74 insertions(+), 8 deletions(-) diff --git a/pkg/apis/compute/vpc.go b/pkg/apis/compute/vpc.go index 01ddb517d2..b5bfbc5ad1 100644 --- a/pkg/apis/compute/vpc.go +++ b/pkg/apis/compute/vpc.go @@ -72,6 +72,16 @@ type VpcCreateInput struct { // CIDR_BLOCK CidrBlock string `json:"cidr_block"` + + // Vpc外网访问模式 + ExternalAccessMode string `json:"external_access_mode"` +} + +type VpcUpdateInput struct { + apis.EnabledStatusInfrasResourceBaseUpdateInput + + // Vpc外网访问模式 + ExternalAccessMode string `json:"external_access_mode"` } type VpcResourceInput struct { @@ -81,6 +91,9 @@ type VpcResourceInput struct { // Deprecated // filter by vpc Id VpcId string `json:"vpc_id" "yunion:deprecated-by":"vpc"` + + // Vpc外网访问模式 + ExternalAccessMode string `json:"external_access_mode"` } type VpcFilterListInputBase struct { diff --git a/pkg/apis/compute/vpcs_ovn.go b/pkg/apis/compute/vpcs_ovn.go index cce32183f2..27b4dae864 100644 --- a/pkg/apis/compute/vpcs_ovn.go +++ b/pkg/apis/compute/vpcs_ovn.go @@ -4,6 +4,20 @@ import ( "yunion.io/x/pkg/util/netutils" ) +const ( + VPC_EXTERNAL_ACCESS_MODE_DISTGW = "distgw" // distgw only + VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW = "eip-distgw" // eip when available, distgw otherwise + VPC_EXTERNAL_ACCESS_MODE_EIP = "eip" // eip only +) + +var ( + VPC_EXTERNAL_ACCESS_MODES = []string{ + VPC_EXTERNAL_ACCESS_MODE_DISTGW, + VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW, + VPC_EXTERNAL_ACCESS_MODE_EIP, + } +) + const ( sVpcMappedCidr = "100.64.0.0/17" VpcMappedIPMask = 17 diff --git a/pkg/apis/compute/zz_generated.model.go b/pkg/apis/compute/zz_generated.model.go index 7605795707..5404952863 100644 --- a/pkg/apis/compute/zz_generated.model.go +++ b/pkg/apis/compute/zz_generated.model.go @@ -2071,6 +2071,8 @@ type SVpc struct { // CIDR地址段 // example: 192.168.222.0/24 CidrBlock string `json:"cidr_block"` + // Vpc外网访问模式 + ExternalAccessMode string `json:"external_access_mode"` } // SVpcResourceBase is an autogenerated struct via yunion.io/x/onecloud/pkg/compute/models.SVpcResourceBase. diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 9a1a409bb1..c811740ba6 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -25,6 +25,7 @@ import ( "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/compare" "yunion.io/x/pkg/util/netutils" + "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/apis" @@ -80,11 +81,8 @@ type SVpc struct { // example: 192.168.222.0/24 CidrBlock string `charset:"ascii" nullable:"true" list:"domain" create:"domain_required"` - // 区域Id - // CloudregionId string `width:"36" charset:"ascii" nullable:"false" list:"domain" create:"domain_required" default:"default"` - - // 全局VPC Id - // GlobalvpcId string `width:"36" charset:"ascii" list:"user" json:"globalvpc_id"` + // Vpc外网访问模式 + ExternalAccessMode string `width:"16" charset:"ascii" nullable:"true" list:"user" update:"user" create:"optional"` } func (manager *SVpcManager) GetContextManagers() [][]db.IModelManager { @@ -127,6 +125,19 @@ func (self *SVpc) GetNatgateways() ([]SNatGateway, error) { return nats, nil } +func (self *SVpc) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.VpcUpdateInput) (api.VpcUpdateInput, error) { + if input.ExternalAccessMode != "" { + if !utils.IsInStringArray(input.ExternalAccessMode, api.VPC_EXTERNAL_ACCESS_MODES) { + return input, httperrors.NewInputParameterError("invalid external_access_mode %q, want %s", + input.ExternalAccessMode, api.VPC_EXTERNAL_ACCESS_MODES) + } + } + if _, err := self.SEnabledStatusInfrasResourceBase.ValidateUpdateData(ctx, userCred, query, input.EnabledStatusInfrasResourceBaseUpdateInput); err != nil { + return input, err + } + return input, nil +} + func (self *SVpc) ValidateDeleteCondition(ctx context.Context) error { cnt, err := self.GetNetworkCount() if err != nil { @@ -561,8 +572,7 @@ func (self *SVpc) markAllNetworksUnknown(userCred mcclient.TokenCredential) erro } func (manager *SVpcManager) InitializeData() error { - vpcObj, err := manager.FetchById(api.DEFAULT_VPC_ID) - if err != nil { + if vpcObj, err := manager.FetchById(api.DEFAULT_VPC_ID); err != nil { if err == sql.ErrNoRows { defVpc := SVpc{} defVpc.SetModelManager(VpcManager, &defVpc) @@ -594,6 +604,27 @@ func (manager *SVpcManager) InitializeData() error { return err } } + + { // initialize default external_access_mode for onecloud vpc + var vpcs []SVpc + q := manager.Query(). + IsNullOrEmpty("manager_id"). + IsNullOrEmpty("external_id"). + IsNullOrEmpty("external_access_mode") + if err := db.FetchModelObjects(manager, q, &vpcs); err != nil { + return errors.Wrap(err, "fetch onecloud vpc with external_access_mode not set") + } + for i := range vpcs { + vpc := &vpcs[i] + if _, err := db.Update(vpc, func() error { + vpc.ExternalAccessMode = api.VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW + return nil + }); err != nil { + return errors.Wrap(err, "db set default external_access_mode") + } + } + } + return nil } @@ -635,8 +666,14 @@ func (manager *SVpcManager) ValidateCreateData( input.Cloudprovider = managerObj.GetId() // data.Add(jsonutils.NewString(managerObj.GetId()), "manager_id") } else { - // data.Set("status", jsonutils.NewString(api.VPC_STATUS_AVAILABLE)) input.Status = api.VPC_STATUS_AVAILABLE + if input.ExternalAccessMode == "" { + input.ExternalAccessMode = api.VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW + } + if !utils.IsInStringArray(input.ExternalAccessMode, api.VPC_EXTERNAL_ACCESS_MODES) { + return input, httperrors.NewInputParameterError("invalid external_access_mode %q, want %s", + input.Status, api.VPC_EXTERNAL_ACCESS_MODES) + } } cidrBlock := input.CidrBlock