github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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 osImageClient osimage.OSImageClient 39 40 sqlClient sql.SQLDatabaseClient 41 42 storageServiceClient storageservice.StorageServiceClient 43 44 vmClient virtualmachine.VirtualMachineClient 45 46 vmDiskClient virtualmachinedisk.DiskClient 47 48 vmImageClient virtualmachineimage.Client 49 50 // unfortunately; because of how Azure's network API works; doing networking operations 51 // concurrently is very hazardous, and we need a mutex to guard the VirtualNetworkClient. 52 vnetClient virtualnetwork.VirtualNetworkClient 53 vnetMutex *sync.Mutex 54 55 // same as the above for security group rule operations: 56 secGroupClient networksecuritygroup.SecurityGroupClient 57 secGroupMutex *sync.Mutex 58 } 59 60 // getStorageClientForStorageService is helper method which returns the 61 // storage.Client associated to the given storage service name. 62 func (c Client) getStorageClientForStorageService(serviceName string) (storage.Client, error) { 63 var storageClient storage.Client 64 65 keys, err := c.storageServiceClient.GetStorageServiceKeys(serviceName) 66 if err != nil { 67 return storageClient, fmt.Errorf("Failed getting Storage Service keys for %s: %s", serviceName, err) 68 } 69 70 storageClient, err = storage.NewBasicClient(serviceName, keys.PrimaryKey) 71 if err != nil { 72 return storageClient, fmt.Errorf("Failed creating Storage Service client for %s: %s", serviceName, err) 73 } 74 75 return storageClient, err 76 } 77 78 // getStorageServiceBlobClient is a helper method which returns the 79 // storage.BlobStorageClient associated to the given storage service name. 80 func (c Client) getStorageServiceBlobClient(serviceName string) (storage.BlobStorageClient, error) { 81 storageClient, err := c.getStorageClientForStorageService(serviceName) 82 if err != nil { 83 return storage.BlobStorageClient{}, err 84 } 85 86 return storageClient.GetBlobService(), nil 87 } 88 89 // getStorageServiceQueueClient is a helper method which returns the 90 // storage.QueueServiceClient associated to the given storage service name. 91 func (c Client) getStorageServiceQueueClient(serviceName string) (storage.QueueServiceClient, error) { 92 storageClient, err := c.getStorageClientForStorageService(serviceName) 93 if err != nil { 94 return storage.QueueServiceClient{}, err 95 } 96 97 return storageClient.GetQueueService(), err 98 } 99 100 func (c *Config) NewClientFromSettingsData() (*Client, error) { 101 mc, err := management.ClientFromPublishSettingsData(c.Settings, c.SubscriptionID) 102 if err != nil { 103 return nil, err 104 } 105 106 return &Client{ 107 mgmtClient: mc, 108 affinityGroupClient: affinitygroup.NewClient(mc), 109 hostedServiceClient: hostedservice.NewClient(mc), 110 secGroupClient: networksecuritygroup.NewClient(mc), 111 secGroupMutex: &sync.Mutex{}, 112 osImageClient: osimage.NewClient(mc), 113 sqlClient: sql.NewClient(mc), 114 storageServiceClient: storageservice.NewClient(mc), 115 vmClient: virtualmachine.NewClient(mc), 116 vmDiskClient: virtualmachinedisk.NewClient(mc), 117 vmImageClient: virtualmachineimage.NewClient(mc), 118 vnetClient: virtualnetwork.NewClient(mc), 119 vnetMutex: &sync.Mutex{}, 120 }, nil 121 } 122 123 // NewClient returns a new Azure management client created 124 // using a subscription ID and certificate. 125 func (c *Config) NewClient() (*Client, error) { 126 mc, err := management.NewClient(c.SubscriptionID, c.Certificate) 127 if err != nil { 128 return nil, nil 129 } 130 131 return &Client{ 132 mgmtClient: mc, 133 affinityGroupClient: affinitygroup.NewClient(mc), 134 hostedServiceClient: hostedservice.NewClient(mc), 135 secGroupClient: networksecuritygroup.NewClient(mc), 136 secGroupMutex: &sync.Mutex{}, 137 osImageClient: osimage.NewClient(mc), 138 sqlClient: sql.NewClient(mc), 139 storageServiceClient: storageservice.NewClient(mc), 140 vmClient: virtualmachine.NewClient(mc), 141 vmDiskClient: virtualmachinedisk.NewClient(mc), 142 vmImageClient: virtualmachineimage.NewClient(mc), 143 vnetClient: virtualnetwork.NewClient(mc), 144 vnetMutex: &sync.Mutex{}, 145 }, nil 146 }