From 6fed17e25d8f58ec57dfbe32fe72167d9626d50a Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 02:25:31 -0700 Subject: [PATCH 1/8] add metadata prop, test --- azurerm/resource_arm_storage_blob.go | 51 +++++++++++++++++++++++ azurerm/resource_arm_storage_blob_test.go | 10 ++++- website/docs/r/storage_blob.html.markdown | 2 + 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index 9dd53a057da1..3d2e65eb77cc 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -114,6 +114,14 @@ func resourceArmStorageBlob() *schema.Resource { ForceNew: true, ValidateFunc: validation.IntAtLeast(1), }, + + "metadata": { + Type: schema.TypeMap, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, }, } } @@ -201,6 +209,13 @@ func resourceArmStorageBlobCreate(d *schema.ResourceData, meta interface{}) erro } } + blob.Metadata = expandBlobMetadata(d) + + opts := &storage.SetBlobMetadataOptions{} + if err := blob.SetMetadata(opts); err != nil { + return fmt.Errorf("Error setting metadata for storage blob on Azure: %s", err) + } + d.SetId(id) return resourceArmStorageBlobRead(d, meta) } @@ -564,6 +579,15 @@ func resourceArmStorageBlobUpdate(d *schema.ResourceData, meta interface{}) erro return fmt.Errorf("Error setting properties of blob %s (container %s, storage account %s): %+v", id.blobName, id.containerName, id.storageAccountName, err) } + if d.HasChange("metadata") { + blob.Metadata = expandBlobMetadata(d) + + opts := &storage.SetBlobMetadataOptions{} + if err := blob.SetMetadata(opts); err != nil { + return fmt.Errorf("Error setting metadata for storage blob on Azure: %s", err) + } + } + return nil } @@ -615,6 +639,12 @@ func resourceArmStorageBlobRead(d *schema.ResourceData, meta interface{}) error return fmt.Errorf("Error getting properties of blob %s (container %s, storage account %s): %+v", id.blobName, id.containerName, id.storageAccountName, err) } + metadataOptions := &storage.GetBlobMetadataOptions{} + blob.GetMetadata(metadataOptions) + if err != nil { + return fmt.Errorf("Error getting metadata of blob %s (container %s, storage account %s): %+v", id.blobName, id.containerName, id.storageAccountName, err) + } + d.Set("name", id.blobName) d.Set("storage_container_name", id.containerName) d.Set("storage_account_name", id.storageAccountName) @@ -632,6 +662,7 @@ func resourceArmStorageBlobRead(d *schema.ResourceData, meta interface{}) error log.Printf("[INFO] URL for %q is empty", id.blobName) } d.Set("url", u) + d.Set("metadata", flattenBlobMetadata(blob.Metadata)) return nil } @@ -730,3 +761,23 @@ func determineResourceGroupForStorageAccount(accountName string, client *ArmClie return nil, nil } + +func expandBlobMetadata(d *schema.ResourceData) storage.BlobMetadata { + blobMetadata := make(map[string]string) + + blobMetadataRaw := d.Get("metadata").(map[string]interface{}) + for key, value := range blobMetadataRaw { + blobMetadata[key] = value.(string) + } + return storage.BlobMetadata(blobMetadata) +} + +func flattenBlobMetadata(in storage.BlobMetadata) map[string]interface{} { + blobMetadata := make(map[string]interface{}) + + for key, value := range in { + blobMetadata[key] = value + } + + return blobMetadata +} diff --git a/azurerm/resource_arm_storage_blob_test.go b/azurerm/resource_arm_storage_blob_test.go index 33035fee4eeb..9f9e9b83af8e 100644 --- a/azurerm/resource_arm_storage_blob_test.go +++ b/azurerm/resource_arm_storage_blob_test.go @@ -31,6 +31,9 @@ func TestAccAzureRMStorageBlob_basic(t *testing.T) { Config: testAccAzureRMStorageBlob_basic(ri, rs, location), Check: resource.ComposeTestCheckFunc( testCheckAzureRMStorageBlobExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "metadata.%", "2"), + resource.TestCheckResourceAttr(resourceName, "metadata.test", "value1"), + resource.TestCheckResourceAttr(resourceName, "metadata.test2", "value2"), ), }, { @@ -490,7 +493,12 @@ resource "azurerm_storage_blob" "test" { storage_container_name = "${azurerm_storage_container.test.name}" type = "page" - size = 5120 + size = 5120 + + metadata { + test = "value1" + test2 = "value2" + } } `, rInt, location, rString) } diff --git a/website/docs/r/storage_blob.html.markdown b/website/docs/r/storage_blob.html.markdown index 2a37a1ab0d45..8d66ba48366a 100644 --- a/website/docs/r/storage_blob.html.markdown +++ b/website/docs/r/storage_blob.html.markdown @@ -75,6 +75,8 @@ The following arguments are supported: * `attempts` - (Optional) The number of attempts to make per page or block when uploading. Defaults to `1`. +* `metadata` - (Optional) A map of custom blob metadata. + ## Attributes Reference The following attributes are exported in addition to the arguments listed above: From a196de7ebfb09d6754ba942cdd10090b563c842a Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 02:30:46 -0700 Subject: [PATCH 2/8] set err when getting metadata --- azurerm/resource_arm_storage_blob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index 3d2e65eb77cc..e08651906cb6 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -640,7 +640,7 @@ func resourceArmStorageBlobRead(d *schema.ResourceData, meta interface{}) error } metadataOptions := &storage.GetBlobMetadataOptions{} - blob.GetMetadata(metadataOptions) + err = blob.GetMetadata(metadataOptions) if err != nil { return fmt.Errorf("Error getting metadata of blob %s (container %s, storage account %s): %+v", id.blobName, id.containerName, id.storageAccountName, err) } From 7aeb22bf3fe1bee09f416530ac7610f11bf92929 Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 02:32:02 -0700 Subject: [PATCH 3/8] fix spacing --- azurerm/resource_arm_storage_blob_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azurerm/resource_arm_storage_blob_test.go b/azurerm/resource_arm_storage_blob_test.go index 9f9e9b83af8e..41ff870110ed 100644 --- a/azurerm/resource_arm_storage_blob_test.go +++ b/azurerm/resource_arm_storage_blob_test.go @@ -495,10 +495,10 @@ resource "azurerm_storage_blob" "test" { type = "page" size = 5120 - metadata { - test = "value1" - test2 = "value2" - } + metadata { + test = "value1" + test2 = "value2" + } } `, rInt, location, rString) } From d48348aaeb482096aadb80dbe916d81af96d9cc2 Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 02:32:41 -0700 Subject: [PATCH 4/8] missed spacing --- azurerm/resource_arm_storage_blob_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azurerm/resource_arm_storage_blob_test.go b/azurerm/resource_arm_storage_blob_test.go index 41ff870110ed..28a447ded0c7 100644 --- a/azurerm/resource_arm_storage_blob_test.go +++ b/azurerm/resource_arm_storage_blob_test.go @@ -493,8 +493,8 @@ resource "azurerm_storage_blob" "test" { storage_container_name = "${azurerm_storage_container.test.name}" type = "page" - size = 5120 - + size = 5120 + metadata { test = "value1" test2 = "value2" From ee30993cad5ae271c51dfb46b493b41ba509cd37 Mon Sep 17 00:00:00 2001 From: kt Date: Mon, 8 Apr 2019 14:47:06 -0700 Subject: [PATCH 5/8] Update azurerm/resource_arm_storage_blob.go Co-Authored-By: Lucretius --- azurerm/resource_arm_storage_blob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index e08651906cb6..b79699f2aa08 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -209,7 +209,7 @@ func resourceArmStorageBlobCreate(d *schema.ResourceData, meta interface{}) erro } } - blob.Metadata = expandBlobMetadata(d) + blob.Metadata = expandStorageAccountBlobMetadata(d) opts := &storage.SetBlobMetadataOptions{} if err := blob.SetMetadata(opts); err != nil { From 4e824dd2675f9d89b5c1afa46866a46bc843cee2 Mon Sep 17 00:00:00 2001 From: kt Date: Mon, 8 Apr 2019 14:47:13 -0700 Subject: [PATCH 6/8] Update azurerm/resource_arm_storage_blob.go Co-Authored-By: Lucretius --- azurerm/resource_arm_storage_blob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index b79699f2aa08..8a2e592ce3ee 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -580,7 +580,7 @@ func resourceArmStorageBlobUpdate(d *schema.ResourceData, meta interface{}) erro } if d.HasChange("metadata") { - blob.Metadata = expandBlobMetadata(d) + blob.Metadata = expandStorageAccountBlobMetadata(d) opts := &storage.SetBlobMetadataOptions{} if err := blob.SetMetadata(opts); err != nil { From 37701385bf0b418c8bdffb43755d75cc0ea325cf Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 14:48:22 -0700 Subject: [PATCH 7/8] fix func calls, add validation --- azurerm/resource_arm_storage_blob.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index 8a2e592ce3ee..7a3613fe0e4c 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -119,7 +119,8 @@ func resourceArmStorageBlob() *schema.Resource { Type: schema.TypeMap, Optional: true, Elem: &schema.Schema{ - Type: schema.TypeString, + Type: schema.TypeString, + ValidateFunc: validate.NoEmptyStrings, }, }, }, @@ -762,7 +763,7 @@ func determineResourceGroupForStorageAccount(accountName string, client *ArmClie return nil, nil } -func expandBlobMetadata(d *schema.ResourceData) storage.BlobMetadata { +func expandStorageAccountBlobMetadata(d *schema.ResourceData) storage.BlobMetadata { blobMetadata := make(map[string]string) blobMetadataRaw := d.Get("metadata").(map[string]interface{}) @@ -772,7 +773,7 @@ func expandBlobMetadata(d *schema.ResourceData) storage.BlobMetadata { return storage.BlobMetadata(blobMetadata) } -func flattenBlobMetadata(in storage.BlobMetadata) map[string]interface{} { +func flattenStorageAccountBlobMetadata(in storage.BlobMetadata) map[string]interface{} { blobMetadata := make(map[string]interface{}) for key, value := range in { From 52d02424cb61935da9af8e0853bff8ef898a7e8b Mon Sep 17 00:00:00 2001 From: Robert Lippens Date: Mon, 8 Apr 2019 15:06:05 -0700 Subject: [PATCH 8/8] fix remaining reference to old func --- azurerm/resource_arm_storage_blob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/resource_arm_storage_blob.go b/azurerm/resource_arm_storage_blob.go index 7a3613fe0e4c..db005454b934 100644 --- a/azurerm/resource_arm_storage_blob.go +++ b/azurerm/resource_arm_storage_blob.go @@ -663,7 +663,7 @@ func resourceArmStorageBlobRead(d *schema.ResourceData, meta interface{}) error log.Printf("[INFO] URL for %q is empty", id.blobName) } d.Set("url", u) - d.Set("metadata", flattenBlobMetadata(blob.Metadata)) + d.Set("metadata", flattenStorageAccountBlobMetadata(blob.Metadata)) return nil }