From f13c890358f30d857d795bb66067a47550c2fa58 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 9 Mar 2025 18:14:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E5=88=86=E9=A1=B5=E6=8B=89?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devcloud-mini/.vscode/launch.json | 15 +++ devcloud-mini/cmdb/apps/resource/interface.go | 8 ++ devcloud-mini/cmdb/apps/secret/impl/secret.go | 12 ++- .../cmdb/apps/secret/impl/secret_test.go | 9 +- devcloud-mini/cmdb/apps/secret/interface.go | 6 +- devcloud-mini/cmdb/apps/secret/model.go | 19 +++- devcloud-mini/cmdb/apps/secret/sync.go | 94 +++++++++++++++++++ devcloud-mini/etc/unit_test.env | 0 go.mod | 2 + go.sum | 5 + 10 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 devcloud-mini/.vscode/launch.json create mode 100644 devcloud-mini/cmdb/apps/secret/sync.go create mode 100644 devcloud-mini/etc/unit_test.env diff --git a/devcloud-mini/.vscode/launch.json b/devcloud-mini/.vscode/launch.json new file mode 100644 index 0000000..61b381c --- /dev/null +++ b/devcloud-mini/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}" + } + ] +} \ No newline at end of file diff --git a/devcloud-mini/cmdb/apps/resource/interface.go b/devcloud-mini/cmdb/apps/resource/interface.go index 0d62c42..f03bb0b 100644 --- a/devcloud-mini/cmdb/apps/resource/interface.go +++ b/devcloud-mini/cmdb/apps/resource/interface.go @@ -58,3 +58,11 @@ func NewSearchRequest() *SearchRequest { Tag: map[string]string{}, } } + +func NewResource() *Resource { + return &Resource{ + Meta: &Meta{}, + Spec: &Spec{}, + Status: &Status{}, + } +} diff --git a/devcloud-mini/cmdb/apps/secret/impl/secret.go b/devcloud-mini/cmdb/apps/secret/impl/secret.go index 8026cdc..acd8e5c 100644 --- a/devcloud-mini/cmdb/apps/secret/impl/secret.go +++ b/devcloud-mini/cmdb/apps/secret/impl/secret.go @@ -45,7 +45,7 @@ func (s *SecretServiceImpl) DescribeSecret(ctx context.Context, in *secret.Descr if err != nil { return nil, err } - return ins, nil + return ins.SetDefault(), nil } @@ -83,6 +83,7 @@ func (s *SecretServiceImpl) QuerySecret(ctx context.Context, in *secret.QuerySec if err := cursor.Decode(e); err != nil { return nil, err } + e.SetDefault() set.Add(e) } @@ -91,6 +92,11 @@ func (s *SecretServiceImpl) QuerySecret(ctx context.Context, in *secret.QuerySec } // SyncResource implements secret.Service. -func (s *SecretServiceImpl) SyncResource(context.Context, *secret.SyncResourceRequest, secret.SyncResourceHandleFunc) error { - panic("unimplemented") +func (s *SecretServiceImpl) SyncResource(ctx context.Context, in *secret.SyncResourceRequest, cb secret.SyncResourceHandleFunc) error { + secret, err := s.DescribeSecret(ctx, secret.NewDescribeSecretRequeset(in.Id)) + if err != nil { + return err + } + + return secret.Sync(cb) } diff --git a/devcloud-mini/cmdb/apps/secret/impl/secret_test.go b/devcloud-mini/cmdb/apps/secret/impl/secret_test.go index 54495df..72a6e24 100644 --- a/devcloud-mini/cmdb/apps/secret/impl/secret_test.go +++ b/devcloud-mini/cmdb/apps/secret/impl/secret_test.go @@ -1,6 +1,7 @@ package impl_test import ( + "fmt" "testing" "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource" @@ -32,9 +33,13 @@ func TestQuerySecret(t *testing.T) { func TestDescribeSecret(t *testing.T) { req := secret.NewDescribeSecretRequeset("0f6836e0-a894-3f87-b031-216478a8093b") - set, err := svc.DescribeSecret(ctx, req) + ins, err := svc.DescribeSecret(ctx, req) if err != nil { t.Fatal(err) } - t.Log(set) + t.Log(ins) + + ins.Sync(func(rr secret.ResourceResponse) { + fmt.Println(rr) + }) } diff --git a/devcloud-mini/cmdb/apps/secret/interface.go b/devcloud-mini/cmdb/apps/secret/interface.go index 8fef835..3d402ee 100644 --- a/devcloud-mini/cmdb/apps/secret/interface.go +++ b/devcloud-mini/cmdb/apps/secret/interface.go @@ -7,6 +7,7 @@ import ( "github.com/infraboard/mcube/v2/ioc" "github.com/infraboard/mcube/v2/tools/pretty" "github.com/infraboard/mcube/v2/types" + "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource" ) const ( @@ -42,8 +43,9 @@ type SyncResourceHandleFunc func(ResourceResponse) type ResourceResponse struct { Success bool - InstanceId string `json:"instance_id"` - Message string `json:"message"` + InstanceId string `json:"instance_id"` + Resource *resource.Resource `json:"resource"` + Message string `json:"message"` } func (t ResourceResponse) String() string { diff --git a/devcloud-mini/cmdb/apps/secret/model.go b/devcloud-mini/cmdb/apps/secret/model.go index d3bbb3a..daa6d7f 100644 --- a/devcloud-mini/cmdb/apps/secret/model.go +++ b/devcloud-mini/cmdb/apps/secret/model.go @@ -33,13 +33,21 @@ type Secret struct { CreateSecretRequest `bson:"inline"` } +func (s *Secret) SetDefault() *Secret { + if s.SyncLimit == 0 { + s.SyncLimit = 10 + } + return s +} + func (s *Secret) String() string { return pretty.ToJSON(s) } func NewCreateSecretRequest() *CreateSecretRequest { return &CreateSecretRequest{ - Regions: []string{}, + Regions: []string{}, + SyncLimit: 10, } } @@ -60,12 +68,21 @@ type CreateSecretRequest struct { // 资源所在区域 Regions []string `json:"regions"` + // 通过分页大小 + SyncLimit int64 `json:"sync_limit"` } func (r *CreateSecretRequest) SetIsEncrypted(v bool) { r.isEncrypted = v } +func (r *CreateSecretRequest) GetSyncLimit() int64 { + if r.SyncLimit == 0 { + return 10 + } + return r.SyncLimit +} + func (r *CreateSecretRequest) EncryptedApiSecret() error { if r.isEncrypted { return nil diff --git a/devcloud-mini/cmdb/apps/secret/sync.go b/devcloud-mini/cmdb/apps/secret/sync.go new file mode 100644 index 0000000..1eb5b1f --- /dev/null +++ b/devcloud-mini/cmdb/apps/secret/sync.go @@ -0,0 +1,94 @@ +package secret + +import ( + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" + lighthouse "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse/v20200324" + "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource" +) + +func (s *Secret) Sync(cb SyncResourceHandleFunc) error { + switch s.Vendor { + case resource.VENDOR_TENCENT: + // 腾讯云的API来进行同步, 云资源(API: https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=DescribeRegions) + + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + credential := common.NewCredential( + s.ApiKey, + s.ApiSecret, + ) + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + cpf := profile.NewClientProfile() + cpf.HttpProfile.Endpoint = "lighthouse.tencentcloudapi.com" + + for i := range s.Regions { + region := s.Regions[i] + // 实例化要请求产品的client对象,clientProfile是可选的 + client, _ := lighthouse.NewClient(credential, region, cpf) + + // 实例化一个请求对象,每个接口都会对应一个request对象 + request := lighthouse.NewDescribeInstancesRequest() + SetLimit(request, s.SyncLimit) + SetOffset(request, 0) + + hasNext := true + for hasNext { + // 返回的resp是一个DescribeInstancesResponse的实例,与请求对象对应 + response, err := client.DescribeInstances(request) + if err != nil { + return err + } + + // 处理拉取到的一页的数据 + for _, ins := range response.Response.InstanceSet { + cb(ResourceResponse{ + Resource: TransferLighthouseToResource(ins), + }) + } + + // 当前数据,都没有填满一页,说明后面没有数据 + if *response.Response.TotalCount < *request.Limit { + hasNext = false + } else { + SetOffset(request, GetValue(request.Offset)+GetValue(request.Limit)) + } + } + } + case resource.VENDOR_ALIYUN: + // 阿里云API + } + + return nil +} + +func TransferLighthouseToResource(ins *lighthouse.Instance) *resource.Resource { + res := resource.NewResource() + // 具体的转化逻辑 + res.Meta.Id = GetValue(ins.InstanceId) + res.Spec.Name = GetValue(ins.InstanceName) + res.Spec.Cpu = int32(GetValue(ins.CPU)) + res.Spec.Memory = GetValue(ins.Memory) + res.Spec.Storage = GetValue(ins.SystemDisk.DiskSize) + res.Status.PrivateAddress = common.StringValues(ins.PrivateAddresses) + + return res +} + +func SetOffset(req *lighthouse.DescribeInstancesRequest, v int64) { + req.Offset = &v +} + +func SetLimit(req *lighthouse.DescribeInstancesRequest, v int64) { + req.Limit = &v +} + +func GetValue[T any](ptr *T) T { + if ptr == nil { + var zero T + return zero + } + + return *ptr +} diff --git a/devcloud-mini/etc/unit_test.env b/devcloud-mini/etc/unit_test.env new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod index b0ec726..5b37418 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,8 @@ require ( github.com/google/uuid v1.6.0 github.com/infraboard/mcube/v2 v2.0.51 github.com/rs/zerolog v1.32.0 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1116 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.1115 go.mongodb.org/mongo-driver v1.14.0 golang.org/x/crypto v0.31.0 google.golang.org/grpc v1.70.0 diff --git a/go.sum b/go.sum index 68507ca..43adfe0 100644 --- a/go.sum +++ b/go.sum @@ -188,6 +188,11 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1115/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1116 h1:hd0TUuEj077JDFJfCVj9WR4P14FYWIROTh13Mq0s0tM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1116/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.1115 h1:x1QmcmWiHgvyADvnNeUMtWZbvrBgkOT1bddlAyFBlgA= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.1115/go.mod h1:/+1yyz1i2y7y0hZsmuDskH6JAFeGUrAxJhai2TqTC98= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=