github.com/ffrizzo/terraform@v0.8.2-0.20161219200057-992e12335f3d/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  }