Merge pull request #11499 from zexi/automated-cherry-pick-of-#11498-upstream-release-3.7

Automated cherry pick of #11498: fix(region): baremetal server change ip address reuse
This commit is contained in:
Zexi Li
2021-06-28 15:07:12 +08:00
committed by GitHub
4 changed files with 22 additions and 6 deletions
+15 -2
View File
@@ -2152,6 +2152,19 @@ func (self *SGuest) findGuestnetworkByInfo(ipStr string, macStr string, index in
}
}
func (self *SGuest) getReuseAddr(gn *SGuestnetwork) string {
if self.GetHypervisor() != api.HYPERVISOR_BAREMETAL {
return ""
}
hostNics := self.GetHost().GetNics()
for _, hn := range hostNics {
if hn.GetMac().String() == gn.MacAddr {
return hn.IpAddr
}
}
return ""
}
// Change IPaddress of a guestnetwork
// first detach the network, then attach a network with identity mac address but different IP configurations
// TODO change IP address of a teaming NIC may fail!!
@@ -2189,7 +2202,7 @@ func (self *SGuest) PerformChangeIpaddr(ctx context.Context, userCred mcclient.T
if err != nil {
return nil, err
}
err = isValidNetworkInfo(userCred, conf)
err = isValidNetworkInfo(userCred, conf, self.getReuseAddr(gn))
if err != nil {
return nil, err
}
@@ -2338,7 +2351,7 @@ func (self *SGuest) PerformAttachnetwork(ctx context.Context, userCred mcclient.
}
var inicCnt, enicCnt int
for i := 0; i < count; i++ {
err := isValidNetworkInfo(userCred, input.Nets[i])
err := isValidNetworkInfo(userCred, input.Nets[i], "")
if err != nil {
return nil, err
}
+1 -1
View File
@@ -1413,7 +1413,7 @@ func (manager *SGuestManager) validateCreateData(
if err != nil {
return nil, httperrors.NewInputParameterError("parse network description error %s", err)
}
err = isValidNetworkInfo(userCred, netConfig)
err = isValidNetworkInfo(userCred, netConfig, "")
if err != nil {
return nil, err
}
+5 -2
View File
@@ -1067,7 +1067,7 @@ func (self *SNetwork) getFreeAddressCount() (int, error) {
return self.getIPRange().AddressCount() - used, nil
}
func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.NetworkConfig) error {
func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.NetworkConfig, reuseAddr string) error {
if len(netConfig.Network) > 0 {
netObj, err := NetworkManager.FetchByIdOrName(userCred, netConfig.Network)
if err != nil {
@@ -1100,7 +1100,7 @@ func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.Networ
if err != nil {
return httperrors.NewInternalServerError("isAddressUsed fail %s", err)
}
if used {
if used && netConfig.Address != reuseAddr {
return httperrors.NewInputParameterError("Address %s has been used", netConfig.Address)
}
}
@@ -1117,6 +1117,9 @@ func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.Networ
if err != nil {
return httperrors.NewInternalServerError("getFreeAddressCount fail %s", err)
}
if reuseAddr != "" {
freeCnt += 1
}
if freeCnt < 1 {
return httperrors.NewInputParameterError("network %s(%s) has no free addresses", net.Name, net.Id)
}
+1 -1
View File
@@ -34,7 +34,7 @@ func baremetalPredicates() sets.String {
factory.RegisterFitPredicate("c-BaremetalCPUFilter", &predicatebm.CPUPredicate{}),
factory.RegisterFitPredicate("d-BaremetalMemoryFilter", &predicatebm.MemoryPredicate{}),
factory.RegisterFitPredicate("e-BaremetalStorageFilter", &predicatebm.StoragePredicate{}),
factory.RegisterFitPredicate("f-BaremetalNetFilter", &predicates.NetworkPredicate{}),
factory.RegisterFitPredicate("f-BaremetalNetFilter", predicates.NewNetworkPredicate(nil)),
factory.RegisterFitPredicate("g-BaremetalResourceTypeFilter", &predicates.ResourceTypePredicate{}),
factory.RegisterFitPredicate("h-DiskschedtagFilter", &predicates.DiskSchedtagPredicate{}),
factory.RegisterFitPredicate("i-NetschedtagFilter", &predicates.NetworkSchedtagPredicate{}),