github.com/cilium/cilium@v1.16.2/pkg/alibabacloud/metadata/metadata.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package metadata
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  	"net/http"
    10  
    11  	"github.com/cilium/cilium/pkg/safeio"
    12  	"github.com/cilium/cilium/pkg/time"
    13  )
    14  
    15  const (
    16  	metadataURL = "http://100.100.100.200/latest/meta-data"
    17  )
    18  
    19  // GetInstanceID returns the instance ID from metadata
    20  func GetInstanceID(ctx context.Context) (string, error) {
    21  	return getMetadata(ctx, "instance-id")
    22  }
    23  
    24  // GetInstanceType returns the instance type from metadata
    25  func GetInstanceType(ctx context.Context) (string, error) {
    26  	return getMetadata(ctx, "instance/instance-type")
    27  }
    28  
    29  // GetRegionID returns the region ID from metadata
    30  func GetRegionID(ctx context.Context) (string, error) {
    31  	return getMetadata(ctx, "region-id")
    32  }
    33  
    34  // GetZoneID returns the zone ID from metadata
    35  func GetZoneID(ctx context.Context) (string, error) {
    36  	return getMetadata(ctx, "zone-id")
    37  }
    38  
    39  // GetVPCID returns the vpc ID that belongs to the ECS instance from metadata
    40  func GetVPCID(ctx context.Context) (string, error) {
    41  	return getMetadata(ctx, "vpc-id")
    42  }
    43  
    44  // GetVPCCIDRBlock returns the IPv4 CIDR block of the VPC to which the instance belongs
    45  func GetVPCCIDRBlock(ctx context.Context) (string, error) {
    46  	return getMetadata(ctx, "vpc-cidr-block")
    47  }
    48  
    49  // getMetadata gets metadata
    50  // see https://www.alibabacloud.com/help/doc-detail/49122.htm
    51  func getMetadata(ctx context.Context, path string) (string, error) {
    52  	client := &http.Client{
    53  		Timeout: time.Second * 10,
    54  	}
    55  	url := fmt.Sprintf("%s/%s", metadataURL, path)
    56  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  
    61  	resp, err := client.Do(req)
    62  	if err != nil {
    63  		return "", err
    64  	}
    65  
    66  	if resp.StatusCode != http.StatusOK {
    67  		return "", fmt.Errorf("metadata service returned status code %d", resp.StatusCode)
    68  	}
    69  
    70  	defer resp.Body.Close()
    71  	respBytes, err := safeio.ReadAllLimit(resp.Body, safeio.MB)
    72  	if err != nil {
    73  		return "", err
    74  	}
    75  
    76  	return string(respBytes), nil
    77  }