github.com/recobe182/terraform@v0.8.5-0.20170117231232-49ab22a935b7/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": locationSchema(), 29 30 "resource_group_name": { 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 }, 35 36 "loadbalancer_id": { 37 Type: schema.TypeString, 38 Required: true, 39 ForceNew: true, 40 }, 41 42 "backend_ip_configurations": { 43 Type: schema.TypeSet, 44 Computed: true, 45 Elem: &schema.Schema{Type: schema.TypeString}, 46 Set: schema.HashString, 47 }, 48 49 "load_balancing_rules": { 50 Type: schema.TypeSet, 51 Computed: true, 52 Elem: &schema.Schema{Type: schema.TypeString}, 53 Set: schema.HashString, 54 }, 55 }, 56 } 57 } 58 59 func resourceArmLoadBalancerBackendAddressPoolCreate(d *schema.ResourceData, meta interface{}) error { 60 client := meta.(*ArmClient) 61 lbClient := client.loadBalancerClient 62 63 loadBalancerID := d.Get("loadbalancer_id").(string) 64 armMutexKV.Lock(loadBalancerID) 65 defer armMutexKV.Unlock(loadBalancerID) 66 67 loadBalancer, exists, err := retrieveLoadBalancerById(loadBalancerID, meta) 68 if err != nil { 69 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 70 } 71 if !exists { 72 d.SetId("") 73 log.Printf("[INFO] LoadBalancer %q not found. Removing from state", d.Get("name").(string)) 74 return nil 75 } 76 77 backendAddressPools := append(*loadBalancer.LoadBalancerPropertiesFormat.BackendAddressPools, expandAzureRmLoadBalancerBackendAddressPools(d)) 78 existingPool, existingPoolIndex, exists := findLoadBalancerBackEndAddressPoolByName(loadBalancer, d.Get("name").(string)) 79 if exists { 80 if d.Get("name").(string) == *existingPool.Name { 81 // this pool is being updated/reapplied remove old copy from the slice 82 backendAddressPools = append(backendAddressPools[:existingPoolIndex], backendAddressPools[existingPoolIndex+1:]...) 83 } 84 } 85 86 loadBalancer.LoadBalancerPropertiesFormat.BackendAddressPools = &backendAddressPools 87 resGroup, loadBalancerName, err := resourceGroupAndLBNameFromId(d.Get("loadbalancer_id").(string)) 88 if err != nil { 89 return errwrap.Wrapf("Error Getting LoadBalancer Name and Group: {{err}}", err) 90 } 91 92 _, err = lbClient.CreateOrUpdate(resGroup, loadBalancerName, *loadBalancer, make(chan struct{})) 93 if err != nil { 94 return errwrap.Wrapf("Error Creating/Updating LoadBalancer {{err}}", err) 95 } 96 97 read, err := lbClient.Get(resGroup, loadBalancerName, "") 98 if err != nil { 99 return errwrap.Wrapf("Error Getting LoadBalancer {{err}}", err) 100 } 101 if read.ID == nil { 102 return fmt.Errorf("Cannot read LoadBalancer %s (resource group %s) ID", loadBalancerName, resGroup) 103 } 104 105 var pool_id string 106 for _, BackendAddressPool := range *(*read.LoadBalancerPropertiesFormat).BackendAddressPools { 107 if *BackendAddressPool.Name == d.Get("name").(string) { 108 pool_id = *BackendAddressPool.ID 109 } 110 } 111 112 if pool_id != "" { 113 d.SetId(pool_id) 114 } else { 115 return fmt.Errorf("Cannot find created LoadBalancer Backend Address Pool ID %q", pool_id) 116 } 117 118 log.Printf("[DEBUG] Waiting for LoadBalancer (%s) to become available", loadBalancerName) 119 stateConf := &resource.StateChangeConf{ 120 Pending: []string{"Accepted", "Updating"}, 121 Target: []string{"Succeeded"}, 122 Refresh: loadbalancerStateRefreshFunc(client, resGroup, loadBalancerName), 123 Timeout: 10 * time.Minute, 124 } 125 if _, err := stateConf.WaitForState(); err != nil { 126 return fmt.Errorf("Error waiting for LoadBalancer (%s) to become available: %s", loadBalancerName, err) 127 } 128 129 return resourceArmLoadBalancerBackendAddressPoolRead(d, meta) 130 } 131 132 func resourceArmLoadBalancerBackendAddressPoolRead(d *schema.ResourceData, meta interface{}) error { 133 loadBalancer, exists, err := retrieveLoadBalancerById(d.Get("loadbalancer_id").(string), meta) 134 if err != nil { 135 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 136 } 137 if !exists { 138 d.SetId("") 139 log.Printf("[INFO] LoadBalancer %q not found. Removing from state", d.Get("name").(string)) 140 return nil 141 } 142 143 configs := *loadBalancer.LoadBalancerPropertiesFormat.BackendAddressPools 144 for _, config := range configs { 145 if *config.Name == d.Get("name").(string) { 146 d.Set("name", config.Name) 147 148 if config.BackendAddressPoolPropertiesFormat.BackendIPConfigurations != nil { 149 backend_ip_configurations := make([]string, 0, len(*config.BackendAddressPoolPropertiesFormat.BackendIPConfigurations)) 150 for _, backendConfig := range *config.BackendAddressPoolPropertiesFormat.BackendIPConfigurations { 151 backend_ip_configurations = append(backend_ip_configurations, *backendConfig.ID) 152 } 153 154 d.Set("backend_ip_configurations", backend_ip_configurations) 155 } 156 157 if config.BackendAddressPoolPropertiesFormat.LoadBalancingRules != nil { 158 load_balancing_rules := make([]string, 0, len(*config.BackendAddressPoolPropertiesFormat.LoadBalancingRules)) 159 for _, rule := range *config.BackendAddressPoolPropertiesFormat.LoadBalancingRules { 160 load_balancing_rules = append(load_balancing_rules, *rule.ID) 161 } 162 163 d.Set("backend_ip_configurations", load_balancing_rules) 164 } 165 166 break 167 } 168 } 169 170 return nil 171 } 172 173 func resourceArmLoadBalancerBackendAddressPoolDelete(d *schema.ResourceData, meta interface{}) error { 174 client := meta.(*ArmClient) 175 lbClient := client.loadBalancerClient 176 177 loadBalancerID := d.Get("loadbalancer_id").(string) 178 armMutexKV.Lock(loadBalancerID) 179 defer armMutexKV.Unlock(loadBalancerID) 180 181 loadBalancer, exists, err := retrieveLoadBalancerById(loadBalancerID, meta) 182 if err != nil { 183 return errwrap.Wrapf("Error Getting LoadBalancer By ID {{err}}", err) 184 } 185 if !exists { 186 d.SetId("") 187 return nil 188 } 189 190 _, index, exists := findLoadBalancerBackEndAddressPoolByName(loadBalancer, d.Get("name").(string)) 191 if !exists { 192 return nil 193 } 194 195 oldBackEndPools := *loadBalancer.LoadBalancerPropertiesFormat.BackendAddressPools 196 newBackEndPools := append(oldBackEndPools[:index], oldBackEndPools[index+1:]...) 197 loadBalancer.LoadBalancerPropertiesFormat.BackendAddressPools = &newBackEndPools 198 199 resGroup, loadBalancerName, err := resourceGroupAndLBNameFromId(d.Get("loadbalancer_id").(string)) 200 if err != nil { 201 return errwrap.Wrapf("Error Getting LoadBalancer Name and Group: {{err}}", err) 202 } 203 204 _, err = lbClient.CreateOrUpdate(resGroup, loadBalancerName, *loadBalancer, make(chan struct{})) 205 if err != nil { 206 return errwrap.Wrapf("Error Creating/Updating LoadBalancer {{err}}", err) 207 } 208 209 read, err := lbClient.Get(resGroup, loadBalancerName, "") 210 if err != nil { 211 return errwrap.Wrapf("Error Getting LoadBalancer {{err}}", err) 212 } 213 if read.ID == nil { 214 return fmt.Errorf("Cannot read LoadBalancer %s (resource group %s) ID", loadBalancerName, resGroup) 215 } 216 217 return nil 218 } 219 220 func expandAzureRmLoadBalancerBackendAddressPools(d *schema.ResourceData) network.BackendAddressPool { 221 return network.BackendAddressPool{ 222 Name: azure.String(d.Get("name").(string)), 223 } 224 }