add qcloud driver lb sync method && add comment

This commit is contained in:
TangBin
2019-02-18 17:46:24 +08:00
parent 11f5b40b63
commit 119516736c
3 changed files with 288 additions and 86 deletions
+4 -86
View File
@@ -332,12 +332,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend
if err != nil {
return nil, err
}
// 腾讯云本身没有后端服务器组,因此不需要在qcloud端执行创建操作
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
return nil, nil
}
loadbalancer := lbbg.GetLoadbalancer()
if loadbalancer == nil {
return nil, fmt.Errorf("failed to find loadbalancer for backendgroup %s", lbbg.Name)
@@ -409,17 +403,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend
if lbbg == nil {
return nil, fmt.Errorf("failed to find lbbg for backend %s", lbb.Name)
}
guest := lbb.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
}
// 兼容腾讯云,在fake的backend group 关联具体的转发策略之前。不需要同步后端服务器
if lbbg.GetProviderName() == models.CLOUD_PROVIDER_QCLOUD && lbbg.RefCount() == 0 {
return nil, nil
}
lb := lbbg.GetLoadbalancer()
if lb == nil {
return nil, fmt.Errorf("failed to find lb for backendgroup %s", lbbg.Name)
@@ -436,6 +419,10 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerBackend
if err != nil {
return nil, err
}
guest := lbb.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
}
iLoadbalancerBackend, err := iLoadbalancerBackendGroup.AddBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
if err != nil {
return nil, err
@@ -465,15 +452,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestDeleteLoadbalancerBackend
if err != nil {
return nil, err
}
// ===========兼容腾讯云,未关联具体转发规则时,直接删除本地数据即可===============
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
count := lbbg.RefCount()
if count == 0 {
return nil, nil
}
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(lb.ExternalId)
if err != nil {
return nil, err
@@ -516,40 +494,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerListene
if err := lblis.SetExternalId(iListener.GetGlobalId()); err != nil {
return nil, err
}
// ====腾讯云添加后端服务器=====
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
group := lblis.GetLoadbalancerBackendGroup()
if group != nil {
backends, err := group.GetBackends()
if err != nil {
return nil, fmt.Errorf("failed to find backends for backend group %s: %s", group.GetId(), err)
}
extBgID := iListener.GetBackendGroupId()
if len(extBgID) == 0 {
return nil, fmt.Errorf("the backend group external id of loadbalancer listener %s is empty", lblis.GetId())
}
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(extBgID)
if err != nil {
return nil, fmt.Errorf("failed to find backend group for loadbalancer listener %s: %s", lblis.GetId(), err)
}
for _, backend := range backends {
guest := backend.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find instance for loadbalancer backend %s", backend.GetId())
}
_, err := ilbbg.AddBackendServer(guest.GetExternalId(), backend.Weight, backend.Port)
if err != nil {
return nil, err
}
}
}
}
// ==========================
return nil, lblis.SyncWithCloudLoadbalancerListener(ctx, userCred, loadbalancer, iListener, "", false)
})
return nil
@@ -732,32 +676,6 @@ func (self *SManagedVirtualizationRegionDriver) RequestCreateLoadbalancerListene
if err := lbr.SetExternalId(iListenerRule.GetGlobalId()); err != nil {
return nil, err
}
// ====腾讯云添加后端服务器=====
if listener.GetProviderName() == models.CLOUD_PROVIDER_QCLOUD && len(rule.BackendGroupID) > 0 {
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(rule.BackendGroupID)
if err != nil {
return nil, fmt.Errorf("failed to find backend group for listener rule %s: %s", lbr.Name, err)
}
group := lbr.GetLoadbalancerBackendGroup()
backends, err := group.GetBackends()
if err != nil {
return nil, fmt.Errorf("failed to find backends for backend group %s: %s", group.GetId(), err)
}
for _, backend := range backends {
guest := backend.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find instance for loadbalancer backend %s", backend.GetId())
}
_, err := ilbbg.AddBackendServer(guest.GetExternalId(), backend.Weight, backend.Port)
if err != nil {
return nil, err
}
}
}
// ==========================
return nil, lbr.SyncWithCloudLoadbalancerListenerRule(ctx, userCred, iListenerRule, "", false)
})
return nil
+278
View File
@@ -1,7 +1,14 @@
package regiondrivers
import (
"context"
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/compute/models"
"yunion.io/x/onecloud/pkg/mcclient"
)
type SQcloudRegionDriver struct {
@@ -16,3 +23,274 @@ func init() {
func (self *SQcloudRegionDriver) GetProvider() string {
return models.CLOUD_PROVIDER_QCLOUD
}
func (self *SQcloudRegionDriver) RequestCreateLoadbalancerBackendGroup(ctx context.Context, userCred mcclient.TokenCredential, lbbg *models.SLoadbalancerBackendGroup, backends []cloudprovider.SLoadbalancerBackend, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
iRegion, err := lbbg.GetIRegion()
if err != nil {
return nil, err
}
// 腾讯云本身没有后端服务器组,因此不需要在qcloud端执行创建操作
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
return nil, nil
}
loadbalancer := lbbg.GetLoadbalancer()
if loadbalancer == nil {
return nil, fmt.Errorf("failed to find loadbalancer for backendgroup %s", lbbg.Name)
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(loadbalancer.ExternalId)
if err != nil {
return nil, err
}
group := &cloudprovider.SLoadbalancerBackendGroup{
Name: lbbg.Name,
GroupType: lbbg.Type,
Backends: backends,
}
iLoadbalancerBackendGroup, err := iLoadbalancer.CreateILoadBalancerBackendGroup(group)
if err != nil {
return nil, err
}
if err := lbbg.SetExternalId(iLoadbalancerBackendGroup.GetGlobalId()); err != nil {
return nil, err
}
iBackends, err := iLoadbalancerBackendGroup.GetILoadbalancerBackends()
if err != nil {
return nil, err
}
if len(iBackends) > 0 {
provider := loadbalancer.GetCloudprovider()
if provider == nil {
return nil, fmt.Errorf("failed to find cloudprovider for lb %s", loadbalancer.Name)
}
models.LoadbalancerBackendManager.SyncLoadbalancerBackends(ctx, userCred, provider, lbbg, iBackends, &models.SSyncRange{})
}
return nil, nil
})
return nil
}
func (self *SQcloudRegionDriver) RequestCreateLoadbalancerBackend(ctx context.Context, userCred mcclient.TokenCredential, lbb *models.SLoadbalancerBackend, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
lbbg := lbb.GetLoadbalancerBackendGroup()
if lbbg == nil {
return nil, fmt.Errorf("failed to find lbbg for backend %s", lbb.Name)
}
guest := lbb.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
}
// 兼容腾讯云,在fake的backend group 关联具体的转发策略之前。不需要同步后端服务器
if lbbg.GetProviderName() == models.CLOUD_PROVIDER_QCLOUD && lbbg.RefCount() == 0 {
return nil, nil
}
lb := lbbg.GetLoadbalancer()
if lb == nil {
return nil, fmt.Errorf("failed to find lb for backendgroup %s", lbbg.Name)
}
iRegion, err := lb.GetIRegion()
if err != nil {
return nil, err
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(lb.ExternalId)
if err != nil {
return nil, err
}
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
if err != nil {
return nil, err
}
iLoadbalancerBackend, err := iLoadbalancerBackendGroup.AddBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
if err != nil {
return nil, err
}
if err := lbb.SetExternalId(iLoadbalancerBackend.GetGlobalId()); err != nil {
return nil, err
}
return nil, lbb.SyncWithCloudLoadbalancerBackend(ctx, userCred, iLoadbalancerBackend, "", false)
})
return nil
}
func (self *SQcloudRegionDriver) RequestDeleteLoadbalancerBackend(ctx context.Context, userCred mcclient.TokenCredential, lbb *models.SLoadbalancerBackend, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
if jsonutils.QueryBoolean(task.GetParams(), "purge", false) {
return nil, nil
}
lbbg := lbb.GetLoadbalancerBackendGroup()
if lbbg == nil {
return nil, fmt.Errorf("failed to find lbbg for backend %s", lbb.Name)
}
lb := lbbg.GetLoadbalancer()
if lb == nil {
return nil, fmt.Errorf("failed to find lb for backendgroup %s", lbbg.Name)
}
iRegion, err := lb.GetIRegion()
if err != nil {
return nil, err
}
// ===========兼容腾讯云,未关联具体转发规则时,直接删除本地数据即可===============
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
count := lbbg.RefCount()
if count == 0 {
return nil, nil
}
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(lb.ExternalId)
if err != nil {
return nil, err
}
iLoadbalancerBackendGroup, err := iLoadbalancer.GetILoadBalancerBackendGroupById(lbbg.ExternalId)
if err != nil {
return nil, err
}
guest := lbb.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find guest for lbb %s", lbb.Name)
}
return nil, iLoadbalancerBackendGroup.RemoveBackendServer(guest.ExternalId, lbb.Weight, lbb.Port)
})
return nil
}
func (self *SQcloudRegionDriver) RequestCreateLoadbalancerListener(ctx context.Context, userCred mcclient.TokenCredential, lblis *models.SLoadbalancerListener, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
params, err := lblis.GetLoadbalancerListenerParams()
if err != nil {
return nil, err
}
loadbalancer := lblis.GetLoadbalancer()
if loadbalancer == nil {
return nil, fmt.Errorf("failed to find loadbalancer for lblis %s", lblis.Name)
}
iRegion, err := loadbalancer.GetIRegion()
if err != nil {
return nil, err
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(loadbalancer.ExternalId)
if err != nil {
return nil, err
}
iListener, err := iLoadbalancer.CreateILoadBalancerListener(params)
if err != nil {
return nil, err
}
if err := lblis.SetExternalId(iListener.GetGlobalId()); err != nil {
return nil, err
}
// ====腾讯云添加后端服务器=====
if iRegion.GetProvider() == models.CLOUD_PROVIDER_QCLOUD {
group := lblis.GetLoadbalancerBackendGroup()
if group != nil {
backends, err := group.GetBackends()
if err != nil {
return nil, fmt.Errorf("failed to find backends for backend group %s: %s", group.GetId(), err)
}
extBgID := iListener.GetBackendGroupId()
if len(extBgID) == 0 {
return nil, fmt.Errorf("the backend group external id of loadbalancer listener %s is empty", lblis.GetId())
}
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(extBgID)
if err != nil {
return nil, fmt.Errorf("failed to find backend group for loadbalancer listener %s: %s", lblis.GetId(), err)
}
for _, backend := range backends {
guest := backend.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find instance for loadbalancer backend %s", backend.GetId())
}
_, err := ilbbg.AddBackendServer(guest.GetExternalId(), backend.Weight, backend.Port)
if err != nil {
return nil, err
}
}
}
}
return nil, lblis.SyncWithCloudLoadbalancerListener(ctx, userCred, loadbalancer, iListener, "", false)
})
return nil
}
func (self *SQcloudRegionDriver) RequestCreateLoadbalancerListenerRule(ctx context.Context, userCred mcclient.TokenCredential, lbr *models.SLoadbalancerListenerRule, task taskman.ITask) error {
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
listener := lbr.GetLoadbalancerListener()
if listener == nil {
return nil, fmt.Errorf("failed to find listener for listnener rule %s", lbr.Name)
}
loadbalancer := listener.GetLoadbalancer()
if loadbalancer == nil {
return nil, fmt.Errorf("failed to find loadbalancer for listener %s", listener.Name)
}
iRegion, err := loadbalancer.GetIRegion()
if err != nil {
return nil, err
}
iLoadbalancer, err := iRegion.GetILoadBalancerById(loadbalancer.ExternalId)
if err != nil {
return nil, err
}
iListener, err := iLoadbalancer.GetILoadBalancerListenerById(listener.ExternalId)
if err != nil {
return nil, err
}
rule := &cloudprovider.SLoadbalancerListenerRule{
Name: lbr.Name,
Domain: lbr.Domain,
Path: lbr.Path,
}
if len(lbr.BackendGroupId) > 0 {
group := lbr.GetLoadbalancerBackendGroup()
if group == nil {
return nil, fmt.Errorf("failed to find backend group for listener rule %s", lbr.Name)
}
rule.BackendGroupID = group.ExternalId
rule.BackendGroupType = group.Type
}
iListenerRule, err := iListener.CreateILoadBalancerListenerRule(rule)
if err != nil {
return nil, err
}
if err := lbr.SetExternalId(iListenerRule.GetGlobalId()); err != nil {
return nil, err
}
// ====腾讯云添加后端服务器=====
if listener.GetProviderName() == models.CLOUD_PROVIDER_QCLOUD && len(rule.BackendGroupID) > 0 {
ilbbg, err := iLoadbalancer.GetILoadBalancerBackendGroupById(rule.BackendGroupID)
if err != nil {
return nil, fmt.Errorf("failed to find backend group for listener rule %s: %s", lbr.Name, err)
}
group := lbr.GetLoadbalancerBackendGroup()
backends, err := group.GetBackends()
if err != nil {
return nil, fmt.Errorf("failed to find backends for backend group %s: %s", group.GetId(), err)
}
for _, backend := range backends {
guest := backend.GetGuest()
if guest == nil {
return nil, fmt.Errorf("failed to find instance for loadbalancer backend %s", backend.GetId())
}
_, err := ilbbg.AddBackendServer(guest.GetExternalId(), backend.Weight, backend.Port)
if err != nil {
return nil, err
}
}
}
return nil, lbr.SyncWithCloudLoadbalancerListenerRule(ctx, userCred, iListenerRule, "", false)
})
return nil
}
+6
View File
@@ -24,6 +24,12 @@ const (
LB_TYPE_APPLICATION = LB_TYPE(1)
)
/*
todo:
1.统一LB 证书fingerprint算法.另外缺少一个回写指纹算法到数据库的方法。
2.需要同步腾讯云LB 所在的project
*/
// https://cloud.tencent.com/document/api/214/30694#LoadBalancer
type SLoadbalancer struct {
region *SRegion