From d4e168e72c741121dda015c1b9323f5e45f6e45c Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 12 Nov 2019 19:55:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E6=8C=87=E5=AE=9A=E5=A4=9A=E4=B8=AA=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/schemas/instance.yaml | 7 +++++ pkg/apis/compute/api.go | 1 + pkg/cloudcommon/cmdline/helper.go | 1 + pkg/compute/guestdrivers/managedvirtual.go | 4 +++ pkg/compute/models/guests.go | 33 +++++++++++++++++++++- pkg/mcclient/options/servers.go | 2 ++ 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/docs/schemas/instance.yaml b/docs/schemas/instance.yaml index f02c7ac876..c0cdca3c72 100644 --- a/docs/schemas/instance.yaml +++ b/docs/schemas/instance.yaml @@ -666,6 +666,13 @@ InstanceCreate: items: type: string description: 主机组的ID或者Name + secgroups: + type: array + description: 安全组列表 + items: + type: string + example: default + description: 安全组名称或ID,建议使用ID InstanceDisk: diff --git a/pkg/apis/compute/api.go b/pkg/apis/compute/api.go index c421a670d7..7ff0986e26 100644 --- a/pkg/apis/compute/api.go +++ b/pkg/apis/compute/api.go @@ -188,6 +188,7 @@ type ServerCreateInput struct { EipChargeType string `json:"eip_charge_type,omitempty"` Eip string `json:"eip,omitempty"` InstanceSnapshotId string `json:"instance_snapshot_id,omitempty"` + Secgroups []string `json:"secgroups"` OsType string `json:"os_type"` // Fill by server diff --git a/pkg/cloudcommon/cmdline/helper.go b/pkg/cloudcommon/cmdline/helper.go index df010a1f39..666ed74cda 100644 --- a/pkg/cloudcommon/cmdline/helper.go +++ b/pkg/cloudcommon/cmdline/helper.go @@ -401,6 +401,7 @@ func FetchServerCreateInputByJSON(obj jsonutils.JSONObject) (*compute.ServerCrea if secgroup := jsonutils.GetAnyString(obj, []string{"secgroup", "secgroup_id", "secgrp_id"}); len(secgroup) != 0 { input.SecgroupId = secgroup } + input.Secgroups, _ = jsonutils.GetStringArray(obj, "secgroups") return input, nil } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 916e7e14ed..24e3737755 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -398,6 +398,10 @@ func (self *SManagedVirtualizedGuestDriver) RemoteDeployGuestForCreate(ctx conte return nil, err } db.SetExternalId(guest, userCred, iVM.GetGlobalId()) + err = iVM.SetSecurityGroups(desc.ExternalSecgroupIds) + if err != nil { + log.Errorf("failed to set multi secgroup for instance %s error: %v", guest.Name, err) + } if hostId := iVM.GetIHostId(); len(hostId) > 0 { host, err := db.FetchByExternalId(models.HostManager, hostId) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index e9f0911a9b..7e0412ebb3 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1186,7 +1186,20 @@ func (manager *SGuestManager) validateCreateData( input.KeypairId = keypairObj.GetId() } - if input.SecgroupId != "" { + secGrpIds := []string{} + for _, secgroup := range input.Secgroups { + secGrpObj, err := SecurityGroupManager.FetchByIdOrName(userCred, secgroup) + if err != nil { + return nil, httperrors.NewResourceNotFoundError("Secgroup %s not found", secgroup) + } + if !utils.IsInStringArray(secGrpObj.GetId(), secGrpIds) { + secGrpIds = append(secGrpIds, secGrpObj.GetId()) + } + } + if len(secGrpIds) > 0 { + input.SecgroupId = secGrpIds[0] + input.Secgroups = secGrpIds[1:] + } else if input.SecgroupId != "" { secGrpId := input.SecgroupId secGrpObj, err := SecurityGroupManager.FetchByIdOrName(userCred, secGrpId) if err != nil { @@ -1197,6 +1210,13 @@ func (manager *SGuestManager) validateCreateData( input.SecgroupId = "default" } + maxSecgrpCount := GetDriver(hypervisor).GetMaxSecurityGroupCount() + if maxSecgrpCount == 0 { //esxi 不支持安全组 + input.Secgroups = []string{} + } else if len(input.Secgroups)+1 > maxSecgrpCount { + return nil, httperrors.NewInputParameterError("%s shall bind up to %d security groups", hypervisor, maxSecgrpCount) + } + preferRegionId, _ := data.GetString("prefer_region_id") if err := manager.validateEip(userCred, input, preferRegionId); err != nil { return nil, err @@ -1419,6 +1439,12 @@ func (guest *SGuest) PostCreate(ctx context.Context, userCred mcclient.TokenCred if len(userData) > 0 { guest.setUserData(ctx, userCred, userData) } + secgroups, _ := jsonutils.GetStringArray(data, "secgroups") + for _, secgroup := range secgroups { + gs := SGuestsecgroup{SecgroupId: secgroup} + gs.GuestId = guest.Id + GuestsecgroupManager.TableSpec().Insert(&gs) + } } func (guest *SGuest) setApptags(ctx context.Context, appTags []string, userCred mcclient.TokenCredential) { @@ -4553,6 +4579,11 @@ func (self *SGuest) ToCreateInput(userCred mcclient.TokenCredential) *api.Server userInput.EipBw = genInput.EipBw userInput.EipChargeType = genInput.EipChargeType userInput.Project = genInput.Project + userInput.Secgroups = []string{} + secgroups := self.GetSecgroups() + for _, secgroup := range secgroups { + userInput.Secgroups = append(userInput.Secgroups, secgroup.Id) + } if genInput.ResourceType != "" { userInput.ResourceType = genInput.ResourceType } diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index a4f1a2a359..3553a8552d 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -272,6 +272,7 @@ type ServerCreateOptions struct { DryRun *bool `help:"Dry run to test scheduler" json:"-"` UserDataFile string `help:"user_data file path" json:"-"` InstanceSnapshot string `help:"instance snapshot" json:"instance_snapshot"` + Secgroups []string `help:"secgroups" json:"secgroups"` OsType string `help:"os type, e.g. Linux, Windows, etc."` @@ -366,6 +367,7 @@ func (opts *ServerCreateOptions) Params() (*computeapi.ServerCreateInput, error) EnableCloudInit: opts.EnableCloudInit, OsType: opts.OsType, GuestImageID: opts.GuestImageID, + Secgroups: opts.Secgroups, } if opts.GenerateName {