purge.go 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package models
  15. import (
  16. "context"
  17. "database/sql"
  18. "fmt"
  19. "strings"
  20. "time"
  21. "yunion.io/x/pkg/errors"
  22. "yunion.io/x/sqlchemy"
  23. api "yunion.io/x/onecloud/pkg/apis/compute"
  24. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  25. "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
  26. "yunion.io/x/onecloud/pkg/mcclient"
  27. )
  28. func (self *SCloudregion) purgeAll(ctx context.Context, managerId string) error {
  29. err := self.purgeAccessGroups(ctx, managerId)
  30. if err != nil {
  31. return errors.Wrapf(err, "purgeAccessGroups")
  32. }
  33. err = self.purgeApps(ctx, managerId)
  34. if err != nil {
  35. return errors.Wrapf(err, "purgeApps")
  36. }
  37. err = self.purgeLoadbalancers(ctx, managerId)
  38. if err != nil {
  39. return errors.Wrapf(err, "purgeLoadbalancers")
  40. }
  41. err = self.purgeKubeClusters(ctx, managerId)
  42. if err != nil {
  43. return errors.Wrapf(err, "purgeKubeClusters")
  44. }
  45. err = self.purgeRds(ctx, managerId)
  46. if err != nil {
  47. return errors.Wrapf(err, "purgeRds")
  48. }
  49. err = self.purgeRedis(ctx, managerId)
  50. if err != nil {
  51. return errors.Wrapf(err, "purgeRedis")
  52. }
  53. err = self.purgeVpcs(ctx, managerId)
  54. if err != nil {
  55. return errors.Wrapf(err, "purgeVpcs")
  56. }
  57. err = self.purgeResources(ctx, managerId)
  58. if err != nil {
  59. return errors.Wrapf(err, "purgeResources")
  60. }
  61. err = self.purgeQuotas(ctx, managerId)
  62. if err != nil {
  63. return errors.Wrapf(err, "purgeQuotas")
  64. }
  65. // fix #20036 避免regional子网未删除, 导致zone残留
  66. zones, err := self.GetZones()
  67. if err != nil {
  68. return errors.Wrapf(err, "GetZones")
  69. }
  70. for i := range zones {
  71. lockman.LockObject(ctx, &zones[i])
  72. defer lockman.ReleaseObject(ctx, &zones[i])
  73. err = zones[i].purgeAll(ctx, managerId)
  74. if err != nil {
  75. return errors.Wrapf(err, "zone purgeAll %s", zones[i].Name)
  76. }
  77. }
  78. cprCount, err := CloudproviderRegionManager.Query().Equals("cloudregion_id", self.Id).NotEquals("cloudprovider_id", managerId).CountWithError()
  79. if err != nil {
  80. return errors.Wrapf(err, "cpr count")
  81. }
  82. // 部分cloudprovider依然有此region, 避免直接删除
  83. if cprCount > 0 {
  84. return nil
  85. }
  86. err = self.ValidateDeleteCondition(ctx, nil)
  87. if err != nil {
  88. return nil
  89. }
  90. // 资源清理完成后, 清理region下面的套餐
  91. err = self.purgeSkuResources(ctx)
  92. if err != nil {
  93. return errors.Wrapf(err, "purgeSkuResources")
  94. }
  95. return self.SEnabledStatusStandaloneResourceBase.Delete(ctx, nil)
  96. }
  97. func (self *SCloudregion) purgeSkuResources(ctx context.Context) error {
  98. rdsSkus := DBInstanceSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  99. redisSkus := ElasticcacheSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  100. artsSkus := ModelartsPoolSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  101. nasSkus := NasSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  102. natSkus := NatSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  103. skus := ServerSkuManager.Query("id").Equals("cloudregion_id", self.Id)
  104. pairs := []purgePair{
  105. {manager: ServerSkuManager, key: "id", q: skus},
  106. {manager: NatSkuManager, key: "id", q: natSkus},
  107. {manager: NasSkuManager, key: "id", q: nasSkus},
  108. {manager: ModelartsPoolSkuManager, key: "id", q: artsSkus},
  109. {manager: ElasticcacheSkuManager, key: "id", q: redisSkus},
  110. {manager: DBInstanceSkuManager, key: "id", q: rdsSkus},
  111. }
  112. for i := range pairs {
  113. err := pairs[i].purgeAll(ctx)
  114. if err != nil {
  115. return err
  116. }
  117. }
  118. return nil
  119. }
  120. func (self *SCloudregion) purgeVpcs(ctx context.Context, managerId string) error {
  121. vpcs := VpcManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  122. wires := WireManager.Query("id").In("vpc_id", vpcs.SubQuery())
  123. networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
  124. bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  125. rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  126. groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  127. lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  128. netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
  129. netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
  130. nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  131. rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
  132. sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  133. schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
  134. nats := NatGatewayManager.Query("id").In("vpc_id", vpcs.SubQuery())
  135. stables := NatSEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
  136. secgroups := SecurityGroupManager.Query("id").In("vpc_id", vpcs.SubQuery())
  137. rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
  138. dtables := NatDEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
  139. routes := RouteTableManager.Query("id").In("vpc_id", vpcs.SubQuery())
  140. intervpcroutes := InterVpcNetworkRouteSetManager.Query("id").In("vpc_id", vpcs.SubQuery())
  141. peers := VpcPeeringConnectionManager.Query("id").In("vpc_id", vpcs.SubQuery())
  142. ipv6 := IPv6GatewayManager.Query("id").In("vpc_id", vpcs.SubQuery())
  143. pairs := []purgePair{
  144. {manager: SecurityGroupRuleManager, key: "id", q: rules},
  145. {manager: SecurityGroupManager, key: "id", q: secgroups},
  146. {manager: IPv6GatewayManager, key: "id", q: ipv6},
  147. {manager: VpcPeeringConnectionManager, key: "id", q: peers},
  148. {manager: InterVpcNetworkRouteSetManager, key: "id", q: intervpcroutes},
  149. {manager: RouteTableManager, key: "id", q: routes},
  150. {manager: NatDEntryManager, key: "id", q: dtables},
  151. {manager: NatSEntryManager, key: "id", q: stables},
  152. {manager: NatGatewayManager, key: "id", q: nats},
  153. {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
  154. {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
  155. {manager: ReservedipManager, key: "id", q: rips},
  156. {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
  157. {manager: NetworkAddressManager, key: "id", q: netaddrs},
  158. {manager: NetworkIpMacManager, key: "id", q: netmacs},
  159. {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
  160. {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
  161. {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
  162. {manager: HostnetworkManager, key: "row_id", q: bns},
  163. {manager: NetworkManager, key: "id", q: networks},
  164. {manager: WireManager, key: "id", q: wires},
  165. {manager: VpcManager, key: "id", q: vpcs},
  166. }
  167. for i := range pairs {
  168. err := pairs[i].purgeAll(ctx)
  169. if err != nil {
  170. return err
  171. }
  172. }
  173. return nil
  174. }
  175. func (self *SVpc) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  176. wires := WireManager.Query("id").Equals("vpc_id", self.Id)
  177. networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
  178. bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  179. rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  180. groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  181. lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  182. netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
  183. netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
  184. nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  185. rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
  186. sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  187. schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
  188. nats := NatGatewayManager.Query("id").Equals("vpc_id", self.Id)
  189. stables := NatSEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
  190. dtables := NatDEntryManager.Query("id").In("natgateway_id", nats.SubQuery())
  191. routes := RouteTableManager.Query("id").Equals("vpc_id", self.Id)
  192. dnszones := DnsZoneVpcManager.Query("row_id").Equals("vpc_id", self.Id)
  193. intervpcroutes := InterVpcNetworkRouteSetManager.Query("id").Equals("vpc_id", self.Id)
  194. ipv6 := IPv6GatewayManager.Query("id").Equals("vpc_id", self.Id)
  195. secgroups := SecurityGroupManager.Query("id").Equals("vpc_id", self.Id)
  196. rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
  197. pairs := []purgePair{
  198. {manager: SecurityGroupRuleManager, key: "id", q: rules},
  199. {manager: SecurityGroupManager, key: "id", q: secgroups},
  200. {manager: IPv6GatewayManager, key: "id", q: ipv6},
  201. {manager: InterVpcNetworkRouteSetManager, key: "id", q: intervpcroutes},
  202. {manager: DnsZoneVpcManager, key: "row_id", q: dnszones},
  203. {manager: RouteTableManager, key: "id", q: routes},
  204. {manager: NatDEntryManager, key: "id", q: dtables},
  205. {manager: NatSEntryManager, key: "id", q: stables},
  206. {manager: NatGatewayManager, key: "id", q: nats},
  207. {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
  208. {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
  209. {manager: ReservedipManager, key: "id", q: rips},
  210. {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
  211. {manager: NetworkAddressManager, key: "id", q: netaddrs},
  212. {manager: NetworkIpMacManager, key: "id", q: netmacs},
  213. {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
  214. {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
  215. {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
  216. {manager: HostnetworkManager, key: "row_id", q: bns},
  217. {manager: NetworkManager, key: "id", q: networks},
  218. {manager: WireManager, key: "id", q: wires},
  219. }
  220. for i := range pairs {
  221. err := pairs[i].purgeAll(ctx)
  222. if err != nil {
  223. return err
  224. }
  225. }
  226. return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
  227. }
  228. func (self *SNetworkInterface) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  229. nis := NetworkinterfacenetworkManager.Query("row_id").In("networkinterface_id", self.Id)
  230. pairs := []purgePair{
  231. {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
  232. }
  233. for i := range pairs {
  234. err := pairs[i].purgeAll(ctx)
  235. if err != nil {
  236. return err
  237. }
  238. }
  239. return self.SModelBase.Delete(ctx, userCred)
  240. }
  241. func (self *SNatGateway) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  242. stables := NatSEntryManager.Query("id").Equals("natgateway_id", self.Id)
  243. dtables := NatDEntryManager.Query("id").Equals("natgateway_id", self.Id)
  244. pairs := []purgePair{
  245. {manager: NatDEntryManager, key: "id", q: dtables},
  246. {manager: NatSEntryManager, key: "id", q: stables},
  247. }
  248. for i := range pairs {
  249. err := pairs[i].purgeAll(ctx)
  250. if err != nil {
  251. return err
  252. }
  253. }
  254. return self.SInfrasResourceBase.Delete(ctx, userCred)
  255. }
  256. func (self *SCloudregion) purgeQuotas(ctx context.Context, managerId string) error {
  257. quotas := CloudproviderQuotaManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  258. pairs := []purgePair{
  259. {manager: CloudproviderQuotaManager, key: "id", q: quotas},
  260. }
  261. for i := range pairs {
  262. err := pairs[i].purgeAll(ctx)
  263. if err != nil {
  264. return err
  265. }
  266. }
  267. return nil
  268. }
  269. func (self *SCloudregion) purgeResources(ctx context.Context, managerId string) error {
  270. buckets := BucketManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  271. ess := ElasticSearchManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  272. eips := ElasticipManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  273. kafkas := KafkaManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  274. misc := MiscResourceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  275. arts := ModelartsPoolManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  276. mongodbs := MongoDBManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  277. nics := NetworkInterfaceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  278. nicips := NetworkinterfacenetworkManager.Query("row_id").In("networkinterface_id", nics.SubQuery())
  279. secgroups := SecurityGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  280. rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
  281. policies := SnapshotPolicyManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  282. snapshots := SnapshotManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  283. tables := TablestoreManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  284. wafs := WafInstanceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  285. ipsets := WafIPSetManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  286. regsets := WafRegexSetManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  287. wafgroups := WafRuleGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  288. cprs := CloudproviderRegionManager.Query("row_id").Equals("cloudprovider_id", managerId).Equals("cloudregion_id", self.Id)
  289. pairs := []purgePair{
  290. {manager: CloudproviderRegionManager, key: "row_id", q: cprs},
  291. {manager: WafRuleGroupManager, key: "id", q: wafgroups},
  292. {manager: WafRegexSetManager, key: "id", q: regsets},
  293. {manager: WafIPSetManager, key: "id", q: ipsets},
  294. {manager: WafInstanceManager, key: "id", q: wafs},
  295. {manager: TablestoreManager, key: "id", q: tables},
  296. {manager: SnapshotManager, key: "id", q: snapshots},
  297. {manager: SnapshotPolicyManager, key: "id", q: policies},
  298. {manager: SecurityGroupRuleManager, key: "id", q: rules},
  299. {manager: SecurityGroupManager, key: "id", q: secgroups},
  300. {manager: NetworkinterfacenetworkManager, key: "row_id", q: nicips},
  301. {manager: NetworkInterfaceManager, key: "id", q: nics},
  302. {manager: MongoDBManager, key: "id", q: mongodbs},
  303. {manager: ModelartsPoolManager, key: "id", q: arts},
  304. {manager: MiscResourceManager, key: "id", q: misc},
  305. {manager: KafkaManager, key: "id", q: kafkas},
  306. {manager: ElasticipManager, key: "id", q: eips},
  307. {manager: ElasticSearchManager, key: "id", q: ess},
  308. {manager: BucketManager, key: "id", q: buckets},
  309. }
  310. for i := range pairs {
  311. err := pairs[i].purgeAll(ctx)
  312. if err != nil {
  313. return err
  314. }
  315. }
  316. return nil
  317. }
  318. func (self *SCloudregion) purgeRedis(ctx context.Context, managerId string) error {
  319. vpcs := VpcManager.Query("id").Equals("cloudregion_id", self.Id).Equals("manager_id", managerId)
  320. redis := ElasticcacheManager.Query("id").In("vpc_id", vpcs.SubQuery())
  321. redisAcls := ElasticcacheAclManager.Query("id").In("elasticcache_id", redis.SubQuery())
  322. backups := ElasticcacheBackupManager.Query("id").In("elasticcache_id", redis.SubQuery())
  323. parameters := ElasticcacheParameterManager.Query("id").In("elasticcache_id", redis.SubQuery())
  324. secgroups := ElasticcachesecgroupManager.Query("row_id").In("elasticcache_id", redis.SubQuery())
  325. accounts := ElasticcacheAccountManager.Query("id").In("elasticcache_id", redis.SubQuery())
  326. pairs := []purgePair{
  327. {manager: ElasticcacheAccountManager, key: "id", q: accounts},
  328. {manager: ElasticcachesecgroupManager, key: "row_id", q: secgroups},
  329. {manager: ElasticcacheParameterManager, key: "id", q: parameters},
  330. {manager: ElasticcacheBackupManager, key: "id", q: backups},
  331. {manager: ElasticcacheAclManager, key: "id", q: redisAcls},
  332. {manager: ElasticcacheManager, key: "id", q: redis},
  333. }
  334. for i := range pairs {
  335. err := pairs[i].purgeAll(ctx)
  336. if err != nil {
  337. return err
  338. }
  339. }
  340. return nil
  341. }
  342. func (self *SCloudregion) purgeRds(ctx context.Context, managerId string) error {
  343. rds := DBInstanceManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  344. rdsNetworks := DBInstanceNetworkManager.Query("row_id").In("dbinstance_id", rds.SubQuery())
  345. rdsBackups := DBInstanceBackupManager.Query("id").In("dbinstance_id", rds.SubQuery())
  346. rdsAccounts := DBInstanceAccountManager.Query("id").In("dbinstance_id", rds.SubQuery())
  347. rdsSecgroups := DBInstanceSecgroupManager.Query("row_id").In("dbinstance_id", rds.SubQuery())
  348. rdsDbs := DBInstanceDatabaseManager.Query("id").In("dbinstance_id", rds.SubQuery())
  349. rdsParamenters := DBInstanceParameterManager.Query("id").In("dbinstance_id", rds.SubQuery())
  350. rdsPrivileges := DBInstancePrivilegeManager.Query("id").In("dbinstanceaccount_id", rdsAccounts.SubQuery())
  351. pairs := []purgePair{
  352. {manager: DBInstancePrivilegeManager, key: "id", q: rdsPrivileges},
  353. {manager: DBInstanceParameterManager, key: "id", q: rdsParamenters},
  354. {manager: DBInstanceDatabaseManager, key: "id", q: rdsDbs},
  355. {manager: DBInstanceSecgroupManager, key: "row_id", q: rdsSecgroups},
  356. {manager: DBInstanceAccountManager, key: "id", q: rdsAccounts},
  357. {manager: DBInstanceBackupManager, key: "id", q: rdsBackups},
  358. {manager: DBInstanceNetworkManager, key: "row_id", q: rdsNetworks},
  359. {manager: DBInstanceManager, key: "id", q: rds},
  360. }
  361. for i := range pairs {
  362. err := pairs[i].purgeAll(ctx)
  363. if err != nil {
  364. return err
  365. }
  366. }
  367. return nil
  368. }
  369. func (self *SDBInstance) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  370. rdsNetworks := DBInstanceNetworkManager.Query("row_id").Equals("dbinstance_id", self.Id)
  371. rdsBackups := DBInstanceBackupManager.Query("id").Equals("dbinstance_id", self.Id)
  372. rdsAccounts := DBInstanceAccountManager.Query("id").Equals("dbinstance_id", self.Id)
  373. rdsSecgroups := DBInstanceSecgroupManager.Query("row_id").Equals("dbinstance_id", self.Id)
  374. rdsDbs := DBInstanceDatabaseManager.Query("id").Equals("dbinstance_id", self.Id)
  375. rdsParamenters := DBInstanceParameterManager.Query("id").Equals("dbinstance_id", self.Id)
  376. rdsPrivileges := DBInstancePrivilegeManager.Query("id").In("dbinstanceaccount_id", rdsAccounts.SubQuery())
  377. pairs := []purgePair{
  378. {manager: DBInstancePrivilegeManager, key: "id", q: rdsPrivileges},
  379. {manager: DBInstanceParameterManager, key: "id", q: rdsParamenters},
  380. {manager: DBInstanceDatabaseManager, key: "id", q: rdsDbs},
  381. {manager: DBInstanceSecgroupManager, key: "row_id", q: rdsSecgroups},
  382. {manager: DBInstanceAccountManager, key: "id", q: rdsAccounts},
  383. {manager: DBInstanceBackupManager, key: "id", q: rdsBackups},
  384. {manager: DBInstanceNetworkManager, key: "row_id", q: rdsNetworks},
  385. }
  386. for i := range pairs {
  387. err := pairs[i].purgeAll(ctx)
  388. if err != nil {
  389. return err
  390. }
  391. }
  392. return self.SVirtualResourceBase.Delete(ctx, userCred)
  393. }
  394. func (self *SCloudregion) purgeKubeClusters(ctx context.Context, managerId string) error {
  395. kubeClusters := KubeClusterManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  396. kubeNodes := KubeNodeManager.Query("id").In("cloud_kube_cluster_id", kubeClusters.SubQuery())
  397. kubePools := KubeNodePoolManager.Query("id").In("cloud_kube_cluster_id", kubeClusters.SubQuery())
  398. pairs := []purgePair{
  399. {manager: KubeNodePoolManager, key: "id", q: kubePools},
  400. {manager: KubeNodeManager, key: "id", q: kubeNodes},
  401. {manager: KubeClusterManager, key: "id", q: kubeClusters},
  402. }
  403. for i := range pairs {
  404. err := pairs[i].purgeAll(ctx)
  405. if err != nil {
  406. return err
  407. }
  408. }
  409. return nil
  410. }
  411. func (self *SCloudregion) purgeLoadbalancers(ctx context.Context, managerId string) error {
  412. lbs := LoadbalancerManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  413. lbnetworks := LoadbalancernetworkManager.Query("row_id").In("loadbalancer_id", lbs.SubQuery())
  414. lblis := LoadbalancerListenerManager.Query("id").In("loadbalancer_id", lbs.SubQuery())
  415. lbbgs := LoadbalancerBackendGroupManager.Query("id").In("loadbalancer_id", lbs.SubQuery())
  416. backends := LoadbalancerBackendManager.Query("id").In("backend_group_id", lbbgs.SubQuery())
  417. lbrules := LoadbalancerListenerRuleManager.Query("id").In("listener_id", lblis.SubQuery())
  418. pairs := []purgePair{
  419. {manager: LoadbalancerBackendManager, key: "id", q: backends},
  420. {manager: LoadbalancerListenerRuleManager, key: "id", q: lbrules},
  421. {manager: LoadbalancerBackendGroupManager, key: "id", q: lbbgs},
  422. {manager: LoadbalancerListenerManager, key: "id", q: lblis},
  423. {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
  424. {manager: LoadbalancerManager, key: "id", q: lbs},
  425. }
  426. for i := range pairs {
  427. err := pairs[i].purgeAll(ctx)
  428. if err != nil {
  429. return err
  430. }
  431. }
  432. return nil
  433. }
  434. func (self *SCloudregion) purgeApps(ctx context.Context, managerId string) error {
  435. apps := AppManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  436. envs := AppEnvironmentManager.Query("id").In("app_id", apps.SubQuery())
  437. pairs := []purgePair{
  438. {manager: AppEnvironmentManager, key: "id", q: envs},
  439. {manager: AppManager, key: "id", q: apps},
  440. }
  441. for i := range pairs {
  442. err := pairs[i].purgeAll(ctx)
  443. if err != nil {
  444. return err
  445. }
  446. }
  447. return nil
  448. }
  449. func (self *SCloudregion) purgeAccessGroups(ctx context.Context, managerId string) error {
  450. fs := FileSystemManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  451. ags := AccessGroupManager.Query("id").Equals("manager_id", managerId).Equals("cloudregion_id", self.Id)
  452. mts := MountTargetManager.Query("id").In("file_system_id", fs.SubQuery())
  453. rules := AccessGroupRuleManager.Query("id").In("access_group_id", ags.SubQuery())
  454. pairs := []purgePair{
  455. {manager: AccessGroupRuleManager, key: "id", q: rules},
  456. {manager: MountTargetManager, key: "id", q: mts},
  457. {manager: AccessGroupManager, key: "id", q: ags},
  458. {manager: FileSystemManager, key: "id", q: fs},
  459. }
  460. for i := range pairs {
  461. err := pairs[i].purgeAll(ctx)
  462. if err != nil {
  463. return err
  464. }
  465. }
  466. return nil
  467. }
  468. func (self *SZone) purgeAll(ctx context.Context, managerId string) error {
  469. err := self.purgeStorages(ctx, managerId)
  470. if err != nil {
  471. return errors.Wrapf(err, "purgeStorages")
  472. }
  473. err = self.purgeHosts(ctx, managerId)
  474. if err != nil {
  475. return errors.Wrapf(err, "purgeHosts")
  476. }
  477. err = self.purgeWires(ctx, managerId)
  478. if err != nil {
  479. return errors.Wrapf(err, "purgeWires")
  480. }
  481. err = self.ValidateDeleteCondition(ctx, nil)
  482. if err != nil {
  483. return nil
  484. }
  485. return self.SStandaloneResourceBase.Delete(ctx, nil)
  486. }
  487. type purgePair struct {
  488. manager db.IModelManager
  489. key string
  490. q *sqlchemy.SQuery
  491. }
  492. func (self *purgePair) queryIds() ([]string, error) {
  493. ids := []string{}
  494. sq := self.q.SubQuery()
  495. q := sq.Query(sq.Field(self.key)).Distinct()
  496. rows, err := q.Rows()
  497. if err != nil {
  498. if errors.Cause(err) == sql.ErrNoRows {
  499. return ids, nil
  500. }
  501. return ids, errors.Wrap(err, "Query")
  502. }
  503. defer rows.Close()
  504. for rows.Next() {
  505. var id string
  506. err := rows.Scan(&id)
  507. if err != nil {
  508. return ids, errors.Wrap(err, "rows.Scan")
  509. }
  510. ids = append(ids, id)
  511. }
  512. return ids, nil
  513. }
  514. func (self *purgePair) purgeAll(ctx context.Context) error {
  515. purgeIds, err := self.queryIds()
  516. if err != nil {
  517. return errors.Wrapf(err, "Query ids")
  518. }
  519. if len(purgeIds) == 0 {
  520. return nil
  521. }
  522. var purge = func(ids []string) error {
  523. vars := []interface{}{}
  524. placeholders := make([]string, len(ids))
  525. for i := range placeholders {
  526. placeholders[i] = "?"
  527. vars = append(vars, ids[i])
  528. }
  529. placeholder := strings.Join(placeholders, ",")
  530. sql := fmt.Sprintf(
  531. "update %s set deleted = true, deleted_at = ? where %s in (%s) and deleted = false",
  532. self.manager.TableSpec().Name(), self.key, placeholder,
  533. )
  534. switch self.manager.Keyword() {
  535. case GuestcdromManager.Keyword(), GuestFloppyManager.Keyword():
  536. sql = fmt.Sprintf(
  537. "update %s set image_id = null, updated_at = ? where %s in (%s) and image_id is not null",
  538. self.manager.TableSpec().Name(), self.key, placeholder,
  539. )
  540. vars = append([]interface{}{time.Now()}, vars...)
  541. case NetInterfaceManager.Keyword():
  542. sql = fmt.Sprintf(
  543. "delete from %s where %s in (%s)",
  544. self.manager.TableSpec().Name(), self.key, placeholder,
  545. )
  546. // sku需要直接删除,避免数据库积累数据导致查询缓慢
  547. case DBInstanceSkuManager.Keyword(), ElasticcacheSkuManager.Keyword(), ServerSkuManager.Keyword():
  548. sql = fmt.Sprintf(
  549. "delete from %s where %s in (%s)",
  550. self.manager.TableSpec().Name(), self.key, placeholder,
  551. )
  552. case SecurityGroupRuleManager.Keyword():
  553. sql = fmt.Sprintf(
  554. "delete from %s where %s in (%s)",
  555. self.manager.TableSpec().Name(), self.key, placeholder,
  556. )
  557. case NetworkAdditionalWireManager.Keyword():
  558. sql = fmt.Sprintf("delete from `%s` where `wire_id` in (%s)",
  559. self.manager.TableSpec().Name(), placeholder,
  560. )
  561. default:
  562. vars = append([]interface{}{time.Now()}, vars...)
  563. }
  564. lockman.LockRawObject(ctx, self.manager.Keyword(), "purge")
  565. defer lockman.ReleaseRawObject(ctx, self.manager.Keyword(), "purge")
  566. _, err = sqlchemy.GetDB().Exec(
  567. sql, vars...,
  568. )
  569. if err != nil {
  570. return errors.Wrapf(err, strings.ReplaceAll(sql, "?", "%s"), vars...)
  571. }
  572. return nil
  573. }
  574. var splitByLen = func(data []string, splitLen int) [][]string {
  575. var result [][]string
  576. for i := 0; i < len(data); i += splitLen {
  577. end := i + splitLen
  578. if end > len(data) {
  579. end = len(data)
  580. }
  581. result = append(result, data[i:end])
  582. }
  583. return result
  584. }
  585. idsArr := splitByLen(purgeIds, 100)
  586. for i := range idsArr {
  587. err = purge(idsArr[i])
  588. if err != nil {
  589. return err
  590. }
  591. }
  592. return nil
  593. }
  594. func (self *SZone) purgeStorages(ctx context.Context, managerId string) error {
  595. storages := StorageManager.Query("id").Equals("manager_id", managerId).Equals("zone_id", self.Id)
  596. schedtags := StorageschedtagManager.Query("row_id").In("storage_id", storages.SubQuery())
  597. snapshots := SnapshotManager.Query("id").In("storage_id", storages.SubQuery()).IsTrue("fake_deleted")
  598. hoststorages := HoststorageManager.Query("row_id").In("storage_id", storages.SubQuery())
  599. disks := DiskManager.Query("id").In("storage_id", storages.SubQuery())
  600. diskbackups := DiskBackupManager.Query("id").In("disk_id", disks.SubQuery())
  601. guestdisks := GuestdiskManager.Query("row_id").In("disk_id", disks.SubQuery())
  602. diskpolicies := SnapshotPolicyResourceManager.Query("resource_id").In("resource_id", disks.SubQuery())
  603. pairs := []purgePair{
  604. {manager: SnapshotPolicyResourceManager, key: "resource_id", q: diskpolicies},
  605. {manager: GuestdiskManager, key: "row_id", q: guestdisks},
  606. {manager: SnapshotManager, key: "id", q: snapshots},
  607. {manager: DiskBackupManager, key: "id", q: diskbackups},
  608. {manager: DiskManager, key: "id", q: disks},
  609. {manager: StorageschedtagManager, key: "row_id", q: schedtags},
  610. {manager: HoststorageManager, key: "row_id", q: hoststorages},
  611. {manager: StorageManager, key: "id", q: storages},
  612. }
  613. for i := range pairs {
  614. err := pairs[i].purgeAll(ctx)
  615. if err != nil {
  616. return err
  617. }
  618. }
  619. return nil
  620. }
  621. func (self *SStorage) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  622. schedtags := StorageschedtagManager.Query("row_id").Equals("storage_id", self.Id)
  623. snapshots := SnapshotManager.Query("id").Equals("storage_id", self.Id).IsTrue("fake_deleted")
  624. hoststorages := HoststorageManager.Query("row_id").Equals("storage_id", self.Id)
  625. disks := DiskManager.Query("id").Equals("storage_id", self.Id)
  626. diskbackups := DiskBackupManager.Query("id").In("disk_id", disks.SubQuery())
  627. guestdisks := GuestdiskManager.Query("row_id").In("disk_id", disks.SubQuery())
  628. pairs := []purgePair{
  629. {manager: GuestdiskManager, key: "row_id", q: guestdisks},
  630. {manager: SnapshotManager, key: "id", q: snapshots},
  631. {manager: DiskBackupManager, key: "id", q: diskbackups},
  632. {manager: DiskManager, key: "id", q: disks},
  633. {manager: StorageschedtagManager, key: "row_id", q: schedtags},
  634. {manager: HoststorageManager, key: "row_id", q: hoststorages},
  635. }
  636. for i := range pairs {
  637. err := pairs[i].purgeAll(ctx)
  638. if err != nil {
  639. return err
  640. }
  641. }
  642. return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
  643. }
  644. func (self *SZone) purgeHosts(ctx context.Context, managerId string) error {
  645. hosts := HostManager.Query("id").Equals("manager_id", managerId).Equals("zone_id", self.Id)
  646. isolateds := IsolatedDeviceManager.Query("id").In("host_id", hosts.SubQuery())
  647. hoststorages := HoststorageManager.Query("row_id").In("host_id", hosts.SubQuery())
  648. hostbackupStorages := HostBackupstorageManager.Query("row_id").In("host_id", hosts.SubQuery())
  649. hostwires := HostwireManagerDeprecated.Query("row_id").In("host_id", hosts.SubQuery())
  650. guests := GuestManager.Query("id").In("host_id", hosts.SubQuery())
  651. guestdisks := GuestdiskManager.Query("row_id").In("guest_id", guests.SubQuery())
  652. guestnetworks := GuestnetworkManager.Query("row_id").In("guest_id", guests.SubQuery())
  653. guestcdroms := GuestcdromManager.Query("row_id").In("id", guests.SubQuery())
  654. guestvfd := GuestFloppyManager.Query("row_id").In("id", guests.SubQuery())
  655. guestgroups := GroupguestManager.Query("row_id").In("guest_id", guests.SubQuery())
  656. guestsecgroups := GuestsecgroupManager.Query("row_id").In("guest_id", guests.SubQuery())
  657. instancesnapshots := InstanceSnapshotManager.Query("id").In("guest_id", guests.SubQuery())
  658. instancebackups := InstanceBackupManager.Query("id").In("guest_id", guests.SubQuery())
  659. publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
  660. Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).In("associate_id", guests.SubQuery())
  661. tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceHost).In("target_id", hosts.SubQuery())
  662. tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
  663. tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowVSwitch).In("source_id", hosts.SubQuery())
  664. backends := LoadbalancerBackendManager.Query("id").In("backend_id", hosts.SubQuery())
  665. hostnetworks := HostnetworkManager.Query("row_id").In("baremetal_id", hosts.SubQuery())
  666. netinterfaces := NetInterfaceManager.Query("baremetal_id").In("baremetal_id", hosts.SubQuery())
  667. storageIds := HoststorageManager.Query("storage_id").In("host_id", hosts.SubQuery())
  668. storages := StorageManager.Query("id").Equals("storage_type", api.STORAGE_BAREMETAL).In("id", storageIds.SubQuery())
  669. guestTapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceGuest).In("target_id", guests.SubQuery())
  670. guestTapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
  671. guestTapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowGuestNic).In("source_id", guests.SubQuery())
  672. guestBackends := LoadbalancerBackendManager.Query("id").In("backend_id", guests.SubQuery())
  673. pairs := []purgePair{
  674. {manager: LoadbalancerBackendManager, key: "id", q: guestBackends},
  675. {manager: NetTapFlowManager, key: "id", q: guestTapNics},
  676. {manager: NetTapFlowManager, key: "id", q: guestTapFlows},
  677. {manager: NetTapServiceManager, key: "id", q: guestTapService},
  678. {manager: StorageManager, key: "id", q: storages},
  679. {manager: NetInterfaceManager, key: "baremetal_id", q: netinterfaces},
  680. {manager: HostnetworkManager, key: "row_id", q: hostnetworks},
  681. {manager: LoadbalancerBackendManager, key: "id", q: backends},
  682. {manager: NetTapFlowManager, key: "id", q: tapNics},
  683. {manager: NetTapFlowManager, key: "id", q: tapFlows},
  684. {manager: NetTapServiceManager, key: "id", q: tapService},
  685. {manager: ElasticipManager, key: "id", q: publicIps},
  686. {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
  687. {manager: GroupguestManager, key: "row_id", q: guestgroups},
  688. {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
  689. {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
  690. {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
  691. {manager: GuestdiskManager, key: "row_id", q: guestdisks},
  692. {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
  693. {manager: InstanceBackupManager, key: "id", q: instancebackups},
  694. {manager: GuestManager, key: "id", q: guests},
  695. {manager: HoststorageManager, key: "row_id", q: hoststorages},
  696. {manager: HostBackupstorageManager, key: "row_id", q: hostbackupStorages},
  697. {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
  698. {manager: IsolatedDeviceManager, key: "id", q: isolateds},
  699. {manager: HostManager, key: "id", q: hosts},
  700. }
  701. for i := range pairs {
  702. err := pairs[i].purgeAll(ctx)
  703. if err != nil {
  704. return err
  705. }
  706. }
  707. return nil
  708. }
  709. func (self *SHost) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  710. isolateds := IsolatedDeviceManager.Query("id").Equals("host_id", self.Id)
  711. hoststorages := HoststorageManager.Query("row_id").Equals("host_id", self.Id)
  712. hostbackupStorages := HostBackupstorageManager.Query("row_id").Equals("host_id", self.Id)
  713. hostwires := HostwireManagerDeprecated.Query("row_id").Equals("host_id", self.Id)
  714. guests := GuestManager.Query("id").Equals("host_id", self.Id)
  715. guestdisks := GuestdiskManager.Query("row_id").In("guest_id", guests.SubQuery())
  716. guestnetworks := GuestnetworkManager.Query("row_id").In("guest_id", guests.SubQuery())
  717. guestcdroms := GuestcdromManager.Query("row_id").In("id", guests.SubQuery())
  718. guestvfd := GuestFloppyManager.Query("row_id").In("id", guests.SubQuery())
  719. guestgroups := GroupguestManager.Query("row_id").In("guest_id", guests.SubQuery())
  720. guestsecgroups := GuestsecgroupManager.Query("row_id").In("guest_id", guests.SubQuery())
  721. instancesnapshots := InstanceSnapshotManager.Query("id").In("guest_id", guests.SubQuery())
  722. instancebackups := InstanceBackupManager.Query("id").In("guest_id", guests.SubQuery())
  723. publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
  724. Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).In("associate_id", guests.SubQuery())
  725. tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceHost).Equals("target_id", self.Id)
  726. tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
  727. tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowVSwitch).Equals("source_id", self.Id)
  728. backends := LoadbalancerBackendManager.Query("id").Equals("backend_id", self.Id)
  729. hostnetworks := HostnetworkManager.Query("row_id").Equals("baremetal_id", self.Id)
  730. netinterfaces := NetInterfaceManager.Query("baremetal_id").Equals("baremetal_id", self.Id)
  731. storageIds := HoststorageManager.Query("storage_id").Equals("host_id", self.Id)
  732. storages := StorageManager.Query("id").Equals("storage_type", api.STORAGE_BAREMETAL).In("id", storageIds.SubQuery())
  733. pairs := []purgePair{
  734. {manager: StorageManager, key: "id", q: storages},
  735. {manager: NetInterfaceManager, key: "baremetal_id", q: netinterfaces},
  736. {manager: HostnetworkManager, key: "row_id", q: hostnetworks},
  737. {manager: LoadbalancerBackendManager, key: "id", q: backends},
  738. {manager: NetTapFlowManager, key: "id", q: tapNics},
  739. {manager: NetTapFlowManager, key: "id", q: tapFlows},
  740. {manager: NetTapServiceManager, key: "id", q: tapService},
  741. {manager: ElasticipManager, key: "id", q: publicIps},
  742. {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
  743. {manager: GroupguestManager, key: "row_id", q: guestgroups},
  744. {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
  745. {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
  746. {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
  747. {manager: GuestdiskManager, key: "row_id", q: guestdisks},
  748. {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
  749. {manager: InstanceBackupManager, key: "id", q: instancebackups},
  750. {manager: GuestManager, key: "id", q: guests},
  751. {manager: HoststorageManager, key: "row_id", q: hoststorages},
  752. {manager: HostBackupstorageManager, key: "row_id", q: hostbackupStorages},
  753. {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
  754. {manager: IsolatedDeviceManager, key: "id", q: isolateds},
  755. }
  756. for i := range pairs {
  757. err := pairs[i].purgeAll(ctx)
  758. if err != nil {
  759. return err
  760. }
  761. }
  762. defer func() {
  763. HostManager.ClearSchedDescCache(self.Id)
  764. }()
  765. return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
  766. }
  767. func (self *SGuest) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  768. guestdisks := GuestdiskManager.Query("row_id").Equals("guest_id", self.Id)
  769. guestnetworks := GuestnetworkManager.Query("row_id").Equals("guest_id", self.Id)
  770. // 辅助IP
  771. networkaddress := NetworkAddressManager.Query("id").In("parent_id", guestnetworks.SubQuery())
  772. guestcdroms := GuestcdromManager.Query("row_id").Equals("id", self.Id)
  773. guestvfd := GuestFloppyManager.Query("row_id").Equals("id", self.Id)
  774. guestgroups := GroupguestManager.Query("row_id").Equals("guest_id", self.Id)
  775. guestsecgroups := GuestsecgroupManager.Query("row_id").Equals("guest_id", self.Id)
  776. // instancesnapshots := InstanceSnapshotManager.Query("id").Equals("guest_id", self.Id)
  777. // instancebackups := InstanceBackupManager.Query("id").Equals("guest_id", self.Id)
  778. publicIps := ElasticipManager.Query("id").Equals("mode", api.EIP_MODE_INSTANCE_PUBLICIP).
  779. Equals("associate_type", api.EIP_ASSOCIATE_TYPE_SERVER).Equals("associate_id", self.Id)
  780. tapService := NetTapServiceManager.Query("id").Equals("type", api.TapServiceGuest).Equals("target_id", self.Id)
  781. tapFlows := NetTapFlowManager.Query("id").In("tap_id", tapService.SubQuery())
  782. tapNics := NetTapFlowManager.Query("id").Equals("type", api.TapFlowGuestNic).Equals("source_id", self.Id)
  783. backends := LoadbalancerBackendManager.Query("id").Equals("backend_id", self.Id)
  784. pairs := []purgePair{
  785. {manager: LoadbalancerBackendManager, key: "id", q: backends},
  786. {manager: NetTapFlowManager, key: "id", q: tapNics},
  787. {manager: NetTapFlowManager, key: "id", q: tapFlows},
  788. {manager: NetTapServiceManager, key: "id", q: tapService},
  789. {manager: ElasticipManager, key: "id", q: publicIps},
  790. {manager: GuestsecgroupManager, key: "row_id", q: guestsecgroups},
  791. {manager: GroupguestManager, key: "row_id", q: guestgroups},
  792. {manager: GuestcdromManager, key: "row_id", q: guestcdroms},
  793. {manager: GuestFloppyManager, key: "row_id", q: guestvfd},
  794. {manager: NetworkAddressManager, key: "id", q: networkaddress},
  795. {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
  796. {manager: GuestdiskManager, key: "row_id", q: guestdisks},
  797. // {manager: InstanceSnapshotManager, key: "id", q: instancesnapshots},
  798. // {manager: InstanceBackupManager, key: "id", q: instancebackups},
  799. }
  800. for i := range pairs {
  801. err := pairs[i].purgeAll(ctx)
  802. if err != nil {
  803. return err
  804. }
  805. }
  806. eip, _ := self.GetElasticIp()
  807. if eip != nil {
  808. eip.Dissociate(ctx, userCred)
  809. }
  810. return self.SVirtualResourceBase.Delete(ctx, userCred)
  811. }
  812. func (self *SZone) purgeWires(ctx context.Context, managerId string) error {
  813. wires := WireManager.Query("id").Equals("zone_id", self.Id).Equals("manager_id", managerId)
  814. // vpcs := VpcManager.Query().SubQuery()
  815. // wires = wires.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))).
  816. // Filter(sqlchemy.Equals(vpcs.Field("manager_id"), managerId))
  817. hostwires := HostwireManagerDeprecated.Query("row_id").In("wire_id", wires.SubQuery())
  818. isolateds := IsolatedDeviceManager.Query("id").In("wire_id", wires.SubQuery())
  819. networks := NetworkManager.Query("id").In("wire_id", wires.SubQuery())
  820. bns := HostnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  821. rdsnetworks := DBInstanceNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  822. groupnetworks := GroupnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  823. guestnetworks := GuestnetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  824. lbnetworks := LoadbalancernetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  825. netmacs := NetworkIpMacManager.Query("id").In("network_id", networks.SubQuery())
  826. netaddrs := NetworkAddressManager.Query("id").In("network_id", networks.SubQuery())
  827. nis := NetworkinterfacenetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  828. rips := ReservedipManager.Query("id").In("network_id", networks.SubQuery())
  829. sns := ScalingGroupNetworkManager.Query("row_id").In("network_id", networks.SubQuery())
  830. schedtags := NetworkschedtagManager.Query("row_id").In("network_id", networks.SubQuery())
  831. pairs := []purgePair{
  832. {manager: NetworkschedtagManager, key: "row_id", q: schedtags},
  833. {manager: ScalingGroupNetworkManager, key: "row_id", q: sns},
  834. {manager: ReservedipManager, key: "id", q: rips},
  835. {manager: NetworkinterfacenetworkManager, key: "row_id", q: nis},
  836. {manager: NetworkAddressManager, key: "id", q: netaddrs},
  837. {manager: NetworkIpMacManager, key: "id", q: netmacs},
  838. {manager: LoadbalancernetworkManager, key: "row_id", q: lbnetworks},
  839. {manager: GuestnetworkManager, key: "row_id", q: guestnetworks},
  840. {manager: GroupnetworkManager, key: "row_id", q: groupnetworks},
  841. {manager: DBInstanceNetworkManager, key: "row_id", q: rdsnetworks},
  842. {manager: HostnetworkManager, key: "row_id", q: bns},
  843. {manager: NetworkManager, key: "id", q: networks},
  844. {manager: IsolatedDeviceManager, key: "id", q: isolateds},
  845. {manager: HostwireManagerDeprecated, key: "row_id", q: hostwires},
  846. {manager: NetworkAdditionalWireManager, key: "id", q: wires},
  847. {manager: WireManager, key: "id", q: wires},
  848. }
  849. for i := range pairs {
  850. err := pairs[i].purgeAll(ctx)
  851. if err != nil {
  852. return err
  853. }
  854. }
  855. return nil
  856. }
  857. func (cprvd *SCloudprovider) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  858. cprs := CloudproviderRegionManager.Query("row_id").Equals("cloudprovider_id", cprvd.Id)
  859. capability := CloudproviderCapabilityManager.Query("cloudprovider_id").Equals("cloudprovider_id", cprvd.Id)
  860. cdn := CDNDomainManager.Query("id").Equals("manager_id", cprvd.Id)
  861. vpcs := GlobalVpcManager.Query("id").Equals("manager_id", cprvd.Id)
  862. secgroups := SecurityGroupManager.Query("id").In("globalvpc_id", vpcs.SubQuery())
  863. rules := SecurityGroupRuleManager.Query("id").In("secgroup_id", secgroups.SubQuery())
  864. intervpcs := InterVpcNetworkManager.Query("id").Equals("manager_id", cprvd.Id)
  865. intervpcnetworks := InterVpcNetworkVpcManager.Query("row_id").In("inter_vpc_network_id", intervpcs.SubQuery())
  866. dnszones := DnsZoneManager.Query("id").Equals("manager_id", cprvd.Id)
  867. records := DnsRecordManager.Query("id").In("dns_zone_id", dnszones.SubQuery())
  868. dnsVpcs := DnsZoneVpcManager.Query("row_id").In("dns_zone_id", dnszones.SubQuery())
  869. ssls := SSLCertificateManager.Query("id").Equals("manager_id", cprvd.Id)
  870. quotas := CloudproviderQuotaManager.Query("id").Equals("manager_id", cprvd.Id)
  871. pairs := []purgePair{
  872. {manager: CloudproviderQuotaManager, key: "id", q: quotas},
  873. {manager: SSLCertificateManager, key: "id", q: ssls},
  874. {manager: DnsZoneVpcManager, key: "row_id", q: dnsVpcs},
  875. {manager: DnsRecordManager, key: "id", q: records},
  876. {manager: DnsZoneManager, key: "id", q: dnszones},
  877. {manager: InterVpcNetworkVpcManager, key: "row_id", q: intervpcnetworks},
  878. {manager: InterVpcNetworkManager, key: "id", q: intervpcs},
  879. {manager: SecurityGroupRuleManager, key: "id", q: rules},
  880. {manager: SecurityGroupManager, key: "id", q: secgroups},
  881. {manager: GlobalVpcManager, key: "id", q: vpcs},
  882. {manager: CDNDomainManager, key: "id", q: cdn},
  883. {manager: CloudproviderRegionManager, key: "row_id", q: cprs},
  884. {manager: CloudproviderCapabilityManager, key: "cloudprovider_id", q: capability},
  885. }
  886. for i := range pairs {
  887. err := pairs[i].purgeAll(ctx)
  888. if err != nil {
  889. return err
  890. }
  891. }
  892. return cprvd.SEnabledStatusStandaloneResourceBase.Delete(ctx, userCred)
  893. }
  894. func (caccount *SCloudaccount) purge(ctx context.Context, userCred mcclient.TokenCredential) error {
  895. projects := ExternalProjectManager.Query("id").Equals("cloudaccount_id", caccount.Id)
  896. pairs := []purgePair{
  897. {manager: ExternalProjectManager, key: "id", q: projects},
  898. }
  899. for i := range pairs {
  900. err := pairs[i].purgeAll(ctx)
  901. if err != nil {
  902. return err
  903. }
  904. }
  905. return caccount.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred)
  906. }