diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 12342c9c47..5c63aacb7e 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -135,8 +135,11 @@ func (self *SBaremetalGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk return httperrors.NewUnsupportOperationError("Cannot resize disk for baremtal") } -func (self *SBaremetalGuestDriver) GetNamedNetworkConfiguration(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *models.SHost, netConfig *api.NetworkConfig) (*models.SNetwork, []models.SNicConfig, api.IPAllocationDirection, bool) { - netifs, net := host.GetNetinterfacesWithIdAndCredential(netConfig.Network, userCred, netConfig.Reserved) +func (self *SBaremetalGuestDriver) GetNamedNetworkConfiguration(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *models.SHost, netConfig *api.NetworkConfig) (*models.SNetwork, []models.SNicConfig, api.IPAllocationDirection, bool, error) { + netifs, net, err := host.GetNetinterfacesWithIdAndCredential(netConfig.Network, userCred, netConfig.Reserved) + if err != nil { + return nil, nil, "", false, errors.Wrap(err, "get host netinterfaces") + } if netifs != nil { nicCnt := 1 if netConfig.RequireTeaming || netConfig.TryTeaming { @@ -144,8 +147,7 @@ func (self *SBaremetalGuestDriver) GetNamedNetworkConfiguration(guest *models.SG } if len(netifs) < nicCnt { if netConfig.RequireTeaming { - log.Errorf("not enough network interfaces, want %d got %d", nicCnt, len(netifs)) - return net, nil, "", false + return net, nil, "", false, errors.Errorf("not enough network interfaces, want %d got %d", nicCnt, len(netifs)) } nicCnt = len(netifs) } @@ -166,9 +168,9 @@ func (self *SBaremetalGuestDriver) GetNamedNetworkConfiguration(guest *models.SG reuseAddr = true } - return net, nicConfs, api.IPAllocationStepup, reuseAddr + return net, nicConfs, api.IPAllocationStepup, reuseAddr, nil } - return net, nil, "", false + return net, nil, "", false, nil } func (self *SBaremetalGuestDriver) GetRandomNetworkTypes() []string { diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index 03f8847051..527f765534 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -55,8 +55,11 @@ func (self *SVirtualizedGuestDriver) PrepareDiskRaidConfig(userCred mcclient.Tok return nil, nil } -func (self *SVirtualizedGuestDriver) GetNamedNetworkConfiguration(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *models.SHost, netConfig *api.NetworkConfig) (*models.SNetwork, []models.SNicConfig, api.IPAllocationDirection, bool) { - net, _ := host.GetNetworkWithId(netConfig.Network, netConfig.Reserved) +func (self *SVirtualizedGuestDriver) GetNamedNetworkConfiguration(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *models.SHost, netConfig *api.NetworkConfig) (*models.SNetwork, []models.SNicConfig, api.IPAllocationDirection, bool, error) { + net, err := host.GetNetworkWithId(netConfig.Network, netConfig.Reserved) + if err != nil { + return nil, nil, "", false, errors.Wrapf(err, "get network with id %q, reserverd %v", netConfig.Network, netConfig.Reserved) + } nicConfs := []models.SNicConfig{ { Mac: netConfig.Mac, @@ -75,7 +78,7 @@ func (self *SVirtualizedGuestDriver) GetNamedNetworkConfiguration(guest *models. if len(netConfig.Address) > 0 && !options.Options.EnablePreAllocateIpAddr && !utils.IsInStringArray(host.GetProviderName(), []string{api.CLOUD_PROVIDER_ONECLOUD, api.CLOUD_PROVIDER_VMWARE}) { reUse = true } - return net, nicConfs, api.IPAllocationStepdown, reUse + return net, nicConfs, api.IPAllocationStepdown, reUse, nil } func (self *SVirtualizedGuestDriver) GetRandomNetworkTypes() []string { diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 0b27b84a66..7f58f7aa12 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -69,7 +69,7 @@ type IGuestDriver interface { PrepareDiskRaidConfig(userCred mcclient.TokenCredential, host *SHost, params []*api.BaremetalDiskConfig, disks []*api.DiskConfig) ([]*api.DiskConfig, error) - GetNamedNetworkConfiguration(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *SHost, netConfig *api.NetworkConfig) (*SNetwork, []SNicConfig, api.IPAllocationDirection, bool) + GetNamedNetworkConfiguration(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *SHost, netConfig *api.NetworkConfig) (*SNetwork, []SNicConfig, api.IPAllocationDirection, bool, error) Attach2RandomNetwork(guest *SGuest, ctx context.Context, userCred mcclient.TokenCredential, host *SHost, netConfig *api.NetworkConfig, pendingUsage quotas.IQuota) ([]SGuestnetwork, error) GetRandomNetworkTypes() []string diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index ad0a67093f..c738359ea9 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3481,7 +3481,10 @@ func (self *SGuest) attach2NetworkDesc( func (self *SGuest) attach2NamedNetworkDesc(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, netConfig *api.NetworkConfig, pendingUsage quotas.IQuota) ([]SGuestnetwork, error) { driver := self.GetDriver() - net, nicConfs, allocDir, reuseAddr := driver.GetNamedNetworkConfiguration(self, ctx, userCred, host, netConfig) + net, nicConfs, allocDir, reuseAddr, err := driver.GetNamedNetworkConfiguration(self, ctx, userCred, host, netConfig) + if err != nil { + return nil, errors.Wrapf(err, "GetNamedNetworkConfiguration on host %q", host.GetName()) + } if net != nil { if len(nicConfs) == 0 { return nil, fmt.Errorf("no avaialble network interface?") @@ -3500,8 +3503,7 @@ func (self *SGuest) attach2NamedNetworkDesc(ctx context.Context, userCred mcclie NicConfs: nicConfs, }) if err != nil { - log.Errorf("Attach2Network fail %s", err) - return nil, err + return nil, errors.Wrap(err, "Attach2Network fail") } else { return gn, nil } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 514c254f3f..4c5d1b6610 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2453,18 +2453,18 @@ func (self *SHost) getNetworkOfIPOnHost(ipAddr string) (*SNetwork, error) { return nil, fmt.Errorf("IP %s not reachable on this host", ipAddr) } -func (self *SHost) GetNetinterfacesWithIdAndCredential(netId string, userCred mcclient.TokenCredential, reserved bool) ([]SNetInterface, *SNetwork) { +func (self *SHost) GetNetinterfacesWithIdAndCredential(netId string, userCred mcclient.TokenCredential, reserved bool) ([]SNetInterface, *SNetwork, error) { netObj, err := NetworkManager.FetchById(netId) if err != nil { - return nil, nil + return nil, nil, errors.Wrapf(err, "fetch by id %q", netId) } net := netObj.(*SNetwork) used, err := net.getFreeAddressCount() if err != nil { - return nil, nil + return nil, nil, errors.Wrapf(err, "get network %q free address count", net.GetName()) } if used == 0 && !reserved && !options.Options.BaremetalServerReuseHostIp { - return nil, nil + return nil, nil, errors.Errorf("network %q out of usage", net.GetName()) } matchNetIfs := make([]SNetInterface, 0) netifs := self.GetNetInterfaces() @@ -2478,9 +2478,9 @@ func (self *SHost) GetNetinterfacesWithIdAndCredential(netId string, userCred mc } } if len(matchNetIfs) > 0 { - return matchNetIfs, net + return matchNetIfs, net, nil } - return nil, nil + return nil, nil, errors.Errorf("not found matched netinterface by net %q wire %q", net.GetName(), net.WireId) } func (self *SHost) GetNetworkWithId(netId string, reserved bool) (*SNetwork, error) {