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