From f3b85dcb7bf7b88afa5005c9b402e4564e6b003b Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 15 Jan 2019 22:42:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9Astorage=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0IsSysDiskStore=E5=B1=9E=E6=80=A7=EF=BC=8C=E6=A0=87?= =?UTF-8?q?=E7=A4=BA=E6=98=AF=E5=90=A6=E6=94=AF=E6=8C=81=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=9B=98=E5=88=9B=E5=BB=BA=E3=80=82=E9=98=BF=E9=87=8C=E4=BA=91?= =?UTF-8?q?cloud=E5=AD=98=E5=82=A8=E4=B8=8D=E6=94=AF=E6=8C=81=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=9B=98=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudprovider/resources.go | 2 ++ pkg/compute/models/capabilities.go | 9 +++++++-- pkg/compute/models/storages.go | 7 +++++++ pkg/util/aliyun/storage.go | 8 ++++++++ pkg/util/aliyun/zone.go | 15 +++++++++++++-- pkg/util/aws/storage.go | 4 ++++ pkg/util/azure/classic_storage.go | 4 ++++ pkg/util/azure/storage.go | 4 ++++ pkg/util/esxi/storage.go | 4 ++++ pkg/util/huawei/storage.go | 4 ++++ pkg/util/openstack/storage.go | 4 ++++ pkg/util/qcloud/localstorage.go | 4 ++++ pkg/util/qcloud/storage.go | 4 ++++ 13 files changed, 69 insertions(+), 4 deletions(-) diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 4f30728c77..7889fb0880 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -123,6 +123,8 @@ type ICloudStorage interface { GetIDiskById(idStr string) (ICloudDisk, error) GetMountPoint() string + + IsSysDiskStore() bool } type ICloudHost interface { diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index 352a36435c..c55ab7758f 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -14,6 +14,7 @@ type SCapabilities struct { Hypervisors []string `json:",allowempty"` ResourceTypes []string `json:",allowempty"` StorageTypes []string `json:",allowempty"` + DataStorageTypes []string `json:",allowempty"` GPUModels []string `json:",allowempty"` MinNicCount int MaxNicCount int @@ -28,7 +29,8 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que capa := SCapabilities{} capa.Hypervisors = getHypervisors(zone) capa.ResourceTypes = getResourceTypes(zone) - capa.StorageTypes = getStorageTypes(zone) + capa.StorageTypes = getStorageTypes(zone, true) + capa.DataStorageTypes = getStorageTypes(zone, false) capa.GPUModels = getGPUs(zone) capa.SchedPolicySupport = isSchedPolicySupported(zone) capa.MinNicCount = getMinNicCount(zone) @@ -97,7 +99,7 @@ func getResourceTypes(zone *SZone) []string { return resourceTypes } -func getStorageTypes(zone *SZone) []string { +func getStorageTypes(zone *SZone, isSysDisk bool) []string { storages := StorageManager.Query().SubQuery() hostStorages := HoststorageManager.Query().SubQuery() hosts := HostManager.Query().SubQuery() @@ -121,6 +123,9 @@ func getStorageTypes(zone *SZone) []string { q = q.Filter(sqlchemy.IsNotNull(storages.Field("medium_type"))) q = q.Filter(sqlchemy.In(storages.Field("status"), []string{STORAGE_ENABLED, STORAGE_ONLINE})) q = q.Filter(sqlchemy.IsTrue(storages.Field("enabled"))) + if isSysDisk { + q = q.Filter(sqlchemy.IsTrue(storages.Field("is_sys_disk_store"))) + } q = q.Distinct() rows, err := q.Rows() if err != nil { diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index e41f967318..47c5f0a44e 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -129,6 +129,9 @@ type SStorage struct { Enabled bool `nullable:"false" default:"true" list:"user" create:"optional"` Status string `width:"36" charset:"ascii" nullable:"false" default:"offline" list:"user" create:"optional"` + + // indicating whether system disk can be allocated in this storage + IsSysDiskStore bool `nullable:"false" default:"true" list:"user" create:"optional" update:"admin"` } func (manager *SStorageManager) GetContextManager() []db.IModelManager { @@ -741,6 +744,8 @@ func (self *SStorage) syncWithCloudStorage(extStorage cloudprovider.ICloudStorag self.IsEmulated = extStorage.IsEmulated() self.ManagerId = extStorage.GetManagerId() + self.IsSysDiskStore = extStorage.IsSysDiskStore() + return nil }) if err != nil { @@ -768,6 +773,8 @@ func (manager *SStorageManager) newFromCloudStorage(extStorage cloudprovider.ICl storage.IsEmulated = extStorage.IsEmulated() storage.ManagerId = extStorage.GetManagerId() + storage.IsSysDiskStore = extStorage.IsSysDiskStore() + err := manager.TableSpec().Insert(&storage) if err != nil { log.Errorf("newFromCloudStorage fail %s", err) diff --git a/pkg/util/aliyun/storage.go b/pkg/util/aliyun/storage.go index 53a5791f09..312455715c 100644 --- a/pkg/util/aliyun/storage.go +++ b/pkg/util/aliyun/storage.go @@ -6,6 +6,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/utils" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" @@ -131,3 +132,10 @@ func (self *SStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, erro func (self *SStorage) GetMountPoint() string { return "" } + +func (self *SStorage) IsSysDiskStore() bool { + if utils.IsInStringArray(self.storageType, self.zone.getSysDiskCategories()) { + return true + } + return false +} diff --git a/pkg/util/aliyun/zone.go b/pkg/util/aliyun/zone.go index 249554c058..00ae518797 100644 --- a/pkg/util/aliyun/zone.go +++ b/pkg/util/aliyun/zone.go @@ -152,9 +152,13 @@ func (self *SZone) GetIRegion() cloudprovider.ICloudRegion { } func (self *SZone) fetchStorages() error { - self.istorages = make([]cloudprovider.ICloudStorage, len(self.AvailableDiskCategories.DiskCategories)) + categories := self.AvailableDiskCategories.DiskCategories + // if len(self.AvailableResources.ResourcesInfo) > 0 { + // categories = self.AvailableResources.ResourcesInfo[0].SystemDiskCategories.SupportedSystemDiskCategory + // } + self.istorages = make([]cloudprovider.ICloudStorage, len(categories)) - for i, sc := range self.AvailableDiskCategories.DiskCategories { + for i, sc := range categories { storage := SStorage{zone: self, storageType: sc} self.istorages[i] = &storage } @@ -236,3 +240,10 @@ func (self *SZone) getNetworkById(vswitchId string) *SVSwitch { } return nil } + +func (self *SZone) getSysDiskCategories() []string { + if len(self.AvailableResources.ResourcesInfo) > 0 { + return self.AvailableResources.ResourcesInfo[0].SystemDiskCategories.SupportedSystemDiskCategory + } + return nil +} diff --git a/pkg/util/aws/storage.go b/pkg/util/aws/storage.go index 4da587ec70..6838248515 100644 --- a/pkg/util/aws/storage.go +++ b/pkg/util/aws/storage.go @@ -128,3 +128,7 @@ func (self *SStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, erro func (self *SStorage) GetMountPoint() string { return "" } + +func (self *SStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/azure/classic_storage.go b/pkg/util/azure/classic_storage.go index d1cf9acbcc..35126ed1c0 100644 --- a/pkg/util/azure/classic_storage.go +++ b/pkg/util/azure/classic_storage.go @@ -130,3 +130,7 @@ func (self *SClassicStorage) Refresh() error { func (self *SClassicStorage) GetMountPoint() string { return "" } + +func (self *SClassicStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/azure/storage.go b/pkg/util/azure/storage.go index e1c2caa023..3a1917554c 100644 --- a/pkg/util/azure/storage.go +++ b/pkg/util/azure/storage.go @@ -164,3 +164,7 @@ func (self *SStorage) Refresh() error { func (self *SStorage) GetMountPoint() string { return "" } + +func (self *SStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/esxi/storage.go b/pkg/util/esxi/storage.go index 7dcd53c2f9..7a20982f73 100644 --- a/pkg/util/esxi/storage.go +++ b/pkg/util/esxi/storage.go @@ -671,3 +671,7 @@ func (self *SDatastore) RemoveDir(ctx context.Context, remotePath string) error return dnm.DeleteDirectory(ctx, dcObj, remotePath) } + +func (self *SDatastore) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/huawei/storage.go b/pkg/util/huawei/storage.go index 06482d6d65..2812d24bec 100644 --- a/pkg/util/huawei/storage.go +++ b/pkg/util/huawei/storage.go @@ -131,3 +131,7 @@ func (self *SStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, erro func (self *SStorage) GetMountPoint() string { return "" } + +func (self *SStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/openstack/storage.go b/pkg/util/openstack/storage.go index 2662b4727b..d395372473 100644 --- a/pkg/util/openstack/storage.go +++ b/pkg/util/openstack/storage.go @@ -109,3 +109,7 @@ func (storage *SStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, e func (storage *SStorage) GetMountPoint() string { return "" } + +func (storage *SStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/qcloud/localstorage.go b/pkg/util/qcloud/localstorage.go index 9194805b87..35145be465 100644 --- a/pkg/util/qcloud/localstorage.go +++ b/pkg/util/qcloud/localstorage.go @@ -101,3 +101,7 @@ func (self *SLocalStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, func (self *SLocalStorage) GetMountPoint() string { return "" } + +func (self *SLocalStorage) IsSysDiskStore() bool { + return true +} diff --git a/pkg/util/qcloud/storage.go b/pkg/util/qcloud/storage.go index e59680fedf..7426d9095e 100644 --- a/pkg/util/qcloud/storage.go +++ b/pkg/util/qcloud/storage.go @@ -134,3 +134,7 @@ func (self *SStorage) GetIDiskById(idStr string) (cloudprovider.ICloudDisk, erro func (self *SStorage) GetMountPoint() string { return "" } + +func (self *SStorage) IsSysDiskStore() bool { + return true +}