| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964 |
- // Copyright 2019 Yunion
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package models
- import (
- "context"
- "database/sql"
- "fmt"
- "strings"
- "time"
- "yunion.io/x/pkg/errors"
- "yunion.io/x/sqlchemy"
- api "yunion.io/x/onecloud/pkg/apis/compute"
- "yunion.io/x/onecloud/pkg/cloudcommon/db"
- "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
- "yunion.io/x/onecloud/pkg/mcclient"
- )
- func (self *SCloudregion) purgeAll(ctx context.Context, managerId string) error {
- err := self.purgeAccessGroups(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeAccessGroups")
- }
- err = self.purgeApps(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeApps")
- }
- err = self.purgeLoadbalancers(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeLoadbalancers")
- }
- err = self.purgeKubeClusters(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeKubeClusters")
- }
- err = self.purgeRds(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeRds")
- }
- err = self.purgeRedis(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeRedis")
- }
- err = self.purgeVpcs(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeVpcs")
- }
- err = self.purgeResources(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeResources")
- }
- err = self.purgeQuotas(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeQuotas")
- }
- // fix #20036 避免regional子网未删除, 导致zone残留
- zones, err := self.GetZones()
- if err != nil {
- return errors.Wrapf(err, "GetZones")
- }
- for i := range zones {
- lockman.LockObject(ctx, &zones[i])
- defer lockman.ReleaseObject(ctx, &zones[i])
- err = zones[i].purgeAll(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "zone purgeAll %s", zones[i].Name)
- }
- }
- cprCount, err := CloudproviderRegionManager.Query().Equals("cloudregion_id", self.Id).NotEquals("cloudprovider_id", managerId).CountWithError()
- if err != nil {
- return errors.Wrapf(err, "cpr count")
- }
- // 部分cloudprovider依然有此region, 避免直接删除
- if cprCount > 0 {
- return nil
- }
- err = self.ValidateDeleteCondition(ctx, nil)
- if err != nil {
- return nil
- }
- // 资源清理完成后, 清理region下面的套餐
- err = self.purgeSkuResources(ctx)
- if err != nil {
- return errors.Wrapf(err, "purgeSkuResources")
- }
- return self.SEnabledStatusStandaloneResourceBase.Delete(ctx, nil)
- }
- func (self *SCloudregion) purgeSkuResources(ctx context.Context) error {
- rdsSkus := DBInstanceSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- redisSkus := ElasticcacheSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- artsSkus := ModelartsPoolSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- nasSkus := NasSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- natSkus := NatSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- skus := ServerSkuManager.Query("id").Equals("cloudregion_id", self.Id)
- pairs := []purgePair{
- {manager: ServerSkuManager, key: "id", q: skus},
- {manager: NatSkuManager, key: "id", q: natSkus},
- {manager: NasSkuManager, key: "id", q: nasSkus},
- {manager: ModelartsPoolSkuManager, key: "id", q: artsSkus},
- {manager: ElasticcacheSkuManager, key: "id", q: redisSkus},
- {manager: DBInstanceSkuManager, key: "id", q: rdsSkus},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeVpcs(ctx context.Context, managerId string) error {
- vpcs := VpcManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- wires := WireManager.Query("id").In("vpc_id", vpcs.SubQuery())
- networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
- bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
- netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
- nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
- sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
- nats := NatGatewayManager.Query("id").In("vpc_id", vpcs.SubQuery())
- stables := NatSEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
- secgroups := SecurityGroupManager.Query("id").In("vpc_id", vpcs.SubQuery())
- rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
- dtables := NatDEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
- routes := RouteTableManager.Query("id").In("vpc_id", vpcs.SubQuery())
- intervpcroutes := InterVpcNetworkRouteSetManager.Query("id").In("vpc_id", vpcs.SubQuery())
- peers := VpcPeeringConnectionManager.Query("id").In("vpc_id", vpcs.SubQuery())
- ipv6 := IPv6GatewayManager.Query("id").In("vpc_id", vpcs.SubQuery())
- pairs := []purgePair{
- {manager: SecurityGroupRuleManager, key: "id", q: rules},
- {manager: SecurityGroupManager, key: "id", q: secgroups},
- {manager: IPv6GatewayManager, key: "id", q: ipv6},
- {manager: VpcPeeringConnectionManager, key: "id", q: peers},
- {manager: InterVpcNetworkRouteSetManager, key: "id", q: intervpcroutes},
- {manager: RouteTableManager, key: "id", q: routes},
- {manager: NatDEntryManager, key: "id", q: dtables},
- {manager: NatSEntryManager, key: "id", q: stables},
- {manager: NatGatewayManager, key: "id", q: nats},
- {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
- {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
- {manager: ReservedipManager, key: "id", q: rips},
- {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
- {manager: NetworkAddressManager, key: "id", q: netaddrs},
- {manager: NetworkIpMacManager, key: "id", q: netmacs},
- {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
- {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
- {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
- {manager: HostnetworkManager, key: "row_id", q: bns},
- {manager: NetworkManager, key: "id", q: networks},
- {manager: WireManager, key: "id", q: wires},
- {manager: VpcManager, key: "id", q: vpcs},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SVpc) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- wires := WireManager.Query("id").Equals("vpc_id", self.Id)
- networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
- bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
- netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
- nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
- sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
- nats := NatGatewayManager.Query("id").Equals("vpc_id", self.Id)
- stables := NatSEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
- dtables := NatDEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
- routes := RouteTableManager.Query("id").Equals("vpc_id", self.Id)
- dnszones := DnsZoneVpcManager.Query("row_id").Equals("vpc_id", self.Id)
- intervpcroutes := InterVpcNetworkRouteSetManager.Query("id").Equals("vpc_id", self.Id)
- ipv6 := IPv6GatewayManager.Query("id").Equals("vpc_id", self.Id)
- secgroups := SecurityGroupManager.Query("id").Equals("vpc_id", self.Id)
- rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
- pairs := []purgePair{
- {manager: SecurityGroupRuleManager, key: "id", q: rules},
- {manager: SecurityGroupManager, key: "id", q: secgroups},
- {manager: IPv6GatewayManager, key: "id", q: ipv6},
- {manager: InterVpcNetworkRouteSetManager, key: "id", q: intervpcroutes},
- {manager: DnsZoneVpcManager, key: "row_id", q: dnszones},
- {manager: RouteTableManager, key: "id", q: routes},
- {manager: NatDEntryManager, key: "id", q: dtables},
- {manager: NatSEntryManager, key: "id", q: stables},
- {manager: NatGatewayManager, key: "id", q: nats},
- {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
- {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
- {manager: ReservedipManager, key: "id", q: rips},
- {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
- {manager: NetworkAddressManager, key: "id", q: netaddrs},
- {manager: NetworkIpMacManager, key: "id", q: netmacs},
- {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
- {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
- {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
- {manager: HostnetworkManager, key: "row_id", q: bns},
- {manager: NetworkManager, key: "id", q: networks},
- {manager: WireManager, key: "id", q: wires},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
- }
- func (self *SNetworkInterface) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- nis := NetworkinterfacenetworkManager.Query("row_id").In("networkinterface_id", self.Id)
- pairs := []purgePair{
- {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return self.SModelBase.Delete(ctx, userCred)
- }
- func (self *SNatGateway) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- stables := NatSEntryManager.Query("id").Equals("natgateway_id", self.Id)
- dtables := NatDEntryManager.Query("id").Equals("natgateway_id", self.Id)
- pairs := []purgePair{
- {manager: NatDEntryManager, key: "id", q: dtables},
- {manager: NatSEntryManager, key: "id", q: stables},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return self.SInfrasResourceBase.Delete(ctx, userCred)
- }
- func (self *SCloudregion) purgeQuotas(ctx context.Context, managerId string) error {
- quotas := CloudproviderQuotaManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- pairs := []purgePair{
- {manager: CloudproviderQuotaManager, key: "id", q: quotas},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeResources(ctx context.Context, managerId string) error {
- buckets := BucketManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- ess := ElasticSearchManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- eips := ElasticipManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- kafkas := KafkaManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- misc := MiscResourceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- arts := ModelartsPoolManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- mongodbs := MongoDBManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- nics := NetworkInterfaceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- nicips := NetworkinterfacenetworkManager.Query("row_id").In("networkinterface_id", nics.SubQuery())
- secgroups := SecurityGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
- policies := SnapshotPolicyManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- snapshots := SnapshotManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- tables := TablestoreManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- wafs := WafInstanceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- ipsets := WafIPSetManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- regsets := WafRegexSetManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- wafgroups := WafRuleGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- cprs := CloudproviderRegionManager.Query("row_id").Equals("cloudprovider_id", managerId).Equals("cloudregion_id", self.Id)
- pairs := []purgePair{
- {manager: CloudproviderRegionManager, key: "row_id", q: cprs},
- {manager: WafRuleGroupManager, key: "id", q: wafgroups},
- {manager: WafRegexSetManager, key: "id", q: regsets},
- {manager: WafIPSetManager, key: "id", q: ipsets},
- {manager: WafInstanceManager, key: "id", q: wafs},
- {manager: TablestoreManager, key: "id", q: tables},
- {manager: SnapshotManager, key: "id", q: snapshots},
- {manager: SnapshotPolicyManager, key: "id", q: policies},
- {manager: SecurityGroupRuleManager, key: "id", q: rules},
- {manager: SecurityGroupManager, key: "id", q: secgroups},
- {manager: NetworkinterfacenetworkManager, key: "row_id", q: nicips},
- {manager: NetworkInterfaceManager, key: "id", q: nics},
- {manager: MongoDBManager, key: "id", q: mongodbs},
- {manager: ModelartsPoolManager, key: "id", q: arts},
- {manager: MiscResourceManager, key: "id", q: misc},
- {manager: KafkaManager, key: "id", q: kafkas},
- {manager: ElasticipManager, key: "id", q: eips},
- {manager: ElasticSearchManager, key: "id", q: ess},
- {manager: BucketManager, key: "id", q: buckets},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeRedis(ctx context.Context, managerId string) error {
- vpcs := VpcManager.Query("id").Equals("cloudregion_id", self.Id).Equals("manager_id", managerId)
- redis := ElasticcacheManager.Query("id").In("vpc_id", vpcs.SubQuery())
- redisAcls := ElasticcacheAclManager.Query("id").In("elasticcache_id", redis.SubQuery())
- backups := ElasticcacheBackupManager.Query("id").In("elasticcache_id", redis.SubQuery())
- parameters := ElasticcacheParameterManager.Query("id").In("elasticcache_id", redis.SubQuery())
- secgroups := ElasticcachesecgroupManager.Query("row_id").In("elasticcache_id", redis.SubQuery())
- accounts := ElasticcacheAccountManager.Query("id").In("elasticcache_id", redis.SubQuery())
- pairs := []purgePair{
- {manager: ElasticcacheAccountManager, key: "id", q: accounts},
- {manager: ElasticcachesecgroupManager, key: "row_id", q: secgroups},
- {manager: ElasticcacheParameterManager, key: "id", q: parameters},
- {manager: ElasticcacheBackupManager, key: "id", q: backups},
- {manager: ElasticcacheAclManager, key: "id", q: redisAcls},
- {manager: ElasticcacheManager, key: "id", q: redis},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeRds(ctx context.Context, managerId string) error {
- rds := DBInstanceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- rdsNetworks := DBInstanceNetworkManager.Query("row_id").In("dbinstance_id", rds.SubQuery())
- rdsBackups := DBInstanceBackupManager.Query("id").In("dbinstance_id", rds.SubQuery())
- rdsAccounts := DBInstanceAccountManager.Query("id").In("dbinstance_id", rds.SubQuery())
- rdsSecgroups := DBInstanceSecgroupManager.Query("row_id").In("dbinstance_id", rds.SubQuery())
- rdsDbs := DBInstanceDatabaseManager.Query("id").In("dbinstance_id", rds.SubQuery())
- rdsParamenters := DBInstanceParameterManager.Query("id").In("dbinstance_id", rds.SubQuery())
- rdsPrivileges := DBInstancePrivilegeManager.Query("id").In("dbinstanceaccount_id", rdsAccounts.SubQuery())
- pairs := []purgePair{
- {manager: DBInstancePrivilegeManager, key: "id", q: rdsPrivileges},
- {manager: DBInstanceParameterManager, key: "id", q: rdsParamenters},
- {manager: DBInstanceDatabaseManager, key: "id", q: rdsDbs},
- {manager: DBInstanceSecgroupManager, key: "row_id", q: rdsSecgroups},
- {manager: DBInstanceAccountManager, key: "id", q: rdsAccounts},
- {manager: DBInstanceBackupManager, key: "id", q: rdsBackups},
- {manager: DBInstanceNetworkManager, key: "row_id", q: rdsNetworks},
- {manager: DBInstanceManager, key: "id", q: rds},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SDBInstance) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- rdsNetworks := DBInstanceNetworkManager.Query("row_id").Equals("dbinstance_id", self.Id)
- rdsBackups := DBInstanceBackupManager.Query("id").Equals("dbinstance_id", self.Id)
- rdsAccounts := DBInstanceAccountManager.Query("id").Equals("dbinstance_id", self.Id)
- rdsSecgroups := DBInstanceSecgroupManager.Query("row_id").Equals("dbinstance_id", self.Id)
- rdsDbs := DBInstanceDatabaseManager.Query("id").Equals("dbinstance_id", self.Id)
- rdsParamenters := DBInstanceParameterManager.Query("id").Equals("dbinstance_id", self.Id)
- rdsPrivileges := DBInstancePrivilegeManager.Query("id").In("dbinstanceaccount_id", rdsAccounts.SubQuery())
- pairs := []purgePair{
- {manager: DBInstancePrivilegeManager, key: "id", q: rdsPrivileges},
- {manager: DBInstanceParameterManager, key: "id", q: rdsParamenters},
- {manager: DBInstanceDatabaseManager, key: "id", q: rdsDbs},
- {manager: DBInstanceSecgroupManager, key: "row_id", q: rdsSecgroups},
- {manager: DBInstanceAccountManager, key: "id", q: rdsAccounts},
- {manager: DBInstanceBackupManager, key: "id", q: rdsBackups},
- {manager: DBInstanceNetworkManager, key: "row_id", q: rdsNetworks},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return self.SVirtualResourceBase.Delete(ctx, userCred)
- }
- func (self *SCloudregion) purgeKubeClusters(ctx context.Context, managerId string) error {
- kubeClusters := KubeClusterManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- kubeNodes := KubeNodeManager.Query("id").In("cloud_kube_cluster_id", kubeClusters.SubQuery())
- kubePools := KubeNodePoolManager.Query("id").In("cloud_kube_cluster_id", kubeClusters.SubQuery())
- pairs := []purgePair{
- {manager: KubeNodePoolManager, key: "id", q: kubePools},
- {manager: KubeNodeManager, key: "id", q: kubeNodes},
- {manager: KubeClusterManager, key: "id", q: kubeClusters},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeLoadbalancers(ctx context.Context, managerId string) error {
- lbs := LoadbalancerManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- lbnetworks := LoadbalancernetworkManager.Query("row_id").In("loadbalancer_id", lbs.SubQuery())
- lblis := LoadbalancerListenerManager.Query("id").In("loadbalancer_id", lbs.SubQuery())
- lbbgs := LoadbalancerBackendGroupManager.Query("id").In("loadbalancer_id", lbs.SubQuery())
- backends := LoadbalancerBackendManager.Query("id").In("backend_group_id", lbbgs.SubQuery())
- lbrules := LoadbalancerListenerRuleManager.Query("id").In("listener_id", lblis.SubQuery())
- pairs := []purgePair{
- {manager: LoadbalancerBackendManager, key: "id", q: backends},
- {manager: LoadbalancerListenerRuleManager, key: "id", q: lbrules},
- {manager: LoadbalancerBackendGroupManager, key: "id", q: lbbgs},
- {manager: LoadbalancerListenerManager, key: "id", q: lblis},
- {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
- {manager: LoadbalancerManager, key: "id", q: lbs},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeApps(ctx context.Context, managerId string) error {
- apps := AppManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- envs := AppEnvironmentManager.Query("id").In("app_id", apps.SubQuery())
- pairs := []purgePair{
- {manager: AppEnvironmentManager, key: "id", q: envs},
- {manager: AppManager, key: "id", q: apps},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SCloudregion) purgeAccessGroups(ctx context.Context, managerId string) error {
- fs := FileSystemManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- ags := AccessGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
- mts := MountTargetManager.Query("id").In("file_system_id", fs.SubQuery())
- rules := AccessGroupRuleManager.Query("id").In("access_group_id", ags.SubQuery())
- pairs := []purgePair{
- {manager: AccessGroupRuleManager, key: "id", q: rules},
- {manager: MountTargetManager, key: "id", q: mts},
- {manager: AccessGroupManager, key: "id", q: ags},
- {manager: FileSystemManager, key: "id", q: fs},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SZone) purgeAll(ctx context.Context, managerId string) error {
- err := self.purgeStorages(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeStorages")
- }
- err = self.purgeHosts(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeHosts")
- }
- err = self.purgeWires(ctx, managerId)
- if err != nil {
- return errors.Wrapf(err, "purgeWires")
- }
- err = self.ValidateDeleteCondition(ctx, nil)
- if err != nil {
- return nil
- }
- return self.SStandaloneResourceBase.Delete(ctx, nil)
- }
- type purgePair struct {
- manager db.IModelManager
- key string
- q *sqlchemy.SQuery
- }
- func (self *purgePair) queryIds() ([]string, error) {
- ids := []string{}
- sq := self.q.SubQuery()
- q := sq.Query(sq.Field(self.key)).Distinct()
- rows, err := q.Rows()
- if err != nil {
- if errors.Cause(err) == sql.ErrNoRows {
- return ids, nil
- }
- return ids, errors.Wrap(err, "Query")
- }
- defer rows.Close()
- for rows.Next() {
- var id string
- err := rows.Scan(&id)
- if err != nil {
- return ids, errors.Wrap(err, "rows.Scan")
- }
- ids = append(ids, id)
- }
- return ids, nil
- }
- func (self *purgePair) purgeAll(ctx context.Context) error {
- purgeIds, err := self.queryIds()
- if err != nil {
- return errors.Wrapf(err, "Query ids")
- }
- if len(purgeIds) == 0 {
- return nil
- }
- var purge = func(ids []string) error {
- vars := []interface{}{}
- placeholders := make([]string, len(ids))
- for i := range placeholders {
- placeholders[i] = "?"
- vars = append(vars, ids[i])
- }
- placeholder := strings.Join(placeholders, ",")
- sql := fmt.Sprintf(
- "update %s set deleted = true, deleted_at = ? where %s in (%s) and deleted = false",
- self.manager.TableSpec().Name(), self.key, placeholder,
- )
- switch self.manager.Keyword() {
- case GuestcdromManager.Keyword(), GuestFloppyManager.Keyword():
- sql = fmt.Sprintf(
- "update %s set image_id = null, updated_at = ? where %s in (%s) and image_id is not null",
- self.manager.TableSpec().Name(), self.key, placeholder,
- )
- vars = append([]interface{}{time.Now()}, vars...)
- case NetInterfaceManager.Keyword():
- sql = fmt.Sprintf(
- "delete from %s where %s in (%s)",
- self.manager.TableSpec().Name(), self.key, placeholder,
- )
- // sku需要直接删除,避免数据库积累数据导致查询缓慢
- case DBInstanceSkuManager.Keyword(), ElasticcacheSkuManager.Keyword(), ServerSkuManager.Keyword():
- sql = fmt.Sprintf(
- "delete from %s where %s in (%s)",
- self.manager.TableSpec().Name(), self.key, placeholder,
- )
- case SecurityGroupRuleManager.Keyword():
- sql = fmt.Sprintf(
- "delete from %s where %s in (%s)",
- self.manager.TableSpec().Name(), self.key, placeholder,
- )
- case NetworkAdditionalWireManager.Keyword():
- sql = fmt.Sprintf("delete from `%s` where `wire_id` in (%s)",
- self.manager.TableSpec().Name(), placeholder,
- )
- default:
- vars = append([]interface{}{time.Now()}, vars...)
- }
- lockman.LockRawObject(ctx, self.manager.Keyword(), "purge")
- defer lockman.ReleaseRawObject(ctx, self.manager.Keyword(), "purge")
- _, err = sqlchemy.GetDB().Exec(
- sql, vars...,
- )
- if err != nil {
- return errors.Wrapf(err, strings.ReplaceAll(sql, "?", "%s"), vars...)
- }
- return nil
- }
- var splitByLen = func(data []string, splitLen int) [][]string {
- var result [][]string
- for i := 0; i < len(data); i += splitLen {
- end := i + splitLen
- if end > len(data) {
- end = len(data)
- }
- result = append(result, data[i:end])
- }
- return result
- }
- idsArr := splitByLen(purgeIds, 100)
- for i := range idsArr {
- err = purge(idsArr[i])
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SZone) purgeStorages(ctx context.Context, managerId string) error {
- storages := StorageManager.Query("id").Equals("manager_id", managerId).Equals("zone_id", self.Id)
- schedtags := StorageschedtagManager.Query("row_id").In("storage_id", storages.SubQuery())
- snapshots := SnapshotManager.Query("id").In("storage_id", storages.SubQuery()).IsTrue("fake_deleted")
- hoststorages := HoststorageManager.Query("row_id").In("storage_id", storages.SubQuery())
- disks := DiskManager.Query("id").In("storage_id", storages.SubQuery())
- diskbackups := DiskBackupManager.Query("id").In("disk_id", disks.SubQuery())
- guestdisks := GuestdiskManager.Query("row_id").In("disk_id", disks.SubQuery())
- diskpolicies := SnapshotPolicyResourceManager.Query("resource_id").In("resource_id", disks.SubQuery())
- pairs := []purgePair{
- {manager: SnapshotPolicyResourceManager, key: "resource_id", q: diskpolicies},
- {manager: GuestdiskManager, key: "row_id", q: guestdisks},
- {manager: SnapshotManager, key: "id", q: snapshots},
- {manager: DiskBackupManager, key: "id", q: diskbackups},
- {manager: DiskManager, key: "id", q: disks},
- {manager: StorageschedtagManager, key: "row_id", q: schedtags},
- {manager: HoststorageManager, key: "row_id", q: hoststorages},
- {manager: StorageManager, key: "id", q: storages},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SStorage) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- schedtags := StorageschedtagManager.Query("row_id").Equals("storage_id", self.Id)
- snapshots := SnapshotManager.Query("id").Equals("storage_id", self.Id).IsTrue("fake_deleted")
- hoststorages := HoststorageManager.Query("row_id").Equals("storage_id", self.Id)
- disks := DiskManager.Query("id").Equals("storage_id", self.Id)
- diskbackups := DiskBackupManager.Query("id").In("disk_id", disks.SubQuery())
- guestdisks := GuestdiskManager.Query("row_id").In("disk_id", disks.SubQuery())
- pairs := []purgePair{
- {manager: GuestdiskManager, key: "row_id", q: guestdisks},
- {manager: SnapshotManager, key: "id", q: snapshots},
- {manager: DiskBackupManager, key: "id", q: diskbackups},
- {manager: DiskManager, key: "id", q: disks},
- {manager: StorageschedtagManager, key: "row_id", q: schedtags},
- {manager: HoststorageManager, key: "row_id", q: hoststorages},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
- }
- func (self *SZone) purgeHosts(ctx context.Context, managerId string) error {
- hosts := HostManager.Query("id").Equals("manager_id", managerId).Equals("zone_id", self.Id)
- isolateds := IsolatedDeviceManager.Query("id").In("host_id", hosts.SubQuery())
- hoststorages := HoststorageManager.Query("row_id").In("host_id", hosts.SubQuery())
- hostbackupStorages := HostBackupstorageManager.Query("row_id").In("host_id", hosts.SubQuery())
- hostwires := HostwireManagerDeprecated.Query("row_id").In("host_id", hosts.SubQuery())
- guests := GuestManager.Query("id").In("host_id", hosts.SubQuery())
- guestdisks := GuestdiskManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestnetworks := GuestnetworkManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestcdroms := GuestcdromManager.Query("row_id").In("id", guests.SubQuery())
- guestvfd := GuestFloppyManager.Query("row_id").In("id", guests.SubQuery())
- guestgroups := GroupguestManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestsecgroups := GuestsecgroupManager.Query("row_id").In("guest_id", guests.SubQuery())
- instancesnapshots := InstanceSnapshotManager.Query("id").In("guest_id", guests.SubQuery())
- instancebackups := InstanceBackupManager.Query("id").In("guest_id", guests.SubQuery())
- publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
- Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).In("associate_id", guests.SubQuery())
- tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceHost).In("target_id", hosts.SubQuery())
- tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
- tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowVSwitch).In("source_id", hosts.SubQuery())
- backends := LoadbalancerBackendManager.Query("id").In("backend_id", hosts.SubQuery())
- hostnetworks := HostnetworkManager.Query("row_id").In("baremetal_id", hosts.SubQuery())
- netinterfaces := NetInterfaceManager.Query("baremetal_id").In("baremetal_id", hosts.SubQuery())
- storageIds := HoststorageManager.Query("storage_id").In("host_id", hosts.SubQuery())
- storages := StorageManager.Query("id").Equals("storage_type", api.STORAGE_BAREMETAL).In("id", storageIds.SubQuery())
- guestTapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceGuest).In("target_id", guests.SubQuery())
- guestTapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
- guestTapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowGuestNic).In("source_id", guests.SubQuery())
- guestBackends := LoadbalancerBackendManager.Query("id").In("backend_id", guests.SubQuery())
- pairs := []purgePair{
- {manager: LoadbalancerBackendManager, key: "id", q: guestBackends},
- {manager: NetTapFlowManager, key: "id", q: guestTapNics},
- {manager: NetTapFlowManager, key: "id", q: guestTapFlows},
- {manager: NetTapServiceManager, key: "id", q: guestTapService},
- {manager: StorageManager, key: "id", q: storages},
- {manager: NetInterfaceManager, key: "baremetal_id", q: netinterfaces},
- {manager: HostnetworkManager, key: "row_id", q: hostnetworks},
- {manager: LoadbalancerBackendManager, key: "id", q: backends},
- {manager: NetTapFlowManager, key: "id", q: tapNics},
- {manager: NetTapFlowManager, key: "id", q: tapFlows},
- {manager: NetTapServiceManager, key: "id", q: tapService},
- {manager: ElasticipManager, key: "id", q: publicIps},
- {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
- {manager: GroupguestManager, key: "row_id", q: guestgroups},
- {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
- {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
- {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
- {manager: GuestdiskManager, key: "row_id", q: guestdisks},
- {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
- {manager: InstanceBackupManager, key: "id", q: instancebackups},
- {manager: GuestManager, key: "id", q: guests},
- {manager: HoststorageManager, key: "row_id", q: hoststorages},
- {manager: HostBackupstorageManager, key: "row_id", q: hostbackupStorages},
- {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
- {manager: IsolatedDeviceManager, key: "id", q: isolateds},
- {manager: HostManager, key: "id", q: hosts},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (self *SHost) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- isolateds := IsolatedDeviceManager.Query("id").Equals("host_id", self.Id)
- hoststorages := HoststorageManager.Query("row_id").Equals("host_id", self.Id)
- hostbackupStorages := HostBackupstorageManager.Query("row_id").Equals("host_id", self.Id)
- hostwires := HostwireManagerDeprecated.Query("row_id").Equals("host_id", self.Id)
- guests := GuestManager.Query("id").Equals("host_id", self.Id)
- guestdisks := GuestdiskManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestnetworks := GuestnetworkManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestcdroms := GuestcdromManager.Query("row_id").In("id", guests.SubQuery())
- guestvfd := GuestFloppyManager.Query("row_id").In("id", guests.SubQuery())
- guestgroups := GroupguestManager.Query("row_id").In("guest_id", guests.SubQuery())
- guestsecgroups := GuestsecgroupManager.Query("row_id").In("guest_id", guests.SubQuery())
- instancesnapshots := InstanceSnapshotManager.Query("id").In("guest_id", guests.SubQuery())
- instancebackups := InstanceBackupManager.Query("id").In("guest_id", guests.SubQuery())
- publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
- Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).In("associate_id", guests.SubQuery())
- tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceHost).Equals("target_id", self.Id)
- tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
- tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowVSwitch).Equals("source_id", self.Id)
- backends := LoadbalancerBackendManager.Query("id").Equals("backend_id", self.Id)
- hostnetworks := HostnetworkManager.Query("row_id").Equals("baremetal_id", self.Id)
- netinterfaces := NetInterfaceManager.Query("baremetal_id").Equals("baremetal_id", self.Id)
- storageIds := HoststorageManager.Query("storage_id").Equals("host_id", self.Id)
- storages := StorageManager.Query("id").Equals("storage_type", api.STORAGE_BAREMETAL).In("id", storageIds.SubQuery())
- pairs := []purgePair{
- {manager: StorageManager, key: "id", q: storages},
- {manager: NetInterfaceManager, key: "baremetal_id", q: netinterfaces},
- {manager: HostnetworkManager, key: "row_id", q: hostnetworks},
- {manager: LoadbalancerBackendManager, key: "id", q: backends},
- {manager: NetTapFlowManager, key: "id", q: tapNics},
- {manager: NetTapFlowManager, key: "id", q: tapFlows},
- {manager: NetTapServiceManager, key: "id", q: tapService},
- {manager: ElasticipManager, key: "id", q: publicIps},
- {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
- {manager: GroupguestManager, key: "row_id", q: guestgroups},
- {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
- {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
- {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
- {manager: GuestdiskManager, key: "row_id", q: guestdisks},
- {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
- {manager: InstanceBackupManager, key: "id", q: instancebackups},
- {manager: GuestManager, key: "id", q: guests},
- {manager: HoststorageManager, key: "row_id", q: hoststorages},
- {manager: HostBackupstorageManager, key: "row_id", q: hostbackupStorages},
- {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
- {manager: IsolatedDeviceManager, key: "id", q: isolateds},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- defer func() {
- HostManager.ClearSchedDescCache(self.Id)
- }()
- return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
- }
- func (self *SGuest) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- guestdisks := GuestdiskManager.Query("row_id").Equals("guest_id", self.Id)
- guestnetworks := GuestnetworkManager.Query("row_id").Equals("guest_id", self.Id)
- // 辅助IP
- networkaddress := NetworkAddressManager.Query("id").In("parent_id", guestnetworks.SubQuery())
- guestcdroms := GuestcdromManager.Query("row_id").Equals("id", self.Id)
- guestvfd := GuestFloppyManager.Query("row_id").Equals("id", self.Id)
- guestgroups := GroupguestManager.Query("row_id").Equals("guest_id", self.Id)
- guestsecgroups := GuestsecgroupManager.Query("row_id").Equals("guest_id", self.Id)
- // instancesnapshots := InstanceSnapshotManager.Query("id").Equals("guest_id", self.Id)
- // instancebackups := InstanceBackupManager.Query("id").Equals("guest_id", self.Id)
- publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
- Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).Equals("associate_id", self.Id)
- tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceGuest).Equals("target_id", self.Id)
- tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
- tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowGuestNic).Equals("source_id", self.Id)
- backends := LoadbalancerBackendManager.Query("id").Equals("backend_id", self.Id)
- pairs := []purgePair{
- {manager: LoadbalancerBackendManager, key: "id", q: backends},
- {manager: NetTapFlowManager, key: "id", q: tapNics},
- {manager: NetTapFlowManager, key: "id", q: tapFlows},
- {manager: NetTapServiceManager, key: "id", q: tapService},
- {manager: ElasticipManager, key: "id", q: publicIps},
- {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
- {manager: GroupguestManager, key: "row_id", q: guestgroups},
- {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
- {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
- {manager: NetworkAddressManager, key: "id", q: networkaddress},
- {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
- {manager: GuestdiskManager, key: "row_id", q: guestdisks},
- // {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
- // {manager: InstanceBackupManager, key: "id", q: instancebackups},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- eip, _ := self.GetElasticIp()
- if eip != nil {
- eip.Dissociate(ctx, userCred)
- }
- return self.SVirtualResourceBase.Delete(ctx, userCred)
- }
- func (self *SZone) purgeWires(ctx context.Context, managerId string) error {
- wires := WireManager.Query("id").Equals("zone_id", self.Id).Equals("manager_id", managerId)
- // vpcs := VpcManager.Query().SubQuery()
- // wires = wires.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))).
- // Filter(sqlchemy.Equals(vpcs.Field("manager_id"), managerId))
- hostwires := HostwireManagerDeprecated.Query("row_id").In("wire_id", wires.SubQuery())
- isolateds := IsolatedDeviceManager.Query("id").In("wire_id", wires.SubQuery())
- networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
- bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- guestnetworks := GuestnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
- netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
- nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
- sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
- schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
- pairs := []purgePair{
- {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
- {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
- {manager: ReservedipManager, key: "id", q: rips},
- {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
- {manager: NetworkAddressManager, key: "id", q: netaddrs},
- {manager: NetworkIpMacManager, key: "id", q: netmacs},
- {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
- {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
- {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
- {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
- {manager: HostnetworkManager, key: "row_id", q: bns},
- {manager: NetworkManager, key: "id", q: networks},
- {manager: IsolatedDeviceManager, key: "id", q: isolateds},
- {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
- {manager: NetworkAdditionalWireManager, key: "id", q: wires},
- {manager: WireManager, key: "id", q: wires},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (cprvd *SCloudprovider) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- cprs := CloudproviderRegionManager.Query("row_id").Equals("cloudprovider_id", cprvd.Id)
- capability := CloudproviderCapabilityManager.Query("cloudprovider_id").Equals("cloudprovider_id", cprvd.Id)
- cdn := CDNDomainManager.Query("id").Equals("manager_id", cprvd.Id)
- vpcs := GlobalVpcManager.Query("id").Equals("manager_id", cprvd.Id)
- secgroups := SecurityGroupManager.Query("id").In("globalvpc_id", vpcs.SubQuery())
- rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
- intervpcs := InterVpcNetworkManager.Query("id").Equals("manager_id", cprvd.Id)
- intervpcnetworks := InterVpcNetworkVpcManager.Query("row_id").In("inter_vpc_network_id", intervpcs.SubQuery())
- dnszones := DnsZoneManager.Query("id").Equals("manager_id", cprvd.Id)
- records := DnsRecordManager.Query("id").In("dns_zone_id", dnszones.SubQuery())
- dnsVpcs := DnsZoneVpcManager.Query("row_id").In("dns_zone_id", dnszones.SubQuery())
- ssls := SSLCertificateManager.Query("id").Equals("manager_id", cprvd.Id)
- quotas := CloudproviderQuotaManager.Query("id").Equals("manager_id", cprvd.Id)
- pairs := []purgePair{
- {manager: CloudproviderQuotaManager, key: "id", q: quotas},
- {manager: SSLCertificateManager, key: "id", q: ssls},
- {manager: DnsZoneVpcManager, key: "row_id", q: dnsVpcs},
- {manager: DnsRecordManager, key: "id", q: records},
- {manager: DnsZoneManager, key: "id", q: dnszones},
- {manager: InterVpcNetworkVpcManager, key: "row_id", q: intervpcnetworks},
- {manager: InterVpcNetworkManager, key: "id", q: intervpcs},
- {manager: SecurityGroupRuleManager, key: "id", q: rules},
- {manager: SecurityGroupManager, key: "id", q: secgroups},
- {manager: GlobalVpcManager, key: "id", q: vpcs},
- {manager: CDNDomainManager, key: "id", q: cdn},
- {manager: CloudproviderRegionManager, key: "row_id", q: cprs},
- {manager: CloudproviderCapabilityManager, key: "cloudprovider_id", q: capability},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return cprvd.SEnabledStatusStandaloneResourceBase.Delete(ctx, userCred)
- }
- func (caccount *SCloudaccount) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
- projects := ExternalProjectManager.Query("id").Equals("cloudaccount_id", caccount.Id)
- pairs := []purgePair{
- {manager: ExternalProjectManager, key: "id", q: projects},
- }
- for i := range pairs {
- err := pairs[i].purgeAll(ctx)
- if err != nil {
- return err
- }
- }
- return caccount.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
- }
|