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  }