diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index f3ef8529ec..420632f42d 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -536,3 +536,30 @@ func (manager *SServerSkuManager) GetSkuCountByProvider(provider string) int { return q.Count() } + +// 删除表中zone not found的记录 +func (manager *SServerSkuManager) PendingDeleteInvalidSku() error { + sq := ZoneManager.Query("id").Distinct().SubQuery() + skus := make([]SServerSku, 0) + q := manager.Query() + q = q.NotIn("zone_id", sq).IsNotEmpty("zone_id") + err := db.FetchModelObjects(manager, q, &skus) + if err != nil { + log.Errorf(err.Error()) + return httperrors.NewInternalServerError("query sku list failed.") + } + + for i := range skus { + sku := skus[i] + _, err = manager.TableSpec().Update(&sku, func() error { + return sku.MarkDelete() + }) + + if err != nil { + log.Errorf(err.Error()) + return httperrors.NewInternalServerError("delete sku %s failed.", sku.Id) + } + } + + return nil +} diff --git a/pkg/compute/skus/skus.go b/pkg/compute/skus/skus.go index 58e675ffe7..bbbb4ae511 100644 --- a/pkg/compute/skus/skus.go +++ b/pkg/compute/skus/skus.go @@ -306,6 +306,7 @@ func (self *SkusZoneList) SyncToLocalDB() error { return err } +// 全量同步sku列表. func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { if isStart { if models.ServerSkuManager.GetSkuCountByProvider("") > 0 { @@ -320,8 +321,13 @@ func SyncSkus(ctx context.Context, userCred mcclient.TokenCredential, isStart bo if e := skus.SyncToLocalDB(); e != nil { log.Errorf("SyncSkus sync to local db failed, %s", e.Error()) } + + // 清理无效的sku + log.Debugf("DeleteInvalidSkus in processing...") + models.ServerSkuManager.PendingDeleteInvalidSku() } +// 同步指定provider sku列表 func SyncSkusByProviderIds(providerIds []string) error { skus := SkusZoneList{} log.Debugf("SyncSkusByProviderIds %s", providerIds)