github.com/jsoriano/terraform@v0.6.7-0.20151026070445-8b70867fdd95/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, err
   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  }