|
- 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)
- }
|