From 23801b5507d681135bcd4ed22023bdc97ebf5358 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Wed, 25 May 2016 17:40:49 +0200 Subject: [PATCH] Add the option to assign affinity groups to a VM --- .../resource_cloudstack_instance.go | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/builtin/providers/cloudstack/resource_cloudstack_instance.go b/builtin/providers/cloudstack/resource_cloudstack_instance.go index 9c787be84..aa894f517 100644 --- a/builtin/providers/cloudstack/resource_cloudstack_instance.go +++ b/builtin/providers/cloudstack/resource_cloudstack_instance.go @@ -73,6 +73,14 @@ func resourceCloudStackInstance() *schema.Resource { ForceNew: true, }, + "affinity_group_ids": &schema.Schema{ + Type: schema.TypeSet, + Optional: true, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, + "project": &schema.Schema{ Type: schema.TypeString, Optional: true, @@ -197,6 +205,16 @@ func resourceCloudStackInstanceCreate(d *schema.ResourceData, meta interface{}) p.SetIpaddress(ipaddress.(string)) } + if ags := d.Get("affinity_group_ids").(*schema.Set); ags.Len() > 0 { + var groups []string + + for _, group := range ags.List() { + groups = append(groups, group.(string)) + } + + p.SetAffinitygroupids(groups) + } + // If there is a project supplied, we retrieve and set the project id if err := setProjectid(p, cs, d); err != nil { return err @@ -281,6 +299,15 @@ func resourceCloudStackInstanceRead(d *schema.ResourceData, meta interface{}) er setValueOrID(d, "project", vm.Project, vm.Projectid) setValueOrID(d, "zone", vm.Zonename, vm.Zoneid) + groups := &schema.Set{F: schema.HashString} + for _, group := range vm.Affinitygroup { + groups.Add(group.Id) + } + + if groups.Len() > 0 { + d.Set("affinity_group_ids", groups) + } + return nil } @@ -331,7 +358,7 @@ func resourceCloudStackInstanceUpdate(d *schema.ResourceData, meta interface{}) } // Attributes that require reboot to update - if d.HasChange("name") || d.HasChange("service_offering") || d.HasChange("keypair") { + if d.HasChange("name") || d.HasChange("service_offering") || d.HasChange("affinity_group_ids") || d.HasChange("keypair") { // Before we can actually make these changes, the virtual machine must be stopped _, err := cs.VirtualMachine.StopVirtualMachine( cs.VirtualMachine.NewStopVirtualMachineParams(d.Id())) @@ -382,6 +409,19 @@ func resourceCloudStackInstanceUpdate(d *schema.ResourceData, meta interface{}) d.SetPartial("service_offering") } + if d.HasChange("affinity_group_ids") { + p := cs.AffinityGroup.NewUpdateVMAffinityGroupParams(d.Id()) + groups := []string{} + + if ags := d.Get("affinity_group_ids").(*schema.Set); ags.Len() > 0 { + for _, group := range ags.List() { + groups = append(groups, group.(string)) + } + } + + p.SetAffinitygroupids(groups) + } + if d.HasChange("keypair") { log.Printf("[DEBUG] SSH keypair changed for %s, starting update", name)