github.com/nbering/terraform@v0.8.5-0.20170113232247-453f670684b5/builtin/providers/azurerm/config.go (about) 1 package azurerm 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "net/http" 8 "net/http/httputil" 9 10 "github.com/Azure/azure-sdk-for-go/arm/cdn" 11 "github.com/Azure/azure-sdk-for-go/arm/compute" 12 "github.com/Azure/azure-sdk-for-go/arm/containerregistry" 13 "github.com/Azure/azure-sdk-for-go/arm/eventhub" 14 "github.com/Azure/azure-sdk-for-go/arm/keyvault" 15 "github.com/Azure/azure-sdk-for-go/arm/network" 16 "github.com/Azure/azure-sdk-for-go/arm/redis" 17 "github.com/Azure/azure-sdk-for-go/arm/resources/resources" 18 "github.com/Azure/azure-sdk-for-go/arm/scheduler" 19 "github.com/Azure/azure-sdk-for-go/arm/servicebus" 20 "github.com/Azure/azure-sdk-for-go/arm/storage" 21 "github.com/Azure/azure-sdk-for-go/arm/trafficmanager" 22 mainStorage "github.com/Azure/azure-sdk-for-go/storage" 23 "github.com/Azure/go-autorest/autorest" 24 "github.com/Azure/go-autorest/autorest/azure" 25 "github.com/hashicorp/terraform/terraform" 26 riviera "github.com/jen20/riviera/azure" 27 ) 28 29 // ArmClient contains the handles to all the specific Azure Resource Manager 30 // resource classes' respective clients. 31 type ArmClient struct { 32 clientId string 33 tenantId string 34 subscriptionId string 35 36 StopContext context.Context 37 38 rivieraClient *riviera.Client 39 40 availSetClient compute.AvailabilitySetsClient 41 usageOpsClient compute.UsageOperationsClient 42 vmExtensionImageClient compute.VirtualMachineExtensionImagesClient 43 vmExtensionClient compute.VirtualMachineExtensionsClient 44 vmScaleSetClient compute.VirtualMachineScaleSetsClient 45 vmImageClient compute.VirtualMachineImagesClient 46 vmClient compute.VirtualMachinesClient 47 48 appGatewayClient network.ApplicationGatewaysClient 49 ifaceClient network.InterfacesClient 50 loadBalancerClient network.LoadBalancersClient 51 localNetConnClient network.LocalNetworkGatewaysClient 52 publicIPClient network.PublicIPAddressesClient 53 secGroupClient network.SecurityGroupsClient 54 secRuleClient network.SecurityRulesClient 55 subnetClient network.SubnetsClient 56 netUsageClient network.UsagesClient 57 vnetGatewayConnectionsClient network.VirtualNetworkGatewayConnectionsClient 58 vnetGatewayClient network.VirtualNetworkGatewaysClient 59 vnetClient network.VirtualNetworksClient 60 vnetPeeringsClient network.VirtualNetworkPeeringsClient 61 routeTablesClient network.RouteTablesClient 62 routesClient network.RoutesClient 63 64 cdnProfilesClient cdn.ProfilesClient 65 cdnEndpointsClient cdn.EndpointsClient 66 67 containerRegistryClient containerregistry.RegistriesClient 68 69 eventHubClient eventhub.EventHubsClient 70 eventHubConsumerGroupClient eventhub.ConsumerGroupsClient 71 eventHubNamespacesClient eventhub.NamespacesClient 72 73 providers resources.ProvidersClient 74 resourceGroupClient resources.GroupsClient 75 tagsClient resources.TagsClient 76 resourceFindClient resources.Client 77 78 jobsClient scheduler.JobsClient 79 jobsCollectionsClient scheduler.JobCollectionsClient 80 81 storageServiceClient storage.AccountsClient 82 storageUsageClient storage.UsageOperationsClient 83 84 deploymentsClient resources.DeploymentsClient 85 86 redisClient redis.Client 87 88 trafficManagerProfilesClient trafficmanager.ProfilesClient 89 trafficManagerEndpointsClient trafficmanager.EndpointsClient 90 91 serviceBusNamespacesClient servicebus.NamespacesClient 92 serviceBusTopicsClient servicebus.TopicsClient 93 serviceBusSubscriptionsClient servicebus.SubscriptionsClient 94 95 keyVaultClient keyvault.VaultsClient 96 } 97 98 func withRequestLogging() autorest.SendDecorator { 99 return func(s autorest.Sender) autorest.Sender { 100 return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) { 101 // dump request to wire format 102 if dump, err := httputil.DumpRequestOut(r, true); err == nil { 103 log.Printf("[DEBUG] AzureRM Request: \n%s\n", dump) 104 } else { 105 // fallback to basic message 106 log.Printf("[DEBUG] AzureRM Request: %s to %s\n", r.Method, r.URL) 107 } 108 109 resp, err := s.Do(r) 110 if resp != nil { 111 // dump response to wire format 112 if dump, err := httputil.DumpResponse(resp, true); err == nil { 113 log.Printf("[DEBUG] AzureRM Response for %s: \n%s\n", r.URL, dump) 114 } else { 115 // fallback to basic message 116 log.Printf("[DEBUG] AzureRM Response: %s for %s\n", resp.Status, r.URL) 117 } 118 } else { 119 log.Printf("[DEBUG] Request to %s completed with no response", r.URL) 120 } 121 return resp, err 122 }) 123 } 124 } 125 126 func setUserAgent(client *autorest.Client) { 127 version := terraform.VersionString() 128 client.UserAgent = fmt.Sprintf("HashiCorp-Terraform-v%s", version) 129 } 130 131 // getArmClient is a helper method which returns a fully instantiated 132 // *ArmClient based on the Config's current settings. 133 func (c *Config) getArmClient() (*ArmClient, error) { 134 // client declarations: 135 client := ArmClient{ 136 clientId: c.ClientID, 137 tenantId: c.TenantID, 138 subscriptionId: c.SubscriptionID, 139 } 140 141 // detect cloud from environment 142 env, envErr := azure.EnvironmentFromName(c.Environment) 143 if envErr != nil { 144 // try again with wrapped value to support readable values like german instead of AZUREGERMANCLOUD 145 wrapped := fmt.Sprintf("AZURE%sCLOUD", c.Environment) 146 var innerErr error 147 if env, innerErr = azure.EnvironmentFromName(wrapped); innerErr != nil { 148 return nil, envErr 149 } 150 } 151 152 rivieraClient, err := riviera.NewClient(&riviera.AzureResourceManagerCredentials{ 153 ClientID: c.ClientID, 154 ClientSecret: c.ClientSecret, 155 TenantID: c.TenantID, 156 SubscriptionID: c.SubscriptionID, 157 ResourceManagerEndpoint: env.ResourceManagerEndpoint, 158 ActiveDirectoryEndpoint: env.ActiveDirectoryEndpoint, 159 }) 160 if err != nil { 161 return nil, fmt.Errorf("Error creating Riviera client: %s", err) 162 } 163 client.rivieraClient = rivieraClient 164 165 oauthConfig, err := env.OAuthConfigForTenant(c.TenantID) 166 if err != nil { 167 return nil, err 168 } 169 170 // OAuthConfigForTenant returns a pointer, which can be nil. 171 if oauthConfig == nil { 172 return nil, fmt.Errorf("Unable to configure OAuthConfig for tenant %s", c.TenantID) 173 } 174 175 spt, err := azure.NewServicePrincipalToken(*oauthConfig, c.ClientID, c.ClientSecret, env.ResourceManagerEndpoint) 176 if err != nil { 177 return nil, err 178 } 179 180 endpoint := env.ResourceManagerEndpoint 181 182 // NOTE: these declarations should be left separate for clarity should the 183 // clients be wished to be configured with custom Responders/PollingModess etc... 184 asc := compute.NewAvailabilitySetsClientWithBaseURI(endpoint, c.SubscriptionID) 185 setUserAgent(&asc.Client) 186 asc.Authorizer = spt 187 asc.Sender = autorest.CreateSender(withRequestLogging()) 188 client.availSetClient = asc 189 190 uoc := compute.NewUsageOperationsClientWithBaseURI(endpoint, c.SubscriptionID) 191 setUserAgent(&uoc.Client) 192 uoc.Authorizer = spt 193 uoc.Sender = autorest.CreateSender(withRequestLogging()) 194 client.usageOpsClient = uoc 195 196 vmeic := compute.NewVirtualMachineExtensionImagesClientWithBaseURI(endpoint, c.SubscriptionID) 197 setUserAgent(&vmeic.Client) 198 vmeic.Authorizer = spt 199 vmeic.Sender = autorest.CreateSender(withRequestLogging()) 200 client.vmExtensionImageClient = vmeic 201 202 vmec := compute.NewVirtualMachineExtensionsClientWithBaseURI(endpoint, c.SubscriptionID) 203 setUserAgent(&vmec.Client) 204 vmec.Authorizer = spt 205 vmec.Sender = autorest.CreateSender(withRequestLogging()) 206 client.vmExtensionClient = vmec 207 208 vmic := compute.NewVirtualMachineImagesClientWithBaseURI(endpoint, c.SubscriptionID) 209 setUserAgent(&vmic.Client) 210 vmic.Authorizer = spt 211 vmic.Sender = autorest.CreateSender(withRequestLogging()) 212 client.vmImageClient = vmic 213 214 vmssc := compute.NewVirtualMachineScaleSetsClientWithBaseURI(endpoint, c.SubscriptionID) 215 setUserAgent(&vmssc.Client) 216 vmssc.Authorizer = spt 217 vmssc.Sender = autorest.CreateSender(withRequestLogging()) 218 client.vmScaleSetClient = vmssc 219 220 vmc := compute.NewVirtualMachinesClientWithBaseURI(endpoint, c.SubscriptionID) 221 setUserAgent(&vmc.Client) 222 vmc.Authorizer = spt 223 vmc.Sender = autorest.CreateSender(withRequestLogging()) 224 client.vmClient = vmc 225 226 agc := network.NewApplicationGatewaysClientWithBaseURI(endpoint, c.SubscriptionID) 227 setUserAgent(&agc.Client) 228 agc.Authorizer = spt 229 agc.Sender = autorest.CreateSender(withRequestLogging()) 230 client.appGatewayClient = agc 231 232 crc := containerregistry.NewRegistriesClientWithBaseURI(endpoint, c.SubscriptionID) 233 setUserAgent(&crc.Client) 234 crc.Authorizer = spt 235 crc.Sender = autorest.CreateSender(withRequestLogging()) 236 client.containerRegistryClient = crc 237 238 ehc := eventhub.NewEventHubsClientWithBaseURI(endpoint, c.SubscriptionID) 239 setUserAgent(&ehc.Client) 240 ehc.Authorizer = spt 241 ehc.Sender = autorest.CreateSender(withRequestLogging()) 242 client.eventHubClient = ehc 243 244 chcgc := eventhub.NewConsumerGroupsClientWithBaseURI(endpoint, c.SubscriptionID) 245 setUserAgent(&chcgc.Client) 246 chcgc.Authorizer = spt 247 chcgc.Sender = autorest.CreateSender(withRequestLogging()) 248 client.eventHubConsumerGroupClient = chcgc 249 250 ehnc := eventhub.NewNamespacesClientWithBaseURI(endpoint, c.SubscriptionID) 251 setUserAgent(&ehnc.Client) 252 ehnc.Authorizer = spt 253 ehnc.Sender = autorest.CreateSender(withRequestLogging()) 254 client.eventHubNamespacesClient = ehnc 255 256 ifc := network.NewInterfacesClientWithBaseURI(endpoint, c.SubscriptionID) 257 setUserAgent(&ifc.Client) 258 ifc.Authorizer = spt 259 ifc.Sender = autorest.CreateSender(withRequestLogging()) 260 client.ifaceClient = ifc 261 262 lbc := network.NewLoadBalancersClientWithBaseURI(endpoint, c.SubscriptionID) 263 setUserAgent(&lbc.Client) 264 lbc.Authorizer = spt 265 lbc.Sender = autorest.CreateSender(withRequestLogging()) 266 client.loadBalancerClient = lbc 267 268 lgc := network.NewLocalNetworkGatewaysClientWithBaseURI(endpoint, c.SubscriptionID) 269 setUserAgent(&lgc.Client) 270 lgc.Authorizer = spt 271 lgc.Sender = autorest.CreateSender(withRequestLogging()) 272 client.localNetConnClient = lgc 273 274 pipc := network.NewPublicIPAddressesClientWithBaseURI(endpoint, c.SubscriptionID) 275 setUserAgent(&pipc.Client) 276 pipc.Authorizer = spt 277 pipc.Sender = autorest.CreateSender(withRequestLogging()) 278 client.publicIPClient = pipc 279 280 sgc := network.NewSecurityGroupsClientWithBaseURI(endpoint, c.SubscriptionID) 281 setUserAgent(&sgc.Client) 282 sgc.Authorizer = spt 283 sgc.Sender = autorest.CreateSender(withRequestLogging()) 284 client.secGroupClient = sgc 285 286 src := network.NewSecurityRulesClientWithBaseURI(endpoint, c.SubscriptionID) 287 setUserAgent(&src.Client) 288 src.Authorizer = spt 289 src.Sender = autorest.CreateSender(withRequestLogging()) 290 client.secRuleClient = src 291 292 snc := network.NewSubnetsClientWithBaseURI(endpoint, c.SubscriptionID) 293 setUserAgent(&snc.Client) 294 snc.Authorizer = spt 295 snc.Sender = autorest.CreateSender(withRequestLogging()) 296 client.subnetClient = snc 297 298 vgcc := network.NewVirtualNetworkGatewayConnectionsClientWithBaseURI(endpoint, c.SubscriptionID) 299 setUserAgent(&vgcc.Client) 300 vgcc.Authorizer = spt 301 vgcc.Sender = autorest.CreateSender(withRequestLogging()) 302 client.vnetGatewayConnectionsClient = vgcc 303 304 vgc := network.NewVirtualNetworkGatewaysClientWithBaseURI(endpoint, c.SubscriptionID) 305 setUserAgent(&vgc.Client) 306 vgc.Authorizer = spt 307 vgc.Sender = autorest.CreateSender(withRequestLogging()) 308 client.vnetGatewayClient = vgc 309 310 vnc := network.NewVirtualNetworksClientWithBaseURI(endpoint, c.SubscriptionID) 311 setUserAgent(&vnc.Client) 312 vnc.Authorizer = spt 313 vnc.Sender = autorest.CreateSender(withRequestLogging()) 314 client.vnetClient = vnc 315 316 vnpc := network.NewVirtualNetworkPeeringsClientWithBaseURI(endpoint, c.SubscriptionID) 317 setUserAgent(&vnpc.Client) 318 vnpc.Authorizer = spt 319 vnpc.Sender = autorest.CreateSender(withRequestLogging()) 320 client.vnetPeeringsClient = vnpc 321 322 rtc := network.NewRouteTablesClientWithBaseURI(endpoint, c.SubscriptionID) 323 setUserAgent(&rtc.Client) 324 rtc.Authorizer = spt 325 rtc.Sender = autorest.CreateSender(withRequestLogging()) 326 client.routeTablesClient = rtc 327 328 rc := network.NewRoutesClientWithBaseURI(endpoint, c.SubscriptionID) 329 setUserAgent(&rc.Client) 330 rc.Authorizer = spt 331 rc.Sender = autorest.CreateSender(withRequestLogging()) 332 client.routesClient = rc 333 334 rgc := resources.NewGroupsClientWithBaseURI(endpoint, c.SubscriptionID) 335 setUserAgent(&rgc.Client) 336 rgc.Authorizer = spt 337 rgc.Sender = autorest.CreateSender(withRequestLogging()) 338 client.resourceGroupClient = rgc 339 340 pc := resources.NewProvidersClientWithBaseURI(endpoint, c.SubscriptionID) 341 setUserAgent(&pc.Client) 342 pc.Authorizer = spt 343 pc.Sender = autorest.CreateSender(withRequestLogging()) 344 client.providers = pc 345 346 tc := resources.NewTagsClientWithBaseURI(endpoint, c.SubscriptionID) 347 setUserAgent(&tc.Client) 348 tc.Authorizer = spt 349 tc.Sender = autorest.CreateSender(withRequestLogging()) 350 client.tagsClient = tc 351 352 rf := resources.NewClientWithBaseURI(endpoint, c.SubscriptionID) 353 setUserAgent(&rf.Client) 354 rf.Authorizer = spt 355 rf.Sender = autorest.CreateSender(withRequestLogging()) 356 client.resourceFindClient = rf 357 358 jc := scheduler.NewJobsClientWithBaseURI(endpoint, c.SubscriptionID) 359 setUserAgent(&jc.Client) 360 jc.Authorizer = spt 361 jc.Sender = autorest.CreateSender(withRequestLogging()) 362 client.jobsClient = jc 363 364 jcc := scheduler.NewJobCollectionsClientWithBaseURI(endpoint, c.SubscriptionID) 365 setUserAgent(&jcc.Client) 366 jcc.Authorizer = spt 367 jcc.Sender = autorest.CreateSender(withRequestLogging()) 368 client.jobsCollectionsClient = jcc 369 370 ssc := storage.NewAccountsClientWithBaseURI(endpoint, c.SubscriptionID) 371 setUserAgent(&ssc.Client) 372 ssc.Authorizer = spt 373 ssc.Sender = autorest.CreateSender(withRequestLogging()) 374 client.storageServiceClient = ssc 375 376 suc := storage.NewUsageOperationsClientWithBaseURI(endpoint, c.SubscriptionID) 377 setUserAgent(&suc.Client) 378 suc.Authorizer = spt 379 suc.Sender = autorest.CreateSender(withRequestLogging()) 380 client.storageUsageClient = suc 381 382 cpc := cdn.NewProfilesClientWithBaseURI(endpoint, c.SubscriptionID) 383 setUserAgent(&cpc.Client) 384 cpc.Authorizer = spt 385 cpc.Sender = autorest.CreateSender(withRequestLogging()) 386 client.cdnProfilesClient = cpc 387 388 cec := cdn.NewEndpointsClientWithBaseURI(endpoint, c.SubscriptionID) 389 setUserAgent(&cec.Client) 390 cec.Authorizer = spt 391 cec.Sender = autorest.CreateSender(withRequestLogging()) 392 client.cdnEndpointsClient = cec 393 394 dc := resources.NewDeploymentsClientWithBaseURI(endpoint, c.SubscriptionID) 395 setUserAgent(&dc.Client) 396 dc.Authorizer = spt 397 dc.Sender = autorest.CreateSender(withRequestLogging()) 398 client.deploymentsClient = dc 399 400 tmpc := trafficmanager.NewProfilesClientWithBaseURI(endpoint, c.SubscriptionID) 401 setUserAgent(&tmpc.Client) 402 tmpc.Authorizer = spt 403 tmpc.Sender = autorest.CreateSender(withRequestLogging()) 404 client.trafficManagerProfilesClient = tmpc 405 406 tmec := trafficmanager.NewEndpointsClientWithBaseURI(endpoint, c.SubscriptionID) 407 setUserAgent(&tmec.Client) 408 tmec.Authorizer = spt 409 tmec.Sender = autorest.CreateSender(withRequestLogging()) 410 client.trafficManagerEndpointsClient = tmec 411 412 rdc := redis.NewClientWithBaseURI(endpoint, c.SubscriptionID) 413 setUserAgent(&rdc.Client) 414 rdc.Authorizer = spt 415 rdc.Sender = autorest.CreateSender(withRequestLogging()) 416 client.redisClient = rdc 417 418 sbnc := servicebus.NewNamespacesClientWithBaseURI(endpoint, c.SubscriptionID) 419 setUserAgent(&sbnc.Client) 420 sbnc.Authorizer = spt 421 sbnc.Sender = autorest.CreateSender(withRequestLogging()) 422 client.serviceBusNamespacesClient = sbnc 423 424 sbtc := servicebus.NewTopicsClientWithBaseURI(endpoint, c.SubscriptionID) 425 setUserAgent(&sbtc.Client) 426 sbtc.Authorizer = spt 427 sbtc.Sender = autorest.CreateSender(withRequestLogging()) 428 client.serviceBusTopicsClient = sbtc 429 430 sbsc := servicebus.NewSubscriptionsClientWithBaseURI(endpoint, c.SubscriptionID) 431 setUserAgent(&sbsc.Client) 432 sbsc.Authorizer = spt 433 sbsc.Sender = autorest.CreateSender(withRequestLogging()) 434 client.serviceBusSubscriptionsClient = sbsc 435 436 kvc := keyvault.NewVaultsClientWithBaseURI(endpoint, c.SubscriptionID) 437 setUserAgent(&kvc.Client) 438 kvc.Authorizer = spt 439 kvc.Sender = autorest.CreateSender(withRequestLogging()) 440 client.keyVaultClient = kvc 441 442 return &client, nil 443 } 444 445 func (armClient *ArmClient) getKeyForStorageAccount(resourceGroupName, storageAccountName string) (string, bool, error) { 446 accountKeys, err := armClient.storageServiceClient.ListKeys(resourceGroupName, storageAccountName) 447 if accountKeys.StatusCode == http.StatusNotFound { 448 return "", false, nil 449 } 450 if err != nil { 451 // We assume this is a transient error rather than a 404 (which is caught above), so assume the 452 // account still exists. 453 return "", true, fmt.Errorf("Error retrieving keys for storage account %q: %s", storageAccountName, err) 454 } 455 456 if accountKeys.Keys == nil { 457 return "", false, fmt.Errorf("Nil key returned for storage account %q", storageAccountName) 458 } 459 460 keys := *accountKeys.Keys 461 return *keys[0].Value, true, nil 462 } 463 464 func (armClient *ArmClient) getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.BlobStorageClient, bool, error) { 465 key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName) 466 if err != nil { 467 return nil, accountExists, err 468 } 469 if accountExists == false { 470 return nil, false, nil 471 } 472 473 storageClient, err := mainStorage.NewBasicClient(storageAccountName, key) 474 if err != nil { 475 return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err) 476 } 477 478 blobClient := storageClient.GetBlobService() 479 return &blobClient, true, nil 480 } 481 482 func (armClient *ArmClient) getFileServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.FileServiceClient, bool, error) { 483 key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName) 484 if err != nil { 485 return nil, accountExists, err 486 } 487 if accountExists == false { 488 return nil, false, nil 489 } 490 491 storageClient, err := mainStorage.NewBasicClient(storageAccountName, key) 492 if err != nil { 493 return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err) 494 } 495 496 fileClient := storageClient.GetFileService() 497 return &fileClient, true, nil 498 } 499 500 func (armClient *ArmClient) getTableServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.TableServiceClient, bool, error) { 501 key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName) 502 if err != nil { 503 return nil, accountExists, err 504 } 505 if accountExists == false { 506 return nil, false, nil 507 } 508 509 storageClient, err := mainStorage.NewBasicClient(storageAccountName, key) 510 if err != nil { 511 return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err) 512 } 513 514 tableClient := storageClient.GetTableService() 515 return &tableClient, true, nil 516 } 517 518 func (armClient *ArmClient) getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.QueueServiceClient, bool, error) { 519 key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName) 520 if err != nil { 521 return nil, accountExists, err 522 } 523 if accountExists == false { 524 return nil, false, nil 525 } 526 527 storageClient, err := mainStorage.NewBasicClient(storageAccountName, key) 528 if err != nil { 529 return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err) 530 } 531 532 queueClient := storageClient.GetQueueService() 533 return &queueClient, true, nil 534 }