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  }