github.com/hobbeswalsh/terraform@v0.3.7-0.20150619183303-ad17cf55a0fa/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/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 SettingsFile string 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 hostedServiceClient hostedservice.HostedServiceClient 35 36 secGroupClient networksecuritygroup.SecurityGroupClient 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 mutex *sync.Mutex 54 } 55 56 // getStorageClientForStorageService is helper method which returns the 57 // storage.Client associated to the given storage service name. 58 func (c Client) getStorageClientForStorageService(serviceName string) (storage.Client, error) { 59 var storageClient storage.Client 60 61 keys, err := c.storageServiceClient.GetStorageServiceKeys(serviceName) 62 if err != nil { 63 return storageClient, fmt.Errorf("Failed getting Storage Service keys for %s: %s", serviceName, err) 64 } 65 66 storageClient, err = storage.NewBasicClient(serviceName, keys.PrimaryKey) 67 if err != nil { 68 return storageClient, fmt.Errorf("Failed creating Storage Service client for %s: %s", serviceName, err) 69 } 70 71 return storageClient, err 72 } 73 74 // getStorageServiceBlobClient is a helper method which returns the 75 // storage.BlobStorageClient associated to the given storage service name. 76 func (c Client) getStorageServiceBlobClient(serviceName string) (storage.BlobStorageClient, error) { 77 storageClient, err := c.getStorageClientForStorageService(serviceName) 78 if err != nil { 79 return storage.BlobStorageClient{}, err 80 } 81 82 return storageClient.GetBlobService(), nil 83 } 84 85 // getStorageServiceQueueClient is a helper method which returns the 86 // storage.QueueServiceClient associated to the given storage service name. 87 func (c Client) getStorageServiceQueueClient(serviceName string) (storage.QueueServiceClient, error) { 88 storageClient, err := c.getStorageClientForStorageService(serviceName) 89 if err != nil { 90 return storage.QueueServiceClient{}, err 91 } 92 93 return storageClient.GetQueueService(), err 94 } 95 96 // NewClientFromSettingsFile returns a new Azure management 97 // client created using a publish settings file. 98 func (c *Config) NewClientFromSettingsFile() (*Client, error) { 99 if _, err := os.Stat(c.SettingsFile); os.IsNotExist(err) { 100 return nil, fmt.Errorf("Publish Settings file %q does not exist!", c.SettingsFile) 101 } 102 103 mc, err := management.ClientFromPublishSettingsFile(c.SettingsFile, c.SubscriptionID) 104 if err != nil { 105 return nil, nil 106 } 107 108 return &Client{ 109 mgmtClient: mc, 110 hostedServiceClient: hostedservice.NewClient(mc), 111 secGroupClient: networksecuritygroup.NewClient(mc), 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 mutex: &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 hostedServiceClient: hostedservice.NewClient(mc), 134 secGroupClient: networksecuritygroup.NewClient(mc), 135 osImageClient: osimage.NewClient(mc), 136 sqlClient: sql.NewClient(mc), 137 storageServiceClient: storageservice.NewClient(mc), 138 vmClient: virtualmachine.NewClient(mc), 139 vmDiskClient: virtualmachinedisk.NewClient(mc), 140 vmImageClient: virtualmachineimage.NewClient(mc), 141 vnetClient: virtualnetwork.NewClient(mc), 142 mutex: &sync.Mutex{}, 143 }, nil 144 }