From aceb20bf79e3782c7178d0fb381862231586dcf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 12 Dec 2018 16:30:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=80=E6=AC=A1=E6=80=A7?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=A4=9A=E4=B8=AA=E5=AE=89=E5=85=A8=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guest_actions.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 19f0397e3e..8af1fb8dfa 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/onecloud/pkg/util/seclib2" "time" + "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/onecloud/pkg/util/billing" @@ -643,24 +644,30 @@ func (self *SGuest) PerformAddSecgroup(ctx context.Context, userCred mcclient.To return nil, httperrors.NewInputParameterError("Cannot assign security rules in status %s", self.Status) } - secgrpV := validators.NewModelIdOrNameValidator("secgrp", "secgroup", userCred.GetProjectId()) - if err := secgrpV.Validate(data.(*jsonutils.JSONDict)); err != nil { - return nil, err - } - maxCount := self.GetDriver().GetMaxSecurityGroupCount() if maxCount == 0 { return nil, httperrors.NewUnsupportOperationError("Cannot assign security group for this guest %s", self.Name) } + secgrps := []string{} + if err := data.Unmarshal(&secgrps, "secgrps"); err != nil { + return nil, httperrors.NewInputParameterError(err.Error()) + } + secgroups := self.GetSecgroups() - if len(secgroups) >= maxCount { + if len(secgroups)+len(secgrps) >= maxCount { return nil, httperrors.NewUnsupportOperationError("guest %s band to up to %d security groups", self.Name, maxCount) } - secgroup := secgrpV.Model.(*SSecurityGroup) - if _, err := GuestsecgroupManager.newGuestSecgroup(ctx, userCred, self, secgroup); err != nil { - return nil, httperrors.NewInputParameterError(err.Error()) + for _, _secgrp := range secgrps { + secgrp, err := SecurityGroupManager.FetchByIdOrName(userCred, _secgrp) + if err != nil { + return nil, httperrors.NewInputParameterError(err.Error()) + } + secgroup := secgrp.(*SSecurityGroup) + if _, err := GuestsecgroupManager.newGuestSecgroup(ctx, userCred, self, secgroup); err != nil { + return nil, httperrors.NewInputParameterError(err.Error()) + } } return nil, self.StartSyncTask(ctx, userCred, true, "") }