Skip to content

Commit

Permalink
feat:Ability to choose default setting for Deployment Triggers for ne…
Browse files Browse the repository at this point in the history
…w Environments (#164)

* feat: Add ability to set default CD and PR plan by project policy

* fix go fmt

* remove default values

* remove id from update request

* remove updatedby from update request
  • Loading branch information
GiliFaroEnv0 committed Nov 25, 2021
1 parent 05a763d commit 8536813
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 41 deletions.
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
- **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
- **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

0 comments on commit 8536813

Please sign in to comment.