mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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{}),
|
||||
|
||||
Reference in New Issue
Block a user