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.go 6.4 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package ecser
  2. import (
  3. "context"
  4. "strconv"
  5. "code.gitlink.org.cn/JCCE/PCM.git/common/tenanter"
  6. "code.gitlink.org.cn/JCCE/PCM.git/lan_trans/idl/pbecs"
  7. "code.gitlink.org.cn/JCCE/PCM.git/lan_trans/idl/pbtenant"
  8. string_ "github.com/alibabacloud-go/darabonba-string/client"
  9. util "github.com/alibabacloud-go/tea-utils/service"
  10. "github.com/alibabacloud-go/tea/tea"
  11. "github.com/golang/glog"
  12. "github.com/pkg/errors"
  13. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
  14. "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
  15. cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
  16. )
  17. type TencentCvm struct {
  18. cli *cvm.Client
  19. region tenanter.Region
  20. tenanter tenanter.Tenanter
  21. }
  22. func newTencentCvmClient(region tenanter.Region, tenant tenanter.Tenanter) (Ecser, error) {
  23. var (
  24. client *cvm.Client
  25. err error
  26. )
  27. switch t := tenant.(type) {
  28. case *tenanter.AccessKeyTenant:
  29. client, err = cvm.NewClient(common.NewCredential(t.GetId(), t.GetSecret()), region.GetName(), profile.NewClientProfile())
  30. default:
  31. }
  32. if err != nil {
  33. return nil, errors.Wrap(err, "init tencent cvm client error")
  34. }
  35. return &TencentCvm{
  36. cli: client,
  37. region: region,
  38. tenanter: tenant,
  39. }, nil
  40. }
  41. func (ecs *TencentCvm) CreateEcs(ctx context.Context, req *pbecs.CreateEcsReq) (*pbecs.CreateEcsResp, error) {
  42. ImageId := req.GetImageId()
  43. InstanceType := req.GetInstanceType()
  44. InstanceName := req.GetInstanceName()
  45. Amount := int64(req.GetAmount())
  46. DryRun := req.GetDryRun()
  47. InstanceChargeType := req.GetInstanceChargeType()
  48. ZoneId := req.GetZoneId()
  49. request := cvm.NewRunInstancesRequest()
  50. request.ImageId = &ImageId
  51. request.InstanceType = &InstanceType
  52. request.InstanceName = &InstanceName
  53. request.DryRun = util.EqualString(&DryRun, tea.String("true"))
  54. request.InstanceChargeType = &InstanceChargeType
  55. request.InstanceCount = &Amount
  56. request.Placement = &cvm.Placement{
  57. Zone: &ZoneId,
  58. }
  59. resp, err := ecs.cli.RunInstances(request)
  60. if err != nil {
  61. return nil, errors.Wrap(err, "Tencent Create ECS error")
  62. }
  63. InstanceIds := make([]string, 0)
  64. for _, v := range resp.Response.InstanceIdSet {
  65. InstanceIds = append(InstanceIds, *v)
  66. }
  67. isFinished := false
  68. if len(resp.Response.InstanceIdSet) > 0 {
  69. isFinished = true
  70. }
  71. glog.Infof("--------------------腾讯ECS实例创建成功--------------------")
  72. glog.Infof(*util.ToJSONString(util.ToMap(resp)))
  73. return &pbecs.CreateEcsResp{
  74. RequestId: "Tencent ECS RequestId: " + *resp.Response.RequestId,
  75. InstanceIdSets: InstanceIds,
  76. Finished: isFinished,
  77. }, nil
  78. }
  79. func (ecs *TencentCvm) DeleteEcs(ctx context.Context, req *pbecs.DeleteEcsReq) (*pbecs.DeleteEcsResp, error) {
  80. idStr := req.GetInstanceIds()
  81. InstanceIds := string_.Split(&idStr, tea.String(","), tea.Int(-1))
  82. //腾讯云支持批量操作,每次请求批量实例的上限为100
  83. if len(InstanceIds) > 100 {
  84. return nil, errors.New("Tencent Delete ECS error InstanceIds > 100")
  85. }
  86. deleteReq := cvm.NewTerminateInstancesRequest()
  87. deleteReq.InstanceIds = InstanceIds
  88. resp, err := ecs.cli.TerminateInstances(deleteReq)
  89. if err != nil {
  90. return nil, errors.Wrap(err, "Tencent Delete ECS error")
  91. }
  92. glog.Infof("--------------------腾讯ECS实例释放成功--------------------")
  93. glog.Infof(*util.ToJSONString(util.ToMap(resp)))
  94. return &pbecs.DeleteEcsResp{
  95. Provider: req.Provider,
  96. RequestId: *resp.Response.RequestId,
  97. AccountName: req.AccountName,
  98. RegionId: req.RegionId,
  99. }, nil
  100. }
  101. func (ecs *TencentCvm) UpdateEcs(ctx context.Context, req *pbecs.UpdateEcsReq) (*pbecs.UpdateEcsResp, error) {
  102. InstanceName := req.GetInstanceName()
  103. InstanceId := req.GetInstanceIds()
  104. UpdateReq := cvm.NewModifyInstancesAttributeRequest()
  105. if req.GetInstanceIds() == "" {
  106. return nil, errors.New("InstanceId is empty")
  107. }
  108. UpdateReq.InstanceIds = string_.Split(&InstanceId, tea.String(","), tea.Int(-1))
  109. if InstanceName != "" {
  110. UpdateReq.InstanceName = &InstanceName
  111. }
  112. resp, err := ecs.cli.ModifyInstancesAttribute(UpdateReq)
  113. if err != nil {
  114. return nil, errors.Wrap(err, "Tencent Update ECS error")
  115. }
  116. glog.Infof("--------------------腾讯ECS实例修改成功--------------------")
  117. glog.Infof(*util.ToJSONString(util.ToMap(resp)))
  118. return &pbecs.UpdateEcsResp{
  119. RequestId: *resp.Response.RequestId,
  120. }, nil
  121. }
  122. func (ecs *TencentCvm) ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) {
  123. request := cvm.NewDescribeInstancesRequest()
  124. request.Offset = common.Int64Ptr(int64((req.PageNumber - 1) * req.PageSize))
  125. request.Limit = common.Int64Ptr(int64(req.PageSize))
  126. resp, err := ecs.cli.DescribeInstances(request)
  127. if err != nil {
  128. return nil, errors.Wrap(err, "Tencent ListDetail error")
  129. }
  130. var ecses = make([]*pbecs.EcsInstance, len(resp.Response.InstanceSet))
  131. for k, v := range resp.Response.InstanceSet {
  132. ExpiredTime := ""
  133. if v.ExpiredTime != nil {
  134. ExpiredTime = *v.ExpiredTime
  135. }
  136. ecses[k] = &pbecs.EcsInstance{
  137. Provider: pbtenant.CloudProvider_tencent,
  138. AccountName: ecs.tenanter.AccountName(),
  139. InstanceId: *v.InstanceId,
  140. InstanceName: *v.InstanceName,
  141. RegionName: ecs.region.GetName(),
  142. PublicIps: make([]string, len(v.PublicIpAddresses)),
  143. InstanceType: *v.InstanceType,
  144. Cpu: strconv.FormatInt(*v.CPU, 10),
  145. Memory: strconv.FormatInt(*v.Memory, 10),
  146. Description: "",
  147. Status: *v.InstanceState,
  148. CreationTime: *v.CreatedTime,
  149. ExpireTime: ExpiredTime,
  150. InnerIps: make([]string, len(v.PrivateIpAddresses)),
  151. VpcId: *v.VirtualPrivateCloud.VpcId,
  152. ResourceGroupId: "",
  153. InstanceChargeType: *v.InstanceChargeType,
  154. }
  155. for k1, v1 := range v.PublicIpAddresses {
  156. ecses[k].PublicIps[k1] = *v1
  157. }
  158. for k1, v1 := range v.PrivateIpAddresses {
  159. ecses[k].InnerIps[k1] = *v1
  160. }
  161. }
  162. isFinished := false
  163. if len(ecses) < int(req.PageSize) {
  164. isFinished = true
  165. }
  166. return &pbecs.ListDetailResp{
  167. Ecses: ecses,
  168. Finished: isFinished,
  169. NextToken: "",
  170. PageNumber: req.PageNumber + 1,
  171. PageSize: req.PageSize,
  172. RequestId: *resp.Response.RequestId,
  173. }, nil
  174. }
  175. func (ecs *TencentCvm) ActionEcs(ctx context.Context, req *pbecs.ActionReq) (resp *pbecs.ActionResp, err error) {
  176. return nil, nil
  177. }

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.