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