github.com/bpineau/terraform@v0.8.0-rc1.0.20161126184705-a8886012d185/builtin/providers/azurerm/resource_arm_servicebus_namespace.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "strings" 8 9 "github.com/Azure/azure-sdk-for-go/arm/servicebus" 10 "github.com/hashicorp/terraform/helper/schema" 11 ) 12 13 // Default Authorization Rule/Policy created by Azure, used to populate the 14 // default connection strings and keys 15 var serviceBusNamespaceDefaultAuthorizationRule = "RootManageSharedAccessKey" 16 17 func resourceArmServiceBusNamespace() *schema.Resource { 18 return &schema.Resource{ 19 Create: resourceArmServiceBusNamespaceCreate, 20 Read: resourceArmServiceBusNamespaceRead, 21 Update: resourceArmServiceBusNamespaceCreate, 22 Delete: resourceArmServiceBusNamespaceDelete, 23 Importer: &schema.ResourceImporter{ 24 State: schema.ImportStatePassthrough, 25 }, 26 27 Schema: map[string]*schema.Schema{ 28 "name": { 29 Type: schema.TypeString, 30 Required: true, 31 ForceNew: true, 32 }, 33 34 "location": { 35 Type: schema.TypeString, 36 Required: true, 37 ForceNew: true, 38 StateFunc: azureRMNormalizeLocation, 39 }, 40 41 "resource_group_name": { 42 Type: schema.TypeString, 43 Required: true, 44 ForceNew: true, 45 }, 46 47 "sku": { 48 Type: schema.TypeString, 49 Required: true, 50 ForceNew: true, 51 ValidateFunc: validateServiceBusNamespaceSku, 52 }, 53 54 "capacity": { 55 Type: schema.TypeInt, 56 Optional: true, 57 ForceNew: true, 58 Default: 1, 59 ValidateFunc: validateServiceBusNamespaceCapacity, 60 }, 61 62 "default_primary_connection_string": { 63 Type: schema.TypeString, 64 Computed: true, 65 }, 66 67 "default_secondary_connection_string": { 68 Type: schema.TypeString, 69 Computed: true, 70 }, 71 72 "default_primary_key": { 73 Type: schema.TypeString, 74 Computed: true, 75 }, 76 77 "default_secondary_key": { 78 Type: schema.TypeString, 79 Computed: true, 80 }, 81 82 "tags": tagsSchema(), 83 }, 84 } 85 } 86 87 func resourceArmServiceBusNamespaceCreate(d *schema.ResourceData, meta interface{}) error { 88 client := meta.(*ArmClient) 89 namespaceClient := client.serviceBusNamespacesClient 90 log.Printf("[INFO] preparing arguments for Azure ARM ServiceBus Namespace creation.") 91 92 name := d.Get("name").(string) 93 location := d.Get("location").(string) 94 resGroup := d.Get("resource_group_name").(string) 95 sku := d.Get("sku").(string) 96 capacity := int32(d.Get("capacity").(int)) 97 tags := d.Get("tags").(map[string]interface{}) 98 99 parameters := servicebus.NamespaceCreateOrUpdateParameters{ 100 Location: &location, 101 Sku: &servicebus.Sku{ 102 Name: servicebus.SkuName(sku), 103 Tier: servicebus.SkuTier(sku), 104 Capacity: &capacity, 105 }, 106 Tags: expandTags(tags), 107 } 108 109 _, err := namespaceClient.CreateOrUpdate(resGroup, name, parameters, make(chan struct{})) 110 if err != nil { 111 return err 112 } 113 114 read, err := namespaceClient.Get(resGroup, name) 115 if err != nil { 116 return err 117 } 118 119 if read.ID == nil { 120 return fmt.Errorf("Cannot read ServiceBus Namespace %s (resource group %s) ID", name, resGroup) 121 } 122 123 d.SetId(*read.ID) 124 125 return resourceArmServiceBusNamespaceRead(d, meta) 126 } 127 128 func resourceArmServiceBusNamespaceRead(d *schema.ResourceData, meta interface{}) error { 129 namespaceClient := meta.(*ArmClient).serviceBusNamespacesClient 130 131 id, err := parseAzureResourceID(d.Id()) 132 if err != nil { 133 return err 134 } 135 resGroup := id.ResourceGroup 136 name := id.Path["namespaces"] 137 138 resp, err := namespaceClient.Get(resGroup, name) 139 if err != nil { 140 return fmt.Errorf("Error making Read request on Azure ServiceBus Namespace %s: %s", name, err) 141 } 142 if resp.StatusCode == http.StatusNotFound { 143 d.SetId("") 144 return nil 145 } 146 147 d.Set("name", resp.Name) 148 d.Set("resource_group_name", resGroup) 149 d.Set("location", azureRMNormalizeLocation(*resp.Location)) 150 d.Set("sku", strings.ToLower(string(resp.Sku.Name))) 151 d.Set("capacity", resp.Sku.Capacity) 152 153 keys, err := namespaceClient.ListKeys(resGroup, name, serviceBusNamespaceDefaultAuthorizationRule) 154 if err != nil { 155 log.Printf("[ERROR] Unable to List default keys for Namespace %s: %s", name, err) 156 } else { 157 d.Set("default_primary_connection_string", keys.PrimaryConnectionString) 158 d.Set("default_secondary_connection_string", keys.SecondaryConnectionString) 159 d.Set("default_primary_key", keys.PrimaryKey) 160 d.Set("default_secondary_key", keys.SecondaryKey) 161 } 162 163 flattenAndSetTags(d, resp.Tags) 164 165 return nil 166 } 167 168 func resourceArmServiceBusNamespaceDelete(d *schema.ResourceData, meta interface{}) error { 169 namespaceClient := meta.(*ArmClient).serviceBusNamespacesClient 170 171 id, err := parseAzureResourceID(d.Id()) 172 if err != nil { 173 return err 174 } 175 resGroup := id.ResourceGroup 176 name := id.Path["namespaces"] 177 178 resp, err := namespaceClient.Delete(resGroup, name, make(chan struct{})) 179 180 if resp.StatusCode != http.StatusNotFound { 181 return fmt.Errorf("Error issuing Azure ARM delete request of ServiceBus Namespace'%s': %s", name, err) 182 } 183 184 return nil 185 } 186 187 func validateServiceBusNamespaceSku(v interface{}, k string) (ws []string, errors []error) { 188 value := strings.ToLower(v.(string)) 189 skus := map[string]bool{ 190 "basic": true, 191 "standard": true, 192 "premium": true, 193 } 194 195 if !skus[value] { 196 errors = append(errors, fmt.Errorf("ServiceBus Namespace SKU can only be Basic, Standard or Premium")) 197 } 198 return 199 } 200 201 func validateServiceBusNamespaceCapacity(v interface{}, k string) (ws []string, errors []error) { 202 value := v.(int) 203 capacities := map[int]bool{ 204 1: true, 205 2: true, 206 4: true, 207 } 208 209 if !capacities[value] { 210 errors = append(errors, fmt.Errorf("ServiceBus Namespace Capacity can only be 1, 2 or 4")) 211 } 212 return 213 }