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