mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
add qcloud driver lb sync method && add comment
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user