vpcs: add ExternalAccessMode field

This commit is contained in:
Yousong Zhou
2020-05-28 15:39:06 +08:00
parent 30844db326
commit eebd15e0d5
4 changed files with 74 additions and 8 deletions
+13
View File
@@ -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 {
+14
View File
@@ -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
+2
View File
@@ -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.
+45 -8
View File
@@ -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