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  }