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