From f27b924db7d2688c8afc0091c47cab71ecf2ab01 Mon Sep 17 00:00:00 2001 From: ioito Date: Sat, 11 May 2019 18:13:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=88=9B=E5=BB=BA=E6=97=B6?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=B8=8D=E5=90=8C=E5=85=AC=E6=9C=89=E4=BA=91?= =?UTF-8?q?=E7=9A=84=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 4 ++++ pkg/compute/guestdrivers/aws.go | 4 ++++ pkg/compute/guestdrivers/azure.go | 4 ++++ pkg/compute/guestdrivers/baremetals.go | 4 ++++ pkg/compute/guestdrivers/container.go | 4 ++++ pkg/compute/guestdrivers/esxi.go | 4 ++++ pkg/compute/guestdrivers/huawei.go | 4 ++++ pkg/compute/guestdrivers/kvm.go | 4 ++++ pkg/compute/guestdrivers/managedvirtual.go | 24 ++++++++++++++++++++++ pkg/compute/guestdrivers/openstack.go | 4 ++++ pkg/compute/guestdrivers/qcloud.go | 4 ++++ pkg/compute/guestdrivers/ucloud.go | 4 ++++ pkg/compute/models/cachedimages.go | 13 ++++++++++++ pkg/compute/models/guestdrivers.go | 1 + 14 files changed, 82 insertions(+) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 3352c0f7cc..c0b694a84d 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -42,6 +42,10 @@ func (self *SAliyunGuestDriver) GetHypervisor() string { return api.HYPERVISOR_ALIYUN } +func (self *SAliyunGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_ALIYUN +} + func (self *SAliyunGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_CLOUD_EFFICIENCY } diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 38611119a3..176a96bccc 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -76,6 +76,10 @@ func (self *SAwsGuestDriver) GetHypervisor() string { return api.HYPERVISOR_AWS } +func (self *SAwsGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_AWS +} + func (self *SAwsGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_GP2_SSD } diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index ae98a49b68..d97629ac76 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -45,6 +45,10 @@ func (self *SAzureGuestDriver) GetHypervisor() string { return api.HYPERVISOR_AZURE } +func (self *SAzureGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_AZURE +} + func (self *SAzureGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_STANDARD_LRS } diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 3d9d450276..a034f72e05 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -49,6 +49,10 @@ func (self *SBaremetalGuestDriver) GetHypervisor() string { return api.HYPERVISOR_BAREMETAL } +func (self *SBaremetalGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_ONECLOUD +} + func (self *SBaremetalGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_LOCAL } diff --git a/pkg/compute/guestdrivers/container.go b/pkg/compute/guestdrivers/container.go index b0ea336b58..dd05c4b36f 100644 --- a/pkg/compute/guestdrivers/container.go +++ b/pkg/compute/guestdrivers/container.go @@ -51,6 +51,10 @@ func (self *SContainerDriver) GetHypervisor() string { return api.HYPERVISOR_CONTAINER } +func (self *SContainerDriver) GetProvider() string { + return api.CLOUD_PROVIDER_ONECLOUD +} + func (self *SContainerDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_LOCAL } diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index ad6ab8545d..b66f74f822 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -45,6 +45,10 @@ func (self *SESXiGuestDriver) GetHypervisor() string { return api.HYPERVISOR_ESXI } +func (self *SESXiGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_VMWARE +} + func (self *SESXiGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_LOCAL } diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index 0ddece1c03..fe91d49e59 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -40,6 +40,10 @@ func (self *SHuaweiGuestDriver) GetHypervisor() string { return api.HYPERVISOR_HUAWEI } +func (self *SHuaweiGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_HUAWEI +} + func (self *SHuaweiGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_HUAWEI_SATA } diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index a6c6653b61..92039e9e4e 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -48,6 +48,10 @@ func (self *SKVMGuestDriver) GetHypervisor() string { return api.HYPERVISOR_KVM } +func (self *SKVMGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_ONECLOUD +} + func (self *SKVMGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_LOCAL } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 19e178795c..74a9b243cf 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -16,6 +16,7 @@ package guestdrivers import ( "context" + "database/sql" "fmt" "math" "time" @@ -129,6 +130,29 @@ func (self *SManagedVirtualizedGuestDriver) ValidateCreateData(ctx context.Conte if input.Cdrom != "" { return nil, httperrors.NewInputParameterError("%s not support cdrom params", input.Hypervisor) } + + _image, err := models.CachedimageManager.FetchById(input.Disks[0].ImageId) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("image", input.Disks[0].ImageId) + } + return nil, httperrors.NewGeneralError(err) + } + image := _image.(*models.SCachedimage) + if image.ImageType == cloudprovider.CachedImageTypeSystem { + cloudprovider, err := image.GetCloudprovider() + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError("failed to found image %s(%s) provider", image.Name, image.Id) + } + return nil, httperrors.NewGeneralError(err) + } + provider := models.GetDriver(input.Hypervisor).GetProvider() + if provider != cloudprovider.Provider { + return nil, httperrors.NewInputParameterError("image %s(%s) not support provider %s only support %s", image.Name, image.Id, provider, cloudprovider.Provider) + } + } + return input, nil } diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index aa66bd3a25..f1b43cd348 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -38,6 +38,10 @@ func (self *SOpenStackGuestDriver) GetHypervisor() string { return api.HYPERVISOR_OPENSTACK } +func (self *SOpenStackGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_OPENSTACK +} + func (self *SOpenStackGuestDriver) IsSupportEip() bool { return false } diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index 81e4a5248e..921121603c 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -42,6 +42,10 @@ func (self *SQcloudGuestDriver) GetHypervisor() string { return api.HYPERVISOR_QCLOUD } +func (self *SQcloudGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_QCLOUD +} + func (self *SQcloudGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_CLOUD_PREMIUM } diff --git a/pkg/compute/guestdrivers/ucloud.go b/pkg/compute/guestdrivers/ucloud.go index 3d14dd77c6..4b3e09fbcc 100644 --- a/pkg/compute/guestdrivers/ucloud.go +++ b/pkg/compute/guestdrivers/ucloud.go @@ -27,6 +27,10 @@ func (self *SUCloudGuestDriver) GetHypervisor() string { return api.HYPERVISOR_UCLOUD } +func (self *SUCloudGuestDriver) GetProvider() string { + return api.CLOUD_PROVIDER_UCLOUD +} + func (self *SUCloudGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_UCLOUD_CLOUD_SSD } diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 5152c4a5d9..b2f7aa5c95 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -496,6 +496,7 @@ func (image *SCachedimage) getValidStoragecache() []SStoragecache { q = q.Filter(sqlchemy.In(providers.Field("status"), api.CLOUD_PROVIDER_VALID_STATUS)) q = q.Filter(sqlchemy.Equals(providers.Field("health_status"), api.CLOUD_PROVIDER_HEALTH_NORMAL)) q = q.Filter(sqlchemy.Equals(storagecacheimages.Field("cachedimage_id"), image.Id)) + q = q.Filter(sqlchemy.Equals(storagecacheimages.Field("status"), api.CACHED_IMAGE_STATUS_READY)) caches := make([]SStoragecache, 0) err := db.FetchModelObjects(StoragecacheManager, q, &caches) @@ -506,6 +507,18 @@ func (image *SCachedimage) getValidStoragecache() []SStoragecache { return caches } +func (image *SCachedimage) GetCloudprovider() (*SCloudprovider, error) { + caches := image.getValidStoragecache() + if len(caches) == 0 { + return nil, fmt.Errorf("no valid storagecache for image %s(%s)", image.Name, image.Id) + } + cloudprovider := caches[0].GetCloudprovider() + if cloudprovider == nil { + return nil, fmt.Errorf("failed to found cloudprovider for storagecache %s(%s)", caches[0].Name, caches[0].Id) + } + return cloudprovider, nil +} + func (manager *SCachedimageManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) if err != nil { diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index a4c5f06c40..660340c621 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -31,6 +31,7 @@ import ( type IGuestDriver interface { GetHypervisor() string + GetProvider() string GetMaxVCpuCount() int GetMaxVMemSizeGB() int