github.com/anuaimi/terraform@v0.6.4-0.20150904235404-2bf9aec61da8/builtin/providers/azure/config.go (about) 1 package azure 2 3 import ( 4 "fmt" 5 "sync" 6 7 "github.com/Azure/azure-sdk-for-go/management" 8 "github.com/Azure/azure-sdk-for-go/management/affinitygroup" 9 "github.com/Azure/azure-sdk-for-go/management/hostedservice" 10 "github.com/Azure/azure-sdk-for-go/management/networksecuritygroup" 11 "github.com/Azure/azure-sdk-for-go/management/osimage" 12 "github.com/Azure/azure-sdk-for-go/management/sql" 13 "github.com/Azure/azure-sdk-for-go/management/storageservice" 14 "github.com/Azure/azure-sdk-for-go/management/virtualmachine" 15 "github.com/Azure/azure-sdk-for-go/management/virtualmachinedisk" 16 "github.com/Azure/azure-sdk-for-go/management/virtualmachineimage" 17 "github.com/Azure/azure-sdk-for-go/management/virtualnetwork" 18 "github.com/Azure/azure-sdk-for-go/storage" 19 ) 20 21 // Config is the configuration structure used to instantiate a 22 // new Azure management client. 23 type Config struct { 24 Settings []byte 25 SubscriptionID string 26 Certificate []byte 27 ManagementURL string 28 } 29 30 // Client contains all the handles required for managing Azure services. 31 type Client struct { 32 mgmtClient management.Client 33 34 affinityGroupClient affinitygroup.AffinityGroupClient 35 36 hostedServiceClient hostedservice.HostedServiceClient 37 38 secGroupClient networksecuritygroup.SecurityGroupClient 39 40 osImageClient osimage.OSImageClient 41 42 sqlClient sql.SQLDatabaseClient 43 44 storageServiceClient storageservice.StorageServiceClient 45 46 vmClient virtualmachine.VirtualMachineClient 47 48 vmDiskClient virtualmachinedisk.DiskClient 49 50 vmImageClient virtualmachineimage.Client 51 52 // unfortunately; because of how Azure's network API works; doing networking operations 53 // concurrently is very hazardous, and we need a mutex to guard the VirtualNetworkClient. 54 vnetClient virtualnetwork.VirtualNetworkClient 55 mutex *sync.Mutex 56 } 57 58 // getStorageClientForStorageService is helper method which returns the 59 // storage.Client associated to the given storage service name. 60 func (c Client) getStorageClientForStorageService(serviceName string) (storage.Client, error) { 61 var storageClient storage.Client 62 63 keys, err := c.storageServiceClient.GetStorageServiceKeys(serviceName) 64 if err != nil { 65 return storageClient, fmt.Errorf("Failed getting Storage Service keys for %s: %s", serviceName, err) 66 } 67 68 storageClient, err = storage.NewBasicClient(serviceName, keys.PrimaryKey) 69 if err != nil { 70 return storageClient, fmt.Errorf("Failed creating Storage Service client for %s: %s", serviceName, err) 71 } 72 73 return storageClient, err 74 } 75 76 // getStorageServiceBlobClient is a helper method which returns the 77 // storage.BlobStorageClient associated to the given storage service name. 78 func (c Client) getStorageServiceBlobClient(serviceName string) (storage.BlobStorageClient, error) { 79 storageClient, err := c.getStorageClientForStorageService(serviceName) 80 if err != nil { 81 return storage.BlobStorageClient{}, err 82 } 83 84 return storageClient.GetBlobService(), nil 85 } 86 87 // getStorageServiceQueueClient is a helper method which returns the 88 // storage.QueueServiceClient associated to the given storage service name. 89 func (c Client) getStorageServiceQueueClient(serviceName string) (storage.QueueServiceClient, error) { 90 storageClient, err := c.getStorageClientForStorageService(serviceName) 91 if err != nil { 92 return storage.QueueServiceClient{}, err 93 } 94 95 return storageClient.GetQueueService(), err 96 } 97 98 func (c *Config) NewClientFromSettingsData() (*Client, error) { 99 mc, err := management.ClientFromPublishSettingsData(c.Settings, c.SubscriptionID) 100 if err != nil { 101 return nil, nil 102 } 103 104 return &Client{ 105 mgmtClient: mc, 106 affinityGroupClient: affinitygroup.NewClient(mc), 107 hostedServiceClient: hostedservice.NewClient(mc), 108 secGroupClient: networksecuritygroup.NewClient(mc), 109 osImageClient: osimage.NewClient(mc), 110 sqlClient: sql.NewClient(mc), 111 storageServiceClient: storageservice.NewClient(mc), 112 vmClient: virtualmachine.NewClient(mc), 113 vmDiskClient: virtualmachinedisk.NewClient(mc), 114 vmImageClient: virtualmachineimage.NewClient(mc), 115 vnetClient: virtualnetwork.NewClient(mc), 116 mutex: &sync.Mutex{}, 117 }, nil 118 } 119 120 // NewClient returns a new Azure management client created 121 // using a subscription ID and certificate. 122 func (c *Config) NewClient() (*Client, error) { 123 mc, err := management.NewClient(c.SubscriptionID, c.Certificate) 124 if err != nil { 125 return nil, nil 126 } 127 128 return &Client{ 129 mgmtClient: mc, 130 affinityGroupClient: affinitygroup.NewClient(mc), 131 hostedServiceClient: hostedservice.NewClient(mc), 132 secGroupClient: networksecuritygroup.NewClient(mc), 133 osImageClient: osimage.NewClient(mc), 134 sqlClient: sql.NewClient(mc), 135 storageServiceClient: storageservice.NewClient(mc), 136 vmClient: virtualmachine.NewClient(mc), 137 vmDiskClient: virtualmachinedisk.NewClient(mc), 138 vmImageClient: virtualmachineimage.NewClient(mc), 139 vnetClient: virtualnetwork.NewClient(mc), 140 mutex: &sync.Mutex{}, 141 }, nil 142 }