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 }