fix(region): fix cloudpods scheduler error

This commit is contained in:
Qu Xuan
2021-10-08 15:10:39 +08:00
parent d4fe8236bc
commit ee6251c4af
6 changed files with 75 additions and 13 deletions
+1 -1
View File
@@ -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
+12 -4
View File
@@ -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()
+7 -7
View File
@@ -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
}
+5 -1
View File
@@ -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) {
@@ -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 {
+46
View File
@@ -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()