3 // Copyright 2017 Microsoft Corporation
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
25 // EnvironmentFilepathName captures the name of the environment variable containing the path to the file
26 // to be used while populating the Azure Environment.
27 const EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
29 var environments = map[string]Environment{
30 "AZURECHINACLOUD": ChinaCloud,
31 "AZUREGERMANCLOUD": GermanCloud,
32 "AZUREPUBLICCLOUD": PublicCloud,
33 "AZUREUSGOVERNMENTCLOUD": USGovernmentCloud,
36 // Environment represents a set of endpoints for each of Azure's Clouds.
37 type Environment struct {
38 Name string `json:"name"`
39 ManagementPortalURL string `json:"managementPortalURL"`
40 PublishSettingsURL string `json:"publishSettingsURL"`
41 ServiceManagementEndpoint string `json:"serviceManagementEndpoint"`
42 ResourceManagerEndpoint string `json:"resourceManagerEndpoint"`
43 ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
44 GalleryEndpoint string `json:"galleryEndpoint"`
45 KeyVaultEndpoint string `json:"keyVaultEndpoint"`
46 GraphEndpoint string `json:"graphEndpoint"`
47 ServiceBusEndpoint string `json:"serviceBusEndpoint"`
48 BatchManagementEndpoint string `json:"batchManagementEndpoint"`
49 StorageEndpointSuffix string `json:"storageEndpointSuffix"`
50 SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
51 TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
52 KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
53 ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
54 ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
55 ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
56 ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
57 CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
58 TokenAudience string `json:"tokenAudience"`
62 // PublicCloud is the default public Azure cloud environment
63 PublicCloud = Environment{
64 Name: "AzurePublicCloud",
65 ManagementPortalURL: "https://manage.windowsazure.com/",
66 PublishSettingsURL: "https://manage.windowsazure.com/publishsettings/index",
67 ServiceManagementEndpoint: "https://management.core.windows.net/",
68 ResourceManagerEndpoint: "https://management.azure.com/",
69 ActiveDirectoryEndpoint: "https://login.microsoftonline.com/",
70 GalleryEndpoint: "https://gallery.azure.com/",
71 KeyVaultEndpoint: "https://vault.azure.net/",
72 GraphEndpoint: "https://graph.windows.net/",
73 ServiceBusEndpoint: "https://servicebus.windows.net/",
74 BatchManagementEndpoint: "https://batch.core.windows.net/",
75 StorageEndpointSuffix: "core.windows.net",
76 SQLDatabaseDNSSuffix: "database.windows.net",
77 TrafficManagerDNSSuffix: "trafficmanager.net",
78 KeyVaultDNSSuffix: "vault.azure.net",
79 ServiceBusEndpointSuffix: "servicebus.windows.net",
80 ServiceManagementVMDNSSuffix: "cloudapp.net",
81 ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
82 ContainerRegistryDNSSuffix: "azurecr.io",
83 CosmosDBDNSSuffix: "documents.azure.com",
84 TokenAudience: "https://management.azure.com/",
87 // USGovernmentCloud is the cloud environment for the US Government
88 USGovernmentCloud = Environment{
89 Name: "AzureUSGovernmentCloud",
90 ManagementPortalURL: "https://manage.windowsazure.us/",
91 PublishSettingsURL: "https://manage.windowsazure.us/publishsettings/index",
92 ServiceManagementEndpoint: "https://management.core.usgovcloudapi.net/",
93 ResourceManagerEndpoint: "https://management.usgovcloudapi.net/",
94 ActiveDirectoryEndpoint: "https://login.microsoftonline.us/",
95 GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
96 KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
97 GraphEndpoint: "https://graph.windows.net/",
98 ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
99 BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
100 StorageEndpointSuffix: "core.usgovcloudapi.net",
101 SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
102 TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
103 KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
104 ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
105 ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
106 ResourceManagerVMDNSSuffix: "cloudapp.windowsazure.us",
107 ContainerRegistryDNSSuffix: "azurecr.us",
108 CosmosDBDNSSuffix: "documents.azure.us",
109 TokenAudience: "https://management.usgovcloudapi.net/",
112 // ChinaCloud is the cloud environment operated in China
113 ChinaCloud = Environment{
114 Name: "AzureChinaCloud",
115 ManagementPortalURL: "https://manage.chinacloudapi.com/",
116 PublishSettingsURL: "https://manage.chinacloudapi.com/publishsettings/index",
117 ServiceManagementEndpoint: "https://management.core.chinacloudapi.cn/",
118 ResourceManagerEndpoint: "https://management.chinacloudapi.cn/",
119 ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/",
120 GalleryEndpoint: "https://gallery.chinacloudapi.cn/",
121 KeyVaultEndpoint: "https://vault.azure.cn/",
122 GraphEndpoint: "https://graph.chinacloudapi.cn/",
123 ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
124 BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
125 StorageEndpointSuffix: "core.chinacloudapi.cn",
126 SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
127 TrafficManagerDNSSuffix: "trafficmanager.cn",
128 KeyVaultDNSSuffix: "vault.azure.cn",
129 ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
130 ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
131 ResourceManagerVMDNSSuffix: "cloudapp.azure.cn",
132 ContainerRegistryDNSSuffix: "azurecr.cn",
133 CosmosDBDNSSuffix: "documents.azure.cn",
134 TokenAudience: "https://management.chinacloudapi.cn/",
137 // GermanCloud is the cloud environment operated in Germany
138 GermanCloud = Environment{
139 Name: "AzureGermanCloud",
140 ManagementPortalURL: "http://portal.microsoftazure.de/",
141 PublishSettingsURL: "https://manage.microsoftazure.de/publishsettings/index",
142 ServiceManagementEndpoint: "https://management.core.cloudapi.de/",
143 ResourceManagerEndpoint: "https://management.microsoftazure.de/",
144 ActiveDirectoryEndpoint: "https://login.microsoftonline.de/",
145 GalleryEndpoint: "https://gallery.cloudapi.de/",
146 KeyVaultEndpoint: "https://vault.microsoftazure.de/",
147 GraphEndpoint: "https://graph.cloudapi.de/",
148 ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
149 BatchManagementEndpoint: "https://batch.cloudapi.de/",
150 StorageEndpointSuffix: "core.cloudapi.de",
151 SQLDatabaseDNSSuffix: "database.cloudapi.de",
152 TrafficManagerDNSSuffix: "azuretrafficmanager.de",
153 KeyVaultDNSSuffix: "vault.microsoftazure.de",
154 ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
155 ServiceManagementVMDNSSuffix: "azurecloudapp.de",
156 ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
157 // ContainerRegistryDNSSuffix: "", ACR not present yet in the German Cloud
158 CosmosDBDNSSuffix: "documents.microsoftazure.de",
159 TokenAudience: "https://management.microsoftazure.de/",
163 // EnvironmentFromName returns an Environment based on the common name specified.
164 func EnvironmentFromName(name string) (Environment, error) {
166 // As per @radhikagupta5:
167 // This is technical debt, fundamentally here because Kubernetes is not currently accepting
168 // contributions to the providers. Once that is an option, the provider should be updated to
169 // directly call `EnvironmentFromFile`. Until then, we rely on dispatching Azure Stack environment creation
170 // from this method based on the name that is provided to us.
171 if strings.EqualFold(name, "AZURESTACKCLOUD") {
172 return EnvironmentFromFile(os.Getenv(EnvironmentFilepathName))
175 name = strings.ToUpper(name)
176 env, ok := environments[name]
178 return env, fmt.Errorf("autorest/azure: There is no cloud environment matching the name %q", name)
184 // EnvironmentFromFile loads an Environment from a configuration file available on disk.
185 // This function is particularly useful in the Hybrid Cloud model, where one must define their own
187 func EnvironmentFromFile(location string) (unmarshaled Environment, err error) {
188 fileContents, err := ioutil.ReadFile(location)
193 err = json.Unmarshal(fileContents, &unmarshaled)