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 }