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