github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/alicloud/resource_alicloud_slb_attachment.go (about)

     1  package alicloud
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/hashicorp/terraform/helper/schema"
     6  	"strings"
     7  )
     8  
     9  func resourceAliyunSlbAttachment() *schema.Resource {
    10  	return &schema.Resource{
    11  		Create: resourceAliyunSlbAttachmentCreate,
    12  		Read:   resourceAliyunSlbAttachmentRead,
    13  		Update: resourceAliyunSlbAttachmentUpdate,
    14  		Delete: resourceAliyunSlbAttachmentDelete,
    15  
    16  		Schema: map[string]*schema.Schema{
    17  
    18  			"slb_id": &schema.Schema{
    19  				Type:     schema.TypeString,
    20  				Required: true,
    21  			},
    22  
    23  			"instances": &schema.Schema{
    24  				Type:     schema.TypeSet,
    25  				Elem:     &schema.Schema{Type: schema.TypeString},
    26  				Required: true,
    27  				Set:      schema.HashString,
    28  			},
    29  
    30  			"backend_servers": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Optional: true,
    33  				Computed: true,
    34  			},
    35  		},
    36  	}
    37  }
    38  
    39  func resourceAliyunSlbAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
    40  
    41  	slbId := d.Get("slb_id").(string)
    42  
    43  	slbconn := meta.(*AliyunClient).slbconn
    44  
    45  	loadBalancer, err := slbconn.DescribeLoadBalancerAttribute(slbId)
    46  	if err != nil {
    47  		if notFoundError(err) {
    48  			d.SetId("")
    49  			return fmt.Errorf("Special SLB Id not found: %#v", err)
    50  		}
    51  
    52  		return err
    53  	}
    54  
    55  	d.SetId(loadBalancer.LoadBalancerId)
    56  
    57  	return resourceAliyunSlbAttachmentUpdate(d, meta)
    58  }
    59  
    60  func resourceAliyunSlbAttachmentRead(d *schema.ResourceData, meta interface{}) error {
    61  
    62  	slbconn := meta.(*AliyunClient).slbconn
    63  	loadBalancer, err := slbconn.DescribeLoadBalancerAttribute(d.Id())
    64  	if err != nil {
    65  		if notFoundError(err) {
    66  			d.SetId("")
    67  			return fmt.Errorf("Read special SLB Id not found: %#v", err)
    68  		}
    69  
    70  		return err
    71  	}
    72  
    73  	backendServerType := loadBalancer.BackendServers
    74  	servers := backendServerType.BackendServer
    75  	instanceIds := make([]string, 0, len(servers))
    76  	if len(servers) > 0 {
    77  		for _, e := range servers {
    78  			instanceIds = append(instanceIds, e.ServerId)
    79  		}
    80  		if err != nil {
    81  			return err
    82  		}
    83  	}
    84  
    85  	d.Set("slb_id", d.Id())
    86  	d.Set("instances", instanceIds)
    87  	d.Set("backend_servers", strings.Join(instanceIds, ","))
    88  
    89  	return nil
    90  }
    91  
    92  func resourceAliyunSlbAttachmentUpdate(d *schema.ResourceData, meta interface{}) error {
    93  
    94  	slbconn := meta.(*AliyunClient).slbconn
    95  	if d.HasChange("instances") {
    96  		o, n := d.GetChange("instances")
    97  		os := o.(*schema.Set)
    98  		ns := n.(*schema.Set)
    99  		remove := expandBackendServers(os.Difference(ns).List())
   100  		add := expandBackendServers(ns.Difference(os).List())
   101  
   102  		if len(add) > 0 {
   103  			_, err := slbconn.AddBackendServers(d.Id(), add)
   104  			if err != nil {
   105  				return err
   106  			}
   107  		}
   108  		if len(remove) > 0 {
   109  			removeBackendServers := make([]string, 0, len(remove))
   110  			for _, e := range remove {
   111  				removeBackendServers = append(removeBackendServers, e.ServerId)
   112  			}
   113  			_, err := slbconn.RemoveBackendServers(d.Id(), removeBackendServers)
   114  			if err != nil {
   115  				return err
   116  			}
   117  		}
   118  
   119  	}
   120  
   121  	return resourceAliyunSlbAttachmentRead(d, meta)
   122  
   123  }
   124  
   125  func resourceAliyunSlbAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
   126  
   127  	slbconn := meta.(*AliyunClient).slbconn
   128  	o := d.Get("instances")
   129  	os := o.(*schema.Set)
   130  	remove := expandBackendServers(os.List())
   131  
   132  	if len(remove) > 0 {
   133  		removeBackendServers := make([]string, 0, len(remove))
   134  		for _, e := range remove {
   135  			removeBackendServers = append(removeBackendServers, e.ServerId)
   136  		}
   137  		_, err := slbconn.RemoveBackendServers(d.Id(), removeBackendServers)
   138  		if err != nil {
   139  			return err
   140  		}
   141  	}
   142  
   143  	return nil
   144  }