func NewCloudManager()

in pkg/skoop/infra/aliyun/cloud_manager.go [89:157]


func NewCloudManager(options *CloudManagerOptions) (*CloudManager, error) {
	//TODO user-agent
	cfg := &openapiv2.Config{
		AccessKeyId:     tea.String(options.AccessKeyID),
		AccessKeySecret: tea.String(options.AccessKeySecret),
		SecurityToken:   tea.String(options.SecurityToken),
		RegionId:        tea.String(options.Region),
	}

	vpcClient, err := vpc.NewClient(cfg)
	if err != nil {
		return nil, fmt.Errorf("create vpc client: %s", err)
	}

	ecsClient, err := ecs.NewClient(&openapi.Config{
		AccessKeyId:     tea.String(options.AccessKeyID),
		AccessKeySecret: tea.String(options.AccessKeySecret),
		SecurityToken:   tea.String(options.SecurityToken),
		RegionId:        tea.String(options.Region),
	})
	if err != nil {
		return nil, fmt.Errorf("create ecs client: %s", err)
	}

	slbClient, err := slb.NewClient(cfg)
	if err != nil {
		return nil, fmt.Errorf("create slb client: %s", err)
	}

	vpcID := ""
	if options.VPCID != "" {
		vpcID = options.VPCID
	} else if options.InstanceOfCluster != "" {
		request := &ecs.DescribeInstancesRequest{}
		request.SetRegionId(options.Region).
			SetInstanceIds(fmt.Sprintf("[\"%s\"]", options.InstanceOfCluster))

		response, err := ecsClient.DescribeInstances(request)
		if err != nil {
			return nil, err
		}

		if len(response.Body.Instances.Instance) == 0 {
			return nil, fmt.Errorf("cannot find ecs instance info from id %s", options.InstanceOfCluster)
		}
		info := response.Body.Instances.Instance[0]
		vpcID = *info.VpcAttributes.VpcId
	} else {
		return nil, fmt.Errorf("VPCID or InstanceOfCluster must be provided to get VPC ID")
	}

	cm := &CloudManager{
		vpc: vpcClient,
		ecs: ecsClient,
		slb: slbClient,

		region: options.Region,
		vpcID:  vpcID,

		ecsInfoCache: map[string]*ECSInfo{},
	}

	cm.vpcCIDRs, err = cm.GetCIDRsFromVPC(vpcID)
	if err != nil {
		return nil, err
	}

	return cm, nil
}