Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat:Ability to choose default setting for Deployment Triggers for new Environments #164

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 40 additions & 32 deletions client/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,48 +243,56 @@ type TeamProjectAssignment struct {
}

type Policy struct {
Id string `json:"id"`
ProjectId string `json:"projectId"`
NumberOfEnvironments int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
UpdatedBy string `json:"updatedBy"`
Id string `json:"id"`
ProjectId string `json:"projectId"`
NumberOfEnvironments int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
UpdatedBy string `json:"updatedBy"`
RunPullRequestPlanDefault bool `json:"runPullRequestPlanDefault"`
ContinuousDeploymentDefault bool `json:"continuousDeploymentDefault"`
}

type PolicyUpdatePayload struct {
ProjectId string `json:"projectId"`
NumberOfEnvironments int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
ProjectId string `json:"projectId"`
NumberOfEnvironments int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
RunPullRequestPlanDefault bool `json:"runPullRequestPlanDefault"`
ContinuousDeploymentDefault bool `json:"continuousDeploymentDefault"`
}

func (p PolicyUpdatePayload) MarshalJSON() ([]byte, error) {
type serial struct {
ProjectId string `json:"projectId"`
NumberOfEnvironments *int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal *int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
ProjectId string `json:"projectId"`
NumberOfEnvironments *int `json:"numberOfEnvironments"`
NumberOfEnvironmentsTotal *int `json:"numberOfEnvironmentsTotal"`
RequiresApprovalDefault bool `json:"requiresApprovalDefault"`
IncludeCostEstimation bool `json:"includeCostEstimation"`
SkipApplyWhenPlanIsEmpty bool `json:"skipApplyWhenPlanIsEmpty"`
DisableDestroyEnvironments bool `json:"disableDestroyEnvironments"`
SkipRedundantDeployments bool `json:"skipRedundantDeployments"`
RunPullRequestPlanDefault bool `json:"runPullRequestPlanDefault"`
ContinuousDeploymentDefault bool `json:"continuousDeploymentDefault"`
}

s := serial{
ProjectId: p.ProjectId,
RequiresApprovalDefault: p.RequiresApprovalDefault,
IncludeCostEstimation: p.IncludeCostEstimation,
SkipApplyWhenPlanIsEmpty: p.SkipApplyWhenPlanIsEmpty,
DisableDestroyEnvironments: p.DisableDestroyEnvironments,
SkipRedundantDeployments: p.SkipRedundantDeployments,
ProjectId: p.ProjectId,
RequiresApprovalDefault: p.RequiresApprovalDefault,
IncludeCostEstimation: p.IncludeCostEstimation,
SkipApplyWhenPlanIsEmpty: p.SkipApplyWhenPlanIsEmpty,
DisableDestroyEnvironments: p.DisableDestroyEnvironments,
SkipRedundantDeployments: p.SkipRedundantDeployments,
RunPullRequestPlanDefault: p.RunPullRequestPlanDefault,
ContinuousDeploymentDefault: p.ContinuousDeploymentDefault,
}

if p.NumberOfEnvironments != 0 {
Expand Down
2 changes: 2 additions & 0 deletions docs/data-sources/project_policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ description: |-

### Read-Only

- **continuous_deployment_default** (Boolean) Redeploy on every push to the git branch default value
- **disable_destroy_environments** (Boolean) Disallow destroying environment in the project
- **id** (String) id of the policy
- **include_cost_estimation** (Boolean) Enable cost estimation for the project
- **number_of_environments** (Number) Max number of environments a single user can have in this project, 0 indicates no limit
- **number_of_environments_total** (Number) Max number of environments in this project, 0 indicates no limit
- **requires_approval_default** (Boolean) Requires approval default value when creating a new environment in the project
- **run_pull_request_plan_default** (Boolean) Run Terraform Plan on Pull Requests for new environments targeting their branch default value
Comment on lines +24 to +31
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why they not near each other - both of them belong trigger policy.
Plus I think id should be the first one

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

its generated

- **skip_apply_when_plan_is_empty** (Boolean) Skip apply when plan has no changes
- **skip_redundant_deployments** (Boolean) Automatically skip queued deployments when a newer deployment is triggered
- **updated_by** (String) updated by
Expand Down
2 changes: 2 additions & 0 deletions docs/resources/project_policy.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,13 @@ resource "env0_project_policy" "example" {

### Optional

- **continuous_deployment_default** (Boolean) Redeploy on every push to the git branch default value
- **disable_destroy_environments** (Boolean) Disallow destroying environment in the project
- **include_cost_estimation** (Boolean) Enable cost estimation for the project
- **number_of_environments** (Number) Max number of environments a single user can have in this project, 0 indicates no limit
- **number_of_environments_total** (Number) Max number of environments in this project, 0 indicates no limit
- **requires_approval_default** (Boolean) Requires approval default value when creating a new environment in the project
- **run_pull_request_plan_default** (Boolean) Run Terraform Plan on Pull Requests for new environments targeting their branch default value
Comment on lines +41 to +47
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same. write one near to other

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

its generated

- **skip_apply_when_plan_is_empty** (Boolean) Skip apply when plan has no changes
- **skip_redundant_deployments** (Boolean) Automatically skip queued deployments when a newer deployment is triggered

Expand Down
10 changes: 10 additions & 0 deletions env0/data_project_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,16 @@ func dataPolicy() *schema.Resource {
Description: "updated by",
Computed: true,
},
"run_pull_request_plan_default": {
Type: schema.TypeBool,
Description: "Run Terraform Plan on Pull Requests for new environments targeting their branch default value",
Computed: true,
},
"continuous_deployment_default": {
Type: schema.TypeBool,
Description: "Redeploy on every push to the git branch default value",
Computed: true,
},
},
}
}
Expand Down
20 changes: 12 additions & 8 deletions env0/data_project_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,16 @@ import (

func TestPolicyDataSource(t *testing.T) {
policy := client.Policy{
Id: "id0",
ProjectId: "project0",
NumberOfEnvironments: 1,
NumberOfEnvironmentsTotal: 2,
RequiresApprovalDefault: true,
IncludeCostEstimation: true,
SkipApplyWhenPlanIsEmpty: true,
DisableDestroyEnvironments: true,
Id: "id0",
ProjectId: "project0",
NumberOfEnvironments: 1,
NumberOfEnvironmentsTotal: 2,
RequiresApprovalDefault: true,
IncludeCostEstimation: true,
SkipApplyWhenPlanIsEmpty: true,
DisableDestroyEnvironments: true,
ContinuousDeploymentDefault: true,
RunPullRequestPlanDefault: false,
}

resourceType := "env0_project_policy"
Expand All @@ -40,6 +42,8 @@ func TestPolicyDataSource(t *testing.T) {
resource.TestCheckResourceAttr(accessor, "include_cost_estimation", strconv.FormatBool(policy.IncludeCostEstimation)),
resource.TestCheckResourceAttr(accessor, "skip_apply_when_plan_is_empty", strconv.FormatBool(policy.SkipApplyWhenPlanIsEmpty)),
resource.TestCheckResourceAttr(accessor, "disable_destroy_environments", strconv.FormatBool(policy.DisableDestroyEnvironments)),
resource.TestCheckResourceAttr(accessor, "run_pull_request_plan_default", strconv.FormatBool(policy.RunPullRequestPlanDefault)),
resource.TestCheckResourceAttr(accessor, "continuous_deployment_default", strconv.FormatBool(policy.ContinuousDeploymentDefault)),
),
},
},
Expand Down
19 changes: 18 additions & 1 deletion env0/resource_project_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ func resourcePolicy() *schema.Resource {
Type: schema.TypeBool,
Description: "Requires approval default value when creating a new environment in the project",
Optional: true,
Default: true,
},
"include_cost_estimation": {
Type: schema.TypeBool,
Expand All @@ -93,6 +92,16 @@ func resourcePolicy() *schema.Resource {
Description: "updated by",
Computed: true,
},
"run_pull_request_plan_default": {
Type: schema.TypeBool,
Description: "Run Terraform Plan on Pull Requests for new environments targeting their branch default value",
Optional: true,
},
"continuous_deployment_default": {
Type: schema.TypeBool,
Description: "Redeploy on every push to the git branch default value",
Optional: true,
},
},
}
}
Expand All @@ -108,6 +117,8 @@ func setPolicySchema(d *schema.ResourceData, policy client.Policy) {
d.Set("disable_destroy_environments", policy.DisableDestroyEnvironments)
d.Set("skip_redundant_deployments", policy.SkipRedundantDeployments)
d.Set("updated_by", policy.UpdatedBy)
d.Set("run_pull_request_plan_default", policy.RunPullRequestPlanDefault)
d.Set("continuous_deployment_default", policy.ContinuousDeploymentDefault)
}

func resourcePolicyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
Expand Down Expand Up @@ -166,6 +177,12 @@ func resourcePolicyUpdate(ctx context.Context, d *schema.ResourceData, meta inte
if skipRedundantDeployments, ok := d.GetOk("skip_redundant_deployments"); ok {
payload.SkipRedundantDeployments = skipRedundantDeployments.(bool)
}
if runPullRequestPlanDefault, ok := d.GetOk("run_pull_request_plan_default"); ok {
payload.RunPullRequestPlanDefault = runPullRequestPlanDefault.(bool)
}
if continuousDeploymentDefault, ok := d.GetOk("continuous_deployment_default"); ok {
payload.ContinuousDeploymentDefault = continuousDeploymentDefault.(bool)
}

_, err := apiClient.PolicyUpdate(payload)
if err != nil {
Expand Down
4 changes: 4 additions & 0 deletions env0/resource_project_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ func TestUnitPolicyResource(t *testing.T) {
"skip_apply_when_plan_is_empty": policy.SkipApplyWhenPlanIsEmpty,
"disable_destroy_environments": policy.DisableDestroyEnvironments,
"skip_redundant_deployments": policy.SkipRedundantDeployments,
"run_pull_request_plan_default": policy.RunPullRequestPlanDefault,
"continuous_deployment_default": policy.ContinuousDeploymentDefault,
}),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(accessor, "project_id", policy.ProjectId),
Expand All @@ -67,6 +69,8 @@ func TestUnitPolicyResource(t *testing.T) {
resource.TestCheckResourceAttr(accessor, "skip_apply_when_plan_is_empty", strconv.FormatBool(policy.SkipApplyWhenPlanIsEmpty)),
resource.TestCheckResourceAttr(accessor, "disable_destroy_environments", strconv.FormatBool(policy.DisableDestroyEnvironments)),
resource.TestCheckResourceAttr(accessor, "skip_redundant_deployments", strconv.FormatBool(policy.SkipRedundantDeployments)),
resource.TestCheckResourceAttr(accessor, "run_pull_request_plan_default", strconv.FormatBool(policy.RunPullRequestPlanDefault)),
resource.TestCheckResourceAttr(accessor, "continuous_deployment_default", strconv.FormatBool(policy.ContinuousDeploymentDefault)),
),
},
{
Expand Down