github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/builtin/providers/azurerm/resource_arm_resource_group.go (about)

     1  package azurerm
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"regexp"
     7  	"strings"
     8  
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	"github.com/jen20/riviera/azure"
    11  )
    12  
    13  func resourceArmResourceGroup() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceArmResourceGroupCreate,
    16  		Read:   resourceArmResourceGroupRead,
    17  		Update: resourceArmResourceGroupUpdate,
    18  		Exists: resourceArmResourceGroupExists,
    19  		Delete: resourceArmResourceGroupDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:         schema.TypeString,
    24  				Required:     true,
    25  				ForceNew:     true,
    26  				ValidateFunc: validateArmResourceGroupName,
    27  			},
    28  			"location": &schema.Schema{
    29  				Type:      schema.TypeString,
    30  				Required:  true,
    31  				ForceNew:  true,
    32  				StateFunc: azureRMNormalizeLocation,
    33  			},
    34  
    35  			"tags": tagsSchema(),
    36  		},
    37  	}
    38  }
    39  
    40  func validateArmResourceGroupName(v interface{}, k string) (ws []string, es []error) {
    41  	value := v.(string)
    42  
    43  	if len(value) > 80 {
    44  		es = append(es, fmt.Errorf("%q may not exceed 80 characters in length", k))
    45  	}
    46  
    47  	if strings.HasSuffix(value, ".") {
    48  		es = append(es, fmt.Errorf("%q may not end with a period", k))
    49  	}
    50  
    51  	if matched := regexp.MustCompile(`[\(\)\.a-zA-Z0-9_-]`).Match([]byte(value)); !matched {
    52  		es = append(es, fmt.Errorf("%q may only contain alphanumeric characters, dash, underscores, parentheses and periods", k))
    53  	}
    54  
    55  	return
    56  }
    57  
    58  func resourceArmResourceGroupUpdate(d *schema.ResourceData, meta interface{}) error {
    59  	client := meta.(*ArmClient)
    60  	rivieraClient := client.rivieraClient
    61  
    62  	if !d.HasChange("tags") {
    63  		return nil
    64  	}
    65  
    66  	name := d.Get("name").(string)
    67  	newTags := d.Get("tags").(map[string]interface{})
    68  
    69  	updateRequest := rivieraClient.NewRequestForURI(d.Id())
    70  	updateRequest.Command = &azure.UpdateResourceGroup{
    71  		Name: name,
    72  		Tags: *expandTags(newTags),
    73  	}
    74  
    75  	updateResponse, err := updateRequest.Execute()
    76  	if err != nil {
    77  		return fmt.Errorf("Error updating resource group: %s", err)
    78  	}
    79  	if !updateResponse.IsSuccessful() {
    80  		return fmt.Errorf("Error updating resource group: %s", updateResponse.Error)
    81  	}
    82  
    83  	return resourceArmResourceGroupRead(d, meta)
    84  }
    85  
    86  func resourceArmResourceGroupCreate(d *schema.ResourceData, meta interface{}) error {
    87  	client := meta.(*ArmClient)
    88  	rivieraClient := client.rivieraClient
    89  
    90  	createRequest := rivieraClient.NewRequest()
    91  	createRequest.Command = &azure.CreateResourceGroup{
    92  		Name:     d.Get("name").(string),
    93  		Location: d.Get("location").(string),
    94  		Tags:     *expandTags(d.Get("tags").(map[string]interface{})),
    95  	}
    96  
    97  	createResponse, err := createRequest.Execute()
    98  	if err != nil {
    99  		return fmt.Errorf("Error creating resource group: %s", err)
   100  	}
   101  	if !createResponse.IsSuccessful() {
   102  		return fmt.Errorf("Error creating resource group: %s", createResponse.Error)
   103  	}
   104  
   105  	resp := createResponse.Parsed.(*azure.CreateResourceGroupResponse)
   106  	d.SetId(*resp.ID)
   107  
   108  	// TODO(jen20): Decide whether we need this or not and migrate to use @stack72's work if so
   109  	// log.Printf("[DEBUG] Waiting for Resource Group (%s) to become available", name)
   110  	// stateConf := &resource.StateChangeConf{
   111  	// 	Pending: []string{"Accepted"},
   112  	// 	Target:  []string{"Succeeded"},
   113  	// 	Refresh: resourceGroupStateRefreshFunc(client, name),
   114  	// 	Timeout: 10 * time.Minute,
   115  	// }
   116  	// if _, err := stateConf.WaitForState(); err != nil {
   117  	// 	return fmt.Errorf("Error waiting for Resource Group (%s) to become available: %s", name, err)
   118  	// }
   119  
   120  	return resourceArmResourceGroupRead(d, meta)
   121  }
   122  
   123  func resourceArmResourceGroupRead(d *schema.ResourceData, meta interface{}) error {
   124  	client := meta.(*ArmClient)
   125  	rivieraClient := client.rivieraClient
   126  
   127  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   128  	readRequest.Command = &azure.GetResourceGroup{}
   129  
   130  	readResponse, err := readRequest.Execute()
   131  	if err != nil {
   132  		return fmt.Errorf("Error reading resource group: %s", err)
   133  	}
   134  	if !readResponse.IsSuccessful() {
   135  		log.Printf("[INFO] Error reading resource group %q - removing from state", d.Id())
   136  		d.SetId("")
   137  		return fmt.Errorf("Error reading resource group: %s", readResponse.Error)
   138  	}
   139  
   140  	resp := readResponse.Parsed.(*azure.GetResourceGroupResponse)
   141  
   142  	d.Set("name", resp.Name)
   143  	d.Set("location", resp.Location)
   144  	flattenAndSetTags(d, resp.Tags)
   145  
   146  	return nil
   147  }
   148  
   149  func resourceArmResourceGroupExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   150  	client := meta.(*ArmClient)
   151  	rivieraClient := client.rivieraClient
   152  
   153  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   154  	readRequest.Command = &azure.GetResourceGroup{}
   155  
   156  	readResponse, err := readRequest.Execute()
   157  	if err != nil {
   158  		return false, fmt.Errorf("Error reading resource group: %s", err)
   159  	}
   160  	if readResponse.IsSuccessful() {
   161  		return true, nil
   162  	}
   163  
   164  	return false, nil
   165  }
   166  
   167  func resourceArmResourceGroupDelete(d *schema.ResourceData, meta interface{}) error {
   168  	client := meta.(*ArmClient)
   169  	rivieraClient := client.rivieraClient
   170  
   171  	deleteRequest := rivieraClient.NewRequestForURI(d.Id())
   172  	deleteRequest.Command = &azure.DeleteResourceGroup{}
   173  
   174  	deleteResponse, err := deleteRequest.Execute()
   175  	if err != nil {
   176  		return fmt.Errorf("Error deleting resource group: %s", err)
   177  	}
   178  	if !deleteResponse.IsSuccessful() {
   179  		return fmt.Errorf("Error deleting resource group: %s", deleteResponse.Error)
   180  	}
   181  
   182  	return nil
   183  
   184  }