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