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