117 lines
4.3 KiB
Go
117 lines
4.3 KiB
Go
package sync
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
|
||
"122.51.31.227/go-course/go18/devcloud/cmdb/apps/resource"
|
||
"122.51.31.227/go-course/go18/devcloud/cmdb/apps/secret"
|
||
"github.com/infraboard/mcube/v2/ioc"
|
||
"github.com/infraboard/mcube/v2/ioc/config/log"
|
||
"github.com/infraboard/mcube/v2/tools/ptr"
|
||
"github.com/infraboard/modules/task/apps/event"
|
||
"github.com/infraboard/modules/task/apps/task"
|
||
"github.com/rs/zerolog"
|
||
|
||
"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"
|
||
)
|
||
|
||
func init() {
|
||
ioc.Controller().Registry(&VmSyncerServiceImpl{})
|
||
}
|
||
|
||
var _ secret.Syncer = (*VmSyncerServiceImpl)(nil)
|
||
|
||
type VmSyncerServiceImpl struct {
|
||
ioc.ObjectImpl
|
||
|
||
log *zerolog.Logger
|
||
}
|
||
|
||
func (s *VmSyncerServiceImpl) Name() string {
|
||
return secret.GetSyncerName(resource.TYPE_VM)
|
||
}
|
||
|
||
func (s *VmSyncerServiceImpl) Init() error {
|
||
s.log = log.Sub(s.Name())
|
||
secret.RegistrySyncer(resource.TYPE_VM, s)
|
||
return nil
|
||
}
|
||
|
||
// Sync implements secret.Syncer.
|
||
func (s *VmSyncerServiceImpl) Sync(ctx context.Context, ins *secret.Secret, region string, rs resource.TYPE) *task.Task {
|
||
// 怎么使用对应secret 来完成, 用的腾讯的API
|
||
// https://console.cloud.tencent.com/api/explorer?Product=cvm&Version=2017-03-12&Action=DescribeRegions
|
||
// https://console.cloud.tencent.com/api/explorer?Product=lighthouse&Version=2020-03-24&Action=DescribeInstances
|
||
return task.GetService().Run(ctx, task.NewFnTask(func(ctx context.Context, req any) error {
|
||
taskInfo := task.GetTaskFromCtx(ctx)
|
||
_, err := event.GetService().AddEvent(ctx, task.NewInfoEvent("同步开始", taskInfo.Id))
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer event.GetService().AddEvent(ctx, task.NewInfoEvent("同步结束", taskInfo.Id))
|
||
|
||
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
|
||
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性
|
||
// 以下代码示例仅供参考,建议采用更安全的方式来使用密钥
|
||
// 请参见:https://cloud.tencent.com/document/product/1278/85305
|
||
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
|
||
credential := common.NewCredential(
|
||
ins.ApiKey,
|
||
ins.ApiSecret,
|
||
)
|
||
// 使用临时密钥示例
|
||
// credential := common.NewTokenCredential("SecretId", "SecretKey", "Token")
|
||
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||
cpf := profile.NewClientProfile()
|
||
cpf.HttpProfile.Endpoint = "lighthouse.tencentcloudapi.com"
|
||
// 实例化要请求产品的client对象,clientProfile是可选的
|
||
// "ap-shanghai"
|
||
client, _ := lighthouse.NewClient(credential, region, cpf)
|
||
|
||
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||
request := lighthouse.NewDescribeInstancesRequest()
|
||
|
||
// 返回的resp是一个DescribeInstancesResponse的实例,与请求对象对应
|
||
response, err := client.DescribeInstances(request)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
_, err = event.GetService().AddEvent(ctx, task.NewInfoEvent("接口调用成功", taskInfo.Id).SetDetail(response.ToJsonString()))
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 获取出了实例的列表
|
||
for _, vm := range response.Response.InstanceSet {
|
||
// 转化为一个Resource对象
|
||
res := resource.NewResource()
|
||
res.Vendor = resource.VENDOR_TENCENT
|
||
res.CredentialId = ins.Id
|
||
res.Region = region
|
||
res.ResourceType = resource.TYPE_VM
|
||
res.Id = ptr.GetValue(vm.InstanceId)
|
||
res.Name = ptr.GetValue(vm.InstanceName)
|
||
res.Cpu = ptr.GetValue(vm.CPU)
|
||
res.Memory = ptr.GetValue(vm.Memory)
|
||
res.SystemStorage = ptr.GetValue(vm.SystemDisk.DiskSize)
|
||
res.Extra["os_name"] = ptr.GetValue(vm.OsName)
|
||
res.PrivateAddress = ptr.GetArrayValue(vm.PrivateAddresses)
|
||
res.PublicAddress = ptr.GetArrayValue(vm.PublicAddresses)
|
||
res.Phase = ptr.GetValue(vm.InstanceState)
|
||
res, err := resource.GetService().Add(ctx, res)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
_, err = event.GetService().AddEvent(ctx, task.NewInfoEvent(fmt.Sprintf("资源%s同步成功", res.Name), taskInfo.Id).SetDetail(res.String()))
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}, ins).SetAsync(true).SetLabel(secret.TASK_LABLE_SECRET_ID, ins.Id))
|
||
}
|