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