github.com/mapuri/terraform@v0.7.6-0.20161012203214-7e0408293f97/builtin/providers/azurerm/resource_arm_loadbalancer_backend_address_pool.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/Azure/azure-sdk-for-go/arm/network" 9 "github.com/hashicorp/errwrap" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/helper/schema" 12 "github.com/jen20/riviera/azure" 13 ) 14 15 func resourceArmLoadBalancerBackendAddressPool() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceArmLoadBalancerBackendAddressPoolCreate, 18 Read: resourceArmLoadBalancerBackendAddressPoolRead, 19 Delete: resourceArmLoadBalancerBackendAddressPoolDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "name": { 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "location": { 29 Type: schema.TypeString, 30 Required: true, 31 ForceNew: true, 32 StateFunc: azureRMNormalizeLocation, 33 }, 34 35 "resource_group_name": { 36 Type: schema.TypeString, 37 Required: true, 38 ForceNew: true, 39 }, 40 41 "loadbalancer_id": { 42 Type: schema.TypeString, 43 Required: true, 44 ForceNew: true, 45 }, 46 47 "backend_ip_configurations": { 48 Type: schema.TypeSet, 49 Computed: true, 50 Elem: &schema.Schema{Type: schema.TypeString}, 51 Set: schema.HashString, 52 }, 53 54 "load_balancing_rules": { 55 Type: schema.TypeSet, 56 Computed: true, 57 Elem: &schema.Schema{Type: schema.TypeString}, 58 Set: schema.HashString, 59 }, 60 }, 61 } 62 } 63 64 func resourceArmLoadBalancerBackendAddressPoolCreate(d *schema.ResourceData, meta interface{}) error { 65 client := meta.(*ArmClient) 66 lbClient := client.loadBalancerClient 67 68 loadBalancer, exists, err := retrieveLoadBalancerById(d.Get("loadbalancer_id").(string), meta) 69 if err != nil { 70 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 71 } 72 if !exists { 73 d.SetId("") 74 log.Printf("[INFO] LoadBalancer %q not found. Removing from state", d.Get("name").(string)) 75 return nil 76 } 77 78 _, _, exists = findLoadBalancerBackEndAddressPoolByName(loadBalancer, d.Get("name").(string)) 79 if exists { 80 return fmt.Errorf("A BackEnd Address Pool with name %q already exists.", d.Get("name").(string)) 81 } 82 83 backendAddressPools := append(*loadBalancer.Properties.BackendAddressPools, expandAzureRmLoadBalancerBackendAddressPools(d)) 84 loadBalancer.Properties.BackendAddressPools = &backendAddressPools 85 resGroup, loadBalancerName, err := resourceGroupAndLBNameFromId(d.Get("loadbalancer_id").(string)) 86 if err != nil { 87 return errwrap.Wrapf("Error Getting LoadBalancer Name and Group: {{err}}", err) 88 } 89 90 _, err = lbClient.CreateOrUpdate(resGroup, loadBalancerName, *loadBalancer, make(chan struct{})) 91 if err != nil { 92 return errwrap.Wrapf("Error Creating/Updating LoadBalancer {{err}}", err) 93 } 94 95 read, err := lbClient.Get(resGroup, loadBalancerName, "") 96 if err != nil { 97 return errwrap.Wrapf("Error Getting LoadBalancer {{err}}", err) 98 } 99 if read.ID == nil { 100 return fmt.Errorf("Cannot read LoadBalancer %s (resource group %s) ID", loadBalancerName, resGroup) 101 } 102 103 d.SetId(*read.ID) 104 105 log.Printf("[DEBUG] Waiting for LoadBalancer (%s) to become available", loadBalancerName) 106 stateConf := &resource.StateChangeConf{ 107 Pending: []string{"Accepted", "Updating"}, 108 Target: []string{"Succeeded"}, 109 Refresh: loadbalancerStateRefreshFunc(client, resGroup, loadBalancerName), 110 Timeout: 10 * time.Minute, 111 } 112 if _, err := stateConf.WaitForState(); err != nil { 113 return fmt.Errorf("Error waiting for LoadBalancer (%s) to become available: %s", loadBalancerName, err) 114 } 115 116 return resourceArmLoadBalancerBackendAddressPoolRead(d, meta) 117 } 118 119 func resourceArmLoadBalancerBackendAddressPoolRead(d *schema.ResourceData, meta interface{}) error { 120 loadBalancer, exists, err := retrieveLoadBalancerById(d.Id(), meta) 121 if err != nil { 122 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 123 } 124 if !exists { 125 d.SetId("") 126 log.Printf("[INFO] LoadBalancer %q not found. Removing from state", d.Get("name").(string)) 127 return nil 128 } 129 130 configs := *loadBalancer.Properties.BackendAddressPools 131 for _, config := range configs { 132 if *config.Name == d.Get("name").(string) { 133 d.Set("name", config.Name) 134 135 if config.Properties.BackendIPConfigurations != nil { 136 backend_ip_configurations := make([]string, 0, len(*config.Properties.BackendIPConfigurations)) 137 for _, backendConfig := range *config.Properties.BackendIPConfigurations { 138 backend_ip_configurations = append(backend_ip_configurations, *backendConfig.ID) 139 } 140 141 d.Set("backend_ip_configurations", backend_ip_configurations) 142 } 143 144 if config.Properties.LoadBalancingRules != nil { 145 load_balancing_rules := make([]string, 0, len(*config.Properties.LoadBalancingRules)) 146 for _, rule := range *config.Properties.LoadBalancingRules { 147 load_balancing_rules = append(load_balancing_rules, *rule.ID) 148 } 149 150 d.Set("backend_ip_configurations", load_balancing_rules) 151 } 152 153 break 154 } 155 } 156 157 return nil 158 } 159 160 func resourceArmLoadBalancerBackendAddressPoolDelete(d *schema.ResourceData, meta interface{}) error { 161 client := meta.(*ArmClient) 162 lbClient := client.loadBalancerClient 163 164 loadBalancer, exists, err := retrieveLoadBalancerById(d.Get("loadbalancer_id").(string), meta) 165 if err != nil { 166 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 167 } 168 if !exists { 169 d.SetId("") 170 return nil 171 } 172 173 _, index, exists := findLoadBalancerBackEndAddressPoolByName(loadBalancer, d.Get("name").(string)) 174 if !exists { 175 return nil 176 } 177 178 oldBackEndPools := *loadBalancer.Properties.BackendAddressPools 179 newBackEndPools := append(oldBackEndPools[:index], oldBackEndPools[index+1:]...) 180 loadBalancer.Properties.BackendAddressPools = &newBackEndPools 181 182 resGroup, loadBalancerName, err := resourceGroupAndLBNameFromId(d.Get("loadbalancer_id").(string)) 183 if err != nil { 184 return errwrap.Wrapf("Error Getting LoadBalancer Name and Group: {{err}}", err) 185 } 186 187 _, err = lbClient.CreateOrUpdate(resGroup, loadBalancerName, *loadBalancer, make(chan struct{})) 188 if err != nil { 189 return errwrap.Wrapf("Error Creating/Updating LoadBalancer {{err}}", err) 190 } 191 192 read, err := lbClient.Get(resGroup, loadBalancerName, "") 193 if err != nil { 194 return errwrap.Wrapf("Error Getting LoadBalancer {{err}}", err) 195 } 196 if read.ID == nil { 197 return fmt.Errorf("Cannot read LoadBalancer %s (resource group %s) ID", loadBalancerName, resGroup) 198 } 199 200 return nil 201 } 202 203 func expandAzureRmLoadBalancerBackendAddressPools(d *schema.ResourceData) network.BackendAddressPool { 204 return network.BackendAddressPool{ 205 Name: azure.String(d.Get("name").(string)), 206 } 207 }