metadata/metadata.go (83 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package metadata
import (
"encoding/json"
"fmt"
"github.com/Azure/azure-extension-foundation/errorhelper"
"github.com/Azure/azure-extension-foundation/httputil"
)
const metadataUrl = "http://169.254.169.254/metadata/instance?api-version=2017-08-01"
type Metadata struct {
Compute MetadataCompute `json:"compute"`
Network MetadataNetwork `json:"network"`
}
type MetadataNetwork struct {
Intrfc []map[string]interface{} `json:"interface"`
}
type provider struct {
httpClient httputil.HttpClient
}
func NewMetadataProvider(client httputil.HttpClient) provider {
return provider{httpClient: client}
}
type MetadataCompute struct {
Location string `json:"location"`
Name string `json:"name"`
Offer string `json:"offer"`
OsType string `json:"osType"`
PlacementGroupId string `json:"placementGroupId"`
PlatformFaultDomain string `json:"platformFaultDomain"`
PlatformUpdateDomatin string `json:"platformUpdateDomain"`
Publisher string `json:"publisher"`
ResourceGroupName string `json:"resourceGroupName"`
Sku string `json:"sku"`
SubscriptionId string `json:"subscriptionId"`
Tags interface{} `json:"tags"`
Version string `json:"version"`
VmId string `json:"vmId"`
VmSize string `json:"vmSize"`
}
func GetMetadataFromJsonString(jsonString *string) (Metadata, error) {
retval := Metadata{}
data := []byte(*jsonString)
err := json.Unmarshal(data, &retval)
return retval, err
}
func (metadata *Metadata) GetIpV4PublicAddress() string {
defaultIp := "0.0.0.0"
interface0Bytes, err := json.Marshal(metadata.Network.Intrfc[0]["ipv4"])
if err != nil {
return defaultIp
}
var interface0ipv4 map[string][]map[string]string
err = json.Unmarshal(interface0Bytes, &interface0ipv4)
if err != nil {
return defaultIp
}
retval := ""
if len(interface0ipv4["ipAddress"]) > 0 {
retval = interface0ipv4["ipAddress"][0]["publicIpAddress"]
}
if retval == "" {
return defaultIp
}
return retval
}
func (metadata *Metadata) GetAzureResourceId() string {
return fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s",
metadata.Compute.SubscriptionId, metadata.Compute.ResourceGroupName, metadata.Compute.Name)
}
func (provider *provider) GetMetadata() (Metadata, error) {
retval := Metadata{}
responseCode, responseBody, err := provider.httpClient.Get(metadataUrl, map[string]string{"Metadata": "true"})
if err != nil {
return retval, err
}
responseString := string(responseBody[:])
if responseCode != 200 {
return retval, errorhelper.AddStackToError(
errorhelper.AddStackToError(
fmt.Errorf("Get request for metadata returned return code %v.\nResponse Body: %s", responseCode, responseString)))
}
err = json.Unmarshal(responseBody[:], &retval)
return retval, errorhelper.AddStackToError(err)
}