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 }