From 87e57c36a0bf4546c2988fe3462f93f7d0fe530d Mon Sep 17 00:00:00 2001 From: Rain Date: Wed, 21 Aug 2019 11:13:45 +0800 Subject: [PATCH] nat delele should overvide Delete() and call RealDelete() after delete cloud resource successfully --- pkg/apis/compute/natgateway.go | 1 + pkg/compute/models/natdtable.go | 16 +++++++++++----- pkg/compute/models/natstable.go | 16 +++++++++++----- pkg/compute/models/purge.go | 22 ++++++++++++++++++++++ pkg/compute/tasks/natdentry_delete_task.go | 7 ++++++- pkg/compute/tasks/natsentry_delete_task.go | 7 ++++++- 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/pkg/apis/compute/natgateway.go b/pkg/apis/compute/natgateway.go index 043190bcf6..df056bca4f 100644 --- a/pkg/apis/compute/natgateway.go +++ b/pkg/apis/compute/natgateway.go @@ -20,6 +20,7 @@ const ( NAT_STATUS_DEPLOYING = "deploying" //配置中 NAT_STATUS_UNKNOWN = "unknown" NAT_STATUS_FAILED = "failed" + NAT_STATUS_START_DELETE = "start_delete" NAT_STATUS_DELETED = "deleted" NAT_STATUS_DELETING = "deleting" NAT_STATUS_DELETE_FAILED = "delete_failed" diff --git a/pkg/compute/models/natdtable.go b/pkg/compute/models/natdtable.go index 57ea7f96e1..f711dcb62e 100644 --- a/pkg/compute/models/natdtable.go +++ b/pkg/compute/models/natdtable.go @@ -185,7 +185,7 @@ func (self *SNatDEntry) syncRemoveCloudNatDTable(ctx context.Context, userCred m if err != nil { // cannot delete return self.SetStatus(userCred, api.VPC_STATUS_UNKNOWN, "sync to delete") } - return self.Delete(ctx, userCred) + return self.RealDelete(ctx, userCred) } func (self *SNatDEntry) SyncWithCloudNatDTable(ctx context.Context, userCred mcclient.TokenCredential, extEntry cloudprovider.ICloudNatDEntry) error { @@ -279,21 +279,27 @@ func (self *SNatDEntry) GetINatGateway() (cloudprovider.ICloudNatGateway, error) return natgateway.GetINatGateway() } +func (self *SNatDEntry) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { + log.Infof("DNAT delete do nothing") + self.SetStatus(userCred, api.NAT_STATUS_START_DELETE, "") + return nil +} + func (self *SNatDEntry) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error { if len(self.ExternalId) > 0 { - return self.startDeleteVpcTask(ctx, userCred) + return self.StartDeleteVpcTask(ctx, userCred) } else { - return self.realDelete(ctx, userCred) + return self.RealDelete(ctx, userCred) } } -func (self *SNatDEntry) realDelete(ctx context.Context, userCred mcclient.TokenCredential) error { +func (self *SNatDEntry) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error { db.OpsLog.LogEvent(self, db.ACT_DELOCATE, self.GetShortDesc(ctx), userCred) self.SetStatus(userCred, api.NAT_STATUS_DELETED, "real delete") return nil } -func (self *SNatDEntry) startDeleteVpcTask(ctx context.Context, userCred mcclient.TokenCredential) error { +func (self *SNatDEntry) StartDeleteVpcTask(ctx context.Context, userCred mcclient.TokenCredential) error { task, err := taskman.TaskManager.NewTask(ctx, "SNatDEntryDeleteTask", self, userCred, nil, "", "", nil) if err != nil { log.Errorf("Start dnatEntry deleteTask fail %s", err) diff --git a/pkg/compute/models/natstable.go b/pkg/compute/models/natstable.go index fcd682747b..05cc20fad8 100644 --- a/pkg/compute/models/natstable.go +++ b/pkg/compute/models/natstable.go @@ -191,7 +191,7 @@ func (self *SNatSEntry) syncRemoveCloudNatSTable(ctx context.Context, userCred m if err != nil { // cannot delete return self.SetStatus(userCred, api.VPC_STATUS_UNKNOWN, "sync to delete") } - return self.Delete(ctx, userCred) + return self.RealDelete(ctx, userCred) } func (self *SNatSEntry) SyncWithCloudNatSTable(ctx context.Context, userCred mcclient.TokenCredential, extEntry cloudprovider.ICloudNatSEntry) error { @@ -302,19 +302,25 @@ func (self *SNatSEntry) GetINatGateway() (cloudprovider.ICloudNatGateway, error) func (self *SNatSEntry) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error { if len(self.ExternalId) > 0 { - return self.startDeleteVpcTask(ctx, userCred) + return self.StartDeleteVpcTask(ctx, userCred) } else { - return self.realDelete(ctx, userCred) + return self.RealDelete(ctx, userCred) } } -func (self *SNatSEntry) realDelete(ctx context.Context, userCred mcclient.TokenCredential) error { +func (self *SNatSEntry) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { + log.Infof("SNAT delete do nothing") + self.SetStatus(userCred, api.NAT_STATUS_START_DELETE, "") + return nil +} + +func (self *SNatSEntry) RealDelete(ctx context.Context, userCred mcclient.TokenCredential) error { db.OpsLog.LogEvent(self, db.ACT_DELOCATE, self.GetShortDesc(ctx), userCred) self.SetStatus(userCred, api.NAT_STATUS_DELETED, "real delete") return nil } -func (self *SNatSEntry) startDeleteVpcTask(ctx context.Context, userCred mcclient.TokenCredential) error { +func (self *SNatSEntry) StartDeleteVpcTask(ctx context.Context, userCred mcclient.TokenCredential) error { task, err := taskman.TaskManager.NewTask(ctx, "SNatSEntryDeleteTask", self, userCred, nil, "", "", nil) if err != nil { log.Errorf("Start snatEntry deleteTask fail %s", err) diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index 857eaeedb1..ce2ea37740 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -995,6 +995,28 @@ func (vpc *SVpc) Purge(ctx context.Context, userCred mcclient.TokenCredential) e return vpc.RealDelete(ctx, userCred) } +func (dn *SNatDEntry) Purge(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, dn) + defer lockman.ReleaseObject(ctx, dn) + + err := dn.ValidateDeleteCondition(ctx) + if err != nil { + return err + } + return dn.RealDelete(ctx, userCred) +} + +func (sn *SNatSEntry) Purge(ctx context.Context, userCred mcclient.TokenCredential) error { + lockman.LockObject(ctx, sn) + defer lockman.ReleaseObject(ctx, sn) + + err := sn.ValidateDeleteCondition(ctx) + if err != nil { + return err + } + return sn.RealDelete(ctx, userCred) +} + func (manager *SCloudproviderregionManager) purgeAll(ctx context.Context, userCred mcclient.TokenCredential, providerId string) error { cprs, err := CloudproviderRegionManager.fetchRecordsByCloudproviderId(providerId) if err != nil { diff --git a/pkg/compute/tasks/natdentry_delete_task.go b/pkg/compute/tasks/natdentry_delete_task.go index 0f19b4b3fb..1b483279e6 100644 --- a/pkg/compute/tasks/natdentry_delete_task.go +++ b/pkg/compute/tasks/natdentry_delete_task.go @@ -58,7 +58,12 @@ func (self *SNatDEntryDeleteTask) OnInit(ctx context.Context, obj db.IStandalone if err != nil { self.taskFailed(ctx, dnatEntry, errors.Wrapf(err, "Delete DNat Entry '%s' failed", dnatEntry.ExternalId)) } - dnatEntry.SetStatus(self.UserCred, api.NAT_STATUS_DELETED, "") + + err = dnatEntry.Purge(ctx, self.UserCred) + if err != nil { + self.taskFailed(ctx, dnatEntry, err) + return + } logclient.AddActionLogWithStartable(self, dnatEntry, logclient.ACT_DELETE, nil, self.UserCred, true) self.SetStageComplete(ctx, nil) diff --git a/pkg/compute/tasks/natsentry_delete_task.go b/pkg/compute/tasks/natsentry_delete_task.go index 573f7a6d08..e6fc709ba7 100644 --- a/pkg/compute/tasks/natsentry_delete_task.go +++ b/pkg/compute/tasks/natsentry_delete_task.go @@ -58,7 +58,12 @@ func (self *SNatSEntryDeleteTask) OnInit(ctx context.Context, obj db.IStandalone if err != nil { self.taskFailed(ctx, snatEntry, errors.Wrapf(err, "Delete SNat Entry '%s' failed", snatEntry.ExternalId)) } - snatEntry.SetStatus(self.UserCred, api.NAT_STATUS_DELETED, "") + + err = snatEntry.Purge(ctx, self.UserCred) + if err != nil { + self.taskFailed(ctx, snatEntry, err) + return + } logclient.AddActionLogWithStartable(self, snatEntry, logclient.ACT_DELETE, nil, self.UserCred, true) self.SetStageComplete(ctx, nil)