github.com/icebourg/terraform@v0.6.5-0.20151015205227-263cc1b85535/builtin/providers/google/resource_compute_instance_group_manager.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"google.golang.org/api/compute/v1"
     8  	"google.golang.org/api/googleapi"
     9  
    10  	"github.com/hashicorp/terraform/helper/hashcode"
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceComputeInstanceGroupManager() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceComputeInstanceGroupManagerCreate,
    17  		Read:   resourceComputeInstanceGroupManagerRead,
    18  		Update: resourceComputeInstanceGroupManagerUpdate,
    19  		Delete: resourceComputeInstanceGroupManagerDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  
    28  			"description": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Optional: true,
    31  				ForceNew: true,
    32  			},
    33  
    34  			"base_instance_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  				ForceNew: true,
    38  			},
    39  
    40  			"fingerprint": &schema.Schema{
    41  				Type:     schema.TypeString,
    42  				Computed: true,
    43  			},
    44  
    45  			"instance_group": &schema.Schema{
    46  				Type:     schema.TypeString,
    47  				Computed: true,
    48  			},
    49  
    50  			"instance_template": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Required: true,
    53  			},
    54  
    55  			"target_pools": &schema.Schema{
    56  				Type:     schema.TypeSet,
    57  				Optional: true,
    58  				Elem:     &schema.Schema{Type: schema.TypeString},
    59  				Set: func(v interface{}) int {
    60  					return hashcode.String(v.(string))
    61  				},
    62  			},
    63  
    64  			"target_size": &schema.Schema{
    65  				Type:     schema.TypeInt,
    66  				Computed: true,
    67  				Optional: true,
    68  			},
    69  
    70  			"zone": &schema.Schema{
    71  				Type:     schema.TypeString,
    72  				Required: true,
    73  				ForceNew: true,
    74  			},
    75  
    76  			"self_link": &schema.Schema{
    77  				Type:     schema.TypeString,
    78  				Computed: true,
    79  			},
    80  		},
    81  	}
    82  }
    83  
    84  func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta interface{}) error {
    85  	config := meta.(*Config)
    86  
    87  	// Get group size, default to 1 if not given
    88  	var target_size int64 = 1
    89  	if v, ok := d.GetOk("target_size"); ok {
    90  		target_size = int64(v.(int))
    91  	}
    92  
    93  	// Build the parameter
    94  	manager := &compute.InstanceGroupManager{
    95  		Name:             d.Get("name").(string),
    96  		BaseInstanceName: d.Get("base_instance_name").(string),
    97  		InstanceTemplate: d.Get("instance_template").(string),
    98  		TargetSize:       target_size,
    99  	}
   100  
   101  	// Set optional fields
   102  	if v, ok := d.GetOk("description"); ok {
   103  		manager.Description = v.(string)
   104  	}
   105  
   106  	if attr := d.Get("target_pools").(*schema.Set); attr.Len() > 0 {
   107  		var s []string
   108  		for _, v := range attr.List() {
   109  			s = append(s, v.(string))
   110  		}
   111  		manager.TargetPools = s
   112  	}
   113  
   114  	log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager)
   115  	op, err := config.clientCompute.InstanceGroupManagers.Insert(
   116  		config.Project, d.Get("zone").(string), manager).Do()
   117  	if err != nil {
   118  		return fmt.Errorf("Error creating InstanceGroupManager: %s", err)
   119  	}
   120  
   121  	// It probably maybe worked, so store the ID now
   122  	d.SetId(manager.Name)
   123  
   124  	// Wait for the operation to complete
   125  	err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Creating InstanceGroupManager")
   126  	if err != nil {
   127  		return err
   128  	}
   129  
   130  	return resourceComputeInstanceGroupManagerRead(d, meta)
   131  }
   132  
   133  func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interface{}) error {
   134  	config := meta.(*Config)
   135  
   136  	manager, err := config.clientCompute.InstanceGroupManagers.Get(
   137  		config.Project, d.Get("zone").(string), d.Id()).Do()
   138  	if err != nil {
   139  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   140  			// The resource doesn't exist anymore
   141  			d.SetId("")
   142  
   143  			return nil
   144  		}
   145  
   146  		return fmt.Errorf("Error reading instance group manager: %s", err)
   147  	}
   148  
   149  	// Set computed fields
   150  	d.Set("fingerprint", manager.Fingerprint)
   151  	d.Set("instance_group", manager.InstanceGroup)
   152  	d.Set("target_size", manager.TargetSize)
   153  	d.Set("self_link", manager.SelfLink)
   154  
   155  	return nil
   156  }
   157  func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error {
   158  	config := meta.(*Config)
   159  
   160  	d.Partial(true)
   161  
   162  	// If target_pools changes then update
   163  	if d.HasChange("target_pools") {
   164  		var targetPools []string
   165  		if attr := d.Get("target_pools").(*schema.Set); attr.Len() > 0 {
   166  			for _, v := range attr.List() {
   167  				targetPools = append(targetPools, v.(string))
   168  			}
   169  		}
   170  
   171  		// Build the parameter
   172  		setTargetPools := &compute.InstanceGroupManagersSetTargetPoolsRequest{
   173  			Fingerprint: d.Get("fingerprint").(string),
   174  			TargetPools: targetPools,
   175  		}
   176  
   177  		op, err := config.clientCompute.InstanceGroupManagers.SetTargetPools(
   178  			config.Project, d.Get("zone").(string), d.Id(), setTargetPools).Do()
   179  		if err != nil {
   180  			return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
   181  		}
   182  
   183  		// Wait for the operation to complete
   184  		err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager")
   185  		if err != nil {
   186  			return err
   187  		}
   188  
   189  		d.SetPartial("target_pools")
   190  	}
   191  
   192  	// If instance_template changes then update
   193  	if d.HasChange("instance_template") {
   194  		// Build the parameter
   195  		setInstanceTemplate := &compute.InstanceGroupManagersSetInstanceTemplateRequest{
   196  			InstanceTemplate: d.Get("instance_template").(string),
   197  		}
   198  
   199  		op, err := config.clientCompute.InstanceGroupManagers.SetInstanceTemplate(
   200  			config.Project, d.Get("zone").(string), d.Id(), setInstanceTemplate).Do()
   201  		if err != nil {
   202  			return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
   203  		}
   204  
   205  		// Wait for the operation to complete
   206  		err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager")
   207  		if err != nil {
   208  			return err
   209  		}
   210  
   211  		d.SetPartial("instance_template")
   212  	}
   213  
   214  	// If size changes trigger a resize
   215  	if d.HasChange("target_size") {
   216  		if v, ok := d.GetOk("target_size"); ok {
   217  			// Only do anything if the new size is set
   218  			target_size := int64(v.(int))
   219  
   220  			op, err := config.clientCompute.InstanceGroupManagers.Resize(
   221  				config.Project, d.Get("zone").(string), d.Id(), target_size).Do()
   222  			if err != nil {
   223  				return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
   224  			}
   225  
   226  			// Wait for the operation to complete
   227  			err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager")
   228  			if err != nil {
   229  				return err
   230  			}
   231  		}
   232  
   233  		d.SetPartial("target_size")
   234  	}
   235  
   236  	d.Partial(false)
   237  
   238  	return resourceComputeInstanceGroupManagerRead(d, meta)
   239  }
   240  
   241  func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
   242  	config := meta.(*Config)
   243  
   244  	zone := d.Get("zone").(string)
   245  	op, err := config.clientCompute.InstanceGroupManagers.Delete(config.Project, zone, d.Id()).Do()
   246  	if err != nil {
   247  		return fmt.Errorf("Error deleting instance group manager: %s", err)
   248  	}
   249  
   250  	// Wait for the operation to complete
   251  	err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Deleting InstanceGroupManager")
   252  	if err != nil {
   253  		return err
   254  	}
   255  
   256  	d.SetId("")
   257  	return nil
   258  }