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  }