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 }