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