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.

ecsImpl.go 7.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package server
  2. import (
  3. pbecs "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_vm/gen/idl"
  4. ecser "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_vm/service"
  5. "code.gitlink.org.cn/JCCE/PCM.git/common/tenanter"
  6. pbtenant "code.gitlink.org.cn/JCCE/PCM.git/tenant/gen/idl"
  7. "context"
  8. "sync"
  9. "github.com/golang/glog"
  10. "github.com/pkg/errors"
  11. )
  12. // CreateMultipleEcs 创建多云ECS
  13. func CreateMultipleEcs(ctx context.Context, reqs *pbecs.CreateEcsMultipleReq) (*pbecs.CreateEcsMultipleResp, error) {
  14. var (
  15. wg sync.WaitGroup
  16. requestIds = make([]string, 0)
  17. )
  18. wg.Add(len(reqs.GetCreateEcsReqs()))
  19. c := make(chan string, len(reqs.GetCreateEcsReqs()))
  20. for _, k := range reqs.GetCreateEcsReqs() {
  21. k := k
  22. go func() {
  23. defer wg.Done()
  24. resp, err := CreateEcs(ctx, k)
  25. if err != nil {
  26. glog.Errorf(k.Provider.String()+"CreateEcs error: %v", err)
  27. c <- k.Provider.String()
  28. return
  29. }
  30. c <- resp.GetRequestId()
  31. }()
  32. }
  33. go func() {
  34. defer close(c)
  35. wg.Wait()
  36. }()
  37. for v := range c {
  38. requestIds = append(requestIds, v)
  39. }
  40. isFinished := false
  41. if len(requestIds) > 0 {
  42. isFinished = true
  43. }
  44. return &pbecs.CreateEcsMultipleResp{
  45. RequestId: requestIds,
  46. Finished: isFinished,
  47. }, nil
  48. }
  49. func CreateEcs(ctx context.Context, req *pbecs.CreateEcsReq) (*pbecs.CreateEcsResp, error) {
  50. var (
  51. ecs ecser.Ecser
  52. )
  53. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  54. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  55. if err != nil {
  56. return nil, errors.Wrap(err, "get tenanters failed")
  57. }
  58. for _, tenanter := range tenanters {
  59. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  60. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  61. return nil, errors.WithMessage(err, "NewEcsClient error")
  62. }
  63. break
  64. }
  65. }
  66. return ecs.CreateEcs(ctx, req)
  67. }
  68. func DeleteEcs(ctx context.Context, req *pbecs.DeleteEcsReq) (*pbecs.DeleteEcsResp, error) {
  69. var (
  70. ecs ecser.Ecser
  71. )
  72. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  73. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  74. if err != nil {
  75. return nil, errors.Wrap(err, "get tenanters failed")
  76. }
  77. for _, tenanter := range tenanters {
  78. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  79. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  80. return nil, errors.WithMessage(err, "NewEcsClient error")
  81. }
  82. break
  83. }
  84. }
  85. return ecs.DeleteEcs(ctx, req)
  86. }
  87. func UpdateEcs(ctx context.Context, req *pbecs.UpdateEcsReq) (*pbecs.UpdateEcsResp, error) {
  88. var (
  89. ecs ecser.Ecser
  90. )
  91. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  92. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  93. if err != nil {
  94. return nil, errors.Wrap(err, "get tenanters failed")
  95. }
  96. for _, tenanter := range tenanters {
  97. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  98. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  99. return nil, errors.WithMessage(err, "NewEcsClient error")
  100. }
  101. break
  102. }
  103. }
  104. return ecs.UpdateEcs(ctx, req)
  105. }
  106. // ListDetail returns the detail of ecs instances
  107. func ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) {
  108. var (
  109. ecs ecser.Ecser
  110. )
  111. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  112. if err != nil {
  113. return nil, errors.WithMessage(err, "getTenanters error")
  114. }
  115. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  116. if err != nil {
  117. return nil, errors.WithMessagef(err, "provider %v regionId %v", req.Provider, req.RegionId)
  118. }
  119. for _, tenanter := range tenanters {
  120. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  121. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  122. return nil, errors.WithMessage(err, "NewEcsClient error")
  123. }
  124. break
  125. }
  126. }
  127. return ecs.ListDetail(ctx, req)
  128. }
  129. // List returns the list of ecs instances
  130. func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) {
  131. var (
  132. wg sync.WaitGroup
  133. mutex sync.Mutex
  134. ecses []*pbecs.EcsInstance
  135. )
  136. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  137. if err != nil {
  138. return nil, errors.WithMessage(err, "getTenanters error")
  139. }
  140. regions := tenanter.GetAllRegionIds(pbtenant.CloudProvider(req.Provider))
  141. wg.Add(len(tenanters) * len(regions))
  142. for _, t := range tenanters {
  143. for _, region := range regions {
  144. go func(tenant tenanter.Tenanter, region tenanter.Region) {
  145. defer wg.Done()
  146. ecs, err := ecser.NewEcsClient(req.Provider, region, tenant)
  147. if err != nil {
  148. glog.Errorf("New Ecs Client error %v", err)
  149. return
  150. }
  151. request := &pbecs.ListDetailReq{
  152. Provider: req.Provider,
  153. AccountName: tenant.AccountName(),
  154. RegionId: region.GetId(),
  155. PageNumber: 1,
  156. PageSize: 100,
  157. NextToken: "",
  158. }
  159. for {
  160. resp, err := ecs.ListDetail(ctx, request)
  161. if err != nil {
  162. glog.Errorf("ListDetail error %v", err)
  163. return
  164. }
  165. mutex.Lock()
  166. ecses = append(ecses, resp.Ecses...)
  167. mutex.Unlock()
  168. if resp.Finished {
  169. break
  170. }
  171. request.PageNumber, request.PageSize, request.NextToken = resp.PageNumber, resp.PageSize, resp.NextToken
  172. }
  173. }(t, region)
  174. }
  175. }
  176. wg.Wait()
  177. return &pbecs.ListResp{Ecses: ecses}, nil
  178. }
  179. // ListAll returns all ecs instances
  180. func ListAll(ctx context.Context) (*pbecs.ListResp, error) {
  181. var (
  182. wg sync.WaitGroup
  183. mutex sync.Mutex
  184. ecses []*pbecs.EcsInstance
  185. )
  186. wg.Add(len(pbecs.CloudProvider_name))
  187. for k := range pbecs.CloudProvider_name {
  188. go func(provider int32) {
  189. defer wg.Done()
  190. resp, err := List(ctx, &pbecs.ListReq{Provider: pbecs.CloudProvider(provider)})
  191. if err != nil {
  192. glog.Errorf("List error %v", err)
  193. return
  194. }
  195. mutex.Lock()
  196. ecses = append(ecses, resp.Ecses...)
  197. mutex.Unlock()
  198. }(k)
  199. }
  200. wg.Wait()
  201. return &pbecs.ListResp{Ecses: ecses}, nil
  202. }
  203. func ActionEcs(ctx context.Context, req *pbecs.ActionReq) (*pbecs.ActionResp, error) {
  204. var (
  205. ecs ecser.Ecser
  206. )
  207. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  208. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  209. if err != nil {
  210. return nil, errors.Wrap(err, "get tenanters failed")
  211. }
  212. for _, tenanter := range tenanters {
  213. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  214. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  215. return nil, errors.WithMessage(err, "NewEcsClient error")
  216. }
  217. break
  218. }
  219. }
  220. return ecs.ActionEcs(ctx, req)
  221. }
  222. func ListImages(ctx context.Context, req *pbecs.ListImagesReq) (*pbecs.ListImagesResp, error) {
  223. var (
  224. ecs ecser.Ecser
  225. )
  226. tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
  227. region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
  228. if err != nil {
  229. return nil, errors.Wrap(err, "get tenanters failed")
  230. }
  231. for _, tenanter := range tenanters {
  232. if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
  233. if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
  234. return nil, errors.WithMessage(err, "NewEcsClient error")
  235. }
  236. break
  237. }
  238. }
  239. return ecs.ListEcsImages(ctx, req)
  240. }

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.