github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/azurerm/resource_arm_storage_queue.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 8 "github.com/Azure/azure-sdk-for-go/storage" 9 "github.com/hashicorp/terraform/helper/schema" 10 ) 11 12 func resourceArmStorageQueue() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceArmStorageQueueCreate, 15 Read: resourceArmStorageQueueRead, 16 Exists: resourceArmStorageQueueExists, 17 Delete: resourceArmStorageQueueDelete, 18 19 Schema: map[string]*schema.Schema{ 20 "name": { 21 Type: schema.TypeString, 22 Required: true, 23 ForceNew: true, 24 ValidateFunc: validateArmStorageQueueName, 25 }, 26 "resource_group_name": { 27 Type: schema.TypeString, 28 Required: true, 29 ForceNew: true, 30 }, 31 "storage_account_name": { 32 Type: schema.TypeString, 33 Required: true, 34 ForceNew: true, 35 }, 36 }, 37 } 38 } 39 40 func validateArmStorageQueueName(v interface{}, k string) (ws []string, errors []error) { 41 value := v.(string) 42 43 if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(value) { 44 errors = append(errors, fmt.Errorf( 45 "only lowercase alphanumeric characters and hyphens allowed in %q", k)) 46 } 47 48 if regexp.MustCompile(`^-`).MatchString(value) { 49 errors = append(errors, fmt.Errorf("%q cannot start with a hyphen", k)) 50 } 51 52 if regexp.MustCompile(`-$`).MatchString(value) { 53 errors = append(errors, fmt.Errorf("%q cannot end with a hyphen", k)) 54 } 55 56 if len(value) > 63 { 57 errors = append(errors, fmt.Errorf( 58 "%q cannot be longer than 63 characters", k)) 59 } 60 61 if len(value) < 3 { 62 errors = append(errors, fmt.Errorf( 63 "%q must be at least 3 characters", k)) 64 } 65 66 return 67 } 68 69 func resourceArmStorageQueueCreate(d *schema.ResourceData, meta interface{}) error { 70 armClient := meta.(*ArmClient) 71 72 resourceGroupName := d.Get("resource_group_name").(string) 73 storageAccountName := d.Get("storage_account_name").(string) 74 75 queueClient, accountExists, err := armClient.getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName) 76 if err != nil { 77 return err 78 } 79 if !accountExists { 80 return fmt.Errorf("Storage Account %q Not Found", storageAccountName) 81 } 82 83 name := d.Get("name").(string) 84 85 log.Printf("[INFO] Creating queue %q in storage account %q", name, storageAccountName) 86 queueReference := queueClient.GetQueueReference(name) 87 options := &storage.QueueServiceOptions{} 88 err = queueReference.Create(options) 89 if err != nil { 90 return fmt.Errorf("Error creating storage queue on Azure: %s", err) 91 } 92 93 d.SetId(name) 94 return resourceArmStorageQueueRead(d, meta) 95 } 96 97 func resourceArmStorageQueueRead(d *schema.ResourceData, meta interface{}) error { 98 99 exists, err := resourceArmStorageQueueExists(d, meta) 100 if err != nil { 101 return err 102 } 103 104 if !exists { 105 // Exists already removed this from state 106 return nil 107 } 108 109 return nil 110 } 111 112 func resourceArmStorageQueueExists(d *schema.ResourceData, meta interface{}) (bool, error) { 113 armClient := meta.(*ArmClient) 114 115 resourceGroupName := d.Get("resource_group_name").(string) 116 storageAccountName := d.Get("storage_account_name").(string) 117 118 queueClient, accountExists, err := armClient.getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName) 119 if err != nil { 120 return false, err 121 } 122 if !accountExists { 123 log.Printf("[DEBUG] Storage account %q not found, removing queue %q from state", storageAccountName, d.Id()) 124 d.SetId("") 125 return false, nil 126 } 127 128 name := d.Get("name").(string) 129 130 log.Printf("[INFO] Checking for existence of storage queue %q.", name) 131 queueReference := queueClient.GetQueueReference(name) 132 exists, err := queueReference.Exists() 133 if err != nil { 134 return false, fmt.Errorf("error testing existence of storage queue %q: %s", name, err) 135 } 136 137 if !exists { 138 log.Printf("[INFO] Storage queue %q no longer exists, removing from state...", name) 139 d.SetId("") 140 } 141 142 return exists, nil 143 } 144 145 func resourceArmStorageQueueDelete(d *schema.ResourceData, meta interface{}) error { 146 armClient := meta.(*ArmClient) 147 148 resourceGroupName := d.Get("resource_group_name").(string) 149 storageAccountName := d.Get("storage_account_name").(string) 150 151 queueClient, accountExists, err := armClient.getQueueServiceClientForStorageAccount(resourceGroupName, storageAccountName) 152 if err != nil { 153 return err 154 } 155 if !accountExists { 156 log.Printf("[INFO]Storage Account %q doesn't exist so the blob won't exist", storageAccountName) 157 return nil 158 } 159 160 name := d.Get("name").(string) 161 162 log.Printf("[INFO] Deleting storage queue %q", name) 163 queueReference := queueClient.GetQueueReference(name) 164 options := &storage.QueueServiceOptions{} 165 if err = queueReference.Delete(options); err != nil { 166 return fmt.Errorf("Error deleting storage queue %q: %s", name, err) 167 } 168 169 d.SetId("") 170 return nil 171 }