fix: fail to delete removed cloud resources (#364)

* fix: fail to delete removed cloud resources

* fix: private_cloud and on_premise filter overlaps

* fix: loadbalancer* should use pending_delete to remove resources
This commit is contained in:
Jian Qiu
2019-04-12 21:14:10 +08:00
committed by yunion-ci-robot
parent bf7a6a2b30
commit e3946e8485
18 changed files with 48 additions and 124 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ func (self *SQcloudGuestDriver) GetHypervisor() string {
}
func (self *SQcloudGuestDriver) GetDefaultSysDiskBackend() string {
return models.STORAGE_CLOUD_BASIC
return models.STORAGE_CLOUD_PREMIUM
}
func (self *SQcloudGuestDriver) GetMinimalSysDiskSizeGb() int {
+3 -3
View File
@@ -133,11 +133,11 @@ func (manager *SCloudproviderManager) GetPublicProviderIdsQuery() *sqlchemy.SSub
}
func (manager *SCloudproviderManager) GetPrivateProviderIdsQuery() *sqlchemy.SSubQuery {
return manager.GetProviderIdsQuery(tristate.False, tristate.None)
return manager.GetProviderIdsQuery(tristate.False, tristate.False)
}
func (manager *SCloudproviderManager) GetOnPremiseProviderIdsQuery() *sqlchemy.SSubQuery {
return manager.GetProviderIdsQuery(tristate.False, tristate.True)
return manager.GetProviderIdsQuery(tristate.None, tristate.True)
}
func (manager *SCloudproviderManager) GetProviderIdsQuery(isPublic tristate.TriState, isOnPremise tristate.TriState) *sqlchemy.SSubQuery {
@@ -154,7 +154,7 @@ func (manager *SCloudproviderManager) GetProviderIdsQuery(isPublic tristate.TriS
if isOnPremise.IsTrue() {
q = q.Filter(sqlchemy.IsTrue(account.Field("is_on_premise")))
} else if isOnPremise.IsFalse() {
q = q.Filter(sqlchemy.IsTrue(account.Field("is_on_premise")))
q = q.Filter(sqlchemy.IsFalse(account.Field("is_on_premise")))
}
return q.SubQuery()
}
+6 -1
View File
@@ -1053,7 +1053,12 @@ func (self *SDisk) syncRemoveCloudDisk(ctx context.Context, userCred mcclient.To
lockman.LockObject(ctx, self)
defer lockman.ReleaseObject(ctx, self)
return self.SetStatus(userCred, DISK_UNKNOWN, "missing original disk after sync")
err := self.ValidatePurgeCondition(ctx)
if err != nil {
return self.SetStatus(userCred, DISK_UNKNOWN, "missing original disk after sync")
} else {
return self.RealDelete(ctx, userCred)
}
}
func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, extDisk cloudprovider.ICloudDisk, index int, projectId string) error {
+1 -1
View File
@@ -293,7 +293,7 @@ func (self *SElasticip) syncRemoveCloudEip(ctx context.Context, userCred mcclien
if err != nil {
return self.SetStatus(userCred, EIP_STATUS_UNKNOWN, "sync to delete")
} else {
return self.Delete(ctx, userCred)
return self.RealDelete(ctx, userCred)
}
}
+2 -2
View File
@@ -1379,14 +1379,14 @@ func (self *SHost) syncRemoveCloudHost(ctx context.Context, userCred mcclient.To
lockman.LockObject(ctx, self)
defer lockman.ReleaseObject(ctx, self)
err := self.ValidateDeleteCondition(ctx)
err := self.ValidatePurgeCondition(ctx)
if err != nil {
err = self.SetStatus(userCred, HOST_OFFLINE, "sync to delete")
if err == nil {
_, err = self.PerformDisable(ctx, userCred, nil, nil)
}
} else {
err = self.Delete(ctx, userCred)
err = self.RealDelete(ctx, userCred)
}
return err
}
+2 -6
View File
@@ -325,13 +325,9 @@ func (lbacl *SLoadbalancerAcl) Delete(ctx context.Context, userCred mcclient.Tok
return nil
}
func (lbacl *SLoadbalancerAcl) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lbacl.SSharableVirtualResourceBase.Delete(ctx, userCred)
}
func (man *SLoadbalancerAclManager) getLoadbalancerAclsByRegion(region *SCloudregion, provider *SCloudprovider) ([]SLoadbalancerAcl, error) {
acls := []SLoadbalancerAcl{}
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id)
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &acls); err != nil {
log.Errorf("failed to get acls for region: %v provider: %v error: %v", region, provider, err)
return nil, err
@@ -401,7 +397,7 @@ func (self *SLoadbalancerAcl) syncRemoveCloudLoadbalanceAcl(ctx context.Context,
if err != nil { // cannot delete
err = self.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = self.Delete(ctx, userCred)
self.DoPendingDelete(ctx, userCred)
}
return err
}
@@ -331,13 +331,9 @@ func (lbbg *SLoadbalancerBackendGroup) Delete(ctx context.Context, userCred mccl
return nil
}
func (lbbg *SLoadbalancerBackendGroup) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lbbg.SVirtualResourceBase.Delete(ctx, userCred)
}
func (man *SLoadbalancerBackendGroupManager) getLoadbalancerBackendgroupsByLoadbalancer(lb *SLoadbalancer) ([]SLoadbalancerBackendGroup, error) {
lbbgs := []SLoadbalancerBackendGroup{}
q := man.Query().Equals("loadbalancer_id", lb.Id)
q := man.Query().Equals("loadbalancer_id", lb.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &lbbgs); err != nil {
log.Errorf("failed to get lbbgs for lb: %s error: %v", lb.Name, err)
return nil, err
@@ -423,7 +419,7 @@ func (lbbg *SLoadbalancerBackendGroup) syncRemoveCloudLoadbalancerBackendgroup(c
if err != nil { // cannot delete
err = lbbg.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lbbg.Delete(ctx, userCred)
lbbg.PreDeleteSubs(ctx, userCred)
}
return err
}
+3 -6
View File
@@ -241,10 +241,6 @@ func (lbb *SLoadbalancerBackend) Delete(ctx context.Context, userCred mcclient.T
return nil
}
func (lbb *SLoadbalancerBackend) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lbb.SVirtualResourceBase.Delete(ctx, userCred)
}
func (lbb *SLoadbalancerBackend) AllowPerformPurge(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
return db.IsAdminAllowPerform(userCred, lbb, "purge")
}
@@ -272,7 +268,7 @@ func (lbb *SLoadbalancerBackend) StartLoadBalancerBackendDeleteTask(ctx context.
func (man *SLoadbalancerBackendManager) getLoadbalancerBackendsByLoadbalancerBackendgroup(loadbalancerBackendgroup *SLoadbalancerBackendGroup) ([]SLoadbalancerBackend, error) {
loadbalancerBackends := []SLoadbalancerBackend{}
q := man.Query().Equals("backend_group_id", loadbalancerBackendgroup.Id)
q = q.Filter(sqlchemy.OR(sqlchemy.IsNull(q.Field("pending_deleted")), sqlchemy.IsFalse(q.Field("pending_deleted"))))
q = q.IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &loadbalancerBackends); err != nil {
return nil, err
}
@@ -377,7 +373,8 @@ func (lbb *SLoadbalancerBackend) syncRemoveCloudLoadbalancerBackend(ctx context.
if err != nil { // cannot delete
err = lbb.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lbb.MarkPendingDelete(userCred)
// err = lbb.MarkPendingDelete(userCred)
err = lbb.DoPendingDelete(ctx, userCred)
}
return err
}
@@ -260,10 +260,6 @@ func (lbcert *SLoadbalancerCertificate) Delete(ctx context.Context, userCred mcc
return nil
}
func (lbcert *SLoadbalancerCertificate) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lbcert.SVirtualResourceBase.Delete(ctx, userCred)
}
func (lbcert *SLoadbalancerCertificate) GetRegion() *SCloudregion {
region, err := CloudregionManager.FetchById(lbcert.CloudregionId)
if err != nil {
@@ -311,7 +307,7 @@ func (lbcert *SLoadbalancerCertificate) StartLoadBalancerCertificateDeleteTask(c
func (man *SLoadbalancerCertificateManager) getLoadbalancerCertificatesByRegion(region *SCloudregion, provider *SCloudprovider) ([]SLoadbalancerCertificate, error) {
certificates := []SLoadbalancerCertificate{}
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id)
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &certificates); err != nil {
log.Errorf("failed to get lb certificates for region: %v provider: %v error: %v", region, provider, err)
return nil, err
@@ -408,7 +404,7 @@ func (lbcert *SLoadbalancerCertificate) syncRemoveCloudLoadbalancerCertificate(c
if err != nil { // cannot delete
err = lbcert.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lbcert.Delete(ctx, userCred)
err = lbcert.DoPendingDelete(ctx, userCred)
}
return err
}
@@ -285,15 +285,11 @@ func (lbr *SLoadbalancerListenerRule) Delete(ctx context.Context, userCred mccli
return nil
}
func (lbr *SLoadbalancerListenerRule) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lbr.SVirtualResourceBase.Delete(ctx, userCred)
}
// Delete, Update
func (man *SLoadbalancerListenerRuleManager) getLoadbalancerListenerRulesByListener(listener *SLoadbalancerListener) ([]SLoadbalancerListenerRule, error) {
rules := []SLoadbalancerListenerRule{}
q := man.Query().Equals("listener_id", listener.Id)
q := man.Query().Equals("listener_id", listener.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &rules); err != nil {
log.Errorf("failed to get lb listener rules for listener %s error: %v", listener.Name, err)
return nil, err
@@ -412,7 +408,7 @@ func (lbr *SLoadbalancerListenerRule) syncRemoveCloudLoadbalancerListenerRule(ct
if err != nil { // cannot delete
err = lbr.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lbr.Delete(ctx, userCred)
err = lbr.DoPendingDelete(ctx, userCred)
}
return err
}
+3 -6
View File
@@ -584,10 +584,6 @@ func (lblis *SLoadbalancerListener) Delete(ctx context.Context, userCred mcclien
return nil
}
func (lblis *SLoadbalancerListener) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lblis.SVirtualResourceBase.Delete(ctx, userCred)
}
func (lblis *SLoadbalancerListener) GetLoadbalancerListenerParams() (*cloudprovider.SLoadbalancerListener, error) {
listener := &cloudprovider.SLoadbalancerListener{
Name: lblis.Name,
@@ -687,7 +683,7 @@ func (lblis *SLoadbalancerListener) GetIRegion() (cloudprovider.ICloudRegion, er
func (man *SLoadbalancerListenerManager) getLoadbalancerListenersByLoadbalancer(lb *SLoadbalancer) ([]SLoadbalancerListener, error) {
listeners := []SLoadbalancerListener{}
q := man.Query().Equals("loadbalancer_id", lb.Id)
q := man.Query().Equals("loadbalancer_id", lb.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &listeners); err != nil {
return nil, err
}
@@ -822,7 +818,8 @@ func (lblis *SLoadbalancerListener) syncRemoveCloudLoadbalancerListener(ctx cont
if err != nil { // cannot delete
err = lblis.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lblis.Delete(ctx, userCred)
// err = lblis.PendingDelete(ctx, userCred)
lblis.PreDeleteSubs(ctx, userCred)
}
return err
}
+5 -9
View File
@@ -437,8 +437,8 @@ func (lb *SLoadbalancer) PendingDelete(ctx context.Context, userCred mcclient.To
}
LoadbalancernetworkManager.DeleteLoadbalancerNetwork(ctx, userCred, req)
}
lb.DoPendingDelete(ctx, userCred)
lb.PreDeleteSubs(ctx, userCred)
lb.DoPendingDelete(ctx, userCred)
}
func (lb *SLoadbalancer) PreDeleteSubs(ctx context.Context, userCred mcclient.TokenCredential) {
@@ -462,13 +462,9 @@ func (lb *SLoadbalancer) Delete(ctx context.Context, userCred mcclient.TokenCred
return nil
}
func (lb *SLoadbalancer) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
return lb.SVirtualResourceBase.Delete(ctx, userCred)
}
func (man *SLoadbalancerManager) getLoadbalancersByRegion(region *SCloudregion, provider *SCloudprovider) ([]SLoadbalancer, error) {
lbs := []SLoadbalancer{}
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id)
q := man.Query().Equals("cloudregion_id", region.Id).Equals("manager_id", provider.Id).IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &lbs); err != nil {
log.Errorf("failed to get lbs for region: %v provider: %v error: %v", region, provider, err)
return nil, err
@@ -589,11 +585,11 @@ func (lb *SLoadbalancer) syncRemoveCloudLoadbalancer(ctx context.Context, userCr
err := lb.ValidateDeleteCondition(ctx)
if err != nil { // cannot delete
err = lb.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
return lb.SetStatus(userCred, api.LB_STATUS_UNKNOWN, "sync to delete")
} else {
err = lb.Delete(ctx, userCred)
lb.PendingDelete(ctx, userCred)
return nil
}
return err
}
func (lb *SLoadbalancer) syncLoadbalancerNetwork(ctx context.Context, userCred mcclient.TokenCredential) {
+2 -28
View File
@@ -158,20 +158,10 @@ func managedResourceFilterByCloudType(q *sqlchemy.SQuery, query jsonutils.JSONOb
if jsonutils.QueryBoolean(query, "private_cloud", false) || jsonutils.QueryBoolean(query, "is_private", false) {
if len(filterField) == 0 {
q = q.Filter(
sqlchemy.OR(
sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()),
sqlchemy.IsNullOrEmpty(q.Field("manager_id")),
),
)
q = q.Filter(sqlchemy.In(q.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()))
} else {
sq := subqFunc()
sq = sq.Filter(
sqlchemy.OR(
sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()),
sqlchemy.IsNullOrEmpty(sq.Field("manager_id")),
),
)
sq = sq.Filter(sqlchemy.In(sq.Field("manager_id"), CloudproviderManager.GetPrivateProviderIdsQuery()))
q = q.Filter(sqlchemy.In(q.Field(filterField), sq.SubQuery()))
}
}
@@ -209,22 +199,6 @@ func managedResourceFilterByCloudType(q *sqlchemy.SQuery, query jsonutils.JSONOb
return q
}
/*func (self *SManagedResourceBase) getExtraDetails(ctx context.Context, extra *jsonutils.JSONDict) *jsonutils.JSONDict {
manager := self.GetCloudprovider()
if manager != nil {
extra.Add(jsonutils.NewString(manager.Name), "manager")
extra.Add(jsonutils.NewString(manager.ProjectId), "manager_tenant_id")
extra.Add(jsonutils.NewString(manager.ProjectId), "manager_project_id")
project := manager.getProject(ctx)
if project != nil {
extra.Add(jsonutils.NewString(project.Name), "manager_tenant")
extra.Add(jsonutils.NewString(project.Name), "manager_project")
}
}
return extra
}
*/
type SCloudProviderInfo struct {
Provider string `json:",omitempty"`
Account string `json:",omitempty"`
+1 -1
View File
@@ -541,7 +541,7 @@ func (self *SNetwork) syncRemoveCloudNetwork(ctx context.Context, userCred mccli
if err != nil { // cannot delete
err = self.SetStatus(userCred, NETWORK_STATUS_UNKNOWN, "Sync to remove")
} else {
err = self.Delete(ctx, userCred)
err = self.RealDelete(ctx, userCred)
}
return err
+10 -7
View File
@@ -162,7 +162,7 @@ func (lbcert *SLoadbalancerCertificate) purge(ctx context.Context, userCred mccl
return err
}
return lbcert.RealDelete(ctx, userCred)
return lbcert.DoPendingDelete(ctx, userCred)
}
func (manager *SLoadbalancerAclManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -189,7 +189,7 @@ func (lbacl *SLoadbalancerAcl) purge(ctx context.Context, userCred mcclient.Toke
return err
}
return lbacl.RealDelete(ctx, userCred)
return lbacl.DoPendingDelete(ctx, userCred)
}
func (manager *SLoadbalancerManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -246,7 +246,8 @@ func (lb *SLoadbalancer) purge(ctx context.Context, userCred mcclient.TokenCrede
return err
}
return lb.RealDelete(ctx, userCred)
lb.PendingDelete(ctx, userCred)
return nil
}
func (manager *SLoadbalancerListenerManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -273,7 +274,8 @@ func (lbl *SLoadbalancerListener) purge(ctx context.Context, userCred mcclient.T
return err
}
return lbl.RealDelete(ctx, userCred)
lbl.PreDeleteSubs(ctx, userCred)
return nil
}
func (manager *SLoadbalancerListenerRuleManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -299,7 +301,7 @@ func (lblr *SLoadbalancerListenerRule) purge(ctx context.Context, userCred mccli
if err != nil {
return err
}
return lblr.RealDelete(ctx, userCred)
return lblr.DoPendingDelete(ctx, userCred)
}
func (manager *SLoadbalancerBackendGroupManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -326,7 +328,8 @@ func (lbbg *SLoadbalancerBackendGroup) purge(ctx context.Context, userCred mccli
return err
}
return lbbg.RealDelete(ctx, userCred)
lbbg.PreDeleteSubs(ctx, userCred)
return nil
}
func (manager *SLoadbalancerBackendManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
@@ -352,7 +355,7 @@ func (lbb *SLoadbalancerBackend) purge(ctx context.Context, userCred mcclient.To
if err != nil {
return err
}
return lbb.RealDelete(ctx, userCred)
return lbb.DoPendingDelete(ctx, userCred)
}
func (manager *SSnapshotManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error {
+1 -1
View File
@@ -463,7 +463,7 @@ func (self *SRouteTable) syncRemoveCloudRouteTable(ctx context.Context, userCred
if err != nil {
return err
}
err = self.Delete(ctx, userCred)
err = self.RealDelete(ctx, userCred)
return err
}
+1 -1
View File
@@ -556,7 +556,7 @@ func (self *SSnapshot) syncRemoveCloudSnapshot(ctx context.Context, userCred mcc
if err != nil {
err = self.SetStatus(userCred, SNAPSHOT_UNKNOWN, "sync to delete")
} else {
err = self.Delete(ctx, userCred)
err = self.RealDelete(ctx, userCred)
}
return err
}
+1 -33
View File
@@ -330,7 +330,7 @@ func (self *SVpc) syncRemoveCloudVpc(ctx context.Context, userCred mcclient.Toke
err = self.SetStatus(userCred, VPC_STATUS_UNKNOWN, "sync to delete")
}
} else {
err = self.Delete(ctx, userCred)
err = self.RealDelete(ctx, userCred)
}
return err
}
@@ -585,43 +585,11 @@ func (manager *SVpcManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQue
}
q = managedResourceFilterByCloudType(q, query, "", nil)
/*managerStr := jsonutils.GetAnyString(query, []string{"manager", "cloudprovider", "cloudprovider_id", "manager_id"})
if len(managerStr) > 0 {
provider, err := CloudproviderManager.FetchByIdOrName(nil, managerStr)
if err != nil {
if err == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr)
}
return nil, httperrors.NewGeneralError(err)
}
q = q.Filter(sqlchemy.Equals(q.Field("manager_id"), provider.GetId()))
queryDict.Remove("manager_id")
}*/
q, err = manager.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
if err != nil {
return nil, err
}
/* accountStr := jsonutils.GetAnyString(query, []string{"account", "account_id", "cloudaccount", "cloudaccount_id"})
if len(accountStr) > 0 {
account, err := CloudaccountManager.FetchByIdOrName(nil, accountStr)
if err != nil {
if err == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr)
}
return nil, httperrors.NewGeneralError(err)
}
subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery()
q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq))
}
providerStr := jsonutils.GetAnyString(query, []string{"provider"})
if len(providerStr) > 0 {
subq := CloudproviderManager.Query("id").Equals("provider", providerStr).SubQuery()
q = q.Filter(sqlchemy.In(q.Field("manager_id"), subq))
}*/
return q, nil
}