Merge pull request #8533 from tb365/bugfix/tb-bugfix-20102701

Bugfix/tb bugfix 20102701
This commit is contained in:
yunion-ci-robot
2020-10-28 12:37:41 +08:00
committed by GitHub
7 changed files with 89 additions and 11 deletions
@@ -317,7 +317,7 @@ func (man *SCachedLoadbalancerCertificateManager) newFromCloudLoadbalancerCertif
if err != nil {
switch err {
case sql.ErrNoRows:
localcert, err := LoadbalancerCertificateManager.CreateCertificate(ctx, userCred, lbcert.Name, extCertificate.GetPublickKey(), extCertificate.GetPrivateKey(), extCertificate.GetFingerprint())
localcert, err := LoadbalancerCertificateManager.CreateCertificate(ctx, userCred, lbcert.Name, extCertificate)
if err != nil {
return nil, fmt.Errorf("newFromCloudLoadbalancerCertificate CreateCertificate %s", err)
}
+10 -3
View File
@@ -32,6 +32,7 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/validators"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/stringutils2"
@@ -382,14 +383,15 @@ func (man *SLoadbalancerCertificateManager) InitializeData() error {
return nil
}
func (man *SLoadbalancerCertificateManager) CreateCertificate(ctx context.Context, userCred mcclient.TokenCredential, name string, publicKey string, privateKey, fingerprint string) (*SLoadbalancerCertificate, error) {
func (man *SLoadbalancerCertificateManager) CreateCertificate(ctx context.Context, userCred mcclient.TokenCredential, name string, extCert cloudprovider.ICloudLoadbalancerCertificate) (*SLoadbalancerCertificate, error) {
fingerprint := extCert.GetFingerprint()
if len(fingerprint) == 0 {
return nil, fmt.Errorf("CreateCertificate fingerprint can not be empty")
}
data := jsonutils.NewDict()
data.Set("certificate", jsonutils.NewString(publicKey))
data.Set("private_key", jsonutils.NewString(privateKey))
data.Set("certificate", jsonutils.NewString(extCert.GetPublickKey()))
data.Set("private_key", jsonutils.NewString(extCert.GetPrivateKey()))
data.Set("name", jsonutils.NewString(name))
data.Set("fingerprint", jsonutils.NewString(fingerprint))
q := man.Query().Equals("fingerprint", fingerprint).Asc("created_at").IsFalse("pending_deleted")
@@ -410,6 +412,11 @@ func (man *SLoadbalancerCertificateManager) CreateCertificate(ctx context.Contex
cert.ProjectId = userCred.GetProjectId()
cert.ProjectSrc = string(apis.OWNER_SOURCE_CLOUD)
// other information's
cert.CommonName = extCert.GetCommonName()
cert.SubjectAlternativeNames = extCert.GetSubjectAlternativeNames()
cert.NotAfter = extCert.GetExpireTime()
err = man.TableSpec().Insert(ctx, cert)
if err != nil {
return nil, err
+66 -3
View File
@@ -803,6 +803,53 @@ func (man *SLoadbalancerManager) getLoadbalancersByRegion(region *SCloudregion,
return lbs, nil
}
func (man *SLoadbalancerManager) getLoadbalancersByExternalIds(externalIds []string) ([]SLoadbalancer, error) {
lbs := []SLoadbalancer{}
q := man.Query()
q = q.In("external_id", externalIds)
q = q.IsFalse("pending_deleted")
if err := db.FetchModelObjects(man, q, &lbs); err != nil {
log.Errorf("failed to get lbs for region: %#v error: %v", externalIds, err)
return nil, err
}
return lbs, nil
}
func (man *SLoadbalancerManager) getLocalLoadbalancers(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, region *SCloudregion, lbs []cloudprovider.ICloudLoadbalancer) ([]SLoadbalancer, error) {
part1, err := man.getLoadbalancersByRegion(region, provider)
if err != nil {
return nil, err
}
localLbs := map[string]SLoadbalancer{}
for i := range part1 {
localLbs[part1[i].Id] = part1[i]
}
externalIds := []string{}
for i := range lbs {
externalIds = append(externalIds, lbs[i].GetGlobalId())
}
if len(externalIds) > 0 {
part2, err := man.getLoadbalancersByExternalIds(externalIds)
if err != nil {
return nil, err
}
for i := range part2 {
localLbs[part2[i].Id] = part2[i]
}
}
ret := []SLoadbalancer{}
for id, _ := range localLbs {
ret = append(ret, localLbs[id])
}
return ret, nil
}
func (man *SLoadbalancerManager) SyncLoadbalancers(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, region *SCloudregion, lbs []cloudprovider.ICloudLoadbalancer, syncRange *SSyncRange) ([]SLoadbalancer, []cloudprovider.ICloudLoadbalancer, compare.SyncResult) {
syncOwnerId := provider.GetOwnerId()
@@ -813,7 +860,7 @@ func (man *SLoadbalancerManager) SyncLoadbalancers(ctx context.Context, userCred
remoteLbs := []cloudprovider.ICloudLoadbalancer{}
syncResult := compare.SyncResult{}
dbLbs, err := man.getLoadbalancersByRegion(region, provider)
dbLbs, err := man.getLocalLoadbalancers(ctx, userCred, provider, region, remoteLbs)
if err != nil {
syncResult.Error(err)
return nil, nil, syncResult
@@ -846,7 +893,7 @@ func (man *SLoadbalancerManager) SyncLoadbalancers(ctx context.Context, userCred
}
}
for i := 0; i < len(commondb); i++ {
err = commondb[i].SyncWithCloudLoadbalancer(ctx, userCred, commonext[i], syncOwnerId, provider)
err = commondb[i].SyncWithCloudLoadbalancer(ctx, userCred, commonext[i], syncOwnerId, provider, region)
if err != nil {
syncResult.UpdateError(err)
} else {
@@ -912,6 +959,14 @@ func (man *SLoadbalancerManager) newFromCloudLoadbalancer(ctx context.Context, u
lbNetworkIds := getExtLbNetworkIds(extLb, lb.ManagerId)
lb.NetworkId = strings.Join(lbNetworkIds, ",")
// classic vpc
if extLb.GetNetworkType() == api.LB_NETWORK_TYPE_CLASSIC {
if vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(ctx, provider, region); err == nil && vpc != nil {
lb.VpcId = vpc.GetId()
}
}
// vpc
if vpcId := extLb.GetVpcId(); len(vpcId) > 0 {
if vpc, err := db.FetchByExternalIdAndManagerId(VpcManager, vpcId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
return q.Equals("manager_id", provider.Id)
@@ -1081,7 +1136,7 @@ func (self *SLoadbalancer) SyncLoadbalancerEip(ctx context.Context, userCred mcc
return result
}
func (lb *SLoadbalancer) SyncWithCloudLoadbalancer(ctx context.Context, userCred mcclient.TokenCredential, extLb cloudprovider.ICloudLoadbalancer, syncOwnerId mcclient.IIdentityProvider, provider *SCloudprovider) error {
func (lb *SLoadbalancer) SyncWithCloudLoadbalancer(ctx context.Context, userCred mcclient.TokenCredential, extLb cloudprovider.ICloudLoadbalancer, syncOwnerId mcclient.IIdentityProvider, provider *SCloudprovider, region *SCloudregion) error {
lockman.LockObject(ctx, lb)
defer lockman.ReleaseObject(ctx, lb)
@@ -1100,6 +1155,14 @@ func (lb *SLoadbalancer) SyncWithCloudLoadbalancer(ctx context.Context, userCred
}
syncVirtualResourceMetadata(ctx, userCred, lb, extLb)
// classic vpc
if extLb.GetNetworkType() == api.LB_NETWORK_TYPE_CLASSIC {
if vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(ctx, provider, region); err == nil && vpc != nil {
lb.VpcId = vpc.GetId()
}
}
// vpc
if vpcId := extLb.GetVpcId(); len(vpcId) > 0 {
if vpc, err := db.FetchByExternalIdAndManagerId(VpcManager, vpcId, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
return q.Equals("manager_id", provider.Id)
+1 -1
View File
@@ -1927,7 +1927,7 @@ func (self *SHuaWeiRegionDriver) RequestCreateLoadbalancer(ctx context.Context,
}
}
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider()); err != nil {
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider(), lb.GetRegion()); err != nil {
return nil, errors.Wrap(err, "Huawei.RequestCreateLoadbalancer.SyncWithCloudLoadbalancer")
}
lbbgs, err := iLoadbalancer.GetILoadBalancerBackendGroups()
+1 -1
View File
@@ -197,7 +197,7 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancer(ctx co
if err := db.SetExternalId(lb, userCred, iLoadbalancer.GetGlobalId()); err != nil {
return nil, err
}
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider()); err != nil {
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider(), lb.GetRegion()); err != nil {
return nil, err
}
//公网lb,需要同步public ip
+1 -1
View File
@@ -178,7 +178,7 @@ func (self *SOpenStackRegionDriver) RequestCreateLoadbalancer(ctx context.Contex
return nil, errors.Wrap(fmt.Errorf("status error"), "check status")
}
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider()); err != nil {
if err := lb.SyncWithCloudLoadbalancer(ctx, userCred, iLoadbalancer, nil, lb.GetCloudprovider(), lb.GetRegion()); err != nil {
return nil, err
}
+9 -1
View File
@@ -312,10 +312,18 @@ func (self *SLoadbalancer) GetAddressType() string {
}
func (self *SLoadbalancer) GetNetworkType() string {
return api.LB_NETWORK_TYPE_VPC
if len(self.VpcID) > 0 {
return api.LB_NETWORK_TYPE_VPC
} else {
return api.LB_NETWORK_TYPE_CLASSIC
}
}
func (self *SLoadbalancer) GetNetworkIds() []string {
if len(self.SubnetId) == 0 {
return []string{}
}
return []string{self.SubnetId}
}