github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/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 }