github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/azure/resource_azure_storage_container.go (about)

     1  package azure
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/Azure/azure-sdk-for-go/storage"
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  )
    10  
    11  // resourceAzureStorageContainer returns the *schema.Resource associated
    12  // to a storage container on Azure.
    13  func resourceAzureStorageContainer() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceAzureStorageContainerCreate,
    16  		Read:   resourceAzureStorageContainerRead,
    17  		Exists: resourceAzureStorageContainerExists,
    18  		Delete: resourceAzureStorageContainerDelete,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"name": &schema.Schema{
    22  				Type:        schema.TypeString,
    23  				Required:    true,
    24  				ForceNew:    true,
    25  				Description: parameterDescriptions["name"],
    26  			},
    27  			"storage_service_name": &schema.Schema{
    28  				Type:        schema.TypeString,
    29  				Required:    true,
    30  				ForceNew:    true,
    31  				Description: parameterDescriptions["storage_service_name"],
    32  			},
    33  			"container_access_type": &schema.Schema{
    34  				Type:        schema.TypeString,
    35  				Required:    true,
    36  				ForceNew:    true,
    37  				Description: parameterDescriptions["container_access_type"],
    38  			},
    39  			"properties": &schema.Schema{
    40  				Type:        schema.TypeMap,
    41  				Computed:    true,
    42  				Elem:        schema.TypeString,
    43  				Description: parameterDescriptions["properties"],
    44  			},
    45  		},
    46  	}
    47  }
    48  
    49  // resourceAzureStorageContainerCreate does all the necessary API calls to
    50  // create the storage container on Azure.
    51  func resourceAzureStorageContainerCreate(d *schema.ResourceData, meta interface{}) error {
    52  	azureClient := meta.(*Client)
    53  	storName := d.Get("storage_service_name").(string)
    54  
    55  	blobClient, err := azureClient.getStorageServiceBlobClient(storName)
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	log.Println("[INFO] Creating storage container on Azure.")
    61  	name := d.Get("name").(string)
    62  	accessType := storage.ContainerAccessType(d.Get("container_access_type").(string))
    63  	container := blobClient.GetContainerReference(name)
    64  	options := &storage.CreateContainerOptions{
    65  		Access: accessType,
    66  	}
    67  	err = container.Create(options)
    68  	if err != nil {
    69  		return fmt.Errorf("Failed to create storage container on Azure: %s", err)
    70  	}
    71  
    72  	d.SetId(name)
    73  	return resourceAzureStorageContainerRead(d, meta)
    74  }
    75  
    76  // resourceAzureStorageContainerRead does all the necessary API calls to
    77  // read the status of the storage container off Azure.
    78  func resourceAzureStorageContainerRead(d *schema.ResourceData, meta interface{}) error {
    79  	azureClient := meta.(*Client)
    80  	storName := d.Get("storage_service_name").(string)
    81  
    82  	blobClient, err := azureClient.getStorageServiceBlobClient(storName)
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	log.Println("[INFO] Querying Azure for storage containers.")
    88  	name := d.Get("name").(string)
    89  	containers, err := blobClient.ListContainers(storage.ListContainersParameters{
    90  		Prefix:  name,
    91  		Timeout: 90,
    92  	})
    93  	if err != nil {
    94  		return fmt.Errorf("Failed to query Azure for its storage containers: %s", err)
    95  	}
    96  
    97  	// search for our storage container and update its stats:
    98  	var found bool
    99  	// loop just to make sure we got the right container:
   100  	for _, cont := range containers.Containers {
   101  		if cont.Name == name {
   102  			found = true
   103  
   104  			props := make(map[string]interface{})
   105  			props["last_modified"] = cont.Properties.LastModified
   106  			props["lease_status"] = cont.Properties.LeaseStatus
   107  			props["lease_state"] = cont.Properties.LeaseState
   108  			props["lease_duration"] = cont.Properties.LeaseDuration
   109  
   110  			d.Set("properties", props)
   111  		}
   112  	}
   113  
   114  	// if not found; it means the resource has been deleted
   115  	// in the meantime; so we must untrack it:
   116  	if !found {
   117  		d.SetId("")
   118  	}
   119  
   120  	return nil
   121  }
   122  
   123  // resourceAzureStorageContainerExists does all the necessary API calls to
   124  // check if the storage container already exists on Azure.
   125  func resourceAzureStorageContainerExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   126  	azureClient := meta.(*Client)
   127  	storName := d.Get("storage_service_name").(string)
   128  
   129  	blobClient, err := azureClient.getStorageServiceBlobClient(storName)
   130  	if err != nil {
   131  		return false, err
   132  	}
   133  
   134  	log.Println("[INFO] Checking existence of storage container on Azure.")
   135  	name := d.Get("name").(string)
   136  	container := blobClient.GetContainerReference(name)
   137  	exists, err := container.Exists()
   138  	if err != nil {
   139  		return false, fmt.Errorf("Failed to query for Azure storage container existence: %s", err)
   140  	}
   141  
   142  	// if it does not exist; untrack the resource:
   143  	if !exists {
   144  		d.SetId("")
   145  	}
   146  	return exists, nil
   147  }
   148  
   149  // resourceAzureStorageContainerDelete does all the necessary API calls to
   150  // delete a storage container off Azure.
   151  func resourceAzureStorageContainerDelete(d *schema.ResourceData, meta interface{}) error {
   152  	azureClient := meta.(*Client)
   153  	storName := d.Get("storage_service_name").(string)
   154  
   155  	blobClient, err := azureClient.getStorageServiceBlobClient(storName)
   156  	if err != nil {
   157  		return err
   158  	}
   159  
   160  	log.Println("[INFO] Issuing Azure storage container deletion call.")
   161  	name := d.Get("name").(string)
   162  	container := blobClient.GetContainerReference(name)
   163  	options := &storage.DeleteContainerOptions{}
   164  	_, err = container.DeleteIfExists(options)
   165  	if err != nil {
   166  		return fmt.Errorf("Failed deleting storage container off Azure: %s", err)
   167  	}
   168  
   169  	d.SetId("")
   170  	return nil
   171  }