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  }