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
}