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 }