From f905e01012f52654ad9e97c0110c2d28e489a83a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 30 Nov 2018 20:22:17 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=90=8C=E4=B8=80?= =?UTF-8?q?=E4=B8=AAsecgroupcache=E9=9C=80=E8=A6=81=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/azure.go | 5 ++ pkg/compute/guestdrivers/managedvirtual.go | 5 ++ pkg/compute/guestdrivers/qcloud.go | 68 ++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index d9e7a702e3..e7938829ec 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -17,6 +17,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" ) @@ -322,6 +323,10 @@ func (self *SAzureGuestDriver) RequestSyncConfigOnHost(ctx context.Context, gues if err != nil { return nil, err } + + lockman.LockRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-%s", guest.SecgrpId, vpcID)) + defer lockman.ReleaseRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-%s", guest.SecgrpId, vpcID)) + secgroupCache := models.SecurityGroupCacheManager.Register(ctx, task.GetUserCred(), guest.SecgrpId, vpcID, host.GetRegion().Id, host.ManagerId) if secgroupCache == nil { return nil, fmt.Errorf("failed to registor secgroupCache for secgroup: %s vpc: %s", guest.SecgrpId, vpcID) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 5c28bb5240..c1b5849274 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -10,6 +10,7 @@ import ( "yunion.io/x/pkg/util/compare" "yunion.io/x/pkg/util/secrules" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" @@ -349,6 +350,10 @@ func (self *SManagedVirtualizedGuestDriver) RequestSyncConfigOnHost(ctx context. if err != nil { return nil, err } + + lockman.LockRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-%s", guest.SecgrpId, vpcId)) + defer lockman.ReleaseRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-%s", guest.SecgrpId, vpcId)) + secgroupCache := models.SecurityGroupCacheManager.Register(ctx, task.GetUserCred(), guest.SecgrpId, vpcId, host.GetRegion().Id, host.ManagerId) if secgroupCache == nil { return nil, fmt.Errorf("failed to registor secgroupCache for secgroup: %s vpc: %s", guest.SecgrpId, vpcId) diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index 64c5b5a47f..f2cb68b437 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -9,9 +9,11 @@ import ( "yunion.io/x/log" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/pkg/util/compare" "yunion.io/x/pkg/utils" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" @@ -348,6 +350,72 @@ func (self *SQcloudGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Contex return nil } +func (self *SQcloudGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + ihost, err := host.GetIHost() + if err != nil { + return nil, err + } + iVM, err := ihost.GetIVMById(guest.ExternalId) + if err != nil { + return nil, err + } + + if fwOnly, _ := task.GetParams().Bool("fw_only"); fwOnly { + iregion, err := host.GetIRegion() + if err != nil { + return nil, err + } + lockman.LockRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-normal", guest.SecgrpId)) + defer lockman.ReleaseRawObject(ctx, "secgroupcache", fmt.Sprintf("%s-normal", guest.SecgrpId)) + + secgroupCache := models.SecurityGroupCacheManager.Register(ctx, task.GetUserCred(), guest.SecgrpId, "normal", host.GetRegion().Id, host.ManagerId) + if secgroupCache == nil { + return nil, fmt.Errorf("failed to registor secgroupCache for secgroup: %s", guest.SecgrpId) + } + extID, err := iregion.SyncSecurityGroup(secgroupCache.ExternalId, "normal", guest.GetSecgroupName(), "", guest.GetSecRules()) + if err != nil { + return nil, err + } + if err = secgroupCache.SetExternalId(extID); err != nil { + return nil, err + } + return nil, iVM.AssignSecurityGroup(extID) + } + + iDisks, err := iVM.GetIDisks() + if err != nil { + return nil, err + } + disks := make([]models.SDisk, 0) + for _, guestdisk := range guest.GetDisks() { + disk := guestdisk.GetDisk() + disks = append(disks, *disk) + } + + added := make([]models.SDisk, 0) + commondb := make([]models.SDisk, 0) + commonext := make([]cloudprovider.ICloudDisk, 0) + removed := make([]cloudprovider.ICloudDisk, 0) + + if err := compare.CompareSets(disks, iDisks, &added, &commondb, &commonext, &removed); err != nil { + return nil, err + } + for _, disk := range removed { + if err := iVM.DetachDisk(disk.GetId()); err != nil { + return nil, err + } + } + for _, disk := range added { + if err := iVM.AttachDisk(disk.ExternalId); err != nil { + return nil, err + } + } + return nil, nil + }) + return nil +} + func (self *SQcloudGuestDriver) AllowReconfigGuest() bool { return true } From 1530ca8914b96b987685e48f3690ea667783eb19 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 30 Nov 2018 20:30:10 +0800 Subject: [PATCH 2/3] add guest extra options --- cmd/climc/shell/servers.go | 30 +++++++++++++++++++++ pkg/compute/models/guest_actions.go | 42 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/cmd/climc/shell/servers.go b/cmd/climc/shell/servers.go index d6957bfb8e..6e978ed90f 100644 --- a/cmd/climc/shell/servers.go +++ b/cmd/climc/shell/servers.go @@ -467,4 +467,34 @@ func init() { printObject(result) return nil }) + type ServerAddExtraOption struct { + ID string `help:"ID or name of server"` + KEY string `help:"Option key"` + VALUE string `help:"Option value"` + } + R(&ServerAddExtraOption{}, "server-add-extra-options", "Add server extra options", func(s *mcclient.ClientSession, args *ServerAddExtraOption) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.KEY), "key") + params.Add(jsonutils.NewString(args.VALUE), "value") + result, err := modules.Servers.PerformAction(s, args.ID, "set-extra-option", params) + if err != nil { + return err + } + printObject(result) + return nil + }) + type ServerRemoveExtraOption struct { + ID string `help:"ID or name of server"` + KEY string `help:"Option key"` + } + R(&ServerRemoveExtraOption{}, "server-remove-extra-options", "Remove server extra options", func(s *mcclient.ClientSession, args *ServerRemoveExtraOption) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.KEY), "key") + result, err := modules.Servers.PerformAction(s, args.ID, "del-extra-option", params) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 3174208e9b..e1585d8980 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1571,3 +1571,45 @@ func (self *SGuest) PerformCreateEip(ctx context.Context, userCred mcclient.Toke return nil, nil } + +func (self *SGuest) AllowPerformSetExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SGuest) PerformSetExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + key, err := data.GetString("key") + if err != nil { + return nil, httperrors.NewBadRequestError("Option key required") + } + value, _ := data.GetString("value") + extraOptions := self.GetExtraOptions(userCred) + extraOptions.Set(key, jsonutils.NewString(value)) + return nil, self.SetExtraOptions(ctx, userCred, extraOptions) +} + +func (self *SGuest) GetExtraOptions(userCred mcclient.TokenCredential) *jsonutils.JSONDict { + options := self.GetMetadataJson("extra_options", userCred) + o, ok := options.(*jsonutils.JSONDict) + if ok { + return o + } + return jsonutils.NewDict() +} + +func (self *SGuest) SetExtraOptions(ctx context.Context, userCred mcclient.TokenCredential, extraOptions *jsonutils.JSONDict) error { + return self.SetMetadata(ctx, "extra_options", extraOptions, userCred) +} + +func (self *SGuest) AllowPerformDelExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SGuest) PerformDelExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + key, err := data.GetString("key") + if err != nil { + return nil, httperrors.NewBadRequestError("Option key required") + } + extraOptions := self.GetExtraOptions(userCred) + extraOptions.Remove(key) + return nil, self.SetExtraOptions(ctx, userCred, extraOptions) +} From 0f78dd1ffcb8c4fef3fd42324e5adf22eb8e911e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 30 Nov 2018 20:40:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A4=A7=E9=83=A8=E5=88=86=E5=85=AC?= =?UTF-8?q?=E6=9C=89=E4=BA=91=E4=B8=8D=E9=9C=80=E8=A6=81=E5=B0=86=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E7=BB=84=E6=8B=86=E5=88=86=E4=B8=BA=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E5=8D=95=E4=B8=AA=E7=9A=84=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/secgrouprules.go | 4 ++++ pkg/compute/models/secgroups.go | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/compute/models/secgrouprules.go b/pkg/compute/models/secgrouprules.go index fdb1f21fcc..86aaa19041 100644 --- a/pkg/compute/models/secgrouprules.go +++ b/pkg/compute/models/secgrouprules.go @@ -273,6 +273,10 @@ func (self *SSecurityGroupRule) String() string { return fields[0] + strings.Join(fields[1:], " ") } +func (self *SSecurityGroupRule) toRule() (*secrules.SecurityRule, error) { + return secrules.ParseSecurityRule(self.String()) +} + func (self *SSecurityGroupRule) SingleRules() ([]secrules.SecurityRule, error) { rules := make([]secrules.SecurityRule, 0) ruleStr := self.String() diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index 68fcd19623..003eab0727 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -116,11 +116,13 @@ func (self *SSecurityGroup) getSecurityRules(direction string) (rules []SSecurit func (self *SSecurityGroup) getSecRules(direction string) []secrules.SecurityRule { rules := make([]secrules.SecurityRule, 0) for _, _rule := range self.getSecurityRules(direction) { - singleRules, err := _rule.SingleRules() + //这里没必要拆分为单个单个的端口,到公有云那边适配 + rule, err := _rule.toRule() if err != nil { log.Errorf(err.Error()) + continue } - rules = append(rules, singleRules...) + rules = append(rules, *rule) } return rules }