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  }