Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wip: 云上目标组同步到本地 #825

Draft
wants to merge 1 commit into
base: v1.6.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions cmd/cloud-server/service/load-balancer/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ func (svc *lbSvc) batchUpdateTCloudTargetGroup(cts *rest.Contexts, id string) (i
if err := req.Validate(); err != nil {
return nil, errf.NewFromErr(errf.InvalidParameter, err)
}
// TODO 检查是因为什么原因需要传递 多个安全组id,不需要的话去掉,改成单个
req.IDs = append(req.IDs, id)

// 检查目标组是否已绑定RS,如已绑定则不能更新region、vpc
Expand All @@ -159,7 +160,7 @@ func (svc *lbSvc) batchUpdateTCloudTargetGroup(cts *rest.Contexts, id string) (i
Port: req.Port,
Weight: req.Weight,
}
err = svc.client.DataService().TCloud.LoadBalancer.BatchUpdateTCloudTargetGroup(cts.Kit, dbReq)
err = svc.client.DataService().TCloud.LoadBalancer.UpdateTargetGroup(cts.Kit, dbReq)
if err != nil {
logs.Errorf("update tcloud target group failed, req: %+v, err: %v, rid: %s", req, err, cts.Kit.Rid)
return nil, err
Expand Down Expand Up @@ -226,7 +227,7 @@ func (svc *lbSvc) updateTCloudTargetGroupHealthCheck(cts *rest.Contexts, tgID st
HealthCheck: req.HealthCheck,
}

err := svc.client.DataService().TCloud.LoadBalancer.BatchUpdateTCloudTargetGroup(cts.Kit, dbReq)
err := svc.client.DataService().TCloud.LoadBalancer.UpdateTargetGroup(cts.Kit, dbReq)
if err != nil {
logs.Errorf("update db tcloud target group failed, err: %v, req: %+v, rid: %s", dbReq, err, cts.Kit.Rid)
return nil, err
Expand Down
2 changes: 2 additions & 0 deletions cmd/cloud-server/service/sync/tcloud/sync_all_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ func SyncAllResource(kt *kit.Kit, cliSet *client.ClientSet,
enumor.LoadBalancerCloudResType: SyncLoadBalancer,
enumor.RouteTableCloudResType: SyncRouteTable,
enumor.SubAccountCloudResType: SyncSubAccount,
enumor.TargetGroupCloudResType: SyncTargetGroup,
}

for _, resType := range getSyncOrder() {
Expand All @@ -123,6 +124,7 @@ func getSyncOrder() []enumor.CloudResourceType {
enumor.SecurityGroupCloudResType,
enumor.CvmCloudResType,
enumor.CertCloudResType,
enumor.TargetGroupCloudResType,
enumor.LoadBalancerCloudResType,
enumor.RouteTableCloudResType,
enumor.SubAccountCloudResType,
Expand Down
70 changes: 70 additions & 0 deletions cmd/cloud-server/service/sync/tcloud/target_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* TencentBlueKing is pleased to support the open source community by making
* 蓝鲸智云 - 混合云管理平台 (BlueKing - Hybrid Cloud Management System) available.
* Copyright (C) 2024 THL A29 Limited,
* a Tencent company. All rights reserved.
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://opensource.org/licenses/MIT
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* We undertake not to change the open source license (MIT license) applicable
*
* to the current version of the project delivered to anyone in the future.
*/

package tcloud

import (
"time"

"hcm/cmd/cloud-server/service/sync/detail"
"hcm/pkg/api/hc-service/sync"
"hcm/pkg/client"
"hcm/pkg/criteria/enumor"
"hcm/pkg/kit"
"hcm/pkg/logs"
)

// SyncTargetGroup 同步云上目标组
func SyncTargetGroup(kt *kit.Kit, cliSet *client.ClientSet, accountID string, regions []string,
sd *detail.SyncDetail) error {

// 重新设置rid方便定位
kt = kt.NewSubKit()

start := time.Now()
logs.V(3).Infof("tcloud account[%s] sync target group start, time: %v, rid: %s", accountID, start, kt.Rid)

// 同步详情同步中
if err := sd.ResSyncStatusSyncing(enumor.TargetGroupCloudResType); err != nil {
return err
}

defer func() {
logs.V(3).Infof("tcloud account[%s] sync target group end, cost: %v, rid: %s",
accountID, time.Since(start), kt.Rid)
}()

for _, region := range regions {
req := &sync.TCloudSyncReq{
AccountID: accountID,
Region: region,
}
if err := cliSet.HCService().TCloud.Clb.SyncTargetGroup(kt, req); err != nil {
logs.Errorf("sync tcloud target group failed, err: %v, req: %v, rid: %s", err, req, kt.Rid)
return err
}
}

// 同步详情同步成功
if err := sd.ResSyncStatusSuccess(enumor.TargetGroupCloudResType); err != nil {
return err
}

return nil
}
17 changes: 11 additions & 6 deletions cmd/data-service/service/cloud/load-balancer/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ func convTargetGroupCreateReqToTable[T corelb.TargetGroupExtension](kt *kit.Kit,
}

targetGroup := &tablelb.LoadBalancerTargetGroupTable{
CloudID: tg.CloudID,
Name: tg.Name,
Vendor: vendor,
AccountID: tg.AccountID,
Expand Down Expand Up @@ -293,18 +294,22 @@ func (svc *lbSvc) batchCreateTargetWithGroupID(kt *kit.Kit, txn *sqlx.Tx, accoun

for _, item := range rsList {
tmpRs := &tablelb.LoadBalancerTargetTable{
AccountID: accountID,
InstType: item.InstType,
CloudInstID: item.CloudInstID,
TargetGroupID: item.TargetGroupID,
// for local target group its cloud id is same as local id
CloudTargetGroupID: item.TargetGroupID,
AccountID: accountID,
InstType: item.InstType,
CloudInstID: item.CloudInstID,
TargetGroupID: item.TargetGroupID,
CloudTargetGroupID: item.CloudTargetGroupID,
Port: item.Port,
Weight: item.Weight,
Memo: nil,
Creator: kt.User,
Reviser: kt.User,
}
// for local target group its cloud id is same as local id
if len(item.CloudTargetGroupID) == 0 {
tmpRs.CloudTargetGroupID = item.TargetGroupID

}
// 实例类型-CVM
if item.InstType == enumor.CvmInstType {
tmpRs.InstID = cvmMap[item.CloudInstID].ID
Expand Down
14 changes: 7 additions & 7 deletions cmd/data-service/service/cloud/load-balancer/load_balancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,8 @@ var svc *lbSvc

// InitService initial the clb service
func InitService(cap *capability.Capability) {
svc = &lbSvc{
dao: cap.Dao,
}

svc = &lbSvc{dao: cap.Dao}
h := rest.NewHandler()

// 负载均衡
h.Add("GetLoadBalancer", http.MethodGet, "/vendors/{vendor}/load_balancers/{id}", svc.GetLoadBalancer)
h.Add("ListLoadBalancer", http.MethodPost, "/load_balancers/list", svc.ListLoadBalancer)
Expand All @@ -55,8 +51,8 @@ func InitService(cap *capability.Capability) {
h.Add("ListListener", http.MethodPost, "/load_balancers/listeners/list", svc.ListListener)
h.Add("ListListenerExt", http.MethodPost, "/vendors/tcloud/load_balancers/listeners/list", svc.ListListenerExt)
h.Add("BatchCreateListener", http.MethodPost, "/vendors/{vendor}/listeners/batch/create", svc.BatchCreateListener)
h.Add("BatchCreateListenerWithRule", http.MethodPost, "/vendors/{vendor}/listeners/rules/batch/create",
svc.BatchCreateListenerWithRule)
h.Add("BatchCreateListenerWithRule", http.MethodPost,
"/vendors/{vendor}/listeners/rules/batch/create", svc.BatchCreateListenerWithRule)
h.Add("BatchUpdateListener", http.MethodPatch, "/vendors/{vendor}/listeners/batch/update", svc.BatchUpdateListener)
h.Add("BatchDeleteListener", http.MethodDelete, "/listeners/batch", svc.BatchDeleteListener)
h.Add("CountListenerByLbIDs", http.MethodPost, "/load_balancers/listeners/count", svc.CountListenerByLbIDs)
Expand All @@ -79,7 +75,11 @@ func InitService(cap *capability.Capability) {
"/vendors/{vendor}/target_groups/with/rels/batch/create", svc.BatchCreateTargetGroupWithRel)
h.Add("GetTargetGroup", http.MethodGet, "/vendors/{vendor}/target_groups/{id}", svc.GetTargetGroup)
h.Add("ListTargetGroup", http.MethodPost, "/load_balancers/target_groups/list", svc.ListTargetGroup)
h.Add("ListTargetGroup", http.MethodPost,
"/vendors/{vendor}/load_balancers/target_groups/list", svc.ListTargetGroupExt)
h.Add("UpdateTargetGroup", http.MethodPatch, "/vendors/{vendor}/target_groups", svc.UpdateTargetGroup)
h.Add("BatchUpdateTargetGroup", http.MethodPatch,
"/vendors/{vendor}/target_groups/batch", svc.BatchUpdateTargetGroup)
h.Add("BatchDeleteTargetGroup", http.MethodDelete, "/target_groups/batch", svc.BatchDeleteTargetGroup)
h.Add("BatchUpdateListenerBizInfo", http.MethodPatch,
"/load_balancers/target_groups/bizs/batch/update", svc.BatchUpdateTargetGroupBizInfo)
Expand Down
80 changes: 74 additions & 6 deletions cmd/data-service/service/cloud/load-balancer/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -539,8 +539,9 @@ func (svc *lbSvc) ListTargetGroup(cts *rest.Contexts) (interface{}, error) {

details := make([]corelb.BaseTargetGroup, 0, len(result.Details))
for _, one := range result.Details {
tmpOne, err := convTableToBaseTargetGroup(cts.Kit, &one)
tmpOne, err := convTableToBaseTargetGroup(&one)
if err != nil {
logs.Errorf("fail convert db model to base target group, err: %v, rid: %s", err, cts.Kit.Rid)
continue
}
details = append(details, *tmpOne)
Expand All @@ -549,6 +550,50 @@ func (svc *lbSvc) ListTargetGroup(cts *rest.Contexts) (interface{}, error) {
return &protocloud.TargetGroupListResult{Details: details}, nil
}

// ListTargetGroupExt list with vendor extension
func (svc *lbSvc) ListTargetGroupExt(cts *rest.Contexts) (any, error) {
vendor := enumor.Vendor(cts.PathParameter("vendor").String())
if err := vendor.Validate(); err != nil {
return nil, errf.NewFromErr(errf.InvalidParameter, err)
}

req := new(core.ListReq)
if err := cts.DecodeInto(req); err != nil {
return nil, err
}

if err := req.Validate(); err != nil {
return nil, errf.NewFromErr(errf.InvalidParameter, err)
}
vendorFilter, err := tools.And(req.Filter, tools.RuleEqual("vendor", vendor))
if err != nil {
return nil, err
}
opt := &types.ListOption{
Fields: req.Fields,
Filter: vendorFilter,
Page: req.Page,
}

result, err := svc.dao.LoadBalancerTargetGroup().List(cts.Kit, opt)
if err != nil {
logs.Errorf("list target group extension failed, req: %v, err: %v, rid: %s", req, err, cts.Kit.Rid)
return nil, fmt.Errorf("failed to list target group, err: %v", err)
}

switch vendor {
case enumor.TCloud:

details, err := convTableToTargetGroup(result.Details)
if err != nil {
return nil, err
}
return core.ListResultT[*corelb.TargetGroup[corelb.TCloudTargetGroupExtension]]{Details: details}, nil
default:
return nil, fmt.Errorf("unsupport vendor: %s", vendor)
}
}

// GetTargetGroup ...
func (svc *lbSvc) GetTargetGroup(cts *rest.Contexts) (any, error) {
vendor := enumor.Vendor(cts.PathParameter("vendor").String())
Expand Down Expand Up @@ -578,22 +623,45 @@ func (svc *lbSvc) GetTargetGroup(cts *rest.Contexts) (any, error) {
tgInfo := result.Details[0]
switch tgInfo.Vendor {
case enumor.TCloud:
return convTableToBaseTargetGroup(cts.Kit, &tgInfo)
list, err := convTableToTargetGroup(result.Details)
if err != nil {
return nil, err
}
return list[0], nil
default:
return nil, fmt.Errorf("unsupport vendor: %s", vendor)
}

}
func convTableToTargetGroup[T corelb.TargetGroupExtension](models []tablelb.LoadBalancerTargetGroupTable) (
[]*corelb.TargetGroup[T], error) {

result := make([]*corelb.TargetGroup[T], 0, len(models))
for _, model := range models {
baseGroup, err := convTableToBaseTargetGroup(cvt.ValToPtr(model))
if err != nil {
logs.Errorf("fail to convert base target group to json, err: %v", err)
return nil, err
}
var ext T

if err := json.UnmarshalFromString(string(model.Extension), &ext); err != nil {
return nil, fmt.Errorf("fail to unmarshal target group extension, err: %v", err)
}
result = append(result, &corelb.TargetGroup[T]{BaseTargetGroup: *baseGroup, Extension: &ext})

}
return result, nil
}

func convTableToBaseTargetGroup(kt *kit.Kit, one *tablelb.LoadBalancerTargetGroupTable) (
*corelb.BaseTargetGroup, error) {
func convTableToBaseTargetGroup(one *tablelb.LoadBalancerTargetGroupTable) (*corelb.BaseTargetGroup, error) {

var healthCheck *corelb.TCloudHealthCheckInfo
// 支持不返回该字段
if len(one.HealthCheck) != 0 {
err := json.UnmarshalFromString(string(one.HealthCheck), &healthCheck)
if err != nil {
logs.Errorf("unmarshal healthCheck failed, one: %+v, err: %v, rid: %s", one, err, kt.Rid)
return nil, err
return nil, fmt.Errorf("unmarshal healthCheck failed: %w", err)
}
}

Expand Down