diff --git a/builtin/providers/cloudstack/provider_test.go b/builtin/providers/cloudstack/provider_test.go index ac67c5199..2585c5fa0 100644 --- a/builtin/providers/cloudstack/provider_test.go +++ b/builtin/providers/cloudstack/provider_test.go @@ -66,9 +66,6 @@ func testAccPreCheck(t *testing.T) { if v := os.Getenv("CLOUDSTACK_2ND_NIC_NETWORK"); v == "" { t.Fatal("CLOUDSTACK_2ND_NIC_NETWORK must be set for acceptance tests") } - if v := os.Getenv("CLOUDSTACK_AFFINITY_GROUP_TYPE"); v == "" { - t.Fatal("CLOUDSTACK_AFFINITY_GROUP_TYPE must be set for acceptance tests") - } if v := os.Getenv("CLOUDSTACK_DISK_OFFERING_1"); v == "" { t.Fatal("CLOUDSTACK_DISK_OFFERING_1 must be set for acceptance tests") } @@ -149,9 +146,6 @@ func testAccPreCheck(t *testing.T) { } } -// Name of an affinity group type -var CLOUDSTACK_AFFINITY_GROUP_TYPE = os.Getenv("CLOUDSTACK_AFFINITY_GROUP_TYPE") - // Name of a valid disk offering var CLOUDSTACK_DISK_OFFERING_1 = os.Getenv("CLOUDSTACK_DISK_OFFERING_1") diff --git a/builtin/providers/cloudstack/resource_cloudstack_affinity_group.go b/builtin/providers/cloudstack/resource_cloudstack_affinity_group.go index 43b5999d6..60bfeb60c 100644 --- a/builtin/providers/cloudstack/resource_cloudstack_affinity_group.go +++ b/builtin/providers/cloudstack/resource_cloudstack_affinity_group.go @@ -25,6 +25,7 @@ func resourceCloudStackAffinityGroup() *schema.Resource { "description": &schema.Schema{ Type: schema.TypeString, Optional: true, + Computed: true, ForceNew: true, }, @@ -49,13 +50,14 @@ func resourceCloudStackAffinityGroupCreate(d *schema.ResourceData, meta interfac name := d.Get("name").(string) affinityGroupType := d.Get("type").(string) - log.Printf("[DEBUG] creating affinity group with name %s of type %s", name, affinityGroupType) - + // Create a new parameter struct p := cs.AffinityGroup.NewCreateAffinityGroupParams(name, affinityGroupType) // Set the description if description, ok := d.GetOk("description"); ok { p.SetDescription(description.(string)) + } else { + p.SetDescription(name) } // If there is a project supplied, we retrieve and set the project id @@ -63,12 +65,13 @@ func resourceCloudStackAffinityGroupCreate(d *schema.ResourceData, meta interfac return err } + log.Printf("[DEBUG] Creating affinity group %s", name) r, err := cs.AffinityGroup.CreateAffinityGroup(p) if err != nil { return err } - log.Printf("[DEBUG] New affinity group successfully created") + log.Printf("[DEBUG] Affinity group %s successfully created", name) d.SetId(r.Id) return resourceCloudStackAffinityGroupRead(d, meta) @@ -77,20 +80,24 @@ func resourceCloudStackAffinityGroupCreate(d *schema.ResourceData, meta interfac func resourceCloudStackAffinityGroupRead(d *schema.ResourceData, meta interface{}) error { cs := meta.(*cloudstack.CloudStackClient) - log.Printf("[DEBUG] looking for affinity group with name %s", d.Id()) + log.Printf("[DEBUG] Rerieving affinity group %s", d.Get("name").(string)) // Get the affinity group details - ag, count, err := cs.AffinityGroup.GetAffinityGroupByID(d.Id(), cloudstack.WithProject(d.Get("project").(string))) + ag, count, err := cs.AffinityGroup.GetAffinityGroupByID( + d.Id(), + cloudstack.WithProject(d.Get("project").(string)), + ) if err != nil { if count == 0 { - log.Printf("[DEBUG] Affinity group %s does not longer exist", d.Id()) + log.Printf("[DEBUG] Affinity group %s does not longer exist", d.Get("name").(string)) d.SetId("") return nil } + return err } - //Affinity group name is unique in a cloudstack account so dont need to check for multiple + // Update the config d.Set("name", ag.Name) d.Set("description", ag.Description) d.Set("type", ag.Type) @@ -103,8 +110,6 @@ func resourceCloudStackAffinityGroupDelete(d *schema.ResourceData, meta interfac // Create a new parameter struct p := cs.AffinityGroup.NewDeleteAffinityGroupParams() - - // Set id p.SetId(d.Id()) // If there is a project supplied, we retrieve and set the project id @@ -112,7 +117,7 @@ func resourceCloudStackAffinityGroupDelete(d *schema.ResourceData, meta interfac return err } - // Remove the affinity group + // Delete the affinity group _, err := cs.AffinityGroup.DeleteAffinityGroup(p) if err != nil { // This is a very poor way to be told the ID does no longer exist :( @@ -121,6 +126,7 @@ func resourceCloudStackAffinityGroupDelete(d *schema.ResourceData, meta interfac "or entity does not exist", d.Id())) { return nil } + return fmt.Errorf("Error deleting affinity group: %s", err) } diff --git a/builtin/providers/cloudstack/resource_cloudstack_affinity_group_test.go b/builtin/providers/cloudstack/resource_cloudstack_affinity_group_test.go index 75fb05949..dda3ffef8 100644 --- a/builtin/providers/cloudstack/resource_cloudstack_affinity_group_test.go +++ b/builtin/providers/cloudstack/resource_cloudstack_affinity_group_test.go @@ -2,7 +2,6 @@ package cloudstack import ( "fmt" - "strings" "testing" "github.com/hashicorp/terraform/helper/resource" @@ -19,18 +18,18 @@ func TestAccCloudStackAffinityGroup_basic(t *testing.T) { CheckDestroy: testAccCheckCloudStackAffinityGroupDestroy, Steps: []resource.TestStep{ resource.TestStep{ - Config: testAccCloudStackAffinityGroupPair, + Config: testAccCloudStackAffinityGroup, Check: resource.ComposeTestCheckFunc( - testAccCheckCloudStackAffinityGroupExists("terraform-test-affinity-group", &affinityGroup), + testAccCheckCloudStackAffinityGroupExists("cloudstack_affinity_group.foo", &affinityGroup), testAccCheckCloudStackAffinityGroupAttributes(&affinityGroup), - testAccCheckCloudStackAffinityGroupCreateAttributes("terraform-test-affinity-group"), ), }, }, }) } -func testAccCheckCloudStackAffinityGroupExists(n string, affinityGroup *cloudstack.AffinityGroup) resource.TestCheckFunc { +func testAccCheckCloudStackAffinityGroupExists( + n string, affinityGroup *cloudstack.AffinityGroup) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { @@ -42,19 +41,17 @@ func testAccCheckCloudStackAffinityGroupExists(n string, affinityGroup *cloudsta } cs := testAccProvider.Meta().(*cloudstack.CloudStackClient) - p := cs.AffinityGroup.NewListAffinityGroupsParams() - p.SetName(rs.Primary.ID) + ag, _, err := cs.AffinityGroup.GetAffinityGroupByID(rs.Primary.ID) - list, err := cs.AffinityGroup.ListAffinityGroups(p) if err != nil { return err } - if list.Count != 1 || list.AffinityGroups[0].Name != rs.Primary.ID { + if ag.Id != rs.Primary.ID { return fmt.Errorf("Affinity group not found") } - *affinityGroup = *list.AffinityGroups[0] + *affinityGroup = *ag return nil } @@ -64,40 +61,16 @@ func testAccCheckCloudStackAffinityGroupAttributes( affinityGroup *cloudstack.AffinityGroup) resource.TestCheckFunc { return func(s *terraform.State) error { - if affinityGroup.Type != CLOUDSTACK_AFFINITY_GROUP_TYPE { - return fmt.Errorf("Affinity group: Attribute type expected %s, got %s", - CLOUDSTACK_AFFINITY_GROUP_TYPE, affinityGroup.Type) + if affinityGroup.Name != "terraform-affinity-group" { + return fmt.Errorf("Bad name: %s", affinityGroup.Name) } - return nil - } -} - -func testAccCheckCloudStackAffinityGroupCreateAttributes(name string) resource.TestCheckFunc { - return func(s *terraform.State) error { - found := false - - for _, rs := range s.RootModule().Resources { - if rs.Type != "cloudstack_affinity_group" { - continue - } - - if rs.Primary.ID != name { - continue - } - - if !strings.Contains(rs.Primary.Attributes["description"], "terraform-test-description") { - return fmt.Errorf( - "Affiity group: Attribute description expected 'terraform-test-description' to be present, got %s", - rs.Primary.Attributes["description"]) - } - - found = true - break + if affinityGroup.Description != "terraform-affinity-group" { + return fmt.Errorf("Bad description: %s", affinityGroup.Description) } - if !found { - return fmt.Errorf("Could not find affinity group %s", name) + if affinityGroup.Type != "host anti-affinity" { + return fmt.Errorf("Bad type: %s", affinityGroup.Type) } return nil @@ -116,27 +89,17 @@ func testAccCheckCloudStackAffinityGroupDestroy(s *terraform.State) error { return fmt.Errorf("No affinity group ID is set") } - p := cs.AffinityGroup.NewListAffinityGroupsParams() - p.SetName(rs.Primary.ID) - - r, err := cs.AffinityGroup.ListAffinityGroups(p) - if err != nil { - return err - } - - for i := 0; i < r.Count; i++ { - if r.AffinityGroups[i].Id == rs.Primary.ID { - return fmt.Errorf("Affinity group %s still exists", rs.Primary.ID) - } + _, _, err := cs.AffinityGroup.GetAffinityGroupByID(rs.Primary.ID) + if err == nil { + return fmt.Errorf("Affinity group %s still exists", rs.Primary.ID) } } return nil } -var testAccCloudStackAffinityGroupPair = fmt.Sprintf(` +var testAccCloudStackAffinityGroup = fmt.Sprintf(` resource "cloudstack_affinity_group" "foo" { - name = "terraform-test-affinty-group" - type = "%s" - description = "terraform-test-description" -}`, CLOUDSTACK_AFFINITY_GROUP_TYPE) + name = "terraform-affinity-group" + type = "host anti-affinity" +}`) diff --git a/website/source/docs/providers/cloudstack/r/affinity_group.html.markdown b/website/source/docs/providers/cloudstack/r/affinity_group.html.markdown index b3b9820c2..147dd132d 100644 --- a/website/source/docs/providers/cloudstack/r/affinity_group.html.markdown +++ b/website/source/docs/providers/cloudstack/r/affinity_group.html.markdown @@ -14,9 +14,8 @@ Creates an affinity group. ``` resource "cloudstack_affinity_group" "default" { - name = "myGroup" - type = "anti-affinity" - project = "myProject" + name = "test-affinity-group" + type = "host anti-affinity" } ``` @@ -40,3 +39,4 @@ The following arguments are supported: The following attributes are exported: * `id` - The id of the affinity group. +* `description` - The description of the affinity group.