|
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 |
}
|