github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/builtin/providers/azurerm/config.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"time"
     8  
     9  	"github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest"
    10  	"github.com/Azure/azure-sdk-for-go/Godeps/_workspace/src/github.com/Azure/go-autorest/autorest/azure"
    11  	"github.com/Azure/azure-sdk-for-go/arm/cdn"
    12  	"github.com/Azure/azure-sdk-for-go/arm/compute"
    13  	"github.com/Azure/azure-sdk-for-go/arm/network"
    14  	"github.com/Azure/azure-sdk-for-go/arm/resources/resources"
    15  	"github.com/Azure/azure-sdk-for-go/arm/scheduler"
    16  	"github.com/Azure/azure-sdk-for-go/arm/storage"
    17  	mainStorage "github.com/Azure/azure-sdk-for-go/storage"
    18  	"github.com/hashicorp/terraform/terraform"
    19  )
    20  
    21  // ArmClient contains the handles to all the specific Azure Resource Manager
    22  // resource classes' respective clients.
    23  type ArmClient struct {
    24  	availSetClient         compute.AvailabilitySetsClient
    25  	usageOpsClient         compute.UsageOperationsClient
    26  	vmExtensionImageClient compute.VirtualMachineExtensionImagesClient
    27  	vmExtensionClient      compute.VirtualMachineExtensionsClient
    28  	vmImageClient          compute.VirtualMachineImagesClient
    29  	vmClient               compute.VirtualMachinesClient
    30  
    31  	appGatewayClient             network.ApplicationGatewaysClient
    32  	ifaceClient                  network.InterfacesClient
    33  	loadBalancerClient           network.LoadBalancersClient
    34  	localNetConnClient           network.LocalNetworkGatewaysClient
    35  	publicIPClient               network.PublicIPAddressesClient
    36  	secGroupClient               network.SecurityGroupsClient
    37  	secRuleClient                network.SecurityRulesClient
    38  	subnetClient                 network.SubnetsClient
    39  	netUsageClient               network.UsagesClient
    40  	vnetGatewayConnectionsClient network.VirtualNetworkGatewayConnectionsClient
    41  	vnetGatewayClient            network.VirtualNetworkGatewaysClient
    42  	vnetClient                   network.VirtualNetworksClient
    43  	routeTablesClient            network.RouteTablesClient
    44  	routesClient                 network.RoutesClient
    45  
    46  	cdnProfilesClient  cdn.ProfilesClient
    47  	cdnEndpointsClient cdn.EndpointsClient
    48  
    49  	providers           resources.ProvidersClient
    50  	resourceGroupClient resources.GroupsClient
    51  	tagsClient          resources.TagsClient
    52  
    53  	jobsClient            scheduler.JobsClient
    54  	jobsCollectionsClient scheduler.JobCollectionsClient
    55  
    56  	storageServiceClient storage.AccountsClient
    57  	storageUsageClient   storage.UsageOperationsClient
    58  }
    59  
    60  func withRequestLogging() autorest.SendDecorator {
    61  	return func(s autorest.Sender) autorest.Sender {
    62  		return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
    63  			log.Printf("[DEBUG] Sending Azure RM Request %q to %q\n", r.Method, r.URL)
    64  			resp, err := s.Do(r)
    65  			if resp != nil {
    66  				log.Printf("[DEBUG] Received Azure RM Request status code %s for %s\n", resp.Status, r.URL)
    67  			} else {
    68  				log.Printf("[DEBUG] Request to %s completed with no response", r.URL)
    69  			}
    70  			return resp, err
    71  		})
    72  	}
    73  }
    74  
    75  func withPollWatcher() autorest.SendDecorator {
    76  	return func(s autorest.Sender) autorest.Sender {
    77  		return autorest.SenderFunc(func(r *http.Request) (*http.Response, error) {
    78  			fmt.Printf("[DEBUG] Sending Azure RM Request %q to %q\n", r.Method, r.URL)
    79  			resp, err := s.Do(r)
    80  			fmt.Printf("[DEBUG] Received Azure RM Request status code %s for %s\n", resp.Status, r.URL)
    81  			if autorest.ResponseRequiresPolling(resp) {
    82  				fmt.Printf("[DEBUG] Azure RM request will poll %s after %d seconds\n",
    83  					autorest.GetPollingLocation(resp),
    84  					int(autorest.GetPollingDelay(resp, time.Duration(0))/time.Second))
    85  			}
    86  			return resp, err
    87  		})
    88  	}
    89  }
    90  
    91  func setUserAgent(client *autorest.Client) {
    92  	var version string
    93  	if terraform.VersionPrerelease != "" {
    94  		version = fmt.Sprintf("%s-%s", terraform.Version, terraform.VersionPrerelease)
    95  	} else {
    96  		version = terraform.Version
    97  	}
    98  
    99  	client.UserAgent = fmt.Sprintf("HashiCorp-Terraform-v%s", version)
   100  }
   101  
   102  // getArmClient is a helper method which returns a fully instantiated
   103  // *ArmClient based on the Config's current settings.
   104  func (c *Config) getArmClient() (*ArmClient, error) {
   105  	spt, err := azure.NewServicePrincipalToken(c.ClientID, c.ClientSecret, c.TenantID, azure.AzureResourceManagerScope)
   106  	if err != nil {
   107  		return nil, err
   108  	}
   109  
   110  	// client declarations:
   111  	client := ArmClient{}
   112  
   113  	// NOTE: these declarations should be left separate for clarity should the
   114  	// clients be wished to be configured with custom Responders/PollingModess etc...
   115  	asc := compute.NewAvailabilitySetsClient(c.SubscriptionID)
   116  	setUserAgent(&asc.Client)
   117  	asc.Authorizer = spt
   118  	asc.Sender = autorest.CreateSender(withRequestLogging())
   119  	client.availSetClient = asc
   120  
   121  	uoc := compute.NewUsageOperationsClient(c.SubscriptionID)
   122  	setUserAgent(&uoc.Client)
   123  	uoc.Authorizer = spt
   124  	uoc.Sender = autorest.CreateSender(withRequestLogging())
   125  	client.usageOpsClient = uoc
   126  
   127  	vmeic := compute.NewVirtualMachineExtensionImagesClient(c.SubscriptionID)
   128  	setUserAgent(&vmeic.Client)
   129  	vmeic.Authorizer = spt
   130  	vmeic.Sender = autorest.CreateSender(withRequestLogging())
   131  	client.vmExtensionImageClient = vmeic
   132  
   133  	vmec := compute.NewVirtualMachineExtensionsClient(c.SubscriptionID)
   134  	setUserAgent(&vmec.Client)
   135  	vmec.Authorizer = spt
   136  	vmec.Sender = autorest.CreateSender(withRequestLogging())
   137  	client.vmExtensionClient = vmec
   138  
   139  	vmic := compute.NewVirtualMachineImagesClient(c.SubscriptionID)
   140  	setUserAgent(&vmic.Client)
   141  	vmic.Authorizer = spt
   142  	vmic.Sender = autorest.CreateSender(withRequestLogging())
   143  	client.vmImageClient = vmic
   144  
   145  	vmc := compute.NewVirtualMachinesClient(c.SubscriptionID)
   146  	setUserAgent(&vmc.Client)
   147  	vmc.Authorizer = spt
   148  	vmc.Sender = autorest.CreateSender(withRequestLogging())
   149  	client.vmClient = vmc
   150  
   151  	agc := network.NewApplicationGatewaysClient(c.SubscriptionID)
   152  	setUserAgent(&agc.Client)
   153  	agc.Authorizer = spt
   154  	agc.Sender = autorest.CreateSender(withRequestLogging())
   155  	client.appGatewayClient = agc
   156  
   157  	ifc := network.NewInterfacesClient(c.SubscriptionID)
   158  	setUserAgent(&ifc.Client)
   159  	ifc.Authorizer = spt
   160  	ifc.Sender = autorest.CreateSender(withRequestLogging())
   161  	client.ifaceClient = ifc
   162  
   163  	lbc := network.NewLoadBalancersClient(c.SubscriptionID)
   164  	setUserAgent(&lbc.Client)
   165  	lbc.Authorizer = spt
   166  	lbc.Sender = autorest.CreateSender(withRequestLogging())
   167  	client.loadBalancerClient = lbc
   168  
   169  	lgc := network.NewLocalNetworkGatewaysClient(c.SubscriptionID)
   170  	setUserAgent(&lgc.Client)
   171  	lgc.Authorizer = spt
   172  	lgc.Sender = autorest.CreateSender(withRequestLogging())
   173  	client.localNetConnClient = lgc
   174  
   175  	pipc := network.NewPublicIPAddressesClient(c.SubscriptionID)
   176  	setUserAgent(&pipc.Client)
   177  	pipc.Authorizer = spt
   178  	pipc.Sender = autorest.CreateSender(withRequestLogging())
   179  	client.publicIPClient = pipc
   180  
   181  	sgc := network.NewSecurityGroupsClient(c.SubscriptionID)
   182  	setUserAgent(&sgc.Client)
   183  	sgc.Authorizer = spt
   184  	sgc.Sender = autorest.CreateSender(withRequestLogging())
   185  	client.secGroupClient = sgc
   186  
   187  	src := network.NewSecurityRulesClient(c.SubscriptionID)
   188  	setUserAgent(&src.Client)
   189  	src.Authorizer = spt
   190  	src.Sender = autorest.CreateSender(withRequestLogging())
   191  	client.secRuleClient = src
   192  
   193  	snc := network.NewSubnetsClient(c.SubscriptionID)
   194  	setUserAgent(&snc.Client)
   195  	snc.Authorizer = spt
   196  	snc.Sender = autorest.CreateSender(withRequestLogging())
   197  	client.subnetClient = snc
   198  
   199  	vgcc := network.NewVirtualNetworkGatewayConnectionsClient(c.SubscriptionID)
   200  	setUserAgent(&vgcc.Client)
   201  	vgcc.Authorizer = spt
   202  	vgcc.Sender = autorest.CreateSender(withRequestLogging())
   203  	client.vnetGatewayConnectionsClient = vgcc
   204  
   205  	vgc := network.NewVirtualNetworkGatewaysClient(c.SubscriptionID)
   206  	setUserAgent(&vgc.Client)
   207  	vgc.Authorizer = spt
   208  	vgc.Sender = autorest.CreateSender(withRequestLogging())
   209  	client.vnetGatewayClient = vgc
   210  
   211  	vnc := network.NewVirtualNetworksClient(c.SubscriptionID)
   212  	setUserAgent(&vnc.Client)
   213  	vnc.Authorizer = spt
   214  	vnc.Sender = autorest.CreateSender(withRequestLogging())
   215  	client.vnetClient = vnc
   216  
   217  	rtc := network.NewRouteTablesClient(c.SubscriptionID)
   218  	setUserAgent(&rtc.Client)
   219  	rtc.Authorizer = spt
   220  	rtc.Sender = autorest.CreateSender(withRequestLogging())
   221  	client.routeTablesClient = rtc
   222  
   223  	rc := network.NewRoutesClient(c.SubscriptionID)
   224  	setUserAgent(&rc.Client)
   225  	rc.Authorizer = spt
   226  	rc.Sender = autorest.CreateSender(withRequestLogging())
   227  	client.routesClient = rc
   228  
   229  	rgc := resources.NewGroupsClient(c.SubscriptionID)
   230  	setUserAgent(&rgc.Client)
   231  	rgc.Authorizer = spt
   232  	rgc.Sender = autorest.CreateSender(withRequestLogging())
   233  	client.resourceGroupClient = rgc
   234  
   235  	pc := resources.NewProvidersClient(c.SubscriptionID)
   236  	setUserAgent(&pc.Client)
   237  	pc.Authorizer = spt
   238  	pc.Sender = autorest.CreateSender(withRequestLogging())
   239  	client.providers = pc
   240  
   241  	tc := resources.NewTagsClient(c.SubscriptionID)
   242  	setUserAgent(&tc.Client)
   243  	tc.Authorizer = spt
   244  	tc.Sender = autorest.CreateSender(withRequestLogging())
   245  	client.tagsClient = tc
   246  
   247  	jc := scheduler.NewJobsClient(c.SubscriptionID)
   248  	setUserAgent(&jc.Client)
   249  	jc.Authorizer = spt
   250  	jc.Sender = autorest.CreateSender(withRequestLogging())
   251  	client.jobsClient = jc
   252  
   253  	jcc := scheduler.NewJobCollectionsClient(c.SubscriptionID)
   254  	setUserAgent(&jcc.Client)
   255  	jcc.Authorizer = spt
   256  	jcc.Sender = autorest.CreateSender(withRequestLogging())
   257  	client.jobsCollectionsClient = jcc
   258  
   259  	ssc := storage.NewAccountsClient(c.SubscriptionID)
   260  	setUserAgent(&ssc.Client)
   261  	ssc.Authorizer = spt
   262  	ssc.Sender = autorest.CreateSender(withRequestLogging(), withPollWatcher())
   263  	client.storageServiceClient = ssc
   264  
   265  	suc := storage.NewUsageOperationsClient(c.SubscriptionID)
   266  	setUserAgent(&suc.Client)
   267  	suc.Authorizer = spt
   268  	suc.Sender = autorest.CreateSender(withRequestLogging())
   269  	client.storageUsageClient = suc
   270  
   271  	cpc := cdn.NewProfilesClient(c.SubscriptionID)
   272  	setUserAgent(&cpc.Client)
   273  	cpc.Authorizer = spt
   274  	cpc.Sender = autorest.CreateSender(withRequestLogging())
   275  	client.cdnProfilesClient = cpc
   276  
   277  	cec := cdn.NewEndpointsClient(c.SubscriptionID)
   278  	setUserAgent(&cec.Client)
   279  	cec.Authorizer = spt
   280  	cec.Sender = autorest.CreateSender(withRequestLogging())
   281  	client.cdnEndpointsClient = cec
   282  
   283  	return &client, nil
   284  }
   285  
   286  func (armClient *ArmClient) getKeyForStorageAccount(resourceGroupName, storageAccountName string) (string, error) {
   287  	keys, err := armClient.storageServiceClient.ListKeys(resourceGroupName, storageAccountName)
   288  	if err != nil {
   289  		return "", fmt.Errorf("Error retrieving keys for storage account %q: %s", storageAccountName, err)
   290  	}
   291  
   292  	if keys.Key1 == nil {
   293  		return "", fmt.Errorf("Nil key returned for storage account %q", storageAccountName)
   294  	}
   295  
   296  	return *keys.Key1, nil
   297  }
   298  
   299  func (armClient *ArmClient) getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.BlobStorageClient, error) {
   300  	key, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   301  	if err != nil {
   302  		return nil, err
   303  	}
   304  
   305  	storageClient, err := mainStorage.NewBasicClient(storageAccountName, key)
   306  	if err != nil {
   307  		return nil, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   308  	}
   309  
   310  	blobClient := storageClient.GetBlobService()
   311  	return &blobClient, nil
   312  }
   313  func (armClient *ArmClient) getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName string) (*mainStorage.QueueServiceClient, error) {
   314  	key, err := armClient.getKeyForStorageAccount(resourceGroupName, storageAccountName)
   315  	if err != nil {
   316  		return nil, err
   317  	}
   318  
   319  	storageClient, err := mainStorage.NewBasicClient(storageAccountName, key)
   320  	if err != nil {
   321  		return nil, fmt.Errorf("Error creating storage client for storage account %q: %s", storageAccountName, err)
   322  	}
   323  
   324  	queueClient := storageClient.GetQueueService()
   325  	return &queueClient, nil
   326  }