From e7e71511b21eca440f3b180e78de48bb38fade0b Mon Sep 17 00:00:00 2001 From: Tomer Heber Date: Fri, 30 Jun 2023 12:42:13 -0500 Subject: [PATCH 1/2] Feat: environment Role assignments for Team --- client/api_client.go | 3 + client/api_client_mock.go | 44 ++++ client/team_environment_assignment.go | 37 +++ client/team_environment_assignment_test.go | 136 +++++++++++ env0/provider.go | 1 + env0/resource_team_environment_assignment.go | 118 ++++++++++ ...source_team_environment_assignment_test.go | 220 ++++++++++++++++++ .../resource.tf | 31 +++ .../env0_workflow_triggers copy/resource.tf | 32 +++ tests/integration/012_environment/main.tf | 9 + 10 files changed, 631 insertions(+) create mode 100644 client/team_environment_assignment.go create mode 100644 client/team_environment_assignment_test.go create mode 100644 env0/resource_team_environment_assignment.go create mode 100644 env0/resource_team_environment_assignment_test.go create mode 100644 examples/resources/env0_team_environment_assignment/resource.tf create mode 100644 examples/resources/env0_workflow_triggers copy/resource.tf diff --git a/client/api_client.go b/client/api_client.go index a81909a8..930d545e 100644 --- a/client/api_client.go +++ b/client/api_client.go @@ -133,6 +133,9 @@ type ApiClientInterface interface { AssignUserRoleToEnvironment(payload *AssignUserRoleToEnvironmentPayload) (*UserRoleEnvironmentAssignment, error) RemoveUserRoleFromEnvironment(environmentId string, userId string) error UserRoleEnvironmentAssignments(environmentId string) ([]UserRoleEnvironmentAssignment, error) + AssignTeamRoleToEnvironment(payload *AssignTeamRoleToEnvironmentPayload) (*TeamRoleEnvironmentAssignment, error) + RemoveTeamRoleFromEnvironment(environmentId string, teamId string) error + TeamRoleEnvironmentAssignments(environmentId string) ([]TeamRoleEnvironmentAssignment, error) } func NewApiClient(client http.HttpClientInterface, defaultOrganizationId string) ApiClientInterface { diff --git a/client/api_client_mock.go b/client/api_client_mock.go index f71e70e0..d8d98cae 100644 --- a/client/api_client_mock.go +++ b/client/api_client_mock.go @@ -152,6 +152,21 @@ func (mr *MockApiClientInterfaceMockRecorder) AssignCostCredentialsToProject(arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignCostCredentialsToProject", reflect.TypeOf((*MockApiClientInterface)(nil).AssignCostCredentialsToProject), arg0, arg1) } +// AssignTeamRoleToEnvironment mocks base method. +func (m *MockApiClientInterface) AssignTeamRoleToEnvironment(arg0 *AssignTeamRoleToEnvironmentPayload) (*TeamRoleEnvironmentAssignment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AssignTeamRoleToEnvironment", arg0) + ret0, _ := ret[0].(*TeamRoleEnvironmentAssignment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AssignTeamRoleToEnvironment indicates an expected call of AssignTeamRoleToEnvironment. +func (mr *MockApiClientInterfaceMockRecorder) AssignTeamRoleToEnvironment(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignTeamRoleToEnvironment", reflect.TypeOf((*MockApiClientInterface)(nil).AssignTeamRoleToEnvironment), arg0) +} + // AssignTemplateToProject mocks base method. func (m *MockApiClientInterface) AssignTemplateToProject(arg0 string, arg1 TemplateAssignmentToProjectPayload) (Template, error) { m.ctrl.T.Helper() @@ -1304,6 +1319,20 @@ func (mr *MockApiClientInterfaceMockRecorder) RemoveCostCredentialsFromProject(a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveCostCredentialsFromProject", reflect.TypeOf((*MockApiClientInterface)(nil).RemoveCostCredentialsFromProject), arg0, arg1) } +// RemoveTeamRoleFromEnvironment mocks base method. +func (m *MockApiClientInterface) RemoveTeamRoleFromEnvironment(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveTeamRoleFromEnvironment", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// RemoveTeamRoleFromEnvironment indicates an expected call of RemoveTeamRoleFromEnvironment. +func (mr *MockApiClientInterfaceMockRecorder) RemoveTeamRoleFromEnvironment(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveTeamRoleFromEnvironment", reflect.TypeOf((*MockApiClientInterface)(nil).RemoveTeamRoleFromEnvironment), arg0, arg1) +} + // RemoveTemplateFromProject mocks base method. func (m *MockApiClientInterface) RemoveTemplateFromProject(arg0, arg1 string) error { m.ctrl.T.Helper() @@ -1566,6 +1595,21 @@ func (mr *MockApiClientInterfaceMockRecorder) TeamProjectAssignments(arg0 interf return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TeamProjectAssignments", reflect.TypeOf((*MockApiClientInterface)(nil).TeamProjectAssignments), arg0) } +// TeamRoleEnvironmentAssignments mocks base method. +func (m *MockApiClientInterface) TeamRoleEnvironmentAssignments(arg0 string) ([]TeamRoleEnvironmentAssignment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TeamRoleEnvironmentAssignments", arg0) + ret0, _ := ret[0].([]TeamRoleEnvironmentAssignment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TeamRoleEnvironmentAssignments indicates an expected call of TeamRoleEnvironmentAssignments. +func (mr *MockApiClientInterfaceMockRecorder) TeamRoleEnvironmentAssignments(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TeamRoleEnvironmentAssignments", reflect.TypeOf((*MockApiClientInterface)(nil).TeamRoleEnvironmentAssignments), arg0) +} + // TeamUpdate mocks base method. func (m *MockApiClientInterface) TeamUpdate(arg0 string, arg1 TeamUpdatePayload) (Team, error) { m.ctrl.T.Helper() diff --git a/client/team_environment_assignment.go b/client/team_environment_assignment.go new file mode 100644 index 00000000..dc4b23bd --- /dev/null +++ b/client/team_environment_assignment.go @@ -0,0 +1,37 @@ +package client + +type AssignTeamRoleToEnvironmentPayload struct { + TeamId string `json:"teamId"` + Role string `json:"role" tfschema:"role_id"` + EnvironmentId string `json:"environmentId"` +} + +type TeamRoleEnvironmentAssignment struct { + TeamId string `json:"teamId"` + Role string `json:"role" tfschema:"role_id"` + Id string `json:"id"` +} + +func (client *ApiClient) AssignTeamRoleToEnvironment(payload *AssignTeamRoleToEnvironmentPayload) (*TeamRoleEnvironmentAssignment, error) { + var result TeamRoleEnvironmentAssignment + + if err := client.http.Put("/roles/assignments/teams", payload, &result); err != nil { + return nil, err + } + + return &result, nil +} + +func (client *ApiClient) RemoveTeamRoleFromEnvironment(environmentId string, teamId string) error { + return client.http.Delete("/roles/assignments/teams", map[string]string{"environmentId": environmentId, "teamId": teamId}) +} + +func (client *ApiClient) TeamRoleEnvironmentAssignments(environmentId string) ([]TeamRoleEnvironmentAssignment, error) { + var result []TeamRoleEnvironmentAssignment + + if err := client.http.Get("/roles/assignments/teams", map[string]string{"environmentId": environmentId}, &result); err != nil { + return nil, err + } + + return result, nil +} diff --git a/client/team_environment_assignment_test.go b/client/team_environment_assignment_test.go new file mode 100644 index 00000000..e2126cad --- /dev/null +++ b/client/team_environment_assignment_test.go @@ -0,0 +1,136 @@ +package client_test + +import ( + "errors" + + . "github.com/env0/terraform-provider-env0/client" + "github.com/golang/mock/gomock" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Team Envrionment Assignment", func() { + environmentId := "environmentId" + teamId := "teamId" + + assignPayload := &AssignTeamRoleToEnvironmentPayload{ + TeamId: teamId, + EnvironmentId: environmentId, + Role: "role1", + } + + expectedResponse := &TeamRoleEnvironmentAssignment{ + Id: "id", + } + + errorMock := errors.New("error") + + Describe("AssignTeamToEnvironment", func() { + + Describe("Successful", func() { + var actualResult *TeamRoleEnvironmentAssignment + var err error + + BeforeEach(func() { + httpCall = mockHttpClient.EXPECT(). + Put("/roles/assignments/teams", assignPayload, gomock.Any()). + Do(func(path string, request interface{}, response *TeamRoleEnvironmentAssignment) { + *response = *expectedResponse + }).Times(1) + actualResult, err = apiClient.AssignTeamRoleToEnvironment(assignPayload) + + }) + + It("Should send POST request with params", func() { + httpCall.Times(1) + }) + + It("should return the PUT result", func() { + Expect(*actualResult).To(Equal(*expectedResponse)) + }) + + It("Should not return error", func() { + Expect(err).To(BeNil()) + }) + }) + + Describe("Failure", func() { + var actualResult *TeamRoleEnvironmentAssignment + var err error + + BeforeEach(func() { + httpCall = mockHttpClient.EXPECT(). + Put("/roles/assignments/teams", gomock.Any(), gomock.Any()).Return(errorMock) + actualResult, err = apiClient.AssignTeamRoleToEnvironment(assignPayload) + }) + + It("Should fail if API call fails", func() { + Expect(err).To(Equal(errorMock)) + }) + + It("Should not return results", func() { + Expect(actualResult).To(BeNil()) + }) + }) + }) + + Describe("RemoveTeamFromEnvironment", func() { + BeforeEach(func() { + httpCall = mockHttpClient.EXPECT().Delete("/roles/assignments/teams", map[string]string{"environmentId": environmentId, "teamId": teamId}) + apiClient.RemoveTeamRoleFromEnvironment(environmentId, teamId) + }) + + It("Should send DELETE request with assignment id", func() { + httpCall.Times(1) + }) + }) + + Describe("TeamEnvironmentAssignments", func() { + + Describe("Successful", func() { + var actualResult []TeamRoleEnvironmentAssignment + var err error + + BeforeEach(func() { + httpCall = mockHttpClient.EXPECT(). + Get("/roles/assignments/teams", map[string]string{"environmentId": environmentId}, gomock.Any()). + Do(func(path string, request interface{}, response *[]TeamRoleEnvironmentAssignment) { + *response = []TeamRoleEnvironmentAssignment{*expectedResponse} + }).Times(1) + actualResult, err = apiClient.TeamRoleEnvironmentAssignments(environmentId) + + }) + + It("Should send GET request with params", func() { + httpCall.Times(1) + }) + + It("should return the GET result", func() { + Expect(actualResult).To(Equal([]TeamRoleEnvironmentAssignment{*expectedResponse})) + }) + + It("Should not return error", func() { + Expect(err).To(BeNil()) + }) + }) + + Describe("Failure", func() { + var actualResult []TeamRoleEnvironmentAssignment + var err error + + BeforeEach(func() { + httpCall = mockHttpClient.EXPECT(). + Get("/roles/assignments/teams", map[string]string{"environmentId": environmentId}, gomock.Any()).Return(errorMock) + actualResult, err = apiClient.TeamRoleEnvironmentAssignments(environmentId) + }) + + It("Should fail if API call fails", func() { + Expect(err).To(Equal(errorMock)) + }) + + It("Should not return results", func() { + Expect(actualResult).To(BeNil()) + }) + }) + }) +}) diff --git a/env0/provider.go b/env0/provider.go index e25d7d16..786c67f3 100644 --- a/env0/provider.go +++ b/env0/provider.go @@ -131,6 +131,7 @@ func Provider(version string) plugin.ProviderFunc { "env0_gpg_key": resourceGpgKey(), "env0_provider": resourceProvider(), "env0_user_environment_assignment": resourceUserEnvironmentAssignment(), + "env0_team_environment_assignment": resourceTeamEnvironmentAssignment(), }, } diff --git a/env0/resource_team_environment_assignment.go b/env0/resource_team_environment_assignment.go new file mode 100644 index 00000000..8111e77e --- /dev/null +++ b/env0/resource_team_environment_assignment.go @@ -0,0 +1,118 @@ +package env0 + +import ( + "context" + "log" + + "github.com/env0/terraform-provider-env0/client" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func resourceTeamEnvironmentAssignment() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceTeamEnvironmentAssignmentCreate, + UpdateContext: resourceTeamEnvironmentAssignmentUpdate, + ReadContext: resourceTeamEnvironmentAssignmentRead, + DeleteContext: resourceTeamEnvironmentAssignmentDelete, + + Schema: map[string]*schema.Schema{ + "team_id": { + Type: schema.TypeString, + Description: "id of the team", + Required: true, + ForceNew: true, + }, + "environment_id": { + Type: schema.TypeString, + Description: "id of the environment", + Required: true, + ForceNew: true, + }, + "role_id": { + Type: schema.TypeString, + Description: "id of the assigned role", + Required: true, + ValidateDiagFunc: ValidateNotEmptyString, + }, + }, + } +} + +func resourceTeamEnvironmentAssignmentCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var newAssignment client.AssignTeamRoleToEnvironmentPayload + if err := readResourceData(&newAssignment, d); err != nil { + return diag.Errorf("schema resource data deserialization failed: %v", err) + } + + client := meta.(client.ApiClientInterface) + + assignment, err := client.AssignTeamRoleToEnvironment(&newAssignment) + if err != nil { + return diag.Errorf("could not create assignment: %v", err) + } + + d.SetId(assignment.Id) + + return nil +} + +func resourceTeamEnvironmentAssignmentRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + client := meta.(client.ApiClientInterface) + + id := d.Id() + environmentId := d.Get("environment_id").(string) + + assignments, err := client.TeamRoleEnvironmentAssignments(environmentId) + if err != nil { + return diag.Errorf("could not get assignments: %v", err) + } + + for _, assignment := range assignments { + if assignment.Id == id { + if err := writeResourceData(&assignment, d); err != nil { + return diag.Errorf("schema resource data serialization failed: %v", err) + } + + d.Set("role_id", assignment.Role) + + return nil + } + } + + log.Printf("[WARN] Drift Detected: Terraform will remove %s from state", d.Id()) + d.SetId("") + + return nil +} + +func resourceTeamEnvironmentAssignmentUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var payload client.AssignTeamRoleToEnvironmentPayload + if err := readResourceData(&payload, d); err != nil { + return diag.Errorf("schema resource data deserialization failed: %v", err) + } + + client := meta.(client.ApiClientInterface) + + assignment, err := client.AssignTeamRoleToEnvironment(&payload) + if err != nil { + return diag.Errorf("could not update assignment: %v", err) + } + + d.SetId(assignment.Id) + + return nil +} + +func resourceTeamEnvironmentAssignmentDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + environmentId := d.Get("environment_id").(string) + teamId := d.Get("team_id").(string) + + client := meta.(client.ApiClientInterface) + + if err := client.RemoveTeamRoleFromEnvironment(environmentId, teamId); err != nil { + return diag.Errorf("could not delete assignment: %v", err) + } + + return nil +} diff --git a/env0/resource_team_environment_assignment_test.go b/env0/resource_team_environment_assignment_test.go new file mode 100644 index 00000000..0057e795 --- /dev/null +++ b/env0/resource_team_environment_assignment_test.go @@ -0,0 +1,220 @@ +package env0 + +import ( + "errors" + "regexp" + "testing" + + "github.com/env0/terraform-provider-env0/client" + "github.com/golang/mock/gomock" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestUnitTeamEnvironmntAssignmentResource(t *testing.T) { + teamId := "tid" + environmentId := "eid" + id := "id" + role := "rid1" + updatedRole := "rid2" + + createPayload := client.AssignTeamRoleToEnvironmentPayload{ + TeamId: teamId, + Role: role, + EnvironmentId: environmentId, + } + + updatePayload := client.AssignTeamRoleToEnvironmentPayload{ + TeamId: teamId, + Role: updatedRole, + EnvironmentId: environmentId, + } + + createResponse := client.TeamRoleEnvironmentAssignment{ + Id: id, + TeamId: teamId, + Role: role, + } + + updateResponse := client.TeamRoleEnvironmentAssignment{ + Id: id, + TeamId: teamId, + Role: updatedRole, + } + + otherResponse := client.TeamRoleEnvironmentAssignment{ + Id: "id2", + TeamId: "teamId2", + Role: "dasdasd", + } + + resourceType := "env0_team_environment_assignment" + resourceName := "test" + accessor := resourceAccessor(resourceType, resourceName) + + t.Run("Create assignment and update role", func(t *testing.T) { + testCase := resource.TestCase{ + Steps: []resource.TestStep{ + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(accessor, "id", id), + resource.TestCheckResourceAttr(accessor, "team_id", teamId), + resource.TestCheckResourceAttr(accessor, "environment_id", environmentId), + resource.TestCheckResourceAttr(accessor, "role_id", role), + ), + }, + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": updatedRole, + }), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(accessor, "id", id), + resource.TestCheckResourceAttr(accessor, "team_id", teamId), + resource.TestCheckResourceAttr(accessor, "environment_id", environmentId), + resource.TestCheckResourceAttr(accessor, "role_id", updatedRole), + ), + }, + }, + } + + runUnitTest(t, testCase, func(mock *client.MockApiClientInterface) { + gomock.InOrder( + mock.EXPECT().AssignTeamRoleToEnvironment(&createPayload).Times(1).Return(&createResponse, nil), + mock.EXPECT().TeamRoleEnvironmentAssignments(environmentId).Times(2).Return([]client.TeamRoleEnvironmentAssignment{otherResponse, createResponse}, nil), + mock.EXPECT().AssignTeamRoleToEnvironment(&updatePayload).Times(1).Return(&updateResponse, nil), + mock.EXPECT().TeamRoleEnvironmentAssignments(environmentId).Times(1).Return([]client.TeamRoleEnvironmentAssignment{otherResponse, updateResponse}, nil), + mock.EXPECT().RemoveTeamRoleFromEnvironment(environmentId, teamId).Times(1).Return(nil), + ) + }) + }) + + t.Run("Create Assignment - drift detected", func(t *testing.T) { + testCase := resource.TestCase{ + Steps: []resource.TestStep{ + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(accessor, "id", id), + resource.TestCheckResourceAttr(accessor, "team_id", teamId), + resource.TestCheckResourceAttr(accessor, "environment_id", environmentId), + resource.TestCheckResourceAttr(accessor, "role_id", role), + ), + ExpectNonEmptyPlan: true, + }, + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(accessor, "id", id), + resource.TestCheckResourceAttr(accessor, "team_id", teamId), + resource.TestCheckResourceAttr(accessor, "environment_id", environmentId), + resource.TestCheckResourceAttr(accessor, "role_id", role), + ), + PlanOnly: true, + ExpectNonEmptyPlan: true, + }, + }, + } + + runUnitTest(t, testCase, func(mock *client.MockApiClientInterface) { + gomock.InOrder( + mock.EXPECT().AssignTeamRoleToEnvironment(&createPayload).Times(1).Return(&createResponse, nil), + mock.EXPECT().TeamRoleEnvironmentAssignments(environmentId).Times(1).Return([]client.TeamRoleEnvironmentAssignment{otherResponse}, nil), + ) + }) + }) + + t.Run("Create Assignment - failed to create", func(t *testing.T) { + testCase := resource.TestCase{ + Steps: []resource.TestStep{ + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + ExpectError: regexp.MustCompile("could not create assignment: error"), + }, + }, + } + + runUnitTest(t, testCase, func(mock *client.MockApiClientInterface) { + gomock.InOrder( + mock.EXPECT().AssignTeamRoleToEnvironment(&createPayload).Times(1).Return(nil, errors.New("error")), + ) + }) + }) + + t.Run("Create Assignment - failed to list assignments", func(t *testing.T) { + testCase := resource.TestCase{ + Steps: []resource.TestStep{ + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + ExpectError: regexp.MustCompile("could not get assignments: error"), + }, + }, + } + + runUnitTest(t, testCase, func(mock *client.MockApiClientInterface) { + gomock.InOrder( + mock.EXPECT().AssignTeamRoleToEnvironment(&createPayload).Times(1).Return(&createResponse, nil), + mock.EXPECT().TeamRoleEnvironmentAssignments(environmentId).Times(1).Return(nil, errors.New("error")), + mock.EXPECT().RemoveTeamRoleFromEnvironment(environmentId, teamId).Times(1).Return(nil), + ) + }) + }) + + t.Run("Create Assignment and update role - failed to update role", func(t *testing.T) { + testCase := resource.TestCase{ + Steps: []resource.TestStep{ + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": role, + }), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(accessor, "id", id), + resource.TestCheckResourceAttr(accessor, "team_id", teamId), + resource.TestCheckResourceAttr(accessor, "environment_id", environmentId), + resource.TestCheckResourceAttr(accessor, "role_id", role), + ), + }, + { + Config: resourceConfigCreate(resourceType, resourceName, map[string]interface{}{ + "team_id": teamId, + "environment_id": environmentId, + "role_id": updatedRole, + }), + ExpectError: regexp.MustCompile("could not update assignment: error"), + }, + }, + } + + runUnitTest(t, testCase, func(mock *client.MockApiClientInterface) { + gomock.InOrder( + mock.EXPECT().AssignTeamRoleToEnvironment(&createPayload).Times(1).Return(&createResponse, nil), + mock.EXPECT().TeamRoleEnvironmentAssignments(environmentId).Times(2).Return([]client.TeamRoleEnvironmentAssignment{otherResponse, createResponse}, nil), + mock.EXPECT().AssignTeamRoleToEnvironment(&updatePayload).Times(1).Return(nil, errors.New("error")), + mock.EXPECT().RemoveTeamRoleFromEnvironment(environmentId, teamId).Times(1).Return(nil), + ) + }) + }) +} diff --git a/examples/resources/env0_team_environment_assignment/resource.tf b/examples/resources/env0_team_environment_assignment/resource.tf new file mode 100644 index 00000000..b4005a15 --- /dev/null +++ b/examples/resources/env0_team_environment_assignment/resource.tf @@ -0,0 +1,31 @@ +data "env0_template" "template" { + name = "Template Name" +} + +data "env0_project" "project" { + name = "Default Organization Project" +} + +resource "env0_environment" "environment" { + name = "environment" + project_id = data.env0_project.project.id + template_id = data.env0_template.template.id +} + +resource "env0_team" "team" { + name = "team" +} + +resource "env0_custom_role" "custom_role" { + name = "custom-role-sample" + permissions = [ + "VIEW_PROJECT", + "EDIT_PROJECT_SETTINGS" + ] +} + +resource "env0_team_environment_assignment" "assignment" { + team_id = env0_team.team.id + environment_id = env0_environment.environment.id + role_id = env0_custom_role.custom_role.id +} diff --git a/examples/resources/env0_workflow_triggers copy/resource.tf b/examples/resources/env0_workflow_triggers copy/resource.tf new file mode 100644 index 00000000..2b9a54d6 --- /dev/null +++ b/examples/resources/env0_workflow_triggers copy/resource.tf @@ -0,0 +1,32 @@ +data "env0_template" "template" { + name = "Template Name" +} + +data "env0_project" "project" { + name = "Default Organization Project" +} + +resource "env0_environment" "environment" { + name = "environment" + project_id = data.env0_project.project.id + template_id = data.env0_template.template.id +} + +resource "env0_api_key" "api_key" { + name = "user-api-key-sample" + organization_role = "User" +} + +resource "env0_custom_role" "custom_role" { + name = "custom-role-sample" + permissions = [ + "VIEW_PROJECT", + "EDIT_PROJECT_SETTINGS" + ] +} + +resource "env0_user_environment_assignment" "assignment" { + user_id = env0_api_key.api_key.id + environment_id = env0_environment.environment.id + role_id = env0_custom_role.custom_role.id +} diff --git a/tests/integration/012_environment/main.tf b/tests/integration/012_environment/main.tf index 92bf5d4a..7b000d22 100644 --- a/tests/integration/012_environment/main.tf +++ b/tests/integration/012_environment/main.tf @@ -66,6 +66,15 @@ resource "env0_user_environment_assignment" "user_role_environment_assignment" { role_id = var.second_run ? env0_custom_role.custom_role1.id : env0_custom_role.custom_role2.id } +resource "env0_team" "team" { + name = "environment-team-${random_string.random.result}" +} + +resource "env0_team_environment_assignment" "team_role_environment_assignment" { + team_id = env0_team.team.id + environment_id = env0_environment.example.id + role_id = var.second_run ? env0_custom_role.custom_role1.id : env0_custom_role.custom_role2.id +} /* TODO: need to add an integration test. resource "env0_environment_state_access" "state_access" { From 594c18b2ccf452dc02af3b0df1dfc22118d7fd16 Mon Sep 17 00:00:00 2001 From: Tomer Heber Date: Tue, 4 Jul 2023 17:50:54 -0500 Subject: [PATCH 2/2] minor changes in examples --- .../resources/env0_team_environment_assignment/resource.tf | 3 +-- examples/resources/env0_workflow_triggers copy/resource.tf | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/resources/env0_team_environment_assignment/resource.tf b/examples/resources/env0_team_environment_assignment/resource.tf index b4005a15..a24e9829 100644 --- a/examples/resources/env0_team_environment_assignment/resource.tf +++ b/examples/resources/env0_team_environment_assignment/resource.tf @@ -19,8 +19,7 @@ resource "env0_team" "team" { resource "env0_custom_role" "custom_role" { name = "custom-role-sample" permissions = [ - "VIEW_PROJECT", - "EDIT_PROJECT_SETTINGS" + "VIEW_ENVIRONMENT" ] } diff --git a/examples/resources/env0_workflow_triggers copy/resource.tf b/examples/resources/env0_workflow_triggers copy/resource.tf index 2b9a54d6..672bdef8 100644 --- a/examples/resources/env0_workflow_triggers copy/resource.tf +++ b/examples/resources/env0_workflow_triggers copy/resource.tf @@ -20,8 +20,7 @@ resource "env0_api_key" "api_key" { resource "env0_custom_role" "custom_role" { name = "custom-role-sample" permissions = [ - "VIEW_PROJECT", - "EDIT_PROJECT_SETTINGS" + "VIEW_ENVIRONMENT" ] }