From 5e1c7755e63a6f0dc6e7626b4a5cd5354e38ddfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Wed, 24 Jan 2024 19:44:48 +0100 Subject: [PATCH] Fix build examples --- docs/resources/project_access.md | 5 ++- docs/resources/role.md | 15 ------- .../unleash_project_access/resource.tf | 5 ++- examples/resources/unleash_role/resource.tf | 15 ------- examples/staged/stage_4/default_project.tf | 10 ----- examples/staged/stage_4/imported_resources.tf | 42 +++++++++++++++++++ internal/provider/project_resource.go | 7 ++++ internal/provider/project_resource_test.go | 7 ++++ internal/provider/role_resource_test.go | 6 +++ internal/provider/user_resource.go | 7 ++++ internal/provider/user_resource_test.go | 28 +++++++++++++ 11 files changed, 103 insertions(+), 44 deletions(-) delete mode 100644 examples/staged/stage_4/default_project.tf create mode 100644 examples/staged/stage_4/imported_resources.tf diff --git a/docs/resources/project_access.md b/docs/resources/project_access.md index 8f840cb..6a1c3e9 100644 --- a/docs/resources/project_access.md +++ b/docs/resources/project_access.md @@ -14,8 +14,8 @@ ProjectAccess schema ```terraform import { - project = "default" - to = unleash_project_access.default_project_access + id = "default" + to = unleash_project_access.default_project_access } resource "unleash_project" "sample_project" { @@ -68,6 +68,7 @@ resource "unleash_project_access" "sample_project_access" { } resource "unleash_project_access" "default_project_access" { + project = "default" roles = [ { role = data.unleash_role.project_owner_role.id diff --git a/docs/resources/role.md b/docs/resources/role.md index 87831c7..76e6f8c 100644 --- a/docs/resources/role.md +++ b/docs/resources/role.md @@ -13,21 +13,6 @@ Role schema ## Example Usage ```terraform -import { - id = 5 - to = unleash_role.project_member_role -} - -resource "unleash_role" "project_member_role" { - permissions = [{ - name = "CREATE_PROJECT" - }, { - name = "UPDATE_PROJECT" - }, { - name = "DELETE_PROJECT" - }] -} - resource "unleash_role" "custom_root_role" { name = "A custom role" type = "root-custom" diff --git a/examples/resources/unleash_project_access/resource.tf b/examples/resources/unleash_project_access/resource.tf index cdfefb1..3e4ae36 100644 --- a/examples/resources/unleash_project_access/resource.tf +++ b/examples/resources/unleash_project_access/resource.tf @@ -1,6 +1,6 @@ import { - project = "default" - to = unleash_project_access.default_project_access + id = "default" + to = unleash_project_access.default_project_access } resource "unleash_project" "sample_project" { @@ -53,6 +53,7 @@ resource "unleash_project_access" "sample_project_access" { } resource "unleash_project_access" "default_project_access" { + project = "default" roles = [ { role = data.unleash_role.project_owner_role.id diff --git a/examples/resources/unleash_role/resource.tf b/examples/resources/unleash_role/resource.tf index 5e340b3..c341b2b 100644 --- a/examples/resources/unleash_role/resource.tf +++ b/examples/resources/unleash_role/resource.tf @@ -1,18 +1,3 @@ -import { - id = 5 - to = unleash_role.project_member_role -} - -resource "unleash_role" "project_member_role" { - permissions = [{ - name = "CREATE_PROJECT" - }, { - name = "UPDATE_PROJECT" - }, { - name = "DELETE_PROJECT" - }] -} - resource "unleash_role" "custom_root_role" { name = "A custom role" type = "root-custom" diff --git a/examples/staged/stage_4/default_project.tf b/examples/staged/stage_4/default_project.tf deleted file mode 100644 index ee5ca75..0000000 --- a/examples/staged/stage_4/default_project.tf +++ /dev/null @@ -1,10 +0,0 @@ -import { - id = "default" - to = unleash_project.default_project -} - -resource "unleash_project" "default_project" { - id = "default" - name = "Taken over by Terraform" - description = "This was default project" -} diff --git a/examples/staged/stage_4/imported_resources.tf b/examples/staged/stage_4/imported_resources.tf new file mode 100644 index 0000000..bbbc89d --- /dev/null +++ b/examples/staged/stage_4/imported_resources.tf @@ -0,0 +1,42 @@ +import { + id = "default" + to = unleash_project.default_project +} + +resource "unleash_project" "default_project" { + id = "default" + name = "Taken over by Terraform" + description = "This was default project" +} + +import { + id = 1 + to = unleash_user.admin_user +} + +resource "unleash_user" "admin_user" { + root_role = 1 + username = "admin" +} + +import { + id = "default" + to = unleash_project_access.default_project_access +} + +data "unleash_role" "project_owner_role" { + name = "Owner" +} + +resource "unleash_project_access" "default_project_access" { + project = "default" + roles = [ + { + role = data.unleash_role.project_owner_role.id + users = [ + unleash_user.admin_user.id + ] + groups = [] + }, + ] +} \ No newline at end of file diff --git a/internal/provider/project_resource.go b/internal/provider/project_resource.go index 7347b7a..f86fbcb 100644 --- a/internal/provider/project_resource.go +++ b/internal/provider/project_resource.go @@ -126,6 +126,7 @@ func (r *projectResource) Read(ctx context.Context, req resource.ReadRequest, re projects, api_response, err := r.client.ProjectsAPI.GetProjects(ctx).Execute() + tflog.Debug(ctx, "Searching for project", map[string]any{"id": state.Id.ValueString()}) var project unleash.ProjectSchema for _, p := range projects.Projects { if p.Id == state.Id.ValueString() { @@ -133,6 +134,12 @@ func (r *projectResource) Read(ctx context.Context, req resource.ReadRequest, re } } + // validate if project was found + if project.Id == "" { + resp.Diagnostics.AddError(fmt.Sprintf("Project with id %s not found", state.Id.ValueString()), "NotFound") + return + } + if !ValidateApiResponse(api_response, 200, &resp.Diagnostics, err) { return } diff --git a/internal/provider/project_resource_test.go b/internal/provider/project_resource_test.go index 7240c3c..eb91a50 100644 --- a/internal/provider/project_resource_test.go +++ b/internal/provider/project_resource_test.go @@ -58,6 +58,13 @@ func TestAccProjectResource(t *testing.T) { resource.TestCheckResourceAttrSet("unleash_project.test_project2", "name"), ), }, + { + Config: `resource "unleash_project" "newly_imported" {}`, + ImportStateId: "TestId2", + ResourceName: "unleash_project.newly_imported", + ImportState: true, + ImportStateVerify: true, + }, }, }) } diff --git a/internal/provider/role_resource_test.go b/internal/provider/role_resource_test.go index e14f6cd..0a400d8 100644 --- a/internal/provider/role_resource_test.go +++ b/internal/provider/role_resource_test.go @@ -114,6 +114,12 @@ func TestAccRoleResource(t *testing.T) { customCheckRolePermissionExists("unleash_role.project_role", "UPDATE_FEATURE_ENVIRONMENT", "development"), ), }, + { + Config: `resource "unleash_role" "project_role" {}`, + ResourceName: "unleash_role.project_role", + ImportState: true, + ImportStateVerify: true, + }, }, }) } diff --git a/internal/provider/user_resource.go b/internal/provider/user_resource.go index aefba59..03204a7 100644 --- a/internal/provider/user_resource.go +++ b/internal/provider/user_resource.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" ) @@ -93,6 +94,8 @@ func (r *userResource) Schema(_ context.Context, _ resource.SchemaRequest, resp "send_email": schema.BoolAttribute{ Description: "Send a welcome email to the customer or not. Defaults to true", Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), }, }, } @@ -199,6 +202,10 @@ func (r *userResource) Read(ctx context.Context, req resource.ReadRequest, resp } else { state.Name = types.StringNull() } + if state.SendEmail.IsNull() || state.SendEmail.IsUnknown() { + state.SendEmail = types.BoolValue(false) + } + state.RootRole = types.Int64Value(int64(*user.RootRole)) tflog.Debug(ctx, "Finished populating model", map[string]any{"success": true}) diff --git a/internal/provider/user_resource_test.go b/internal/provider/user_resource_test.go index becbc30..34a681f 100644 --- a/internal/provider/user_resource_test.go +++ b/internal/provider/user_resource_test.go @@ -74,6 +74,34 @@ func TestAccUserResource(t *testing.T) { }) } +func TestAccUserResourceImport(t *testing.T) { + if os.Getenv("UNLEASH_ENTERPRISE") != "true" { + t.Skip("Skipping enterprise tests") + } + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccSampleUserResource("Test User"), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("unleash_user.the_newbie", "id"), + resource.TestCheckResourceAttr("unleash_user.the_newbie", "name", "Test User"), + resource.TestCheckResourceAttr("unleash_user.the_newbie", "email", "test@getunleash.io"), + resource.TestCheckResourceAttr("unleash_user.the_newbie", "root_role", "2"), + // TODO test the remote object matches https://developer.hashicorp.com/terraform/plugin/testing/testing-patterns#basic-test-to-verify-attributes + ), + }, + { + Config: `resource "unleash_user" "the_newbie" {}`, + ResourceName: "unleash_user.the_newbie", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckUserResourceDestroy(s *terraform.State) error { // TODO retrieve the client from Provider configuration rather than creating a new client configuration := unleash.NewConfiguration()