You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tencent_eks.go 6.6 kB

3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package poder
  2. import (
  3. "context"
  4. "strconv"
  5. "sync"
  6. "github.com/golang/glog"
  7. "code.gitlink.org.cn/JCCE/PCM.git/lan_trans/idl/pbtenant"
  8. "code.gitlink.org.cn/JCCE/PCM.git/common/tenanter"
  9. "code.gitlink.org.cn/JCCE/PCM.git/lan_trans/idl/pbpod"
  10. "github.com/pkg/errors"
  11. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
  12. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
  13. tencenteks "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525"
  14. )
  15. var tencentClientMutex sync.Mutex
  16. type TencentEks struct {
  17. cli *tencenteks.Client
  18. region tenanter.Region
  19. tenanter tenanter.Tenanter
  20. }
  21. func (eks TencentEks) GetPodRegion(ctx context.Context, req *pbpod.GetPodRegionReq) (*pbpod.GetPodRegionResp, error) {
  22. regions := make([]*pbtenant.Region, 0)
  23. request := tencenteks.NewDescribeEKSContainerInstanceRegionsRequest()
  24. resp, err := eks.cli.DescribeEKSContainerInstanceRegions(request)
  25. if err != nil {
  26. return nil, errors.Wrap(err, "tencent eks describe region error")
  27. }
  28. for _, eksRegion := range resp.Response.Regions {
  29. regionId, _ := tenanter.GetTencentRegionId(*eksRegion.RegionName)
  30. regionPod := &pbtenant.Region{
  31. Id: regionId,
  32. Name: *eksRegion.RegionName,
  33. }
  34. regions = append(regions, regionPod)
  35. }
  36. return &pbpod.GetPodRegionResp{Regions: regions}, nil
  37. }
  38. func newTencentEksClient(region tenanter.Region, tenant tenanter.Tenanter) (Poder, error) {
  39. var (
  40. client *tencenteks.Client
  41. err error
  42. )
  43. switch t := tenant.(type) {
  44. case *tenanter.AccessKeyTenant:
  45. tencentClientMutex.Lock()
  46. credential := common.NewCredential(
  47. t.GetId(),
  48. t.GetSecret(),
  49. )
  50. cpf := profile.NewClientProfile()
  51. client, err = tencenteks.NewClient(credential, region.GetName(), cpf)
  52. tencentClientMutex.Unlock()
  53. default:
  54. }
  55. if err != nil {
  56. return nil, errors.Wrap(err, "init tencent eks client error")
  57. }
  58. return &TencentEks{
  59. cli: client,
  60. region: region,
  61. tenanter: tenant,
  62. }, nil
  63. }
  64. func (eks TencentEks) CreatePod(ctx context.Context, req *pbpod.CreatePodReq) (*pbpod.CreatePodResp, error) {
  65. request := tencenteks.NewCreateEKSContainerInstancesRequest()
  66. eksCiName := req.PodName
  67. containerName := req.ContainerName
  68. containerImage := req.ContainerImage
  69. eksCpu := req.CpuPod
  70. eksMemory := req.MemoryPod
  71. securityGroupId := req.SecurityGroupId
  72. securityGroupIds := make([]*string, 1)
  73. securityGroupIds[0] = &securityGroupId
  74. subNetId := req.SubnetId
  75. vpcId := req.VpcId
  76. request.EksCiName = &eksCiName
  77. container := make([]*tencenteks.Container, 1)
  78. container[0] = new(tencenteks.Container)
  79. container[0].Name = &containerName
  80. container[0].Image = &containerImage
  81. request.Containers = container
  82. eksCpu64, err := strconv.ParseFloat(eksCpu, 64)
  83. eksMemory64, err := strconv.ParseFloat(eksMemory, 64)
  84. request.Cpu = &eksCpu64
  85. request.Memory = &eksMemory64
  86. request.SecurityGroupIds = securityGroupIds
  87. request.SubnetId = &subNetId
  88. request.VpcId = &vpcId
  89. resp, err := eks.cli.CreateEKSContainerInstances(request)
  90. if err != nil {
  91. return nil, errors.Wrap(err, "Tencent CreatePod error")
  92. }
  93. isFinished := false
  94. if resp.Response.RequestId != nil {
  95. isFinished = true
  96. }
  97. glog.Infof("--------------------K8S Pod Instance created--------------------")
  98. return &pbpod.CreatePodResp{
  99. Finished: isFinished,
  100. RequestId: "tencent pod create request id:" + *resp.Response.RequestId,
  101. PodId: *resp.Response.EksCiIds[0],
  102. PodName: req.PodName,
  103. }, nil
  104. }
  105. func (eks *TencentEks) DeletePod(ctx context.Context, req *pbpod.DeletePodReq) (*pbpod.DeletePodResp, error) {
  106. request := tencenteks.NewDeleteEKSContainerInstancesRequest()
  107. request.EksCiIds = make([]*string, 1)
  108. request.EksCiIds[0] = &req.PcmId
  109. resp, err := eks.cli.DeleteEKSContainerInstances(request)
  110. isFinished := true
  111. if err != nil {
  112. isFinished = false
  113. return nil, errors.Wrap(err, "Tencent DeletePod error")
  114. }
  115. glog.Infof("--------------------K8S Pod Instance deleted--------------------")
  116. return &pbpod.DeletePodResp{
  117. Finished: isFinished,
  118. RequestId: "tencent pod delete request id:" + *resp.Response.RequestId,
  119. PodId: req.PodId,
  120. PodName: req.PodName,
  121. }, nil
  122. }
  123. func (eks *TencentEks) UpdatePod(ctx context.Context, req *pbpod.UpdatePodReq) (*pbpod.UpdatePodResp, error) {
  124. //创建更新pod请求
  125. request := tencenteks.NewUpdateEKSContainerInstanceRequest()
  126. request.EksCiId = &req.PcmId
  127. request.Name = &req.PodName
  128. request.RestartPolicy = &req.RestartPolicy
  129. request.Containers = make([]*tencenteks.Container, 1)
  130. request.Containers[0] = new(tencenteks.Container)
  131. request.Containers[0].Name = &req.ContainerName
  132. request.Containers[0].Image = &req.ContainerImage
  133. resp, err := eks.cli.UpdateEKSContainerInstance(request)
  134. isFinished := true
  135. if err != nil {
  136. isFinished = false
  137. return nil, errors.Wrap(err, "Tencent UpdatePod error")
  138. }
  139. glog.Infof("--------------------K8S Pod Instance deleted--------------------")
  140. return &pbpod.UpdatePodResp{
  141. Finished: isFinished,
  142. RequestId: "tencent pod update request id:" + *resp.Response.RequestId,
  143. PodId: req.PodId,
  144. PodName: req.PodName,
  145. }, nil
  146. }
  147. func (eks TencentEks) ListPodDetail(ctx context.Context, req *pbpod.ListPodDetailReq) (*pbpod.ListPodDetailResp, error) {
  148. request := tencenteks.NewDescribeEKSContainerInstancesRequest()
  149. resp, err := eks.cli.DescribeEKSContainerInstances(request)
  150. if err != nil {
  151. return nil, errors.Wrap(err, "Tencent ListDetail pod error")
  152. }
  153. var ekspods = make([]*pbpod.PodInstance, len(resp.Response.EksCis))
  154. for k, v := range resp.Response.EksCis {
  155. ekspods[k] = &pbpod.PodInstance{
  156. Provider: pbtenant.CloudProvider_tencent,
  157. AccountName: eks.tenanter.AccountName(),
  158. PcmId: *v.EksCiId,
  159. PodId: *v.EksCiId,
  160. PodName: *v.EksCiName,
  161. RegionId: eks.region.GetId(),
  162. RegionName: eks.region.GetName(),
  163. ContainerImage: *v.Containers[0].Image,
  164. ContainerName: *v.Containers[0].Name,
  165. CpuPod: strconv.FormatFloat(*v.Cpu, 'f', 6, 64),
  166. MemoryPod: strconv.FormatFloat(*v.Memory, 'f', 6, 64),
  167. SecurityGroupId: *v.SecurityGroupIds[0],
  168. SubnetId: *v.SubnetId,
  169. VpcId: *v.VpcId,
  170. Namespace: "",
  171. Status: *v.Status,
  172. }
  173. }
  174. isFinished := false
  175. if len(ekspods) < int(req.PageSize) {
  176. isFinished = true
  177. }
  178. glog.Infof("--------------------K8S Pod Instance listed--------------------")
  179. return &pbpod.ListPodDetailResp{
  180. Pods: ekspods,
  181. Finished: isFinished,
  182. PageNumber: req.PageNumber + 1,
  183. PageSize: req.PageSize,
  184. RequestId: *resp.Response.RequestId,
  185. }, nil
  186. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.