From 184a6a0817ba79d05e65ee95c0f7c1cdea9f2aa5 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 9 Jul 2021 10:35:24 +0800 Subject: [PATCH] fix: host detach wire not update netinterface --- pkg/apigateway/handler/resource.go | 2 +- pkg/compute/models/hosts.go | 3 +++ pkg/compute/models/hostwires.go | 29 ++++++++++++++++++++++++++++- pkg/compute/models/netinterfaces.go | 8 ++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/pkg/apigateway/handler/resource.go b/pkg/apigateway/handler/resource.go index 0191bb57f7..0737c0c484 100644 --- a/pkg/apigateway/handler/resource.go +++ b/pkg/apigateway/handler/resource.go @@ -805,7 +805,7 @@ func (f *ResourceHandlers) detachHandle(ctx context.Context, w http.ResponseWrit jmod, e := modulebase.GetJointModule2(session, module, module2) var obj jsonutils.JSONObject if e == nil { // joint detach - obj, e = jmod.Detach(session, req.ResID(), req.ResID2(), nil) + obj, e = jmod.Detach(session, req.ResID(), req.ResID2(), req.Query()) } else { obj, e = module2.DeleteInContextWithParam(session, req.ResID2(), req.Query(), req.Body(), module, req.ResID()) } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 817a851e6a..be162e1082 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -4453,6 +4453,9 @@ func (self *SHost) PerformDisableNetif(ctx context.Context, userCred mcclient.To return nil, nil } +/* + * Disable a net interface, remove IP address if assigned + */ func (self *SHost) DisableNetif(ctx context.Context, userCred mcclient.TokenCredential, netif *SNetInterface, reserve bool) error { bn := netif.GetBaremetalNetwork() var ipAddr string diff --git a/pkg/compute/models/hostwires.go b/pkg/compute/models/hostwires.go index f708ec5a95..037e0debae 100644 --- a/pkg/compute/models/hostwires.go +++ b/pkg/compute/models/hostwires.go @@ -156,7 +156,11 @@ func (self *SHostwire) ValidateDeleteCondition(ctx context.Context) error { return httperrors.NewInternalServerError("GetGuestnicsCount fail %s", err) } if cnt > 0 { - return httperrors.NewNotEmptyError("guest on the host are using networks on this wire") + // check if this is the last one + host := self.GetHost() + if len(host.getHostwiresOfId(self.WireId)) == 1 { + return httperrors.NewNotEmptyError("guest on the host are using networks on this wire") + } } return self.SHostJointsBase.ValidateDeleteCondition(ctx) } @@ -165,6 +169,29 @@ func (self *SHostwire) Delete(ctx context.Context, userCred mcclient.TokenCreden return db.DeleteModel(ctx, userCred, self) } +func (self *SHostwire) PreDelete(ctx context.Context, userCred mcclient.TokenCredential) { + host := self.GetHost() + if host == nil { + log.Errorf("no host found??") + return + } + netif := host.GetNetInterface(self.MacAddr) + if netif == nil { + log.Errorf("no netinterface for %s", self.MacAddr) + return + } + err := host.DisableNetif(ctx, userCred, netif, false) + if err != nil { + log.Errorf("host.DisableNetif fail %s", err) + return + } + err = netif.UnsetWire() + if err != nil { + log.Errorf("netif.UnsetWire fail %s", err) + return + } +} + func (self *SHostwire) Detach(ctx context.Context, userCred mcclient.TokenCredential) error { return db.DetachJoint(ctx, userCred, self) } diff --git a/pkg/compute/models/netinterfaces.go b/pkg/compute/models/netinterfaces.go index 7151f67144..dc7b0da23c 100644 --- a/pkg/compute/models/netinterfaces.go +++ b/pkg/compute/models/netinterfaces.go @@ -78,6 +78,14 @@ func (manager *SNetInterfaceManager) FetchByMac(mac string) (*SNetInterface, err return netif.(*SNetInterface), nil } +func (netif *SNetInterface) UnsetWire() error { + _, err := db.Update(netif, func() error { + netif.WireId = "" + return nil + }) + return err +} + func (netif *SNetInterface) GetWire() *SWire { if len(netif.WireId) > 0 { wireModel, _ := WireManager.FetchById(netif.WireId)