mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-05-06 21:52:54 +08:00
965 lines
44 KiB
Go
965 lines
44 KiB
Go
// 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)
|
||
}
|