forked from JointCloud/pcm-coordinator
221 lines
6.4 KiB
Go
221 lines
6.4 KiB
Go
package poder
|
|
|
|
import (
|
|
pbpod "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_pod/gen/idl"
|
|
"context"
|
|
"strconv"
|
|
"sync"
|
|
|
|
"github.com/golang/glog"
|
|
|
|
"code.gitlink.org.cn/JCCE/PCM.git/common/tenanter"
|
|
"github.com/pkg/errors"
|
|
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
|
|
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
|
|
tencenteks "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525"
|
|
)
|
|
|
|
var tencentClientMutex sync.Mutex
|
|
|
|
type TencentEks struct {
|
|
cli *tencenteks.Client
|
|
region tenanter.Region
|
|
tenanter tenanter.Tenanter
|
|
}
|
|
|
|
func (eks TencentEks) GetPodRegion(ctx context.Context, req *pbpod.GetPodRegionReq) (*pbpod.GetPodRegionResp, error) {
|
|
|
|
regions := make([]*pbpod.Region, 0)
|
|
|
|
request := tencenteks.NewDescribeEKSContainerInstanceRegionsRequest()
|
|
resp, err := eks.cli.DescribeEKSContainerInstanceRegions(request)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "tencent eks describe region error")
|
|
}
|
|
for _, eksRegion := range resp.Response.Regions {
|
|
|
|
regionId, _ := tenanter.GetTencentRegionId(*eksRegion.RegionName)
|
|
regionPod := &pbpod.Region{
|
|
Id: regionId,
|
|
Name: *eksRegion.RegionName,
|
|
}
|
|
regions = append(regions, regionPod)
|
|
}
|
|
return &pbpod.GetPodRegionResp{Regions: regions}, nil
|
|
|
|
}
|
|
|
|
func newTencentEksClient(region tenanter.Region, tenant tenanter.Tenanter) (Poder, error) {
|
|
var (
|
|
client *tencenteks.Client
|
|
err error
|
|
)
|
|
|
|
switch t := tenant.(type) {
|
|
case *tenanter.AccessKeyTenant:
|
|
tencentClientMutex.Lock()
|
|
|
|
credential := common.NewCredential(
|
|
t.GetId(),
|
|
t.GetSecret(),
|
|
)
|
|
cpf := profile.NewClientProfile()
|
|
client, err = tencenteks.NewClient(credential, region.GetName(), cpf)
|
|
tencentClientMutex.Unlock()
|
|
default:
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "init tencent eks client error")
|
|
}
|
|
|
|
return &TencentEks{
|
|
cli: client,
|
|
region: region,
|
|
tenanter: tenant,
|
|
}, nil
|
|
}
|
|
|
|
func (eks TencentEks) CreatePod(ctx context.Context, req *pbpod.CreatePodReq) (*pbpod.CreatePodResp, error) {
|
|
|
|
request := tencenteks.NewCreateEKSContainerInstancesRequest()
|
|
|
|
eksCiName := req.PodName
|
|
containerName := req.ContainerName
|
|
containerImage := req.ContainerImage
|
|
eksCpu := req.CpuPod
|
|
eksMemory := req.MemoryPod
|
|
securityGroupId := req.SecurityGroupId
|
|
securityGroupIds := make([]*string, 1)
|
|
securityGroupIds[0] = &securityGroupId
|
|
subNetId := req.SubnetId
|
|
vpcId := req.VpcId
|
|
|
|
request.EksCiName = &eksCiName
|
|
container := make([]*tencenteks.Container, 1)
|
|
container[0] = new(tencenteks.Container)
|
|
container[0].Name = &containerName
|
|
container[0].Image = &containerImage
|
|
|
|
request.Containers = container
|
|
eksCpu64, err := strconv.ParseFloat(eksCpu, 64)
|
|
eksMemory64, err := strconv.ParseFloat(eksMemory, 64)
|
|
request.Cpu = &eksCpu64
|
|
request.Memory = &eksMemory64
|
|
request.SecurityGroupIds = securityGroupIds
|
|
request.SubnetId = &subNetId
|
|
request.VpcId = &vpcId
|
|
|
|
resp, err := eks.cli.CreateEKSContainerInstances(request)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Tencent CreatePod error")
|
|
}
|
|
|
|
isFinished := false
|
|
if resp.Response.RequestId != nil {
|
|
isFinished = true
|
|
}
|
|
|
|
glog.Infof("--------------------K8S Pod Instance created--------------------")
|
|
|
|
return &pbpod.CreatePodResp{
|
|
Finished: isFinished,
|
|
RequestId: "tencent pcm_pod create request id:" + *resp.Response.RequestId,
|
|
PodId: *resp.Response.EksCiIds[0],
|
|
PodName: req.PodName,
|
|
}, nil
|
|
|
|
}
|
|
|
|
func (eks *TencentEks) DeletePod(ctx context.Context, req *pbpod.DeletePodReq) (*pbpod.DeletePodResp, error) {
|
|
request := tencenteks.NewDeleteEKSContainerInstancesRequest()
|
|
request.EksCiIds = make([]*string, 1)
|
|
request.EksCiIds[0] = &req.PcmId
|
|
resp, err := eks.cli.DeleteEKSContainerInstances(request)
|
|
|
|
isFinished := true
|
|
if err != nil {
|
|
isFinished = false
|
|
return nil, errors.Wrap(err, "Tencent DeletePod error")
|
|
}
|
|
|
|
glog.Infof("--------------------K8S Pod Instance deleted--------------------")
|
|
|
|
return &pbpod.DeletePodResp{
|
|
Finished: isFinished,
|
|
RequestId: "tencent pcm_pod delete request id:" + *resp.Response.RequestId,
|
|
PodId: req.PodId,
|
|
PodName: req.PodName,
|
|
}, nil
|
|
}
|
|
|
|
func (eks *TencentEks) UpdatePod(ctx context.Context, req *pbpod.UpdatePodReq) (*pbpod.UpdatePodResp, error) {
|
|
//创建更新pod请求
|
|
request := tencenteks.NewUpdateEKSContainerInstanceRequest()
|
|
request.EksCiId = &req.PcmId
|
|
request.Name = &req.PodName
|
|
request.RestartPolicy = &req.RestartPolicy
|
|
request.Containers = make([]*tencenteks.Container, 1)
|
|
request.Containers[0] = new(tencenteks.Container)
|
|
request.Containers[0].Name = &req.ContainerName
|
|
request.Containers[0].Image = &req.ContainerImage
|
|
resp, err := eks.cli.UpdateEKSContainerInstance(request)
|
|
isFinished := true
|
|
if err != nil {
|
|
isFinished = false
|
|
return nil, errors.Wrap(err, "Tencent UpdatePod error")
|
|
}
|
|
|
|
glog.Infof("--------------------K8S Pod Instance deleted--------------------")
|
|
|
|
return &pbpod.UpdatePodResp{
|
|
Finished: isFinished,
|
|
RequestId: "tencent pcm_pod update request id:" + *resp.Response.RequestId,
|
|
PodId: req.PodId,
|
|
PodName: req.PodName,
|
|
}, nil
|
|
}
|
|
|
|
func (eks TencentEks) ListPodDetail(ctx context.Context, req *pbpod.ListPodDetailReq) (*pbpod.ListPodDetailResp, error) {
|
|
request := tencenteks.NewDescribeEKSContainerInstancesRequest()
|
|
resp, err := eks.cli.DescribeEKSContainerInstances(request)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Tencent ListDetail pcm_pod error")
|
|
}
|
|
var ekspods = make([]*pbpod.PodInstance, len(resp.Response.EksCis))
|
|
for k, v := range resp.Response.EksCis {
|
|
ekspods[k] = &pbpod.PodInstance{
|
|
Provider: pbpod.CloudProvider_tencent,
|
|
AccountName: eks.tenanter.AccountName(),
|
|
PcmId: *v.EksCiId,
|
|
PodId: *v.EksCiId,
|
|
PodName: *v.EksCiName,
|
|
RegionId: eks.region.GetId(),
|
|
RegionName: eks.region.GetName(),
|
|
ContainerImage: *v.Containers[0].Image,
|
|
ContainerName: *v.Containers[0].Name,
|
|
CpuPod: strconv.FormatFloat(*v.Cpu, 'f', 6, 64),
|
|
MemoryPod: strconv.FormatFloat(*v.Memory, 'f', 6, 64),
|
|
SecurityGroupId: *v.SecurityGroupIds[0],
|
|
SubnetId: *v.SubnetId,
|
|
VpcId: *v.VpcId,
|
|
Namespace: "",
|
|
Status: *v.Status,
|
|
}
|
|
}
|
|
isFinished := false
|
|
if len(ekspods) < int(req.PageSize) {
|
|
isFinished = true
|
|
}
|
|
|
|
glog.Infof("--------------------K8S Pod Instance listed--------------------")
|
|
|
|
return &pbpod.ListPodDetailResp{
|
|
Pods: ekspods,
|
|
Finished: isFinished,
|
|
PageNumber: req.PageNumber + 1,
|
|
PageSize: req.PageSize,
|
|
RequestId: *resp.Response.RequestId,
|
|
}, nil
|
|
}
|