func()

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
}