From dd67f68485f9af176e81ebafbcb39cef7055d821 Mon Sep 17 00:00:00 2001 From: ioito Date: Tue, 27 Aug 2019 17:16:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=A3=81=E7=9B=98=E6=97=B6=E6=98=BE=E7=A4=BAprovider=20disable?= =?UTF-8?q?=E5=BA=95=E4=B8=8B=E7=9A=84=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/disks.go | 12 ++++++++++++ pkg/compute/models/storages.go | 22 ++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index f5ab0d7c95..dc58f66fd0 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -395,6 +395,18 @@ func (manager *SDiskManager) ValidateCreateData(ctx context.Context, userCred mc } storage := storageObj.(*SStorage) + if provider := storage.GetCloudprovider(); provider != nil { + if !provider.Enabled { + return nil, httperrors.NewInputParameterError("provider %s(%s) is disabled, you need enable provider first", provider.Name, provider.Id) + } + if !utils.IsInStringArray(provider.Status, api.CLOUD_PROVIDER_VALID_STATUS) { + return nil, httperrors.NewInputParameterError("invalid provider %s(%s) status %s, require status is %s", provider.Name, provider.Id, provider.Status, api.CLOUD_PROVIDER_VALID_STATUS) + } + if !utils.IsInStringArray(provider.HealthStatus, api.CLOUD_PROVIDER_VALID_HEALTH_STATUS) { + return nil, httperrors.NewInputParameterError("invalid provider %s(%s) health status %s, require status is %s", provider.Name, provider.Id, provider.HealthStatus, api.CLOUD_PROVIDER_VALID_HEALTH_STATUS) + } + } + host := storage.GetMasterHost() if host == nil { return nil, httperrors.NewResourceNotFoundError("storage %s(%s) need onlne and attach host for create disk", storage.Name, storage.Id) diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 0a275e0a40..304fbf48a8 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -1132,11 +1132,25 @@ func (manager *SStorageManager) ListItemFilter(ctx context.Context, q *sqlchemy. if jsonutils.QueryBoolean(query, "usable", false) { hostStorageTable := HoststorageManager.Query().SubQuery() hostTable := HostManager.Query().SubQuery() - sq := hostStorageTable.Query(hostStorageTable.Field("storage_id")).Join(hostTable, - sqlchemy.Equals(hostTable.Field("id"), hostStorageTable.Field("host_id"))). - Filter(sqlchemy.Equals(hostTable.Field("host_status"), api.HOST_ONLINE)) + sq1 := hostStorageTable.Query(hostStorageTable.Field("storage_id")). + Join(hostTable, sqlchemy.Equals(hostTable.Field("id"), hostStorageTable.Field("host_id"))). + Filter(sqlchemy.Equals(hostTable.Field("host_status"), api.HOST_ONLINE)). + Filter(sqlchemy.IsTrue(hostTable.Field("enabled"))). + Filter(sqlchemy.IsNullOrEmpty(hostTable.Field("manager_id"))) - q = q.Filter(sqlchemy.In(q.Field("id"), sq)). + providerTable := CloudproviderManager.Query().SubQuery() + sq2 := hostStorageTable.Query(hostStorageTable.Field("storage_id")). + Join(hostTable, sqlchemy.Equals(hostTable.Field("id"), hostStorageTable.Field("host_id"))). + Join(providerTable, sqlchemy.Equals(hostTable.Field("manager_id"), providerTable.Field("id"))). + Filter(sqlchemy.IsTrue(providerTable.Field("enabled"))). + Filter(sqlchemy.In(providerTable.Field("status"), api.CLOUD_PROVIDER_VALID_STATUS)). + Filter(sqlchemy.In(providerTable.Field("health_status"), api.CLOUD_PROVIDER_VALID_HEALTH_STATUS)) + + q = q.Filter( + sqlchemy.OR( + sqlchemy.In(q.Field("id"), sq1), + sqlchemy.In(q.Field("id"), sq2), + )). Filter(sqlchemy.In(q.Field("status"), []string{api.STORAGE_ENABLED, api.STORAGE_ONLINE})). Filter(sqlchemy.IsTrue(q.Field("enabled"))) }