diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 0c023bb982..af9c09411b 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -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 } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index df9e11a1a9..708ae7ee65 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -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 } diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 0f1e5626cd..7ec7089d8a 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -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) } diff --git a/pkg/scheduler/algorithmprovider/baremetal.go b/pkg/scheduler/algorithmprovider/baremetal.go index 63e34e96a7..fc31c5e5cb 100644 --- a/pkg/scheduler/algorithmprovider/baremetal.go +++ b/pkg/scheduler/algorithmprovider/baremetal.go @@ -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{}),