in pkg/skoop/infra/aliyun/cloud_manager.go [337:404]
func (m *CloudManager) GetECSInfo(id string) (*ECSInfo, error) {
if info, ok := m.ecsInfoCache[id]; ok {
return info, nil
}
request := &ecs.DescribeInstancesRequest{}
request.SetRegionId(m.region).SetInstanceIds(fmt.Sprintf("[%q]", id))
response, err := m.ecs.DescribeInstances(request)
if err != nil {
return nil, err
}
if len(response.Body.Instances.Instance) == 0 {
return nil, fmt.Errorf("instance '%s' not found", id)
}
instance := response.Body.Instances.Instance[0]
ecsInfo := &ECSInfo{
ID: *instance.InstanceId,
Status: *instance.Status,
Network: ECSNetwork{
SecurityGroups: map[string]SecurityGroupRule{},
VSwitchID: *instance.VpcAttributes.VSwitchId,
VpcID: *instance.VpcAttributes.VpcId,
},
}
for _, ip := range instance.VpcAttributes.PrivateIpAddress.IpAddress {
ecsInfo.Network.IP = append(ecsInfo.Network.IP, *ip)
}
for _, sg := range instance.SecurityGroupIds.SecurityGroupId {
sgInfo, err := m.GetSecurityGroupRule(*sg)
if err != nil {
return ecsInfo, err
}
ecsInfo.Network.SecurityGroups[sgInfo.ID] = sgInfo
}
ecsInfo.Network.RouteTableEntries, err = m.GetRouteEntryFromVswitch(*instance.VpcAttributes.VSwitchId)
if err != nil {
return nil, err
}
ecsInfo.Network.VpcDefaultRouteTableEntries, err = m.GetVPCDefaultRouteEntry(*instance.VpcAttributes.VpcId)
if err != nil {
return ecsInfo, err
}
// get eni
for _, networkInterface := range instance.NetworkInterfaces.NetworkInterface {
info, err := m.GetENIInfoFromID(*networkInterface.NetworkInterfaceId)
if err != nil {
return ecsInfo, err
}
ecsInfo.Network.NetworkInterfaces = append(ecsInfo.Network.NetworkInterfaces, info)
}
if instance.EipAddress != nil && instance.EipAddress.IpAddress != nil {
ecsInfo.Network.EIPAddress = *instance.EipAddress.IpAddress
}
m.ecsInfoCache[id] = ecsInfo
return ecsInfo, nil
}