From 920fdb8683e1caa99f6b2fcd9c4755c734f4a5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 15 Aug 2018 18:51:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=AC=E6=9C=89?= =?UTF-8?q?=E4=BA=91=E4=BA=91=E7=A1=AC=E7=9B=98=E5=90=8C=E6=AD=A5=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 49 +++++++++++++++++++++++++----- pkg/compute/models/guests.go | 11 +++++++ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 9477c541f6..a58b046b80 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -9,6 +9,7 @@ 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" @@ -264,13 +265,47 @@ func (self *SAliyunGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Contex func (self *SAliyunGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { - if fw_only, _ := task.GetParams().Bool("fw_only"); fw_only { - if ihost, err := host.GetIHost(); err != nil { - return nil, err - } else if iVM, err := ihost.GetIVMById(guest.ExternalId); err != nil { - return nil, err - } else if err := iVM.SyncSecurityGroup(guest.SecgrpId, guest.GetSecgroupName(), guest.GetSecRules()); err != nil { - return nil, err + if ihost, err := host.GetIHost(); err != nil { + return nil, err + } else if iVM, err := ihost.GetIVMById(guest.ExternalId); err != nil { + return nil, err + } else { + if fw_only, _ := task.GetParams().Bool("fw_only"); fw_only { + if err := iVM.SyncSecurityGroup(guest.SecgrpId, guest.GetSecgroupName(), guest.GetSecRules()); err != nil { + return nil, err + } + } else { + iVM.Refresh() + if iDisks, err := iVM.GetIDisks(); err != nil { + return nil, err + } else { + 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 { + // log.Errorf("need remove %v", disk) + // if err := iVM.DetachDisk(disk.GetId()); err != nil { + // return nil, err + // } + // } + // for _, disk := range added { + // log.Errorf("need add %v", disk) + // if err := iVM.AttachDisk(disk.ExternalId); err != nil { + // return nil, err + // } + // } + } } } return nil, nil diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index c12f0e4221..49eef954de 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1547,6 +1547,17 @@ func (self *SGuest) AllowPerformAttachdisk(ctx context.Context, userCred mcclien } func (self *SGuest) ValidateAttachDisk(ctx context.Context, disk *SDisk) error { + storage := disk.GetStorage() + if provider := storage.GetCloudprovider(); provider != nil { + host := self.GetHost() + if provider.Id != host.ManagerId { + return httperrors.NewInputParameterError("Disk %s and guest not belong to the same account", disk.Name) + } else if storage.ZoneId != host.ZoneId { + return httperrors.NewInputParameterError("Disk %s and guest not belong to the same zone", disk.Name) + } + return nil + } + if disk.isAttached() { return httperrors.NewInputParameterError("Disk %s has been attached", disk.Name) } else if len(disk.GetPathAtHost(self.GetHost())) == 0 { From 29caf7d6fa5fc33eed0862a715052c99f170f882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 28 Aug 2018 16:09:59 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0GetDetachDiskStatus?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 42eeaa6eed..800fbeb234 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -49,6 +49,10 @@ func (self *SAliyunGuestDriver) ChooseHostStorage(host *models.SHost, backend st return nil } +func (self *SAliyunGuestDriver) GetDetachDiskStatus() ([]string, error) { + return []string{models.VM_READY, models.VM_RUNNING}, nil +} + func (self *SAliyunGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { data, err := self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, data) if err != nil { From 293b72907b6807d47b0697fb298fc512a7f3b627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 28 Aug 2018 16:30:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0aliyuncli=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/util/aliyun/instance.go | 1 + pkg/util/aliyun/shell/instance.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/pkg/util/aliyun/instance.go b/pkg/util/aliyun/instance.go index 8f4114dc55..2d7e95e49b 100644 --- a/pkg/util/aliyun/instance.go +++ b/pkg/util/aliyun/instance.go @@ -675,6 +675,7 @@ func (self *SRegion) DetachDisk(instanceId string, diskId string) error { params := make(map[string]string) params["InstanceId"] = instanceId params["DiskId"] = diskId + log.Infof("Detach instance %s disk %s", instanceId, diskId) _, err := self.ecsRequest("DetachDisk", params) if err != nil { log.Errorf("DetachDisk %s to %s fail %s", diskId, instanceId, err) diff --git a/pkg/util/aliyun/shell/instance.go b/pkg/util/aliyun/shell/instance.go index 4a741d0b66..28b1a73d36 100644 --- a/pkg/util/aliyun/shell/instance.go +++ b/pkg/util/aliyun/shell/instance.go @@ -43,6 +43,27 @@ func init() { return nil }) + type InstanceDiskOperationOptions struct { + ID string `help:"instance ID"` + DISK string `help:"disk ID"` + } + + shellutils.R(&InstanceDiskOperationOptions{}, "instance-attach-disk", "Attach a disk to instance", func(cli *aliyun.SRegion, args *InstanceDiskOperationOptions) error { + err := cli.AttachDisk(args.ID, args.DISK) + if err != nil { + return err + } + return nil + }) + + shellutils.R(&InstanceDiskOperationOptions{}, "instance-detach-disk", "Detach a disk to instance", func(cli *aliyun.SRegion, args *InstanceDiskOperationOptions) error { + err := cli.DetachDisk(args.ID, args.DISK) + if err != nil { + return err + } + return nil + }) + type InstanceOperationOptions struct { ID string `help:"instance ID"` } From 5ad60302560eb5aeb540c1540902c43769e83dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 28 Aug 2018 16:39:19 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A1=A5=E5=85=A8aliyun=20driver=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 800fbeb234..c3d65f208b 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -53,6 +53,10 @@ func (self *SAliyunGuestDriver) GetDetachDiskStatus() ([]string, error) { return []string{models.VM_READY, models.VM_RUNNING}, nil } +func (self *SAliyunGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { + return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) +} + func (self *SAliyunGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { data, err := self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, data) if err != nil {