|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- package server
-
- import (
- pbecs "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_vm/gen/idl"
- ecser "code.gitlink.org.cn/JCCE/PCM.git/adaptor/pcm_vm/service"
- "code.gitlink.org.cn/JCCE/PCM.git/common/tenanter"
- pbtenant "code.gitlink.org.cn/JCCE/PCM.git/tenant/gen/idl"
- "context"
- "sync"
-
- "github.com/golang/glog"
- "github.com/pkg/errors"
- )
-
- // CreateMultipleEcs 创建多云ECS
- func CreateMultipleEcs(ctx context.Context, reqs *pbecs.CreateEcsMultipleReq) (*pbecs.CreateEcsMultipleResp, error) {
- var (
- wg sync.WaitGroup
- requestIds = make([]string, 0)
- )
- wg.Add(len(reqs.GetCreateEcsReqs()))
- c := make(chan string, len(reqs.GetCreateEcsReqs()))
- for _, k := range reqs.GetCreateEcsReqs() {
- k := k
- go func() {
- defer wg.Done()
- resp, err := CreateEcs(ctx, k)
- if err != nil {
- glog.Errorf(k.Provider.String()+"CreateEcs error: %v", err)
- c <- k.Provider.String()
- return
- }
- c <- resp.GetRequestId()
- }()
- }
- go func() {
- defer close(c)
- wg.Wait()
- }()
- for v := range c {
- requestIds = append(requestIds, v)
- }
- isFinished := false
- if len(requestIds) > 0 {
- isFinished = true
- }
- return &pbecs.CreateEcsMultipleResp{
- RequestId: requestIds,
- Finished: isFinished,
- }, nil
- }
-
- func CreateEcs(ctx context.Context, req *pbecs.CreateEcsReq) (*pbecs.CreateEcsResp, error) {
- var (
- ecs ecser.Ecser
- )
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.Wrap(err, "get tenanters failed")
- }
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
- return ecs.CreateEcs(ctx, req)
- }
-
- func DeleteEcs(ctx context.Context, req *pbecs.DeleteEcsReq) (*pbecs.DeleteEcsResp, error) {
- var (
- ecs ecser.Ecser
- )
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.Wrap(err, "get tenanters failed")
- }
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
- return ecs.DeleteEcs(ctx, req)
- }
-
- func UpdateEcs(ctx context.Context, req *pbecs.UpdateEcsReq) (*pbecs.UpdateEcsResp, error) {
- var (
- ecs ecser.Ecser
- )
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.Wrap(err, "get tenanters failed")
- }
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
- return ecs.UpdateEcs(ctx, req)
- }
-
- // ListDetail returns the detail of ecs instances
- func ListDetail(ctx context.Context, req *pbecs.ListDetailReq) (*pbecs.ListDetailResp, error) {
- var (
- ecs ecser.Ecser
- )
-
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- if err != nil {
- return nil, errors.WithMessage(err, "getTenanters error")
- }
-
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.WithMessagef(err, "provider %v regionId %v", req.Provider, req.RegionId)
- }
-
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
-
- return ecs.ListDetail(ctx, req)
- }
-
- // List returns the list of ecs instances
- func List(ctx context.Context, req *pbecs.ListReq) (*pbecs.ListResp, error) {
- var (
- wg sync.WaitGroup
- mutex sync.Mutex
- ecses []*pbecs.EcsInstance
- )
-
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- if err != nil {
- return nil, errors.WithMessage(err, "getTenanters error")
- }
-
- regions := tenanter.GetAllRegionIds(pbtenant.CloudProvider(req.Provider))
-
- wg.Add(len(tenanters) * len(regions))
- for _, t := range tenanters {
- for _, region := range regions {
- go func(tenant tenanter.Tenanter, region tenanter.Region) {
- defer wg.Done()
- ecs, err := ecser.NewEcsClient(req.Provider, region, tenant)
- if err != nil {
- glog.Errorf("New Ecs Client error %v", err)
- return
- }
-
- request := &pbecs.ListDetailReq{
- Provider: req.Provider,
- AccountName: tenant.AccountName(),
- RegionId: region.GetId(),
- PageNumber: 1,
- PageSize: 100,
- NextToken: "",
- }
- for {
- resp, err := ecs.ListDetail(ctx, request)
- if err != nil {
- glog.Errorf("ListDetail error %v", err)
- return
- }
- mutex.Lock()
- ecses = append(ecses, resp.Ecses...)
- mutex.Unlock()
- if resp.Finished {
- break
- }
- request.PageNumber, request.PageSize, request.NextToken = resp.PageNumber, resp.PageSize, resp.NextToken
- }
- }(t, region)
- }
- }
- wg.Wait()
-
- return &pbecs.ListResp{Ecses: ecses}, nil
- }
-
- // ListAll returns all ecs instances
- func ListAll(ctx context.Context) (*pbecs.ListResp, error) {
- var (
- wg sync.WaitGroup
- mutex sync.Mutex
- ecses []*pbecs.EcsInstance
- )
-
- wg.Add(len(pbecs.CloudProvider_name))
- for k := range pbecs.CloudProvider_name {
- go func(provider int32) {
- defer wg.Done()
-
- resp, err := List(ctx, &pbecs.ListReq{Provider: pbecs.CloudProvider(provider)})
- if err != nil {
- glog.Errorf("List error %v", err)
- return
- }
- mutex.Lock()
- ecses = append(ecses, resp.Ecses...)
- mutex.Unlock()
- }(k)
- }
-
- wg.Wait()
-
- return &pbecs.ListResp{Ecses: ecses}, nil
- }
-
- func ActionEcs(ctx context.Context, req *pbecs.ActionReq) (*pbecs.ActionResp, error) {
- var (
- ecs ecser.Ecser
- )
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.Wrap(err, "get tenanters failed")
- }
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
- return ecs.ActionEcs(ctx, req)
- }
-
- func ListImages(ctx context.Context, req *pbecs.ListImagesReq) (*pbecs.ListImagesResp, error) {
- var (
- ecs ecser.Ecser
- )
- tenanters, err := tenanter.GetTenanters(pbtenant.CloudProvider(req.Provider))
- region, err := tenanter.NewRegion(pbtenant.CloudProvider(req.Provider), req.RegionId)
- if err != nil {
- return nil, errors.Wrap(err, "get tenanters failed")
- }
- for _, tenanter := range tenanters {
- if req.AccountName == "" || tenanter.AccountName() == req.AccountName {
- if ecs, err = ecser.NewEcsClient(req.Provider, region, tenanter); err != nil {
- return nil, errors.WithMessage(err, "NewEcsClient error")
- }
- break
- }
- }
- return ecs.ListEcsImages(ctx, req)
- }
|