From 692754b9419e366dec3a82385d70aaf5bcc056c4 Mon Sep 17 00:00:00 2001 From: rainzm Date: Wed, 7 Apr 2021 16:54:13 +0800 Subject: [PATCH] fix(region): rigorously merge the network under wire MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 网络a和网络b能不能合并 = 网络a能不能合并到网络b || 网络b能不能合并到网络a --- .../tasks/networks_under_wire_merge_task.go | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/pkg/compute/tasks/networks_under_wire_merge_task.go b/pkg/compute/tasks/networks_under_wire_merge_task.go index 5491b6d984..4f45fc5cce 100644 --- a/pkg/compute/tasks/networks_under_wire_merge_task.go +++ b/pkg/compute/tasks/networks_under_wire_merge_task.go @@ -91,16 +91,37 @@ func (self *NetworksUnderWireMergeTask) OnInit(ctx context.Context, obj db.IStan wireNets = append(wireNets, nets[i].SNetwork) } } - startIp, endIp, err := nets[i].CheckInvalidToMerge(ctx, nets[i+1].SNetwork, wireNets) - if err != nil { - log.Debugf("unable to merge network %q to %q: %v", nets[i].GetId(), nets[i+1].GetId(), err) - continue - } - err = nets[i].MergeToNetworkAfterCheck(ctx, self.UserCred, nets[i+1].SNetwork, startIp, endIp) + ok, err := self.mergeNetwork(ctx, nets[i].SNetwork, nets[i+1].SNetwork, wireNets) if err != nil { self.taskFailed(ctx, w, fmt.Sprintf("unable to merge network %q to %q", nets[i].GetId(), nets[i+1].GetId()), err) return } + if ok { + continue + } + // Try to merge in the opposite direction + ok, err = self.mergeNetwork(ctx, nets[i+1].SNetwork, nets[i].SNetwork, wireNets) + if err != nil { + self.taskFailed(ctx, w, fmt.Sprintf("unable to merge network %q to %q", nets[i+1].GetId(), nets[i].GetId()), err) + return + } + if ok { + // Swap position + nets[i], nets[i+1] = nets[i+1], nets[i] + } } self.taskSuccess(ctx, w, "") } + +func (self *NetworksUnderWireMergeTask) mergeNetwork(ctx context.Context, source, target *models.SNetwork, wireNets []*models.SNetwork) (bool, error) { + startIp, endIp, err := source.CheckInvalidToMerge(ctx, target, wireNets) + if err != nil { + log.Debugf("unable to merge network %q to %q: %v", source.GetId(), target.GetId(), err) + return false, nil + } + err = source.MergeToNetworkAfterCheck(ctx, self.UserCred, target, startIp, endIp) + if err != nil { + return false, err + } + return true, nil +}