github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/builtin/providers/azurerm/resource_arm_storage_blob.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  )
    10  
    11  func resourceArmStorageBlob() *schema.Resource {
    12  	return &schema.Resource{
    13  		Create: resourceArmStorageBlobCreate,
    14  		Read:   resourceArmStorageBlobRead,
    15  		Exists: resourceArmStorageBlobExists,
    16  		Delete: resourceArmStorageBlobDelete,
    17  
    18  		Schema: map[string]*schema.Schema{
    19  			"name": &schema.Schema{
    20  				Type:     schema.TypeString,
    21  				Required: true,
    22  				ForceNew: true,
    23  			},
    24  			"resource_group_name": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  			},
    29  			"storage_account_name": {
    30  				Type:     schema.TypeString,
    31  				Required: true,
    32  				ForceNew: true,
    33  			},
    34  			"storage_container_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  				ForceNew: true,
    38  			},
    39  			"type": &schema.Schema{
    40  				Type:         schema.TypeString,
    41  				Required:     true,
    42  				ForceNew:     true,
    43  				ValidateFunc: validateArmStorageBlobType,
    44  			},
    45  			"size": &schema.Schema{
    46  				Type:         schema.TypeInt,
    47  				Optional:     true,
    48  				ForceNew:     true,
    49  				Default:      0,
    50  				ValidateFunc: validateArmStorageBlobSize,
    51  			},
    52  			"url": &schema.Schema{
    53  				Type:     schema.TypeString,
    54  				Computed: true,
    55  			},
    56  		},
    57  	}
    58  }
    59  
    60  func validateArmStorageBlobSize(v interface{}, k string) (ws []string, errors []error) {
    61  	value := v.(int)
    62  
    63  	if value%512 != 0 {
    64  		errors = append(errors, fmt.Errorf("Blob Size %q is invalid, must be a multiple of 512", value))
    65  	}
    66  
    67  	return
    68  }
    69  
    70  func validateArmStorageBlobType(v interface{}, k string) (ws []string, errors []error) {
    71  	value := strings.ToLower(v.(string))
    72  	validTypes := map[string]struct{}{
    73  		"blob": struct{}{},
    74  		"page": struct{}{},
    75  	}
    76  
    77  	if _, ok := validTypes[value]; !ok {
    78  		errors = append(errors, fmt.Errorf("Blob type %q is invalid, must be %q or %q", value, "blob", "page"))
    79  	}
    80  	return
    81  }
    82  
    83  func resourceArmStorageBlobCreate(d *schema.ResourceData, meta interface{}) error {
    84  	armClient := meta.(*ArmClient)
    85  
    86  	resourceGroupName := d.Get("resource_group_name").(string)
    87  	storageAccountName := d.Get("storage_account_name").(string)
    88  
    89  	blobClient, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName)
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	name := d.Get("name").(string)
    95  	blobType := d.Get("type").(string)
    96  	cont := d.Get("storage_container_name").(string)
    97  
    98  	log.Printf("[INFO] Creating blob %q in storage account %q", name, storageAccountName)
    99  	switch strings.ToLower(blobType) {
   100  	case "block":
   101  		err = blobClient.CreateBlockBlob(cont, name)
   102  	case "page":
   103  		size := int64(d.Get("size").(int))
   104  		err = blobClient.PutPageBlob(cont, name, size, map[string]string{})
   105  	}
   106  	if err != nil {
   107  		return fmt.Errorf("Error creating storage blob on Azure: %s", err)
   108  	}
   109  
   110  	d.SetId(name)
   111  	return resourceArmStorageBlobRead(d, meta)
   112  }
   113  
   114  func resourceArmStorageBlobRead(d *schema.ResourceData, meta interface{}) error {
   115  	armClient := meta.(*ArmClient)
   116  
   117  	resourceGroupName := d.Get("resource_group_name").(string)
   118  	storageAccountName := d.Get("storage_account_name").(string)
   119  
   120  	blobClient, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName)
   121  	if err != nil {
   122  		return err
   123  	}
   124  
   125  	exists, err := resourceArmStorageBlobExists(d, meta)
   126  	if err != nil {
   127  		return err
   128  	}
   129  
   130  	if !exists {
   131  		// Exists already removed this from state
   132  		return nil
   133  	}
   134  
   135  	name := d.Get("name").(string)
   136  	storageContainerName := d.Get("storage_container_name").(string)
   137  
   138  	url := blobClient.GetBlobURL(storageContainerName, name)
   139  	if url == "" {
   140  		log.Printf("[INFO] URL for %q is empty", name)
   141  	}
   142  	d.Set("url", url)
   143  
   144  	return nil
   145  }
   146  
   147  func resourceArmStorageBlobExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   148  	armClient := meta.(*ArmClient)
   149  
   150  	resourceGroupName := d.Get("resource_group_name").(string)
   151  	storageAccountName := d.Get("storage_account_name").(string)
   152  
   153  	blobClient, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName)
   154  	if err != nil {
   155  		return false, err
   156  	}
   157  
   158  	name := d.Get("name").(string)
   159  	storageContainerName := d.Get("storage_container_name").(string)
   160  
   161  	log.Printf("[INFO] Checking for existence of storage blob %q.", name)
   162  	exists, err := blobClient.BlobExists(storageContainerName, name)
   163  	if err != nil {
   164  		return false, fmt.Errorf("error testing existence of storage blob %q: %s", name, err)
   165  	}
   166  
   167  	if !exists {
   168  		log.Printf("[INFO] Storage blob %q no longer exists, removing from state...", name)
   169  		d.SetId("")
   170  	}
   171  
   172  	return exists, nil
   173  }
   174  
   175  func resourceArmStorageBlobDelete(d *schema.ResourceData, meta interface{}) error {
   176  	armClient := meta.(*ArmClient)
   177  
   178  	resourceGroupName := d.Get("resource_group_name").(string)
   179  	storageAccountName := d.Get("storage_account_name").(string)
   180  
   181  	blobClient, err := armClient.getBlobStorageClientForStorageAccount(resourceGroupName, storageAccountName)
   182  	if err != nil {
   183  		return err
   184  	}
   185  
   186  	name := d.Get("name").(string)
   187  	storageContainerName := d.Get("storage_container_name").(string)
   188  
   189  	log.Printf("[INFO] Deleting storage blob %q", name)
   190  	if _, err = blobClient.DeleteBlobIfExists(storageContainerName, name); err != nil {
   191  		return fmt.Errorf("Error deleting storage blob %q: %s", name, err)
   192  	}
   193  
   194  	d.SetId("")
   195  	return nil
   196  }