diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index d026e4690a..ccdca3332d 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -75,7 +75,7 @@ func (self *SVirtualizedGuestDriver) GetNamedNetworkConfiguration(guest *models. }) } reUse := false - if len(netConfig.Address) > 0 && !options.Options.EnablePreAllocateIpAddr && !utils.IsInStringArray(host.GetProviderName(), []string{api.CLOUD_PROVIDER_ONECLOUD, api.CLOUD_PROVIDER_VMWARE}) { + 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 diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 62b2fa531a..22ea94e15f 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2510,10 +2510,18 @@ func (self *SHost) GetNetworkWithId(netId string, reserved bool) (*SNetwork, err q2 = q2.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) q2 = q2.Join(regions, sqlchemy.Equals(regions.Field("id"), vpcs.Field("cloudregion_id"))) q2 = q2.Filter(sqlchemy.Equals(networks.Field("id"), netId)) - q2 = q2.Filter(sqlchemy.AND( - sqlchemy.Equals(regions.Field("provider"), api.CLOUD_PROVIDER_ONECLOUD), - sqlchemy.NOT(sqlchemy.Equals(vpcs.Field("id"), api.DEFAULT_VPC_ID)), - )) + q2 = q2.Filter( + sqlchemy.OR( + sqlchemy.AND( + sqlchemy.Equals(regions.Field("provider"), api.CLOUD_PROVIDER_ONECLOUD), + sqlchemy.NOT(sqlchemy.Equals(vpcs.Field("id"), api.DEFAULT_VPC_ID)), + ), + sqlchemy.AND( + sqlchemy.Equals(regions.Field("provider"), api.CLOUD_PROVIDER_CLOUDPODS), + sqlchemy.NOT(sqlchemy.Equals(vpcs.Field("external_id"), api.DEFAULT_VPC_ID)), + ), + ), + ) } q := sqlchemy.Union(q1, q2).Query() diff --git a/pkg/multicloud/cloudpods/host.go b/pkg/multicloud/cloudpods/host.go index 69b2981f75..edc7c12e49 100644 --- a/pkg/multicloud/cloudpods/host.go +++ b/pkg/multicloud/cloudpods/host.go @@ -180,7 +180,7 @@ func (self *SHost) GetSchedtags() ([]string, error) { } type SHostNic struct { - api.HostwireDetails + api.HostnetworkDetails } func (self *SHostNic) GetDriver() string { @@ -188,7 +188,7 @@ func (self *SHostNic) GetDriver() string { } func (self *SHostNic) GetDevice() string { - return self.Interface + return "" } func (self *SHostNic) GetMac() string { @@ -208,24 +208,24 @@ func (self *SHostNic) GetMtu() int32 { } func (self *SHostNic) GetNicType() string { - return "" + return self.NicType } func (self *SHostNic) GetBridge() string { - return self.Bridge + return "" } func (self *SHostNic) GetIpAddr() string { - return "" + return self.IpAddr } func (self *SHost) GetIHostNics() ([]cloudprovider.ICloudHostNetInterface, error) { nics := []SHostNic{} params := map[string]interface{}{ "scope": "system", - "host_id": self.Id, + "details": "true", } - resp, err := modules.Hostwires.List(self.zone.region.cli.s, jsonutils.Marshal(params)) + resp, err := modules.Baremetalnetworks.ListDescendent(self.zone.region.cli.s, self.Id, jsonutils.Marshal(params)) if err != nil { return nil, err } diff --git a/pkg/multicloud/cloudpods/project.go b/pkg/multicloud/cloudpods/project.go index e2ced810f1..a7ebd43075 100644 --- a/pkg/multicloud/cloudpods/project.go +++ b/pkg/multicloud/cloudpods/project.go @@ -49,7 +49,11 @@ func (self *SProject) GetStatus() string { func (self *SCloudpodsClient) GetProjects() ([]SProject, error) { ret := []SProject{} - return ret, self.list(&modules.Projects, nil, &ret) + params := map[string]interface{}{ + "scope": "system", + "limit": 1024, + } + return ret, self.list(&modules.Projects, params, &ret) } func (self *SCloudpodsClient) GetIProjects() ([]cloudprovider.ICloudProject, error) { diff --git a/pkg/multicloud/cloudpods/provider/provider.go b/pkg/multicloud/cloudpods/provider/provider.go index 43898129cd..72e647d0a5 100644 --- a/pkg/multicloud/cloudpods/provider/provider.go +++ b/pkg/multicloud/cloudpods/provider/provider.go @@ -38,6 +38,10 @@ func (self *SCloudpodsProviderFactory) GetName() string { return cloudpods.CLOUD_PROVIDER_CLOUDPODS } +func (self *SCloudpodsProviderFactory) IsNeedForceAutoCreateProject() bool { + return true +} + func (self *SCloudpodsProviderFactory) ValidateCreateCloudaccountData(ctx context.Context, userCred mcclient.TokenCredential, input cloudprovider.SCloudaccountCredential) (cloudprovider.SCloudaccount, error) { ret := cloudprovider.SCloudaccount{} if len(input.AuthUrl) == 0 { diff --git a/pkg/scheduler/cache/candidate/base.go b/pkg/scheduler/cache/candidate/base.go index 77585dda7c..a719159391 100644 --- a/pkg/scheduler/cache/candidate/base.go +++ b/pkg/scheduler/cache/candidate/base.go @@ -303,6 +303,11 @@ func newBaseHostDesc(b *baseBuilder, host *computemodels.SHost) (*BaseHostDesc, return nil, fmt.Errorf("Fill onecloud vpc networks error: %v", err) } } + if host.HostType == computeapi.HOST_TYPE_CLOUDPODS { + if err := desc.fillCloudpodsVpcNetworks(); err != nil { + return nil, fmt.Errorf("Fill cloudpods vpc networks error: %v", err) + } + } if err := desc.fillZone(host); err != nil { return nil, fmt.Errorf("Fill zone error: %v", err) @@ -556,6 +561,47 @@ func (b *BaseHostDesc) fillNetworks(host *computemodels.SHost) error { return nil } +func (b *BaseHostDesc) fillCloudpodsVpcNetworks() error { + nets := computemodels.NetworkManager.Query() + wires := computemodels.WireManager.Query().SubQuery() + vpcs := computemodels.VpcManager.Query().SubQuery() + regions := computemodels.CloudregionManager.Query().SubQuery() + q := nets.AppendField(nets.QueryFields()...) + q = q.AppendField( + vpcs.Field("id", "vpc_id"), + regions.Field("provider"), + ) + q = q.Join(wires, sqlchemy.Equals(wires.Field("id"), nets.Field("wire_id"))) + q = q.Join(vpcs, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + q = q.Join(regions, sqlchemy.Equals(regions.Field("id"), vpcs.Field("cloudregion_id"))) + q = q.Filter(sqlchemy.AND( + sqlchemy.Equals(regions.Field("provider"), computeapi.CLOUD_PROVIDER_CLOUDPODS), + sqlchemy.NOT(sqlchemy.Equals(vpcs.Field("external_id"), computeapi.DEFAULT_VPC_ID)), + )) + + type Row struct { + computemodels.SNetwork + VpcId string + Provider string + } + rows := []Row{} + if err := q.All(&rows); err != nil { + return errors.Wrap(err, "query cloudpods vpc networks") + } + for i := range rows { + row := &rows[i] + net := &row.SNetwork + net.SetModelManager(computemodels.NetworkManager, net) + candidateNet := &api.CandidateNetwork{ + SNetwork: net, + VpcId: row.VpcId, + Provider: row.Provider, + } + b.Networks = append(b.Networks, candidateNet) + } + return nil +} + func (b *BaseHostDesc) fillOnecloudVpcNetworks() error { nets := computemodels.NetworkManager.Query() wires := computemodels.WireManager.Query().SubQuery()