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