diff --git a/docs/resources/account.md b/docs/resources/account.md index 6b311ed6..1ff08702 100644 --- a/docs/resources/account.md +++ b/docs/resources/account.md @@ -47,4 +47,10 @@ resource "boundary_account" "jeff" { - **name** (String, Optional) The account name. Defaults to the resource name. - **password** (String, Optional) The account password. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_account.foo +``` diff --git a/docs/resources/auth_method.md b/docs/resources/auth_method.md index f6fef688..914eb2c6 100644 --- a/docs/resources/auth_method.md +++ b/docs/resources/auth_method.md @@ -40,4 +40,10 @@ resource "boundary_auth_method" "password" { - **min_password_length** (Number, Optional) The minimum password length. - **name** (String, Optional) The auth method name. Defaults to the resource name. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_auth_method.foo +``` diff --git a/docs/resources/group.md b/docs/resources/group.md index 876fd7f4..fdffd79b 100644 --- a/docs/resources/group.md +++ b/docs/resources/group.md @@ -74,3 +74,11 @@ resource "boundary_group" "example" { - **id** (String, Optional) The ID of this resource. - **member_ids** (Set of String, Optional) Resource IDs for group members, these are most likely boundary users. - **name** (String, Optional) The group name. Defaults to the resource name. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import boundary_group.foo +``` diff --git a/docs/resources/host.md b/docs/resources/host.md index cae33a96..4a11a3f1 100644 --- a/docs/resources/host.md +++ b/docs/resources/host.md @@ -48,4 +48,10 @@ resource "boundary_host" "example" { - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The host name. Defaults to the resource name. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_host.foo +``` diff --git a/docs/resources/host_catalog.md b/docs/resources/host_catalog.md index 16951c42..66a70394 100644 --- a/docs/resources/host_catalog.md +++ b/docs/resources/host_catalog.md @@ -47,4 +47,10 @@ resource "boundary_host_catalog" "example" { - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The host catalog name. Defaults to the resource name. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_host_catalog.foo +``` diff --git a/docs/resources/host_set.md b/docs/resources/host_set.md index 0afbc3d7..bab0d496 100644 --- a/docs/resources/host_set.md +++ b/docs/resources/host_set.md @@ -69,4 +69,10 @@ resource "boundary_host_set" "web" { - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The hostset name. Defaults to the resource name. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_host_set.foo +``` diff --git a/docs/resources/role.md b/docs/resources/role.md index db79425f..59f39594 100644 --- a/docs/resources/role.md +++ b/docs/resources/role.md @@ -128,3 +128,11 @@ resource "boundary_role" "readonly" { - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The role name. Defaults to the resource name. - **principal_ids** (Set of String, Optional) A list of principal (user or group) IDs to add as principals on the role. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import boundary_role.foo +``` \ No newline at end of file diff --git a/docs/resources/scope.md b/docs/resources/scope.md index 33e3d569..13c25924 100644 --- a/docs/resources/scope.md +++ b/docs/resources/scope.md @@ -74,3 +74,11 @@ resource "boundary_role" "org_admin" { - **global_scope** (Boolean, Optional) Indicates that the scope containing this value is the global scope, which triggers some specialized behavior to allow it to be imported and managed. - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The scope name. Defaults to the resource name. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import boundary_scope.foo +``` \ No newline at end of file diff --git a/docs/resources/target.md b/docs/resources/target.md index 81439101..d5315a31 100644 --- a/docs/resources/target.md +++ b/docs/resources/target.md @@ -91,4 +91,10 @@ resource "boundary_target" "foo" { - **session_connection_limit** (Number, Optional) - **session_max_seconds** (Number, Optional) +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_target.foo +``` diff --git a/docs/resources/user.md b/docs/resources/user.md index a1e5e71c..8863b821 100644 --- a/docs/resources/user.md +++ b/docs/resources/user.md @@ -52,4 +52,10 @@ resource "boundary_user" "jeff" { - **id** (String, Optional) The ID of this resource. - **name** (String, Optional) The username. Defaults to the resource name. +## Import +Import is supported using the following syntax: + +```shell +terraform import boundary_user.foo +``` diff --git a/examples/resources/boundary_account/import.sh b/examples/resources/boundary_account/import.sh new file mode 100644 index 00000000..3cf97e7e --- /dev/null +++ b/examples/resources/boundary_account/import.sh @@ -0,0 +1 @@ +terraform import boundary_account.foo \ No newline at end of file diff --git a/examples/resources/boundary_auth_method/import.sh b/examples/resources/boundary_auth_method/import.sh new file mode 100644 index 00000000..007d91b0 --- /dev/null +++ b/examples/resources/boundary_auth_method/import.sh @@ -0,0 +1 @@ +terraform import boundary_auth_method.foo \ No newline at end of file diff --git a/examples/resources/boundary_group/import.sh b/examples/resources/boundary_group/import.sh new file mode 100644 index 00000000..b42d3bd5 --- /dev/null +++ b/examples/resources/boundary_group/import.sh @@ -0,0 +1 @@ +terraform import boundary_group.foo \ No newline at end of file diff --git a/examples/resources/boundary_host/import.sh b/examples/resources/boundary_host/import.sh new file mode 100644 index 00000000..82b82b18 --- /dev/null +++ b/examples/resources/boundary_host/import.sh @@ -0,0 +1 @@ +terraform import boundary_host.foo \ No newline at end of file diff --git a/examples/resources/boundary_host_catalog/import.sh b/examples/resources/boundary_host_catalog/import.sh new file mode 100644 index 00000000..cda5f1ea --- /dev/null +++ b/examples/resources/boundary_host_catalog/import.sh @@ -0,0 +1 @@ +terraform import boundary_host_catalog.foo \ No newline at end of file diff --git a/examples/resources/boundary_host_set/import.sh b/examples/resources/boundary_host_set/import.sh new file mode 100644 index 00000000..52a53c53 --- /dev/null +++ b/examples/resources/boundary_host_set/import.sh @@ -0,0 +1 @@ +terraform import boundary_host_set.foo \ No newline at end of file diff --git a/examples/resources/boundary_role/import.sh b/examples/resources/boundary_role/import.sh new file mode 100644 index 00000000..7913201a --- /dev/null +++ b/examples/resources/boundary_role/import.sh @@ -0,0 +1 @@ +terraform import boundary_role.foo \ No newline at end of file diff --git a/examples/resources/boundary_scope/import.sh b/examples/resources/boundary_scope/import.sh new file mode 100644 index 00000000..9e66dc8b --- /dev/null +++ b/examples/resources/boundary_scope/import.sh @@ -0,0 +1 @@ +terraform import boundary_scope.foo \ No newline at end of file diff --git a/examples/resources/boundary_target/import.sh b/examples/resources/boundary_target/import.sh new file mode 100644 index 00000000..34b63b9c --- /dev/null +++ b/examples/resources/boundary_target/import.sh @@ -0,0 +1 @@ +terraform import boundary_target.foo \ No newline at end of file diff --git a/examples/resources/boundary_user/import.sh b/examples/resources/boundary_user/import.sh new file mode 100644 index 00000000..ca7d33d9 --- /dev/null +++ b/examples/resources/boundary_user/import.sh @@ -0,0 +1 @@ +terraform import boundary_user.foo \ No newline at end of file diff --git a/internal/provider/provider_test.go b/internal/provider/provider_test.go index fb47f3ca..0d14c725 100644 --- a/internal/provider/provider_test.go +++ b/internal/provider/provider_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/testing/controller" wrapping "github.com/hashicorp/go-kms-wrapping" "github.com/hashicorp/go-kms-wrapping/wrappers/aead" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -25,10 +26,14 @@ var ( tcRecoveryKey = "7xtkEoS5EXPbgynwd+dDLHopaCqK8cq0Rpep4eooaTs=" ) -var providerFactories = map[string]func() (*schema.Provider, error){ - "boundary": func() (*schema.Provider, error) { - return New(), nil - }, +func providerFactories(p **schema.Provider) map[string]func() (*schema.Provider, error) { + // TODO: eventually rework this to real factories... + *p = New() + return map[string]func() (*schema.Provider, error){ + "boundary": func() (*schema.Provider, error) { + return *p, nil + }, + } } func testWrapper(t *testing.T, key string) wrapping.Wrapper { @@ -113,6 +118,20 @@ provider "boundary" { return strings.Join(c, "\n") } +func importStep(name string, ignore ...string) resource.TestStep { + step := resource.TestStep{ + ResourceName: name, + ImportState: true, + ImportStateVerify: true, + } + + if len(ignore) > 0 { + step.ImportStateVerifyIgnore = ignore + } + + return step +} + func TestProvider(t *testing.T) { if err := New().InternalValidate(); err != nil { t.Fatalf("err: %s", err) diff --git a/internal/provider/resource_account.go b/internal/provider/resource_account.go index dea48d40..1fb073b9 100644 --- a/internal/provider/resource_account.go +++ b/internal/provider/resource_account.go @@ -24,6 +24,10 @@ func resourceAccount() *schema.Resource { ReadContext: resourceAccountRead, UpdateContext: resourceAccountUpdate, DeleteContext: resourceAccountDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The account name. Defaults to the resource name.", diff --git a/internal/provider/resource_account_test.go b/internal/provider/resource_account_test.go index c88b4c37..b67b5453 100644 --- a/internal/provider/resource_account_test.go +++ b/internal/provider/resource_account_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/accounts" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -61,9 +62,11 @@ func TestAccAccount(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider + resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckAccountResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckAccountResourceDestroy(t, provider), Steps: []resource.TestStep{ { //create @@ -74,9 +77,10 @@ func TestAccAccount(t *testing.T) { resource.TestCheckResourceAttr("boundary_account.foo", "type", "password"), resource.TestCheckResourceAttr("boundary_account.foo", "login_name", "foo"), resource.TestCheckResourceAttr("boundary_account.foo", "password", "foofoofoo"), - testAccCheckAccountResourceExists("boundary_account.foo"), + testAccCheckAccountResourceExists(provider, "boundary_account.foo"), ), }, + importStep("boundary_account.foo", "password"), { // update Config: testConfig(url, fooOrg, fooAccountUpdate), @@ -86,14 +90,15 @@ func TestAccAccount(t *testing.T) { resource.TestCheckResourceAttr("boundary_account.foo", "type", "password"), resource.TestCheckResourceAttr("boundary_account.foo", "login_name", "foo"), resource.TestCheckResourceAttr("boundary_account.foo", "password", "foofoofoo"), - testAccCheckAccountResourceExists("boundary_account.foo"), + testAccCheckAccountResourceExists(provider, "boundary_account.foo"), ), }, + importStep("boundary_account.foo", "password"), }, }) } -func testAccCheckAccountResourceExists(name string) resource.TestCheckFunc { +func testAccCheckAccountResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -117,7 +122,7 @@ func testAccCheckAccountResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckAccountResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckAccountResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_auth_method.go b/internal/provider/resource_auth_method.go index de4ae79f..06da2155 100644 --- a/internal/provider/resource_auth_method.go +++ b/internal/provider/resource_auth_method.go @@ -25,6 +25,10 @@ func resourceAuthMethod() *schema.Resource { ReadContext: resourceAuthMethodRead, UpdateContext: resourceAuthMethodUpdate, DeleteContext: resourceAuthMethodDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The auth method name. Defaults to the resource name.", diff --git a/internal/provider/resource_auth_method_test.go b/internal/provider/resource_auth_method_test.go index 5836fd44..bcc090c0 100644 --- a/internal/provider/resource_auth_method_test.go +++ b/internal/provider/resource_auth_method_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/authmethods" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -43,9 +44,10 @@ func TestAccAuthMethod(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckAuthMethodResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckAuthMethodResourceDestroy(t, provider), Steps: []resource.TestStep{ { //create @@ -54,9 +56,10 @@ func TestAccAuthMethod(t *testing.T) { resource.TestCheckResourceAttr("boundary_auth_method.foo", "description", fooAuthMethodDesc), resource.TestCheckResourceAttr("boundary_auth_method.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_auth_method.foo", "type", "password"), - testAccCheckAuthMethodResourceExists("boundary_auth_method.foo"), + testAccCheckAuthMethodResourceExists(provider, "boundary_auth_method.foo"), ), }, + importStep("boundary_auth_method.foo"), { // update Config: testConfig(url, fooOrg, fooAuthMethodUpdate), @@ -64,14 +67,15 @@ func TestAccAuthMethod(t *testing.T) { resource.TestCheckResourceAttr("boundary_auth_method.foo", "description", fooAuthMethodDescUpdate), resource.TestCheckResourceAttr("boundary_auth_method.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_auth_method.foo", "type", "password"), - testAccCheckAuthMethodResourceExists("boundary_auth_method.foo"), + testAccCheckAuthMethodResourceExists(provider, "boundary_auth_method.foo"), ), }, + importStep("boundary_auth_method.foo"), }, }) } -func testAccCheckAuthMethodResourceExists(name string) resource.TestCheckFunc { +func testAccCheckAuthMethodResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -95,7 +99,7 @@ func testAccCheckAuthMethodResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckAuthMethodResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckAuthMethodResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_group.go b/internal/provider/resource_group.go index 2fcbb4a9..f3079a7d 100644 --- a/internal/provider/resource_group.go +++ b/internal/provider/resource_group.go @@ -22,6 +22,10 @@ func resourceGroup() *schema.Resource { ReadContext: resourceGroupRead, UpdateContext: resourceGroupUpdate, DeleteContext: resourceGroupDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The group name. Defaults to the resource name.", diff --git a/internal/provider/resource_group_test.go b/internal/provider/resource_group_test.go index 61712039..58fae30e 100644 --- a/internal/provider/resource_group_test.go +++ b/internal/provider/resource_group_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/boundary/api/groups" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -119,73 +120,81 @@ func TestAccGroup(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckGroupResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckGroupResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfigWithRecovery(url, fooOrg, orgGroup), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.org1"), + testAccCheckGroupResourceExists(provider, "boundary_group.org1"), resource.TestCheckResourceAttr("boundary_group.org1", DescriptionKey, fooGroupDescription), resource.TestCheckResourceAttr("boundary_group.org1", NameKey, "test"), ), }, + importStep("boundary_group.org1"), { // test update Config: testConfigWithRecovery(url, fooOrg, orgGroupUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.org1"), + testAccCheckGroupResourceExists(provider, "boundary_group.org1"), resource.TestCheckResourceAttr("boundary_group.org1", DescriptionKey, fooGroupDescriptionUpdate), ), }, + importStep("boundary_group.org1"), { // test update to project scope Config: testConfigWithRecovery(url, fooOrg, firstProjectFoo, orgToProjectGroupUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.org1"), + testAccCheckGroupResourceExists(provider, "boundary_group.org1"), resource.TestCheckResourceAttr("boundary_group.org1", DescriptionKey, "org1-test-to-proj"), - testAccCheckGroupScope("boundary_group.org1", "p_"), + testAccCheckGroupScope(provider, "boundary_group.org1", "p_"), ), }, + importStep("boundary_group.org1"), { // test create Config: testConfigWithRecovery(url, fooOrg, firstProjectFoo, projGroup), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.proj1"), + testAccCheckGroupResourceExists(provider, "boundary_group.proj1"), resource.TestCheckResourceAttr("boundary_group.proj1", DescriptionKey, "desc-test-proj"), resource.TestCheckResourceAttr("boundary_group.proj1", NameKey, "test-proj"), - testAccCheckGroupScope("boundary_group.proj1", "p_"), + testAccCheckGroupScope(provider, "boundary_group.proj1", "p_"), ), }, + importStep("boundary_group.proj1"), { // test update Config: testConfigWithRecovery(url, fooOrg, firstProjectFoo, projGroupUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.proj1"), + testAccCheckGroupResourceExists(provider, "boundary_group.proj1"), resource.TestCheckResourceAttr("boundary_group.proj1", DescriptionKey, "desc-test-proj-up"), - testAccCheckGroupScope("boundary_group.proj1", "p_"), + testAccCheckGroupScope(provider, "boundary_group.proj1", "p_"), ), }, + importStep("boundary_group.proj1"), { // test name removal Config: testConfigWithRecovery(url, fooOrg, firstProjectFoo, projNameRemoval), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.proj1"), + testAccCheckGroupResourceExists(provider, "boundary_group.proj1"), resource.TestCheckResourceAttr("boundary_group.proj1", NameKey, ""), - testAccCheckGroupScope("boundary_group.proj1", "p_"), + testAccCheckGroupScope(provider, "boundary_group.proj1", "p_"), ), }, + importStep("boundary_group.proj1"), { // test update to org scope Config: testConfigWithRecovery(url, fooOrg, firstProjectFoo, projToOrgGroupUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.proj1"), + testAccCheckGroupResourceExists(provider, "boundary_group.proj1"), resource.TestCheckResourceAttr("boundary_group.proj1", DescriptionKey, "desc-back"), - testAccCheckGroupScope("boundary_group.proj1", "o_"), + testAccCheckGroupScope(provider, "boundary_group.proj1", "o_"), ), }, + importStep("boundary_group.proj1"), }, }) } @@ -196,36 +205,40 @@ func TestAccGroupWithMembers(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, + ProviderFactories: providerFactories(&provider), - CheckDestroy: testAccCheckGroupResourceDestroy(t), + CheckDestroy: testAccCheckGroupResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfig(url, fooOrg, orgGroupWithMembers), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.with_members"), - testAccCheckUserResourceExists("boundary_user.org1"), + testAccCheckGroupResourceExists(provider, "boundary_group.with_members"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), resource.TestCheckResourceAttr("boundary_group.with_members", DescriptionKey, "with members"), - testAccCheckGroupResourceMembersSet("boundary_group.with_members", []string{"boundary_user.org1"}), + testAccCheckGroupResourceMembersSet(provider, "boundary_group.with_members", []string{"boundary_user.org1"}), ), }, + importStep("boundary_group.with_members"), { // test update Config: testConfig(url, fooOrg, orgGroupWithMembersUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckGroupResourceExists("boundary_group.with_members"), - testAccCheckUserResourceExists("boundary_user.org1"), + testAccCheckGroupResourceExists(provider, "boundary_group.with_members"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), resource.TestCheckResourceAttr("boundary_group.with_members", DescriptionKey, "with members"), - testAccCheckGroupResourceMembersSet("boundary_group.with_members", []string{"boundary_user.org1", "boundary_user.bar"}), + testAccCheckGroupResourceMembersSet(provider, "boundary_group.with_members", []string{"boundary_user.org1", "boundary_user.bar"}), ), }, + importStep("boundary_group.with_members"), + importStep("boundary_user.org1"), }, }) } -func testAccCheckGroupResourceMembersSet(name string, members []string) resource.TestCheckFunc { +func testAccCheckGroupResourceMembersSet(testProvider *schema.Provider, name string, members []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -284,7 +297,7 @@ func testAccCheckGroupResourceMembersSet(name string, members []string) resource } } -func testAccCheckGroupScope(name, prefix string) resource.TestCheckFunc { +func testAccCheckGroupScope(testProvider *schema.Provider, name, prefix string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -312,7 +325,7 @@ func testAccCheckGroupScope(name, prefix string) resource.TestCheckFunc { } } -func testAccCheckGroupResourceExists(name string) resource.TestCheckFunc { +func testAccCheckGroupResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -336,7 +349,7 @@ func testAccCheckGroupResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckGroupResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckGroupResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_host.go b/internal/provider/resource_host.go index 51e7a172..876b3739 100644 --- a/internal/provider/resource_host.go +++ b/internal/provider/resource_host.go @@ -25,6 +25,10 @@ func resourceHost() *schema.Resource { ReadContext: resourceHostRead, UpdateContext: resourceHostUpdate, DeleteContext: resourceHostDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The host name. Defaults to the resource name.", diff --git a/internal/provider/resource_host_catalog.go b/internal/provider/resource_host_catalog.go index 31428f91..c4c8a9cc 100644 --- a/internal/provider/resource_host_catalog.go +++ b/internal/provider/resource_host_catalog.go @@ -24,6 +24,10 @@ func resourceHostCatalog() *schema.Resource { ReadContext: resourceHostCatalogRead, UpdateContext: resourceHostCatalogUpdate, DeleteContext: resourceHostCatalogDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The host catalog name. Defaults to the resource name.", diff --git a/internal/provider/resource_host_catalog_test.go b/internal/provider/resource_host_catalog_test.go index 879e0aab..97c9a3a8 100644 --- a/internal/provider/resource_host_catalog_test.go +++ b/internal/provider/resource_host_catalog_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/hostcatalogs" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -43,33 +44,36 @@ func TestAccHostCatalogCreate(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckHostCatalogResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckHostCatalogResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfig(url, fooOrg, firstProjectFoo, projHostCatalog), Check: resource.ComposeTestCheckFunc( - testAccCheckScopeResourceExists("boundary_scope.org1"), - testAccCheckScopeResourceExists("boundary_scope.proj1"), - testAccCheckHostCatalogResourceExists("boundary_host_catalog.foo"), + testAccCheckScopeResourceExists(provider, "boundary_scope.org1"), + testAccCheckScopeResourceExists(provider, "boundary_scope.proj1"), + testAccCheckHostCatalogResourceExists(provider, "boundary_host_catalog.foo"), resource.TestCheckResourceAttr("boundary_host_catalog.foo", DescriptionKey, fooHostCatalogDescription), ), }, + importStep("boundary_host_catalog.foo"), { // test update Config: testConfig(url, fooOrg, firstProjectFoo, projHostCatalogUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckHostCatalogResourceExists("boundary_host_catalog.foo"), + testAccCheckHostCatalogResourceExists(provider, "boundary_host_catalog.foo"), resource.TestCheckResourceAttr("boundary_host_catalog.foo", DescriptionKey, fooHostCatalogDescriptionUpdate), ), }, + importStep("boundary_host_catalog.foo"), }, }) } -func testAccCheckHostCatalogResourceExists(name string) resource.TestCheckFunc { +func testAccCheckHostCatalogResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -92,7 +96,7 @@ func testAccCheckHostCatalogResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckHostCatalogResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckHostCatalogResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { md := testProvider.Meta().(*metaData) diff --git a/internal/provider/resource_host_set.go b/internal/provider/resource_host_set.go index 793cacac..1fce909b 100644 --- a/internal/provider/resource_host_set.go +++ b/internal/provider/resource_host_set.go @@ -25,6 +25,10 @@ func resourceHostset() *schema.Resource { ReadContext: resourceHostsetRead, UpdateContext: resourceHostsetUpdate, DeleteContext: resourceHostsetDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The hostset name. Defaults to the resource name.", diff --git a/internal/provider/resource_host_set_test.go b/internal/provider/resource_host_set_test.go index e1999b7c..4381121d 100644 --- a/internal/provider/resource_host_set_test.go +++ b/internal/provider/resource_host_set_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/hostsets" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -72,35 +73,38 @@ func TestAccHostset(t *testing.T) { // org := iam.TestOrg(t, tc.IamRepo()) url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckHostsetResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckHostsetResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test project hostset create Config: testConfig(url, fooOrg, firstProjectFoo, fooHostset), Check: resource.ComposeTestCheckFunc( - testAccCheckHostsetResourceExists("boundary_host_set.foo"), - testAccCheckHostsetHostIDsSet("boundary_host_set.foo", []string{"boundary_host.foo"}), + testAccCheckHostsetResourceExists(provider, "boundary_host_set.foo"), + testAccCheckHostsetHostIDsSet(provider, "boundary_host_set.foo", []string{"boundary_host.foo"}), resource.TestCheckResourceAttr("boundary_host_set.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_host_set.foo", "description", "test hostset"), ), }, + importStep("boundary_host_set.foo"), { // test project hostset update Config: testConfig(url, fooOrg, firstProjectFoo, fooHostsetUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckHostsetResourceExists("boundary_host_set.foo"), - testAccCheckHostsetHostIDsSet("boundary_host_set.foo", []string{"boundary_host.foo", "boundary_host.bar"}), + testAccCheckHostsetResourceExists(provider, "boundary_host_set.foo"), + testAccCheckHostsetHostIDsSet(provider, "boundary_host_set.foo", []string{"boundary_host.foo", "boundary_host.bar"}), resource.TestCheckResourceAttr("boundary_host_set.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_host_set.foo", "description", "test hostset"), ), }, + importStep("boundary_host_set.foo"), }, }) } -func testAccCheckHostsetResourceExists(name string) resource.TestCheckFunc { +func testAccCheckHostsetResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -123,7 +127,7 @@ func testAccCheckHostsetResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckHostsetHostIDsSet(name string, wantHostIDs []string) resource.TestCheckFunc { +func testAccCheckHostsetHostIDsSet(testProvider *schema.Provider, name string, wantHostIDs []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -181,7 +185,7 @@ func testAccCheckHostsetHostIDsSet(name string, wantHostIDs []string) resource.T } } -func testAccCheckHostsetResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckHostsetResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_host_test.go b/internal/provider/resource_host_test.go index 808f0e81..759c91c8 100644 --- a/internal/provider/resource_host_test.go +++ b/internal/provider/resource_host_test.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/boundary/api/hosts" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -61,37 +62,40 @@ func TestAccHost(t *testing.T) { // org := iam.TestOrg(t, tc.IamRepo()) url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckHostResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckHostResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test project host create Config: testConfig(url, fooOrg, firstProjectFoo, projHost), Check: resource.ComposeTestCheckFunc( - testAccCheckHostAttributeSet("boundary_host.foo", "address", fooHostAddress), - testAccCheckHostResourceExists("boundary_host.foo"), + testAccCheckHostAttributeSet(provider, "boundary_host.foo", "address", fooHostAddress), + testAccCheckHostResourceExists(provider, "boundary_host.foo"), resource.TestCheckResourceAttr("boundary_host.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_host.foo", "description", "test host"), resource.TestCheckResourceAttr("boundary_host.foo", "address", fooHostAddress), ), }, + importStep("boundary_host.foo"), { // test project host update Config: testConfig(url, fooOrg, firstProjectFoo, projHostUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckHostAttributeSet("boundary_host.foo", "address", fooHostAddressUpdate), - testAccCheckHostResourceExists("boundary_host.foo"), + testAccCheckHostAttributeSet(provider, "boundary_host.foo", "address", fooHostAddressUpdate), + testAccCheckHostResourceExists(provider, "boundary_host.foo"), resource.TestCheckResourceAttr("boundary_host.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_host.foo", "description", "test host"), resource.TestCheckResourceAttr("boundary_host.foo", "address", fooHostAddressUpdate), ), }, + importStep("boundary_host.foo"), }, }) } -func testAccCheckHostResourceExists(name string) resource.TestCheckFunc { +func testAccCheckHostResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -115,7 +119,7 @@ func testAccCheckHostResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckHostAttributeSet(name, attrKey, wantAttrVal string) resource.TestCheckFunc { +func testAccCheckHostAttributeSet(testProvider *schema.Provider, name, attrKey, wantAttrVal string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -152,7 +156,7 @@ func testAccCheckHostAttributeSet(name, attrKey, wantAttrVal string) resource.Te } } -func testAccCheckHostResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckHostResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_role.go b/internal/provider/resource_role.go index 6ddb1b7a..50484a88 100644 --- a/internal/provider/resource_role.go +++ b/internal/provider/resource_role.go @@ -25,6 +25,10 @@ func resourceRole() *schema.Resource { ReadContext: resourceRoleRead, UpdateContext: resourceRoleUpdate, DeleteContext: resourceRoleDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The role name. Defaults to the resource name.", diff --git a/internal/provider/resource_role_test.go b/internal/provider/resource_role_test.go index d7fc40a1..1ec2f08f 100644 --- a/internal/provider/resource_role_test.go +++ b/internal/provider/resource_role_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/boundary/api/roles" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -152,46 +153,51 @@ func TestAccRoleToOrgToProject(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckRoleResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckRoleResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test org role create Config: testConfig(url, fooOrg, orgRole), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.foo"), resource.TestCheckResourceAttr("boundary_role.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_role.foo", "description", fooRoleDescription), ), }, + importStep("boundary_role.foo"), { // test org role update Config: testConfig(url, fooOrg, orgRoleUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.foo"), resource.TestCheckResourceAttr("boundary_role.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_role.foo", "description", fooRoleDescriptionUpdate), ), }, + importStep("boundary_role.foo"), { // test org to project role create Config: testConfig(url, fooOrg, firstProjectFoo, projRole), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.foo"), resource.TestCheckResourceAttr("boundary_role.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_role.foo", "description", fooRoleDescription), ), }, + importStep("boundary_role.foo"), { // test project role update Config: testConfig(url, fooOrg, firstProjectFoo, projRoleUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.foo"), resource.TestCheckResourceAttr("boundary_role.foo", "name", "test"), resource.TestCheckResourceAttr("boundary_role.foo", "description", fooRoleDescriptionUpdate), ), }, + importStep("boundary_role.foo"), }, }) } @@ -201,31 +207,33 @@ func TestAccRoleWithGrants(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckRoleResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckRoleResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test project role create with grants Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithGrants), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_grants"), - testAccCheckRoleResourceGrantsSet("boundary_role.with_grants", []string{readonlyGrant}), + testAccCheckRoleResourceExists(provider, "boundary_role.with_grants"), + testAccCheckRoleResourceGrantsSet(provider, "boundary_role.with_grants", []string{readonlyGrant}), resource.TestCheckResourceAttr("boundary_role.with_grants", "name", "with_grants"), resource.TestCheckResourceAttr("boundary_role.with_grants", "description", "with grants"), ), }, + importStep("boundary_role.with_grants"), { // test project role update with grants Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithGrantsUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_grants"), - - testAccCheckRoleResourceGrantsSet("boundary_role.with_grants", []string{readonlyGrant, readonlyGrantUpdate}), + testAccCheckRoleResourceExists(provider, "boundary_role.with_grants"), + testAccCheckRoleResourceGrantsSet(provider, "boundary_role.with_grants", []string{readonlyGrant, readonlyGrantUpdate}), resource.TestCheckResourceAttr("boundary_role.with_grants", "name", "with_grants"), resource.TestCheckResourceAttr("boundary_role.with_grants", "description", "with grants"), ), }, + importStep("boundary_role.with_grants"), }, }) } @@ -235,32 +243,35 @@ func TestAccRoleWithPrincipals(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckRoleResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckRoleResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithPrincipal), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_principal"), - testAccCheckRoleResourcePrincipalsSet("boundary_role.with_principal", []string{"boundary_user.foo"}), - testAccCheckUserResourceExists("boundary_user.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.with_principal"), + testAccCheckRoleResourcePrincipalsSet(provider, "boundary_role.with_principal", []string{"boundary_user.foo"}), + testAccCheckUserResourceExists(provider, "boundary_user.foo"), resource.TestCheckResourceAttr("boundary_role.with_principal", DescriptionKey, "with principal"), resource.TestCheckResourceAttr("boundary_role.with_principal", NameKey, "with_principal"), resource.TestCheckResourceAttr("boundary_user.foo", "name", "foo"), ), }, + importStep("boundary_role.with_principal"), { // test update Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithPrincipalUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_principal"), - testAccCheckUserResourceExists("boundary_user.foo"), - testAccCheckUserResourceExists("boundary_user.bar"), - testAccCheckRoleResourcePrincipalsSet("boundary_role.with_principal", []string{"boundary_user.foo", "boundary_user.bar"}), + testAccCheckRoleResourceExists(provider, "boundary_role.with_principal"), + testAccCheckUserResourceExists(provider, "boundary_user.foo"), + testAccCheckUserResourceExists(provider, "boundary_user.bar"), + testAccCheckRoleResourcePrincipalsSet(provider, "boundary_role.with_principal", []string{"boundary_user.foo", "boundary_user.bar"}), ), }, + importStep("boundary_role.with_principal"), }, }) } @@ -270,32 +281,35 @@ func TestAccRoleWithGroups(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckRoleResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckRoleResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithGroups), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_groups"), - testAccCheckRoleResourceGroupsSet("boundary_role.with_groups", []string{"boundary_group.foo"}), - testAccCheckGroupResourceExists("boundary_group.foo"), + testAccCheckRoleResourceExists(provider, "boundary_role.with_groups"), + testAccCheckRoleResourceGroupsSet(provider, "boundary_role.with_groups", []string{"boundary_group.foo"}), + testAccCheckGroupResourceExists(provider, "boundary_group.foo"), resource.TestCheckResourceAttr("boundary_role.with_groups", DescriptionKey, "with groups"), resource.TestCheckResourceAttr("boundary_role.with_groups", NameKey, "with_groups"), resource.TestCheckResourceAttr("boundary_group.foo", "name", "foo"), ), }, + importStep("boundary_role.with_groups"), { // test update Config: testConfig(url, fooOrg, firstProjectFoo, projRoleWithGroupsUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckRoleResourceExists("boundary_role.with_groups"), - testAccCheckGroupResourceExists("boundary_group.foo"), - testAccCheckGroupResourceExists("boundary_group.bar"), - testAccCheckRoleResourceGroupsSet("boundary_role.with_groups", []string{"boundary_group.foo", "boundary_group.bar"}), + testAccCheckRoleResourceExists(provider, "boundary_role.with_groups"), + testAccCheckGroupResourceExists(provider, "boundary_group.foo"), + testAccCheckGroupResourceExists(provider, "boundary_group.bar"), + testAccCheckRoleResourceGroupsSet(provider, "boundary_role.with_groups", []string{"boundary_group.foo", "boundary_group.bar"}), ), }, + importStep("boundary_role.with_groups"), }, }) } @@ -310,7 +324,7 @@ func TestAccRoleWithGroups(t *testing.T) { // // It does check Boundary if the resource is found in state to point out any // misalignment between what is in state and the actual configuration. -func testAccCheckRoleDestroyed(name string) resource.TestCheckFunc { +func testAccCheckRoleDestroyed(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -339,7 +353,7 @@ func testAccCheckRoleDestroyed(name string) resource.TestCheckFunc { } } -func testAccCheckRoleResourceExists(name string) resource.TestCheckFunc { +func testAccCheckRoleResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -362,7 +376,7 @@ func testAccCheckRoleResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckRoleResourcePrincipalsSet(name string, principals []string) resource.TestCheckFunc { +func testAccCheckRoleResourcePrincipalsSet(testProvider *schema.Provider, name string, principals []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -419,7 +433,7 @@ func testAccCheckRoleResourcePrincipalsSet(name string, principals []string) res } } -func testAccCheckRoleResourceGroupsSet(name string, groups []string) resource.TestCheckFunc { +func testAccCheckRoleResourceGroupsSet(testProvider *schema.Provider, name string, groups []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -476,7 +490,7 @@ func testAccCheckRoleResourceGroupsSet(name string, groups []string) resource.Te } } -func testAccCheckRoleResourceGrantsSet(name string, expectedGrants []string) resource.TestCheckFunc { +func testAccCheckRoleResourceGrantsSet(testProvider *schema.Provider, name string, expectedGrants []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -517,7 +531,7 @@ func testAccCheckRoleResourceGrantsSet(name string, expectedGrants []string) res } } -func testAccCheckRoleResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckRoleResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_scope.go b/internal/provider/resource_scope.go index 19511e20..c2d94c30 100644 --- a/internal/provider/resource_scope.go +++ b/internal/provider/resource_scope.go @@ -24,6 +24,9 @@ func resourceScope() *schema.Resource { ReadContext: resourceScopeRead, UpdateContext: resourceScopeUpdate, DeleteContext: resourceScopeDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, Schema: map[string]*schema.Schema{ NameKey: { diff --git a/internal/provider/resource_scope_test.go b/internal/provider/resource_scope_test.go index 3aff757d..b650a662 100644 --- a/internal/provider/resource_scope_test.go +++ b/internal/provider/resource_scope_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/scopes" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -88,41 +89,46 @@ func TestAccScopeCreation(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckScopeResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckScopeResourceDestroy(t, provider), Steps: []resource.TestStep{ { Config: testConfig(url, fooOrg, firstProjectFoo, secondProject), Check: resource.ComposeTestCheckFunc( - testAccCheckScopeResourceExists("boundary_scope.org1"), - testAccCheckScopeResourceExists("boundary_scope.proj1"), + testAccCheckScopeResourceExists(provider, "boundary_scope.org1"), + testAccCheckScopeResourceExists(provider, "boundary_scope.proj1"), resource.TestCheckResourceAttr("boundary_scope.proj1", DescriptionKey, "foo"), resource.TestCheckResourceAttr("boundary_scope.proj2", DescriptionKey, "project2"), ), }, + importStep("boundary_scope.org1"), + importStep("boundary_scope.proj1"), // Updates the first project to have description bar { Config: testConfig(url, fooOrg, firstProjectBar, secondProject), Check: resource.ComposeTestCheckFunc( - testAccCheckScopeResourceExists("boundary_scope.proj1"), + testAccCheckScopeResourceExists(provider, "boundary_scope.proj1"), resource.TestCheckResourceAttr("boundary_scope.proj1", DescriptionKey, "bar"), resource.TestCheckResourceAttr("boundary_scope.proj2", DescriptionKey, "project2"), ), }, + importStep("boundary_scope.proj1"), // Remove second project { Config: testConfig(url, fooOrg, firstProjectBar), Check: resource.ComposeTestCheckFunc( - testAccCheckScopeResourceExists("boundary_scope.proj1"), + testAccCheckScopeResourceExists(provider, "boundary_scope.proj1"), resource.TestCheckResourceAttr("boundary_scope.proj1", DescriptionKey, "bar"), ), }, + importStep("boundary_scope.proj1"), }, }) } -func testAccCheckScopeResourceExists(name string) resource.TestCheckFunc { +func testAccCheckScopeResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -145,7 +151,7 @@ func testAccCheckScopeResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckScopeResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckScopeResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { // retrieve the connection established in Provider configuration md := testProvider.Meta().(*metaData) @@ -155,6 +161,10 @@ func testAccCheckScopeResourceDestroy(t *testing.T) resource.TestCheckFunc { id := rs.Primary.ID switch rs.Type { case "boundary_scope": + if rs.Primary.Attributes["global_scope"] == "true" { + // skip resource, its the global scope + continue + } _, err := scp.Read(context.Background(), id) if apiErr := api.AsServerError(err); apiErr == nil || apiErr.Status != http.StatusNotFound { return fmt.Errorf("Didn't get a 404 when reading destroyed resource %q: %w", id, err) diff --git a/internal/provider/resource_target.go b/internal/provider/resource_target.go index ca651aa6..ec2d35fc 100644 --- a/internal/provider/resource_target.go +++ b/internal/provider/resource_target.go @@ -28,6 +28,10 @@ func resourceTarget() *schema.Resource { ReadContext: resourceTargetRead, UpdateContext: resourceTargetUpdate, DeleteContext: resourceTargetDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The target name. Defaults to the resource name.", diff --git a/internal/provider/resource_target_test.go b/internal/provider/resource_target_test.go index ecad9d1c..35906933 100644 --- a/internal/provider/resource_target_test.go +++ b/internal/provider/resource_target_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/targets" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -89,15 +90,16 @@ func TestAccTarget(t *testing.T) { defer tc.Shutdown() url := tc.ApiAddrs()[0] + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckTargetResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckTargetResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfig(url, fooOrg, firstProjectFoo, fooHostSet, fooTarget), Check: resource.ComposeTestCheckFunc( - testAccCheckTargetResourceExists("boundary_target.foo"), + testAccCheckTargetResourceExists(provider, "boundary_target.foo"), resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription), resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"), resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"), @@ -105,22 +107,24 @@ func TestAccTarget(t *testing.T) { resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "6"), ), }, + importStep("boundary_target.foo"), { // test update Config: testConfig(url, fooOrg, firstProjectFoo, fooHostSet, fooTargetUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckTargetResourceExists("boundary_target.foo"), + testAccCheckTargetResourceExists(provider, "boundary_target.foo"), resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescriptionUpdate), resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"), resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"), resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"), ), }, + importStep("boundary_target.foo"), }, }) } -func testAccCheckTargetResourceMembersSet(name string, hostSets []string) resource.TestCheckFunc { +func testAccCheckTargetResourceMembersSet(testProvider *schema.Provider, name string, hostSets []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -177,7 +181,7 @@ func testAccCheckTargetResourceMembersSet(name string, hostSets []string) resour } } -func testAccCheckTargetResourceExists(name string) resource.TestCheckFunc { +func testAccCheckTargetResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -200,7 +204,7 @@ func testAccCheckTargetResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckTargetResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckTargetResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/internal/provider/resource_user.go b/internal/provider/resource_user.go index 5c7805c0..7aa78116 100644 --- a/internal/provider/resource_user.go +++ b/internal/provider/resource_user.go @@ -20,6 +20,10 @@ func resourceUser() *schema.Resource { ReadContext: resourceUserRead, UpdateContext: resourceUserUpdate, DeleteContext: resourceUserDelete, + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + Schema: map[string]*schema.Schema{ NameKey: { Description: "The username. Defaults to the resource name.", diff --git a/internal/provider/resource_user_test.go b/internal/provider/resource_user_test.go index 2817efdc..41331287 100644 --- a/internal/provider/resource_user_test.go +++ b/internal/provider/resource_user_test.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/boundary/api/users" "github.com/hashicorp/boundary/testing/controller" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -64,28 +65,31 @@ func TestAccUser(t *testing.T) { url := tc.ApiAddrs()[0] token := tc.Token().Token + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckUserResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckUserResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfigWithToken(url, token, fooOrg, orgUser), Check: resource.ComposeTestCheckFunc( - testAccCheckUserResourceExists("boundary_user.org1"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), resource.TestCheckResourceAttr("boundary_user.org1", DescriptionKey, fooDescription), resource.TestCheckResourceAttr("boundary_user.org1", NameKey, "test"), ), }, + importStep("boundary_user.org1"), { // test update description Config: testConfigWithToken(url, token, fooOrg, orgUserUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckUserResourceExists("boundary_user.org1"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), resource.TestCheckResourceAttr("boundary_user.org1", DescriptionKey, fooDescriptionUpdate), resource.TestCheckResourceAttr("boundary_user.org1", NameKey, "test"), ), }, + importStep("boundary_user.org1"), }, }) } @@ -96,36 +100,41 @@ func TestAccUserWithAccounts(t *testing.T) { url := tc.ApiAddrs()[0] token := tc.Token().Token + var provider *schema.Provider resource.Test(t, resource.TestCase{ - ProviderFactories: providerFactories, - CheckDestroy: testAccCheckUserResourceDestroy(t), + ProviderFactories: providerFactories(&provider), + CheckDestroy: testAccCheckUserResourceDestroy(t, provider), Steps: []resource.TestStep{ { // test create Config: testConfigWithToken(url, token, fooOrg, fooAccount, orgUserWithAccts), Check: resource.ComposeTestCheckFunc( - testAccCheckUserResourceExists("boundary_user.org1"), - testAccCheckAccountResourceExists("boundary_account.foo"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), + testAccCheckAccountResourceExists(provider, "boundary_account.foo"), resource.TestCheckResourceAttr("boundary_user.org1", DescriptionKey, "with accts"), resource.TestCheckResourceAttr("boundary_user.org1", NameKey, "test"), - testAccCheckUserResourceAccountsSet("boundary_user.org1", []string{"boundary_account.foo"}), + testAccCheckUserResourceAccountsSet(provider, "boundary_user.org1", []string{"boundary_account.foo"}), ), }, + importStep("boundary_user.org1"), + importStep("boundary_account.foo", "password"), { // test update description Config: testConfigWithToken(url, token, fooOrg, fooAccount, orgUserWithAcctsUpdate), Check: resource.ComposeTestCheckFunc( - testAccCheckUserResourceExists("boundary_user.org1"), - testAccCheckAccountResourceExists("boundary_account.foo"), + testAccCheckUserResourceExists(provider, "boundary_user.org1"), + testAccCheckAccountResourceExists(provider, "boundary_account.foo"), resource.TestCheckResourceAttr("boundary_user.org1", DescriptionKey, "with accts"), resource.TestCheckResourceAttr("boundary_user.org1", NameKey, "test"), ), }, + importStep("boundary_user.org1"), + importStep("boundary_account.foo", "password"), }, }) } -func testAccCheckUserResourceAccountsSet(name string, accounts []string) resource.TestCheckFunc { +func testAccCheckUserResourceAccountsSet(testProvider *schema.Provider, name string, accounts []string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -184,7 +193,7 @@ func testAccCheckUserResourceAccountsSet(name string, accounts []string) resourc } } -func testAccCheckUserResourceExists(name string) resource.TestCheckFunc { +func testAccCheckUserResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -208,7 +217,7 @@ func testAccCheckUserResourceExists(name string) resource.TestCheckFunc { } } -func testAccCheckUserResourceDestroy(t *testing.T) resource.TestCheckFunc { +func testAccCheckUserResourceDestroy(t *testing.T, testProvider *schema.Provider) resource.TestCheckFunc { return func(s *terraform.State) error { if testProvider.Meta() == nil { t.Fatal("got nil provider metadata") diff --git a/templates/resources/group.md.tmpl b/templates/resources/group.md.tmpl index 9bc445c9..5c0b97c5 100644 --- a/templates/resources/group.md.tmpl +++ b/templates/resources/group.md.tmpl @@ -18,3 +18,9 @@ Usage for project-specific group: {{tffile "examples/resources/boundary_group/project-specific/resource.tf"}} {{ .SchemaMarkdown | trimspace }} + +## Import + +Import is supported using the following syntax: + +{{codefile "shell" "examples/resources/boundary_group/import.sh" }} diff --git a/templates/resources/role.md.tmpl b/templates/resources/role.md.tmpl index 49229441..71a725af 100644 --- a/templates/resources/role.md.tmpl +++ b/templates/resources/role.md.tmpl @@ -28,3 +28,9 @@ Usage for a project-specific role: {{tffile "examples/resources/boundary_role/project-specific/resource.tf"}} {{ .SchemaMarkdown | trimspace }} + +## Import + +Import is supported using the following syntax: + +{{codefile "shell" "examples/resources/boundary_role/import.sh" }} \ No newline at end of file diff --git a/templates/resources/scope.md.tmpl b/templates/resources/scope.md.tmpl index aad4f285..5d4d2feb 100644 --- a/templates/resources/scope.md.tmpl +++ b/templates/resources/scope.md.tmpl @@ -28,3 +28,9 @@ Creating an organization scope with a managed role for administration (auto crea {{tffile "examples/resources/boundary_scope/role.tf"}} {{ .SchemaMarkdown | trimspace }} + +## Import + +Import is supported using the following syntax: + +{{codefile "shell" "examples/resources/boundary_scope/import.sh" }} \ No newline at end of file