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