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"))) }