github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/azure/resource_azure_storage_service.go (about)

     1  package azure
     2  
     3  import (
     4  	"encoding/base64"
     5  	"fmt"
     6  	"log"
     7  
     8  	"github.com/Azure/azure-sdk-for-go/management"
     9  	"github.com/Azure/azure-sdk-for-go/management/storageservice"
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  // resourceAzureStorageService returns the *schema.Resource associated
    14  // to an Azure hosted service.
    15  func resourceAzureStorageService() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceAzureStorageServiceCreate,
    18  		Read:   resourceAzureStorageServiceRead,
    19  		Exists: resourceAzureStorageServiceExists,
    20  		Delete: resourceAzureStorageServiceDelete,
    21  
    22  		Schema: map[string]*schema.Schema{
    23  			// General attributes:
    24  			"name": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  				// TODO(aznashwan): constrain name in description
    29  				Description: parameterDescriptions["name"],
    30  			},
    31  			"location": &schema.Schema{
    32  				Type:        schema.TypeString,
    33  				Required:    true,
    34  				ForceNew:    true,
    35  				Description: parameterDescriptions["location"],
    36  			},
    37  			"label": &schema.Schema{
    38  				Type:        schema.TypeString,
    39  				Optional:    true,
    40  				ForceNew:    true,
    41  				Default:     "Made by Terraform.",
    42  				Description: parameterDescriptions["label"],
    43  			},
    44  			"description": &schema.Schema{
    45  				Type:        schema.TypeString,
    46  				Optional:    true,
    47  				ForceNew:    true,
    48  				Description: parameterDescriptions["description"],
    49  			},
    50  			// Functional attributes:
    51  			"account_type": &schema.Schema{
    52  				Type:        schema.TypeString,
    53  				Required:    true,
    54  				ForceNew:    true,
    55  				Description: parameterDescriptions["account_type"],
    56  			},
    57  			"affinity_group": &schema.Schema{
    58  				Type:        schema.TypeString,
    59  				Optional:    true,
    60  				ForceNew:    true,
    61  				Description: parameterDescriptions["affinity_group"],
    62  			},
    63  			"properties": &schema.Schema{
    64  				Type:     schema.TypeMap,
    65  				Optional: true,
    66  				ForceNew: true,
    67  				Elem:     schema.TypeString,
    68  			},
    69  			// Computed attributes:
    70  			"url": &schema.Schema{
    71  				Type:     schema.TypeString,
    72  				Computed: true,
    73  			},
    74  			"primary_key": &schema.Schema{
    75  				Type:     schema.TypeString,
    76  				Computed: true,
    77  			},
    78  			"secondary_key": &schema.Schema{
    79  				Type:     schema.TypeString,
    80  				Computed: true,
    81  			},
    82  		},
    83  	}
    84  }
    85  
    86  // resourceAzureStorageServiceCreate does all the necessary API calls to
    87  // create a new Azure storage service.
    88  func resourceAzureStorageServiceCreate(d *schema.ResourceData, meta interface{}) error {
    89  	azureClient := meta.(*Client)
    90  	mgmtClient := azureClient.mgmtClient
    91  	storageServiceClient := azureClient.storageServiceClient
    92  
    93  	// get all the values:
    94  	log.Println("[INFO] Creating Azure Storage Service creation parameters.")
    95  	name := d.Get("name").(string)
    96  	location := d.Get("location").(string)
    97  	accountType := storageservice.AccountType(d.Get("account_type").(string))
    98  	affinityGroup := d.Get("affinity_group").(string)
    99  	description := d.Get("description").(string)
   100  	label := base64.StdEncoding.EncodeToString([]byte(d.Get("label").(string)))
   101  	var props []storageservice.ExtendedProperty
   102  	if given := d.Get("properties").(map[string]interface{}); len(given) > 0 {
   103  		props = []storageservice.ExtendedProperty{}
   104  		for k, v := range given {
   105  			props = append(props, storageservice.ExtendedProperty{
   106  				Name:  k,
   107  				Value: v.(string),
   108  			})
   109  		}
   110  	}
   111  
   112  	// create parameters and send request:
   113  	log.Println("[INFO] Sending Storage Service creation request to Azure.")
   114  	reqID, err := storageServiceClient.CreateStorageService(
   115  		storageservice.StorageAccountCreateParameters{
   116  			ServiceName:   name,
   117  			Location:      location,
   118  			Description:   description,
   119  			Label:         label,
   120  			AffinityGroup: affinityGroup,
   121  			AccountType:   accountType,
   122  			ExtendedProperties: storageservice.ExtendedPropertyList{
   123  				ExtendedProperty: props,
   124  			},
   125  		})
   126  	if err != nil {
   127  		return fmt.Errorf("Failed to create Azure storage service %s: %s", name, err)
   128  	}
   129  	err = mgmtClient.WaitForOperation(reqID, nil)
   130  	if err != nil {
   131  		return fmt.Errorf("Failed creating storage service %s: %s", name, err)
   132  	}
   133  
   134  	d.SetId(name)
   135  	return resourceAzureStorageServiceRead(d, meta)
   136  }
   137  
   138  // resourceAzureStorageServiceRead does all the necessary API calls to
   139  // read the state of the storage service off Azure.
   140  func resourceAzureStorageServiceRead(d *schema.ResourceData, meta interface{}) error {
   141  	storageServiceClient := meta.(*Client).storageServiceClient
   142  
   143  	// get our storage service:
   144  	log.Println("[INFO] Sending query about storage service to Azure.")
   145  	name := d.Get("name").(string)
   146  	storsvc, err := storageServiceClient.GetStorageService(name)
   147  	if err != nil {
   148  		if !management.IsResourceNotFoundError(err) {
   149  			return fmt.Errorf("Failed to query about Azure about storage service: %s", err)
   150  		} else {
   151  			// it means that the resource has been deleted from Azure
   152  			// in the meantime and we must remove its associated Resource.
   153  			d.SetId("")
   154  			return nil
   155  
   156  		}
   157  	}
   158  
   159  	// read values:
   160  	d.Set("url", storsvc.URL)
   161  	log.Println("[INFO] Querying keys of Azure storage service.")
   162  	keys, err := storageServiceClient.GetStorageServiceKeys(name)
   163  	if err != nil {
   164  		return fmt.Errorf("Failed querying keys for Azure storage service: %s", err)
   165  	}
   166  	d.Set("primary_key", keys.PrimaryKey)
   167  	d.Set("secondary_key", keys.SecondaryKey)
   168  
   169  	return nil
   170  }
   171  
   172  // resourceAzureStorageServiceExists does all the necessary API calls to
   173  // check if the storage service exists on Azure.
   174  func resourceAzureStorageServiceExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   175  	storageServiceClient := meta.(*Client).storageServiceClient
   176  
   177  	// get our storage service:
   178  	log.Println("[INFO] Sending query about storage service to Azure.")
   179  	name := d.Get("name").(string)
   180  	_, err := storageServiceClient.GetStorageService(name)
   181  	if err != nil {
   182  		if !management.IsResourceNotFoundError(err) {
   183  			return false, fmt.Errorf("Failed to query about Azure about storage service: %s", err)
   184  		} else {
   185  			// it means that the resource has been deleted from Azure
   186  			// in the meantime and we must remove its associated Resource.
   187  			d.SetId("")
   188  			return false, nil
   189  
   190  		}
   191  	}
   192  
   193  	return true, nil
   194  }
   195  
   196  // resourceAzureStorageServiceDelete does all the necessary API calls to
   197  // delete the storage service off Azure.
   198  func resourceAzureStorageServiceDelete(d *schema.ResourceData, meta interface{}) error {
   199  	azureClient := meta.(*Client)
   200  	mgmtClient := azureClient.mgmtClient
   201  	storageServiceClient := azureClient.storageServiceClient
   202  
   203  	// issue the deletion:
   204  	name := d.Get("name").(string)
   205  	log.Println("[INFO] Issuing delete of storage service off Azure.")
   206  	reqID, err := storageServiceClient.DeleteStorageService(name)
   207  	if err != nil {
   208  		return fmt.Errorf("Error whilst issuing deletion of storage service off Azure: %s", err)
   209  	}
   210  	err = mgmtClient.WaitForOperation(reqID, nil)
   211  	if err != nil {
   212  		return fmt.Errorf("Error whilst deleting storage service off Azure: %s", err)
   213  	}
   214  
   215  	d.SetId("")
   216  	return nil
   217  }