Skip to content

Commit

Permalink
wip: 云上目标组同步到本地
Browse files Browse the repository at this point in the history
--story=117125488
  • Loading branch information
chenjr15 committed May 21, 2024
1 parent 7aca3dc commit 453a06f
Show file tree
Hide file tree
Showing 22 changed files with 1,104 additions and 87 deletions.
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

0 comments on commit 453a06f

Please sign in to comment.