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  }