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 2 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
74 changes: 42 additions & 32 deletions client/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,48 +243,58 @@ 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"`
Id string `json:"id"`
Copy link
Contributor

Choose a reason for hiding this comment

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

We don't send the id on the project update payload, the id is a part of the path

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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"`
Copy link
Contributor

Choose a reason for hiding this comment

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

Same here, this is a computed attribute and shouldn't be sent on payload...

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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
20 changes: 20 additions & 0 deletions env0/resource_project_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,18 @@ 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,
Default: false,
Copy link
Contributor

Choose a reason for hiding this comment

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

Since all other fields here don't have a default value setting, I think we should change it to either make all of them with default values, or none.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

},
"continuous_deployment_default": {
Type: schema.TypeBool,
Description: "Redeploy on every push to the git branch default value",
Optional: true,
Default: false,
},
},
}
}
Expand All @@ -108,6 +120,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 +180,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