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