diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index 73d9e1f36f..49af53455d 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -28,7 +28,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" - "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" ) @@ -73,11 +72,11 @@ func (self *SVirtualizedGuestDriver) GetNamedNetworkConfiguration(guest *models. Ifname: "", }) } - reUse := false - if len(netConfig.Address) > 0 && !options.Options.EnablePreAllocateIpAddr && !utils.IsInStringArray(host.GetProviderName(), []string{api.CLOUD_PROVIDER_ONECLOUD, api.CLOUD_PROVIDER_VMWARE, api.CLOUD_PROVIDER_CLOUDPODS}) { - reUse = true - } - return net, nicConfs, api.IPAllocationStepdown, reUse, nil + // reUse := false + // if len(netConfig.Address) > 0 && !options.Options.EnablePreAllocateIpAddr && !utils.IsInStringArray(host.GetProviderName(), []string{api.CLOUD_PROVIDER_ONECLOUD, api.CLOUD_PROVIDER_VMWARE, api.CLOUD_PROVIDER_CLOUDPODS}) { + // reUse = true + // } + return net, nicConfs, api.IPAllocationStepdown, false, nil } func (self *SVirtualizedGuestDriver) GetRandomNetworkTypes() []string { diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index 38a9e337a4..6529546e7c 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -314,17 +314,24 @@ func (manager *SGuestnetworkManager) newGuestNetwork( // if reuse Ip address, no need to check address availability // assign it anyway gn.IpAddr = address - } else if provider == api.CLOUD_PROVIDER_ONECLOUD || options.Options.EnablePreAllocateIpAddr { - addrTable := network.GetUsedAddresses() - recentAddrTable := manager.getRecentlyReleasedIPAddresses(network.Id, network.getAllocTimoutDuration()) - ipAddr, err := network.GetFreeIP(ctx, userCred, addrTable, recentAddrTable, address, allocDir, reserved) - if err != nil { - return nil, err + } else { + // 如果是不具备IPAM能力的平台(主要是OneCloud和VMware,也就是VPC为ONECLOUD的平台 provider == api.CLOUD_PROVIDER_ONECLOUD ),则需要分配IP地址 + // 如果是其他云平台(具体IPAM能力的平台),则 + // * 开启options.Options.EnablePreAllocateIpAddr,也就是把IPAM的任务交给平台的,则需要分配IP地址 + // * IP地址为空并且 !options.Options.EnablePreAllocateIpAddr 时,不需要分配IP,等创建后自动同步过来 + // * 否则,还是需要先分配了 + if provider == api.CLOUD_PROVIDER_ONECLOUD || options.Options.EnablePreAllocateIpAddr || (!options.Options.EnablePreAllocateIpAddr && len(address) > 0) { + addrTable := network.GetUsedAddresses() + recentAddrTable := manager.getRecentlyReleasedIPAddresses(network.Id, network.getAllocTimoutDuration()) + ipAddr, err := network.GetFreeIP(ctx, userCred, addrTable, recentAddrTable, address, allocDir, reserved) + if err != nil { + return nil, err + } + if len(address) > 0 && ipAddr != address && requiredDesignatedIp { + return nil, fmt.Errorf("candidate ip %s is occupied!", address) + } + gn.IpAddr = ipAddr } - if len(address) > 0 && ipAddr != address && requiredDesignatedIp { - return nil, fmt.Errorf("candidate ip %s is occupied!", address) - } - gn.IpAddr = ipAddr } if vpc.Id != api.DEFAULT_VPC_ID && provider == api.CLOUD_PROVIDER_ONECLOUD { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index a0ca424ec1..245ce8efd4 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -3663,8 +3663,8 @@ func (self *SGuest) SyncVMNics( TryReserved: true, AllocDir: api.IPAllocationDefault, RequireDesignatedIP: true, - UseDesignatedIP: false, - NicConfs: []SNicConfig{nicConf}, + // UseDesignatedIP: true, + NicConfs: []SNicConfig{nicConf}, }) if err != nil { result.AddError(err) diff --git a/pkg/compute/options/options.go b/pkg/compute/options/options.go index cf6610e560..1a86cbcfe1 100644 --- a/pkg/compute/options/options.go +++ b/pkg/compute/options/options.go @@ -125,6 +125,7 @@ type ComputeOptions struct { // cloud image sync CloudImagesSyncIntervalHours int `default:"3" help:"Interval to sync public cloud image, defualt is 3 hour"` + // 由云管(Cloudpods)负责分配IP地址,默认为false。默认是由对应具备IPAM能力的云平台自主分配IP地址 EnablePreAllocateIpAddr bool `help:"Enable private and public cloud private ip pre allocate, default false" default:"false"` // 创建虚拟机失败后, 自动使用其他相同配置套餐