Blame vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go

Packit 63bb0d
package azure
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"encoding/json"
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"io/ioutil"
Packit 63bb0d
	"net/http"
Packit 63bb0d
	"strings"
Packit 63bb0d
Packit 63bb0d
	"github.com/Azure/go-autorest/autorest"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Copyright 2017 Microsoft Corporation
Packit 63bb0d
//
Packit 63bb0d
//  Licensed under the Apache License, Version 2.0 (the "License");
Packit 63bb0d
//  you may not use this file except in compliance with the License.
Packit 63bb0d
//  You may obtain a copy of the License at
Packit 63bb0d
//
Packit 63bb0d
//      http://www.apache.org/licenses/LICENSE-2.0
Packit 63bb0d
//
Packit 63bb0d
//  Unless required by applicable law or agreed to in writing, software
Packit 63bb0d
//  distributed under the License is distributed on an "AS IS" BASIS,
Packit 63bb0d
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 63bb0d
//  See the License for the specific language governing permissions and
Packit 63bb0d
//  limitations under the License.
Packit 63bb0d
Packit 63bb0d
type audience []string
Packit 63bb0d
Packit 63bb0d
type authentication struct {
Packit 63bb0d
	LoginEndpoint string   `json:"loginEndpoint"`
Packit 63bb0d
	Audiences     audience `json:"audiences"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type environmentMetadataInfo struct {
Packit 63bb0d
	GalleryEndpoint string         `json:"galleryEndpoint"`
Packit 63bb0d
	GraphEndpoint   string         `json:"graphEndpoint"`
Packit 63bb0d
	PortalEndpoint  string         `json:"portalEndpoint"`
Packit 63bb0d
	Authentication  authentication `json:"authentication"`
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// EnvironmentProperty represent property names that clients can override
Packit 63bb0d
type EnvironmentProperty string
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	// EnvironmentName ...
Packit 63bb0d
	EnvironmentName EnvironmentProperty = "name"
Packit 63bb0d
	// EnvironmentManagementPortalURL ..
Packit 63bb0d
	EnvironmentManagementPortalURL EnvironmentProperty = "managementPortalURL"
Packit 63bb0d
	// EnvironmentPublishSettingsURL ...
Packit 63bb0d
	EnvironmentPublishSettingsURL EnvironmentProperty = "publishSettingsURL"
Packit 63bb0d
	// EnvironmentServiceManagementEndpoint ...
Packit 63bb0d
	EnvironmentServiceManagementEndpoint EnvironmentProperty = "serviceManagementEndpoint"
Packit 63bb0d
	// EnvironmentResourceManagerEndpoint ...
Packit 63bb0d
	EnvironmentResourceManagerEndpoint EnvironmentProperty = "resourceManagerEndpoint"
Packit 63bb0d
	// EnvironmentActiveDirectoryEndpoint ...
Packit 63bb0d
	EnvironmentActiveDirectoryEndpoint EnvironmentProperty = "activeDirectoryEndpoint"
Packit 63bb0d
	// EnvironmentGalleryEndpoint ...
Packit 63bb0d
	EnvironmentGalleryEndpoint EnvironmentProperty = "galleryEndpoint"
Packit 63bb0d
	// EnvironmentKeyVaultEndpoint ...
Packit 63bb0d
	EnvironmentKeyVaultEndpoint EnvironmentProperty = "keyVaultEndpoint"
Packit 63bb0d
	// EnvironmentGraphEndpoint ...
Packit 63bb0d
	EnvironmentGraphEndpoint EnvironmentProperty = "graphEndpoint"
Packit 63bb0d
	// EnvironmentServiceBusEndpoint ...
Packit 63bb0d
	EnvironmentServiceBusEndpoint EnvironmentProperty = "serviceBusEndpoint"
Packit 63bb0d
	// EnvironmentBatchManagementEndpoint ...
Packit 63bb0d
	EnvironmentBatchManagementEndpoint EnvironmentProperty = "batchManagementEndpoint"
Packit 63bb0d
	// EnvironmentStorageEndpointSuffix ...
Packit 63bb0d
	EnvironmentStorageEndpointSuffix EnvironmentProperty = "storageEndpointSuffix"
Packit 63bb0d
	// EnvironmentSQLDatabaseDNSSuffix ...
Packit 63bb0d
	EnvironmentSQLDatabaseDNSSuffix EnvironmentProperty = "sqlDatabaseDNSSuffix"
Packit 63bb0d
	// EnvironmentTrafficManagerDNSSuffix ...
Packit 63bb0d
	EnvironmentTrafficManagerDNSSuffix EnvironmentProperty = "trafficManagerDNSSuffix"
Packit 63bb0d
	// EnvironmentKeyVaultDNSSuffix ...
Packit 63bb0d
	EnvironmentKeyVaultDNSSuffix EnvironmentProperty = "keyVaultDNSSuffix"
Packit 63bb0d
	// EnvironmentServiceBusEndpointSuffix ...
Packit 63bb0d
	EnvironmentServiceBusEndpointSuffix EnvironmentProperty = "serviceBusEndpointSuffix"
Packit 63bb0d
	// EnvironmentServiceManagementVMDNSSuffix ...
Packit 63bb0d
	EnvironmentServiceManagementVMDNSSuffix EnvironmentProperty = "serviceManagementVMDNSSuffix"
Packit 63bb0d
	// EnvironmentResourceManagerVMDNSSuffix ...
Packit 63bb0d
	EnvironmentResourceManagerVMDNSSuffix EnvironmentProperty = "resourceManagerVMDNSSuffix"
Packit 63bb0d
	// EnvironmentContainerRegistryDNSSuffix ...
Packit 63bb0d
	EnvironmentContainerRegistryDNSSuffix EnvironmentProperty = "containerRegistryDNSSuffix"
Packit 63bb0d
	// EnvironmentTokenAudience ...
Packit 63bb0d
	EnvironmentTokenAudience EnvironmentProperty = "tokenAudience"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// OverrideProperty represents property name and value that clients can override
Packit 63bb0d
type OverrideProperty struct {
Packit 63bb0d
	Key   EnvironmentProperty
Packit 63bb0d
	Value string
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// EnvironmentFromURL loads an Environment from a URL
Packit 63bb0d
// This function is particularly useful in the Hybrid Cloud model, where one may define their own
Packit 63bb0d
// endpoints.
Packit 63bb0d
func EnvironmentFromURL(resourceManagerEndpoint string, properties ...OverrideProperty) (environment Environment, err error) {
Packit 63bb0d
	var metadataEnvProperties environmentMetadataInfo
Packit 63bb0d
Packit 63bb0d
	if resourceManagerEndpoint == "" {
Packit 63bb0d
		return environment, fmt.Errorf("Metadata resource manager endpoint is empty")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	if metadataEnvProperties, err = retrieveMetadataEnvironment(resourceManagerEndpoint); err != nil {
Packit 63bb0d
		return environment, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Give priority to user's override values
Packit 63bb0d
	overrideProperties(&environment, properties)
Packit 63bb0d
Packit 63bb0d
	if environment.Name == "" {
Packit 63bb0d
		environment.Name = "HybridEnvironment"
Packit 63bb0d
	}
Packit 63bb0d
	stampDNSSuffix := environment.StorageEndpointSuffix
Packit 63bb0d
	if stampDNSSuffix == "" {
Packit 63bb0d
		stampDNSSuffix = strings.TrimSuffix(strings.TrimPrefix(strings.Replace(resourceManagerEndpoint, strings.Split(resourceManagerEndpoint, ".")[0], "", 1), "."), "/")
Packit 63bb0d
		environment.StorageEndpointSuffix = stampDNSSuffix
Packit 63bb0d
	}
Packit 63bb0d
	if environment.KeyVaultDNSSuffix == "" {
Packit 63bb0d
		environment.KeyVaultDNSSuffix = fmt.Sprintf("%s.%s", "vault", stampDNSSuffix)
Packit 63bb0d
	}
Packit 63bb0d
	if environment.KeyVaultEndpoint == "" {
Packit 63bb0d
		environment.KeyVaultEndpoint = fmt.Sprintf("%s%s", "https://", environment.KeyVaultDNSSuffix)
Packit 63bb0d
	}
Packit 63bb0d
	if environment.TokenAudience == "" {
Packit 63bb0d
		environment.TokenAudience = metadataEnvProperties.Authentication.Audiences[0]
Packit 63bb0d
	}
Packit 63bb0d
	if environment.ActiveDirectoryEndpoint == "" {
Packit 63bb0d
		environment.ActiveDirectoryEndpoint = metadataEnvProperties.Authentication.LoginEndpoint
Packit 63bb0d
	}
Packit 63bb0d
	if environment.ResourceManagerEndpoint == "" {
Packit 63bb0d
		environment.ResourceManagerEndpoint = resourceManagerEndpoint
Packit 63bb0d
	}
Packit 63bb0d
	if environment.GalleryEndpoint == "" {
Packit 63bb0d
		environment.GalleryEndpoint = metadataEnvProperties.GalleryEndpoint
Packit 63bb0d
	}
Packit 63bb0d
	if environment.GraphEndpoint == "" {
Packit 63bb0d
		environment.GraphEndpoint = metadataEnvProperties.GraphEndpoint
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return environment, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func overrideProperties(environment *Environment, properties []OverrideProperty) {
Packit 63bb0d
	for _, property := range properties {
Packit 63bb0d
		switch property.Key {
Packit 63bb0d
		case EnvironmentName:
Packit 63bb0d
			{
Packit 63bb0d
				environment.Name = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentManagementPortalURL:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ManagementPortalURL = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentPublishSettingsURL:
Packit 63bb0d
			{
Packit 63bb0d
				environment.PublishSettingsURL = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentServiceManagementEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ServiceManagementEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentResourceManagerEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ResourceManagerEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentActiveDirectoryEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ActiveDirectoryEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentGalleryEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.GalleryEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentKeyVaultEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.KeyVaultEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentGraphEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.GraphEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentServiceBusEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ServiceBusEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentBatchManagementEndpoint:
Packit 63bb0d
			{
Packit 63bb0d
				environment.BatchManagementEndpoint = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentStorageEndpointSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.StorageEndpointSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentSQLDatabaseDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.SQLDatabaseDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentTrafficManagerDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.TrafficManagerDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentKeyVaultDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.KeyVaultDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentServiceBusEndpointSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ServiceBusEndpointSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentServiceManagementVMDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ServiceManagementVMDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentResourceManagerVMDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ResourceManagerVMDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentContainerRegistryDNSSuffix:
Packit 63bb0d
			{
Packit 63bb0d
				environment.ContainerRegistryDNSSuffix = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		case EnvironmentTokenAudience:
Packit 63bb0d
			{
Packit 63bb0d
				environment.TokenAudience = property.Value
Packit 63bb0d
			}
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func retrieveMetadataEnvironment(endpoint string) (environment environmentMetadataInfo, err error) {
Packit 63bb0d
	client := autorest.NewClientWithUserAgent("")
Packit 63bb0d
	managementEndpoint := fmt.Sprintf("%s%s", strings.TrimSuffix(endpoint, "/"), "/metadata/endpoints?api-version=1.0")
Packit 63bb0d
	req, _ := http.NewRequest("GET", managementEndpoint, nil)
Packit 63bb0d
	response, err := client.Do(req)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return environment, err
Packit 63bb0d
	}
Packit 63bb0d
	defer response.Body.Close()
Packit 63bb0d
	jsonResponse, err := ioutil.ReadAll(response.Body)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return environment, err
Packit 63bb0d
	}
Packit 63bb0d
	err = json.Unmarshal(jsonResponse, &environment)
Packit 63bb0d
	return environment, err
Packit 63bb0d
}