github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/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/containerregistry"
    13  	"github.com/Azure/azure-sdk-for-go/arm/containerservice"
    14  	"github.com/Azure/azure-sdk-for-go/arm/disk"
    15  	"github.com/Azure/azure-sdk-for-go/arm/eventhub"
    16  	"github.com/Azure/azure-sdk-for-go/arm/keyvault"
    17  	"github.com/Azure/azure-sdk-for-go/arm/network"
    18  	"github.com/Azure/azure-sdk-for-go/arm/redis"
    19  	"github.com/Azure/azure-sdk-for-go/arm/resources/resources"
    20  	"github.com/Azure/azure-sdk-for-go/arm/scheduler"
    21  	"github.com/Azure/azure-sdk-for-go/arm/servicebus"
    22  	"github.com/Azure/azure-sdk-for-go/arm/sql"
    23  	"github.com/Azure/azure-sdk-for-go/arm/storage"
    24  	"github.com/Azure/azure-sdk-for-go/arm/trafficmanager"
    25  	mainStorage "github.com/Azure/azure-sdk-for-go/storage"
    26  	"github.com/Azure/go-autorest/autorest"
    27  	"github.com/Azure/go-autorest/autorest/adal"
    28  	"github.com/Azure/go-autorest/autorest/azure"
    29  	"github.com/hashicorp/terraform/terraform"
    30  	riviera "github.com/jen20/riviera/azure"
    31  )
    32  
    33  // ArmClient contains the handles to all the specific Azure Resource Manager
    34  // resource classes' respective clients.
    35  type ArmClient struct {
    36  	clientId       string
    37  	tenantId       string
    38  	subscriptionId string
    39  	environment    azure.Environment
    40  
    41  	StopContext context.Context
    42  
    43  	rivieraClient *riviera.Client
    44  
    45  	availSetClient         compute.AvailabilitySetsClient
    46  	usageOpsClient         compute.UsageClient
    47  	vmExtensionImageClient compute.VirtualMachineExtensionImagesClient
    48  	vmExtensionClient      compute.VirtualMachineExtensionsClient
    49  	vmScaleSetClient       compute.VirtualMachineScaleSetsClient
    50  	vmImageClient          compute.VirtualMachineImagesClient
    51  	vmClient               compute.VirtualMachinesClient
    52  
    53  	diskClient disk.DisksClient
    54  
    55  	appGatewayClient             network.ApplicationGatewaysClient
    56  	ifaceClient                  network.InterfacesClient
    57  	expressRouteCircuitClient    network.ExpressRouteCircuitsClient
    58  	loadBalancerClient           network.LoadBalancersClient
    59  	localNetConnClient           network.LocalNetworkGatewaysClient
    60  	publicIPClient               network.PublicIPAddressesClient
    61  	secGroupClient               network.SecurityGroupsClient
    62  	secRuleClient                network.SecurityRulesClient
    63  	subnetClient                 network.SubnetsClient
    64  	netUsageClient               network.UsagesClient
    65  	vnetGatewayConnectionsClient network.VirtualNetworkGatewayConnectionsClient
    66  	vnetGatewayClient            network.VirtualNetworkGatewaysClient
    67  	vnetClient                   network.VirtualNetworksClient
    68  	vnetPeeringsClient           network.VirtualNetworkPeeringsClient
    69  	routeTablesClient            network.RouteTablesClient
    70  	routesClient                 network.RoutesClient
    71  
    72  	cdnProfilesClient  cdn.ProfilesClient
    73  	cdnEndpointsClient cdn.EndpointsClient
    74  
    75  	containerRegistryClient containerregistry.RegistriesClient
    76  	containerServicesClient containerservice.ContainerServicesClient
    77  
    78  	eventHubClient              eventhub.EventHubsClient
    79  	eventHubConsumerGroupClient eventhub.ConsumerGroupsClient
    80  	eventHubNamespacesClient    eventhub.NamespacesClient
    81  
    82  	providers           resources.ProvidersClient
    83  	resourceGroupClient resources.GroupsClient
    84  	tagsClient          resources.TagsClient
    85  	resourceFindClient  resources.GroupClient
    86  
    87  	jobsClient            scheduler.JobsClient
    88  	jobsCollectionsClient scheduler.JobCollectionsClient
    89  
    90  	storageServiceClient storage.AccountsClient
    91  	storageUsageClient   storage.UsageClient
    92  
    93  	deploymentsClient resources.DeploymentsClient
    94  
    95  	redisClient redis.GroupClient
    96  
    97  	trafficManagerProfilesClient  trafficmanager.ProfilesClient
    98  	trafficManagerEndpointsClient trafficmanager.EndpointsClient
    99  
   100  	serviceBusNamespacesClient    servicebus.NamespacesClient
   101  	serviceBusTopicsClient        servicebus.TopicsClient
   102  	serviceBusSubscriptionsClient servicebus.SubscriptionsClient
   103  
   104  	keyVaultClient keyvault.VaultsClient
   105  
   106  	sqlElasticPoolsClient sql.ElasticPoolsClient
   107  }
   108  
   109  func withRequestLogging() autorest.SendDecorator {
   110  	return func(s autorest.Sender) autorest.Sender {
   111  		return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
   112  			// dump request to wire format
   113  			if dump, err := httputil.DumpRequestOut(r, true); err == nil {
   114  				log.Printf("[DEBUG] AzureRM Request: \n%s\n", dump)
   115  			} else {
   116  				// fallback to basic message
   117  				log.Printf("[DEBUG] AzureRM Request: %s to %s\n", r.Method, r.URL)
   118  			}
   119  
   120  			resp, err := s.Do(r)
   121  			if resp != nil {
   122  				// dump response to wire format
   123  				if dump, err := httputil.DumpResponse(resp, true); err == nil {
   124  					log.Printf("[DEBUG] AzureRM Response for %s: \n%s\n", r.URL, dump)
   125  				} else {
   126  					// fallback to basic message
   127  					log.Printf("[DEBUG] AzureRM Response: %s for %s\n", resp.Status, r.URL)
   128  				}
   129  			} else {
   130  				log.Printf("[DEBUG] Request to %s completed with no response", r.URL)
   131  			}
   132  			return resp, err
   133  		})
   134  	}
   135  }
   136  
   137  func setUserAgent(client *autorest.Client) {
   138  	version := terraform.VersionString()
   139  	client.UserAgent = fmt.Sprintf("HashiCorp-Terraform-v%s", version)
   140  }
   141  
   142  // getArmClient is a helper method which returns a fully instantiated
   143  // *ArmClient based on the Config's current settings.
   144  func (c *Config) getArmClient() (*ArmClient, error) {
   145  	// detect cloud from environment
   146  	env, envErr := azure.EnvironmentFromName(c.Environment)
   147  	if envErr != nil {
   148  		// try again with wrapped value to support readable values like german instead of AZUREGERMANCLOUD
   149  		wrapped := fmt.Sprintf("AZURE%sCLOUD", c.Environment)
   150  		var innerErr error
   151  		if env, innerErr = azure.EnvironmentFromName(wrapped); innerErr != nil {
   152  			return nil, envErr
   153  		}
   154  	}
   155  
   156  	// client declarations:
   157  	client := ArmClient{
   158  		clientId:       c.ClientID,
   159  		tenantId:       c.TenantID,
   160  		subscriptionId: c.SubscriptionID,
   161  		environment:    env,
   162  	}
   163  
   164  	rivieraClient, err := riviera.NewClient(&riviera.AzureResourceManagerCredentials{
   165  		ClientID:                c.ClientID,
   166  		ClientSecret:            c.ClientSecret,
   167  		TenantID:                c.TenantID,
   168  		SubscriptionID:          c.SubscriptionID,
   169  		ResourceManagerEndpoint: env.ResourceManagerEndpoint,
   170  		ActiveDirectoryEndpoint: env.ActiveDirectoryEndpoint,
   171  	})
   172  	if err != nil {
   173  		return nil, fmt.Errorf("Error creating Riviera client: %s", err)
   174  	}
   175  	client.rivieraClient = rivieraClient
   176  
   177  	oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, c.TenantID)
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  
   182  	// OAuthConfigForTenant returns a pointer, which can be nil.
   183  	if oauthConfig == nil {
   184  		return nil, fmt.Errorf("Unable to configure OAuthConfig for tenant %s", c.TenantID)
   185  	}
   186  
   187  	spt, err := adal.NewServicePrincipalToken(*oauthConfig, c.ClientID, c.ClientSecret, env.ResourceManagerEndpoint)
   188  	if err != nil {
   189  		return nil, err
   190  	}
   191  
   192  	endpoint := env.ResourceManagerEndpoint
   193  	auth := autorest.NewBearerAuthorizer(spt)
   194  
   195  	// NOTE: these declarations should be left separate for clarity should the
   196  	// clients be wished to be configured with custom Responders/PollingModess etc...
   197  	asc := compute.NewAvailabilitySetsClientWithBaseURI(endpoint, c.SubscriptionID)
   198  	setUserAgent(&asc.Client)
   199  	asc.Authorizer = auth
   200  	asc.Sender = autorest.CreateSender(withRequestLogging())
   201  	client.availSetClient = asc
   202  
   203  	uoc := compute.NewUsageClientWithBaseURI(endpoint, c.SubscriptionID)
   204  	setUserAgent(&uoc.Client)
   205  	uoc.Authorizer = auth
   206  	uoc.Sender = autorest.CreateSender(withRequestLogging())
   207  	client.usageOpsClient = uoc
   208  
   209  	vmeic := compute.NewVirtualMachineExtensionImagesClientWithBaseURI(endpoint, c.SubscriptionID)
   210  	setUserAgent(&vmeic.Client)
   211  	vmeic.Authorizer = auth
   212  	vmeic.Sender = autorest.CreateSender(withRequestLogging())
   213  	client.vmExtensionImageClient = vmeic
   214  
   215  	vmec := compute.NewVirtualMachineExtensionsClientWithBaseURI(endpoint, c.SubscriptionID)
   216  	setUserAgent(&vmec.Client)
   217  	vmec.Authorizer = auth
   218  	vmec.Sender = autorest.CreateSender(withRequestLogging())
   219  	client.vmExtensionClient = vmec
   220  
   221  	vmic := compute.NewVirtualMachineImagesClientWithBaseURI(endpoint, c.SubscriptionID)
   222  	setUserAgent(&vmic.Client)
   223  	vmic.Authorizer = auth
   224  	vmic.Sender = autorest.CreateSender(withRequestLogging())
   225  	client.vmImageClient = vmic
   226  
   227  	vmssc := compute.NewVirtualMachineScaleSetsClientWithBaseURI(endpoint, c.SubscriptionID)
   228  	setUserAgent(&vmssc.Client)
   229  	vmssc.Authorizer = auth
   230  	vmssc.Sender = autorest.CreateSender(withRequestLogging())
   231  	client.vmScaleSetClient = vmssc
   232  
   233  	vmc := compute.NewVirtualMachinesClientWithBaseURI(endpoint, c.SubscriptionID)
   234  	setUserAgent(&vmc.Client)
   235  	vmc.Authorizer = auth
   236  	vmc.Sender = autorest.CreateSender(withRequestLogging())
   237  	client.vmClient = vmc
   238  
   239  	agc := network.NewApplicationGatewaysClientWithBaseURI(endpoint, c.SubscriptionID)
   240  	setUserAgent(&agc.Client)
   241  	agc.Authorizer = auth
   242  	agc.Sender = autorest.CreateSender(withRequestLogging())
   243  	client.appGatewayClient = agc
   244  
   245  	crc := containerregistry.NewRegistriesClientWithBaseURI(endpoint, c.SubscriptionID)
   246  	setUserAgent(&crc.Client)
   247  	crc.Authorizer = auth
   248  	crc.Sender = autorest.CreateSender(withRequestLogging())
   249  	client.containerRegistryClient = crc
   250  
   251  	csc := containerservice.NewContainerServicesClientWithBaseURI(endpoint, c.SubscriptionID)
   252  	setUserAgent(&csc.Client)
   253  	csc.Authorizer = auth
   254  	csc.Sender = autorest.CreateSender(withRequestLogging())
   255  	client.containerServicesClient = csc
   256  
   257  	dkc := disk.NewDisksClientWithBaseURI(endpoint, c.SubscriptionID)
   258  	setUserAgent(&dkc.Client)
   259  	dkc.Authorizer = auth
   260  	dkc.Sender = autorest.CreateSender(withRequestLogging())
   261  	client.diskClient = dkc
   262  
   263  	ehc := eventhub.NewEventHubsClientWithBaseURI(endpoint, c.SubscriptionID)
   264  	setUserAgent(&ehc.Client)
   265  	ehc.Authorizer = auth
   266  	ehc.Sender = autorest.CreateSender(withRequestLogging())
   267  	client.eventHubClient = ehc
   268  
   269  	chcgc := eventhub.NewConsumerGroupsClientWithBaseURI(endpoint, c.SubscriptionID)
   270  	setUserAgent(&chcgc.Client)
   271  	chcgc.Authorizer = auth
   272  	chcgc.Sender = autorest.CreateSender(withRequestLogging())
   273  	client.eventHubConsumerGroupClient = chcgc
   274  
   275  	ehnc := eventhub.NewNamespacesClientWithBaseURI(endpoint, c.SubscriptionID)
   276  	setUserAgent(&ehnc.Client)
   277  	ehnc.Authorizer = auth
   278  	ehnc.Sender = autorest.CreateSender(withRequestLogging())
   279  	client.eventHubNamespacesClient = ehnc
   280  
   281  	ifc := network.NewInterfacesClientWithBaseURI(endpoint, c.SubscriptionID)
   282  	setUserAgent(&ifc.Client)
   283  	ifc.Authorizer = auth
   284  	ifc.Sender = autorest.CreateSender(withRequestLogging())
   285  	client.ifaceClient = ifc
   286  
   287  	erc := network.NewExpressRouteCircuitsClientWithBaseURI(endpoint, c.SubscriptionID)
   288  	setUserAgent(&erc.Client)
   289  	erc.Authorizer = auth
   290  	erc.Sender = autorest.CreateSender(withRequestLogging())
   291  	client.expressRouteCircuitClient = erc
   292  
   293  	lbc := network.NewLoadBalancersClientWithBaseURI(endpoint, c.SubscriptionID)
   294  	setUserAgent(&lbc.Client)
   295  	lbc.Authorizer = auth
   296  	lbc.Sender = autorest.CreateSender(withRequestLogging())
   297  	client.loadBalancerClient = lbc
   298  
   299  	lgc := network.NewLocalNetworkGatewaysClientWithBaseURI(endpoint, c.SubscriptionID)
   300  	setUserAgent(&lgc.Client)
   301  	lgc.Authorizer = auth
   302  	lgc.Sender = autorest.CreateSender(withRequestLogging())
   303  	client.localNetConnClient = lgc
   304  
   305  	pipc := network.NewPublicIPAddressesClientWithBaseURI(endpoint, c.SubscriptionID)
   306  	setUserAgent(&pipc.Client)
   307  	pipc.Authorizer = auth
   308  	pipc.Sender = autorest.CreateSender(withRequestLogging())
   309  	client.publicIPClient = pipc
   310  
   311  	sgc := network.NewSecurityGroupsClientWithBaseURI(endpoint, c.SubscriptionID)
   312  	setUserAgent(&sgc.Client)
   313  	sgc.Authorizer = auth
   314  	sgc.Sender = autorest.CreateSender(withRequestLogging())
   315  	client.secGroupClient = sgc
   316  
   317  	src := network.NewSecurityRulesClientWithBaseURI(endpoint, c.SubscriptionID)
   318  	setUserAgent(&src.Client)
   319  	src.Authorizer = auth
   320  	src.Sender = autorest.CreateSender(withRequestLogging())
   321  	client.secRuleClient = src
   322  
   323  	snc := network.NewSubnetsClientWithBaseURI(endpoint, c.SubscriptionID)
   324  	setUserAgent(&snc.Client)
   325  	snc.Authorizer = auth
   326  	snc.Sender = autorest.CreateSender(withRequestLogging())
   327  	client.subnetClient = snc
   328  
   329  	vgcc := network.NewVirtualNetworkGatewayConnectionsClientWithBaseURI(endpoint, c.SubscriptionID)
   330  	setUserAgent(&vgcc.Client)
   331  	vgcc.Authorizer = auth
   332  	vgcc.Sender = autorest.CreateSender(withRequestLogging())
   333  	client.vnetGatewayConnectionsClient = vgcc
   334  
   335  	vgc := network.NewVirtualNetworkGatewaysClientWithBaseURI(endpoint, c.SubscriptionID)
   336  	setUserAgent(&vgc.Client)
   337  	vgc.Authorizer = auth
   338  	vgc.Sender = autorest.CreateSender(withRequestLogging())
   339  	client.vnetGatewayClient = vgc
   340  
   341  	vnc := network.NewVirtualNetworksClientWithBaseURI(endpoint, c.SubscriptionID)
   342  	setUserAgent(&vnc.Client)
   343  	vnc.Authorizer = auth
   344  	vnc.Sender = autorest.CreateSender(withRequestLogging())
   345  	client.vnetClient = vnc
   346  
   347  	vnpc := network.NewVirtualNetworkPeeringsClientWithBaseURI(endpoint, c.SubscriptionID)
   348  	setUserAgent(&vnpc.Client)
   349  	vnpc.Authorizer = auth
   350  	vnpc.Sender = autorest.CreateSender(withRequestLogging())
   351  	client.vnetPeeringsClient = vnpc
   352  
   353  	rtc := network.NewRouteTablesClientWithBaseURI(endpoint, c.SubscriptionID)
   354  	setUserAgent(&rtc.Client)
   355  	rtc.Authorizer = auth
   356  	rtc.Sender = autorest.CreateSender(withRequestLogging())
   357  	client.routeTablesClient = rtc
   358  
   359  	rc := network.NewRoutesClientWithBaseURI(endpoint, c.SubscriptionID)
   360  	setUserAgent(&rc.Client)
   361  	rc.Authorizer = auth
   362  	rc.Sender = autorest.CreateSender(withRequestLogging())
   363  	client.routesClient = rc
   364  
   365  	rgc := resources.NewGroupsClientWithBaseURI(endpoint, c.SubscriptionID)
   366  	setUserAgent(&rgc.Client)
   367  	rgc.Authorizer = auth
   368  	rgc.Sender = autorest.CreateSender(withRequestLogging())
   369  	client.resourceGroupClient = rgc
   370  
   371  	pc := resources.NewProvidersClientWithBaseURI(endpoint, c.SubscriptionID)
   372  	setUserAgent(&pc.Client)
   373  	pc.Authorizer = auth
   374  	pc.Sender = autorest.CreateSender(withRequestLogging())
   375  	client.providers = pc
   376  
   377  	tc := resources.NewTagsClientWithBaseURI(endpoint, c.SubscriptionID)
   378  	setUserAgent(&tc.Client)
   379  	tc.Authorizer = auth
   380  	tc.Sender = autorest.CreateSender(withRequestLogging())
   381  	client.tagsClient = tc
   382  
   383  	rf := resources.NewGroupClientWithBaseURI(endpoint, c.SubscriptionID)
   384  	setUserAgent(&rf.Client)
   385  	rf.Authorizer = auth
   386  	rf.Sender = autorest.CreateSender(withRequestLogging())
   387  	client.resourceFindClient = rf
   388  
   389  	jc := scheduler.NewJobsClientWithBaseURI(endpoint, c.SubscriptionID)
   390  	setUserAgent(&jc.Client)
   391  	jc.Authorizer = auth
   392  	jc.Sender = autorest.CreateSender(withRequestLogging())
   393  	client.jobsClient = jc
   394  
   395  	jcc := scheduler.NewJobCollectionsClientWithBaseURI(endpoint, c.SubscriptionID)
   396  	setUserAgent(&jcc.Client)
   397  	jcc.Authorizer = auth
   398  	jcc.Sender = autorest.CreateSender(withRequestLogging())
   399  	client.jobsCollectionsClient = jcc
   400  
   401  	ssc := storage.NewAccountsClientWithBaseURI(endpoint, c.SubscriptionID)
   402  	setUserAgent(&ssc.Client)
   403  	ssc.Authorizer = auth
   404  	ssc.Sender = autorest.CreateSender(withRequestLogging())
   405  	client.storageServiceClient = ssc
   406  
   407  	suc := storage.NewUsageClientWithBaseURI(endpoint, c.SubscriptionID)
   408  	setUserAgent(&suc.Client)
   409  	suc.Authorizer = auth
   410  	suc.Sender = autorest.CreateSender(withRequestLogging())
   411  	client.storageUsageClient = suc
   412  
   413  	cpc := cdn.NewProfilesClientWithBaseURI(endpoint, c.SubscriptionID)
   414  	setUserAgent(&cpc.Client)
   415  	cpc.Authorizer = auth
   416  	cpc.Sender = autorest.CreateSender(withRequestLogging())
   417  	client.cdnProfilesClient = cpc
   418  
   419  	cec := cdn.NewEndpointsClientWithBaseURI(endpoint, c.SubscriptionID)
   420  	setUserAgent(&cec.Client)
   421  	cec.Authorizer = auth
   422  	cec.Sender = autorest.CreateSender(withRequestLogging())
   423  	client.cdnEndpointsClient = cec
   424  
   425  	dc := resources.NewDeploymentsClientWithBaseURI(endpoint, c.SubscriptionID)
   426  	setUserAgent(&dc.Client)
   427  	dc.Authorizer = auth
   428  	dc.Sender = autorest.CreateSender(withRequestLogging())
   429  	client.deploymentsClient = dc
   430  
   431  	tmpc := trafficmanager.NewProfilesClientWithBaseURI(endpoint, c.SubscriptionID)
   432  	setUserAgent(&tmpc.Client)
   433  	tmpc.Authorizer = auth
   434  	tmpc.Sender = autorest.CreateSender(withRequestLogging())
   435  	client.trafficManagerProfilesClient = tmpc
   436  
   437  	tmec := trafficmanager.NewEndpointsClientWithBaseURI(endpoint, c.SubscriptionID)
   438  	setUserAgent(&tmec.Client)
   439  	tmec.Authorizer = auth
   440  	tmec.Sender = autorest.CreateSender(withRequestLogging())
   441  	client.trafficManagerEndpointsClient = tmec
   442  
   443  	rdc := redis.NewGroupClientWithBaseURI(endpoint, c.SubscriptionID)
   444  	setUserAgent(&rdc.Client)
   445  	rdc.Authorizer = auth
   446  	rdc.Sender = autorest.CreateSender(withRequestLogging())
   447  	client.redisClient = rdc
   448  
   449  	sbnc := servicebus.NewNamespacesClientWithBaseURI(endpoint, c.SubscriptionID)
   450  	setUserAgent(&sbnc.Client)
   451  	sbnc.Authorizer = auth
   452  	sbnc.Sender = autorest.CreateSender(withRequestLogging())
   453  	client.serviceBusNamespacesClient = sbnc
   454  
   455  	sbtc := servicebus.NewTopicsClientWithBaseURI(endpoint, c.SubscriptionID)
   456  	setUserAgent(&sbtc.Client)
   457  	sbtc.Authorizer = auth
   458  	sbtc.Sender = autorest.CreateSender(withRequestLogging())
   459  	client.serviceBusTopicsClient = sbtc
   460  
   461  	sbsc := servicebus.NewSubscriptionsClientWithBaseURI(endpoint, c.SubscriptionID)
   462  	setUserAgent(&sbsc.Client)
   463  	sbsc.Authorizer = auth
   464  	sbsc.Sender = autorest.CreateSender(withRequestLogging())
   465  	client.serviceBusSubscriptionsClient = sbsc
   466  
   467  	kvc := keyvault.NewVaultsClientWithBaseURI(endpoint, c.SubscriptionID)
   468  	setUserAgent(&kvc.Client)
   469  	kvc.Authorizer = auth
   470  	kvc.Sender = autorest.CreateSender(withRequestLogging())
   471  	client.keyVaultClient = kvc
   472  
   473  	sqlepc := sql.NewElasticPoolsClientWithBaseURI(endpoint, c.SubscriptionID)
   474  	setUserAgent(&sqlepc.Client)
   475  	sqlepc.Authorizer = auth
   476  	sqlepc.Sender = autorest.CreateSender(withRequestLogging())
   477  	client.sqlElasticPoolsClient = sqlepc
   478  
   479  	return &client, nil
   480  }
   481  
   482  func (armClient *ArmClient) getKeyForStorageAccount(resourceGroupName, storageAccountName string) (string, bool, error) {
   483  	accountKeys, err := armClient.storageServiceClient.ListKeys(resourceGroupName, storageAccountName)
   484  	if accountKeys.StatusCode == http.StatusNotFound {
   485  		return "", false, nil
   486  	}
   487  	if err != nil {
   488  		// We assume this is a transient error rather than a 404 (which is caught above),  so assume the
   489  		// account still exists.
   490  		return "", true, fmt.Errorf("Error retrieving keys for storage account %q: %s", storageAccountName, err)
   491  	}
   492  
   493  	if accountKeys.Keys == nil {
   494  		return "", false, fmt.Errorf("Nil key returned for storage account %q", storageAccountName)
   495  	}
   496  
   497  	keys := *accountKeys.Keys
   498  	return *keys[0].Value, true, nil
   499  }
   500  
   501  func (armClient *ArmClient) getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.BlobStorageClient, bool, error) {
   502  	key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   503  	if err != nil {
   504  		return nil, accountExists, err
   505  	}
   506  	if accountExists == false {
   507  		return nil, false, nil
   508  	}
   509  
   510  	storageClient, err := mainStorage.NewClient(storageAccountName, key, armClient.environment.StorageEndpointSuffix,
   511  		mainStorage.DefaultAPIVersion, true)
   512  	if err != nil {
   513  		return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   514  	}
   515  
   516  	blobClient := storageClient.GetBlobService()
   517  	return &blobClient, true, nil
   518  }
   519  
   520  func (armClient *ArmClient) getFileServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.FileServiceClient, bool, error) {
   521  	key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   522  	if err != nil {
   523  		return nil, accountExists, err
   524  	}
   525  	if accountExists == false {
   526  		return nil, false, nil
   527  	}
   528  
   529  	storageClient, err := mainStorage.NewClient(storageAccountName, key, armClient.environment.StorageEndpointSuffix,
   530  		mainStorage.DefaultAPIVersion, true)
   531  	if err != nil {
   532  		return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   533  	}
   534  
   535  	fileClient := storageClient.GetFileService()
   536  	return &fileClient, true, nil
   537  }
   538  
   539  func (armClient *ArmClient) getTableServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.TableServiceClient, bool, error) {
   540  	key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   541  	if err != nil {
   542  		return nil, accountExists, err
   543  	}
   544  	if accountExists == false {
   545  		return nil, false, nil
   546  	}
   547  
   548  	storageClient, err := mainStorage.NewClient(storageAccountName, key, armClient.environment.StorageEndpointSuffix,
   549  		mainStorage.DefaultAPIVersion, true)
   550  	if err != nil {
   551  		return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   552  	}
   553  
   554  	tableClient := storageClient.GetTableService()
   555  	return &tableClient, true, nil
   556  }
   557  
   558  func (armClient *ArmClient) getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.QueueServiceClient, bool, error) {
   559  	key, accountExists, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   560  	if err != nil {
   561  		return nil, accountExists, err
   562  	}
   563  	if accountExists == false {
   564  		return nil, false, nil
   565  	}
   566  
   567  	storageClient, err := mainStorage.NewClient(storageAccountName, key, armClient.environment.StorageEndpointSuffix,
   568  		mainStorage.DefaultAPIVersion, true)
   569  	if err != nil {
   570  		return nil, true, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   571  	}
   572  
   573  	queueClient := storageClient.GetQueueService()
   574  	return &queueClient, true, nil
   575  }