-
Notifications
You must be signed in to change notification settings - Fork 72
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add placement_groups * add resource_test for placement_group * Bump hcloud-go version * Update docs
- Loading branch information
Showing
21 changed files
with
776 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
package placementgroup | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/e2etests" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/placementgroup" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/testsupport" | ||
|
||
"github.com/hetznercloud/terraform-provider-hcloud/internal/testtemplate" | ||
) | ||
|
||
func TestAccHcloudDataSourcePlacementGroupTest(t *testing.T) { | ||
tmplMan := testtemplate.Manager{} | ||
|
||
res := placementgroup.NewRData(t, "basic-placement-group", "spread") | ||
res.SetRName("placement-group-ds-test") | ||
|
||
placementGroupByName := &placementgroup.DData{ | ||
PlacementGroupName: res.TFID() + ".name", | ||
} | ||
placementGroupByName.SetRName("placement_group_by_name") | ||
|
||
placementGroupByID := &placementgroup.DData{ | ||
PlacementGroupID: res.TFID() + ".id", | ||
} | ||
placementGroupByID.SetRName("placement_group_by_id") | ||
|
||
placementGroupBySel := &placementgroup.DData{ | ||
LabelSelector: fmt.Sprintf("key=${%s.labels[\"key\"]}", res.TFID()), | ||
} | ||
placementGroupBySel.SetRName("placement_group_by_sel") | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: e2etests.PreCheck(t), | ||
Providers: e2etests.Providers(), | ||
CheckDestroy: testsupport.CheckResourcesDestroyed(placementgroup.ResourceType, placementgroup.ByID(t, nil)), | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: tmplMan.Render(t, | ||
"testdata/r/hcloud_placement_group", res, | ||
), | ||
}, | ||
{ | ||
Config: tmplMan.Render(t, | ||
"testdata/r/hcloud_placement_group", res, | ||
"testdata/d/hcloud_placement_group", placementGroupByName, | ||
"testdata/d/hcloud_placement_group", placementGroupByID, | ||
"testdata/d/hcloud_placement_group", placementGroupBySel, | ||
), | ||
|
||
Check: resource.ComposeTestCheckFunc( | ||
resource.TestCheckResourceAttr(placementGroupByName.TFID(), | ||
"name", fmt.Sprintf("%s--%d", res.Name, tmplMan.RandInt)), | ||
|
||
resource.TestCheckResourceAttr(placementGroupByID.TFID(), | ||
"name", fmt.Sprintf("%s--%d", res.Name, tmplMan.RandInt)), | ||
|
||
resource.TestCheckResourceAttr(placementGroupBySel.TFID(), | ||
"name", fmt.Sprintf("%s--%d", res.Name, tmplMan.RandInt)), | ||
), | ||
}, | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package placementgroup | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" | ||
"github.com/hetznercloud/hcloud-go/hcloud" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/e2etests" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/placementgroup" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/testsupport" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/testtemplate" | ||
) | ||
|
||
func TestPlacementGroupResource_Basic(t *testing.T) { | ||
var g hcloud.PlacementGroup | ||
|
||
res := placementgroup.NewRData(t, "basic-placement-group", "spread") | ||
resRenamed := &placementgroup.RData{ | ||
Name: res.Name + "-renamed", | ||
Type: "spread", | ||
Labels: map[string]string{ | ||
"key1": "value1", | ||
"key2": "value2", | ||
}, | ||
} | ||
resRenamed.SetRName(res.RName()) | ||
|
||
updated := placementgroup.NewRData(t, "basic-placement-group", "spread") | ||
updated.SetRName(res.RName()) | ||
tmplMan := testtemplate.Manager{} | ||
resource.Test(t, resource.TestCase{ | ||
PreCheck: e2etests.PreCheck(t), | ||
Providers: e2etests.Providers(), | ||
CheckDestroy: testsupport.CheckResourcesDestroyed(placementgroup.ResourceType, placementgroup.ByID(t, &g)), | ||
Steps: []resource.TestStep{ | ||
{ | ||
// Create a new Placement Group using the required values | ||
// only. | ||
Config: tmplMan.Render(t, "testdata/r/hcloud_placement_group", res), | ||
Check: resource.ComposeTestCheckFunc( | ||
testsupport.CheckResourceExists(res.TFID(), placementgroup.ByID(t, &g)), | ||
resource.TestCheckResourceAttr(res.TFID(), "name", | ||
fmt.Sprintf("basic-placement-group--%d", tmplMan.RandInt)), | ||
resource.TestCheckResourceAttr(res.TFID(), "type", "spread"), | ||
), | ||
}, | ||
{ | ||
// Try to import the newly created Placement Group | ||
ResourceName: res.TFID(), | ||
ImportState: true, | ||
ImportStateVerify: true, | ||
}, | ||
{ | ||
// Update the Placement Group created in the previous step by | ||
// setting all optional fields and renaming the volume. | ||
Config: tmplMan.Render(t, | ||
"testdata/r/hcloud_placement_group", resRenamed, | ||
), | ||
Check: resource.ComposeAggregateTestCheckFunc( | ||
resource.TestCheckResourceAttr(resRenamed.TFID(), "name", | ||
fmt.Sprintf("basic-placement-group-renamed--%d", tmplMan.RandInt)), | ||
resource.TestCheckResourceAttr(resRenamed.TFID(), "labels.key1", "value1"), | ||
resource.TestCheckResourceAttr(resRenamed.TFID(), "labels.key2", "value2"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
package placementgroup | ||
|
||
import ( | ||
"log" | ||
"sort" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||
"github.com/hetznercloud/hcloud-go/hcloud" | ||
"github.com/hetznercloud/terraform-provider-hcloud/internal/hcclient" | ||
"golang.org/x/net/context" | ||
) | ||
|
||
const DataSourceType = "hcloud_placement_group" | ||
|
||
func DataSource() *schema.Resource { | ||
return &schema.Resource{ | ||
ReadContext: dataSourceHcloudPlacementGroupRead, | ||
Schema: map[string]*schema.Schema{ | ||
"id": { | ||
Type: schema.TypeInt, | ||
Optional: true, | ||
}, | ||
"name": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Computed: true, | ||
}, | ||
"labels": { | ||
Type: schema.TypeMap, | ||
Optional: true, | ||
}, | ||
"servers": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Elem: &schema.Schema{ | ||
Type: schema.TypeInt, | ||
}, | ||
}, | ||
"type": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
}, | ||
"most_recent": { | ||
Type: schema.TypeBool, | ||
Optional: true, | ||
}, | ||
"with_selector": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func dataSourceHcloudPlacementGroupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { | ||
client := m.(*hcloud.Client) | ||
if id, ok := d.GetOk("id"); ok { | ||
i, _, err := client.PlacementGroup.GetByID(ctx, id.(int)) | ||
if err != nil { | ||
return hcclient.ErrorToDiag(err) | ||
} | ||
if i == nil { | ||
return diag.Errorf("no placement group found with id %d", id) | ||
} | ||
setSchema(d, i) | ||
return nil | ||
} | ||
if name, ok := d.GetOk("name"); ok { | ||
i, _, err := client.PlacementGroup.GetByName(ctx, name.(string)) | ||
if err != nil { | ||
return hcclient.ErrorToDiag(err) | ||
} | ||
if i == nil { | ||
return diag.Errorf("no placement group found with name %v", name) | ||
} | ||
setSchema(d, i) | ||
return nil | ||
} | ||
if selector, ok := d.GetOk("with_selector"); ok { | ||
var allPlacementGroups []*hcloud.PlacementGroup | ||
|
||
opts := hcloud.PlacementGroupListOpts{ListOpts: hcloud.ListOpts{LabelSelector: selector.(string)}} | ||
allPlacementGroups, err := client.PlacementGroup.AllWithOpts(ctx, opts) | ||
if err != nil { | ||
return hcclient.ErrorToDiag(err) | ||
} | ||
if len(allPlacementGroups) == 0 { | ||
return diag.Errorf("no placement group found for selector %q", selector) | ||
} | ||
if len(allPlacementGroups) > 1 { | ||
if _, ok := d.GetOk("most_recent"); !ok { | ||
return diag.Errorf("more than one placement group found for selector %q", selector) | ||
} | ||
sortPlacementGroupListByCreated(allPlacementGroups) | ||
log.Printf("[INFO] %d placement groups found for selector %q, using %d as the most recent one", len(allPlacementGroups), selector, allPlacementGroups[0].ID) | ||
} | ||
setSchema(d, allPlacementGroups[0]) | ||
return nil | ||
} | ||
return diag.Errorf("please specify an id, a name or a selector to lookup the placement group") | ||
} | ||
|
||
func sortPlacementGroupListByCreated(placementGroupList []*hcloud.PlacementGroup) { | ||
sort.Slice(placementGroupList, func(i, j int) bool { | ||
return placementGroupList[i].Created.After(placementGroupList[j].Created) | ||
}) | ||
} |
Oops, something went wrong.