github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/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 }