这是indexloc提供的服务,不要输入任何密码
Skip to content

[deployment-retention] feat: enabling projects to configure deployment retention #198

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

Merged
merged 22 commits into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
de60c59
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 27, 2024
db900b3
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 27, 2024
656738b
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 27, 2024
b1d887a
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 27, 2024
908a7aa
Update vercel/resource_project_deployment_retention.go
brookemosby Aug 28, 2024
967b6bc
Update vercel/resource_project_deployment_retention.go
brookemosby Aug 28, 2024
db2b96b
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
99dfece
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
2a781d1
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
a84e45d
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
99ca5ab
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
2b55f25
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
ca9aab2
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
e984e6b
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
a1a15f3
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
c247f6e
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 28, 2024
e6f5368
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 29, 2024
e6c05ee
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 29, 2024
5ee4893
[deployment-retention]: feat: configuring deployment retention polici…
brookemosby Aug 29, 2024
c688db4
Fix various issues with tests, refresh + api calls
dglsparsons Aug 30, 2024
3af4d1d
Add project_deployment_retention data source, fix some issues with re…
dglsparsons Aug 30, 2024
058d200
Generate docs
dglsparsons Aug 30, 2024
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
8 changes: 8 additions & 0 deletions client/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ type EnvironmentVariable struct {
TeamID string `json:"-"`
}

type DeploymentExpiration struct {
ExpirationPreview int `json:"expirationDays"`
ExpirationProduction int `json:"expirationDaysProduction"`
ExpirationCanceled int `json:"expirationDaysCanceled"`
ExpirationErrored int `json:"expirationDaysErrored"`
}

// CreateProjectRequest defines the information necessary to create a project.
type CreateProjectRequest struct {
BuildCommand *string `json:"buildCommand"`
Expand Down Expand Up @@ -189,6 +196,7 @@ type ProjectResponse struct {
SkewProtectionMaxAge int `json:"skewProtectionMaxAge"`
GitComments *GitComments `json:"gitComments"`
Security *Security `json:"security"`
DeploymentExpiration *DeploymentExpiration `json:"deploymentExpiration"`
}

type GitComments struct {
Expand Down
132 changes: 132 additions & 0 deletions client/project_deployment_retention.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package client

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-log/tflog"
)

// CreateDeploymentRetentionRequest defines the information that needs to be passed to Vercel in order to
// create an deployment retention.
type DeploymentRetentionRequest struct {
ExpirationPreview string `json:"expiration,omitempty"`
ExpirationProduction string `json:"expirationProduction,omitempty"`
ExpirationCanceled string `json:"expirationCanceled,omitempty"`
ExpirationErrored string `json:"expirationErrored,omitempty"`
}

// UpdateDeploymentRetentionRequest defines the information that needs to be passed to Vercel in order to
// update an deployment retention.
type UpdateDeploymentRetentionRequest struct {
DeploymentRetention DeploymentRetentionRequest
ProjectID string
TeamID string
}

// DeleteDeploymentRetention will remove any existing deployment retention for a given project.
func (c *Client) DeleteDeploymentRetention(ctx context.Context, projectID, teamID string) error {
url := fmt.Sprintf("%s/v9/projects/%s/deployment-expiration", c.baseURL, projectID)
if c.teamID(teamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(teamID))
}
unlimited := "unlimited"
payload := string(mustMarshal(DeploymentRetentionRequest{ExpirationPreview: unlimited, ExpirationProduction: unlimited, ExpirationCanceled: unlimited, ExpirationErrored: unlimited}))

tflog.Info(ctx, "updating deployment expiration", map[string]interface{}{
"url": url,
"payload": payload,
})
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: url,
body: payload,
}, nil)
return err
}

type deploymentExpirationResponse struct {
DeploymentExpiration struct {
Expiration string `json:"expiration"`
ExpirationProduction string `json:"expirationProduction"`
ExpirationCanceled string `json:"expirationCanceled"`
ExpirationErrored string `json:"expirationErrored"`
} `json:"deploymentExpiration"`
}

var DeploymentRetentionDaysToString = map[int]string{
1: "1d",
7: "1w",
30: "1m",
60: "2m",
90: "3m",
180: "6m",
365: "1y",
36500: "unlimited",
}

var DeploymentRetentionStringToDays = map[string]int{
"1d": 1,
"1w": 7,
"1m": 30,
"2m": 60,
"3m": 90,
"6m": 180,
"1y": 365,
"unlimited": 36500,
}

func (d deploymentExpirationResponse) toDeploymentExpiration() DeploymentExpiration {
return DeploymentExpiration{
ExpirationPreview: DeploymentRetentionStringToDays[d.DeploymentExpiration.Expiration],
ExpirationProduction: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationProduction],
ExpirationCanceled: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationCanceled],
ExpirationErrored: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationErrored],
}
}

// UpdateDeploymentRetention will update an existing deployment retention to the latest information.
func (c *Client) UpdateDeploymentRetention(ctx context.Context, request UpdateDeploymentRetentionRequest) (DeploymentExpiration, error) {
url := fmt.Sprintf("%s/v9/projects/%s/deployment-expiration", c.baseURL, request.ProjectID)
if c.teamID(request.TeamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(request.TeamID))
}
payload := string(mustMarshal(request.DeploymentRetention))

tflog.Info(ctx, "updating deployment expiration", map[string]interface{}{
"url": url,
"payload": payload,
})
var d deploymentExpirationResponse
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: url,
body: payload,
}, &d)
return d.toDeploymentExpiration(), err
}

// GetDeploymentRetention returns the deployment retention for a given project.
func (c *Client) GetDeploymentRetention(ctx context.Context, projectID, teamID string) (d DeploymentExpiration, err error) {
url := fmt.Sprintf("%s/v2/projects/%s", c.baseURL, projectID)
if c.teamID(teamID) != "" {
url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(teamID))
}

tflog.Info(ctx, "getting deployment retention", map[string]interface{}{
"url": url,
})
var p ProjectResponse
err = c.doRequest(clientRequest{
ctx: ctx,
method: "GET",
url: url,
body: "",
}, &p)
if p.DeploymentExpiration == nil {
return DeploymentExpiration{}, fmt.Errorf("deployment retention not found")
}
return *p.DeploymentExpiration, err
}
38 changes: 38 additions & 0 deletions docs/data-sources/project_deployment_retention.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_deployment_retention Data Source - terraform-provider-vercel"
subcategory: ""
description: |-
Provides a Project Deployment Retention datasource.
A Project Deployment Retention datasource details information about Deployment Retention on a Vercel Project.
For more detailed information, please see the Vercel documentation https://vercel.com/docs/security/deployment-retention.
---

# vercel_project_deployment_retention (Data Source)

Provides a Project Deployment Retention datasource.

A Project Deployment Retention datasource details information about Deployment Retention on a Vercel Project.

For more detailed information, please see the [Vercel documentation](https://vercel.com/docs/security/deployment-retention).



<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `project_id` (String) The ID of the Project for the retention policy

### Optional

- `team_id` (String) The ID of the Vercel team.

### Read-Only

- `expiration_canceled` (String) The retention period for canceled deployments.
- `expiration_errored` (String) The retention period for errored deployments.
- `expiration_preview` (String) The retention period for preview deployments.
- `expiration_production` (String) The retention period for production deployments.
- `id` (String) The ID of this resource.
78 changes: 78 additions & 0 deletions docs/resources/project_deployment_retention.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_deployment_retention Resource - terraform-provider-vercel"
subcategory: ""
description: |-
Provides a Project Deployment Retention resource.
A Project Deployment Retention resource defines an Deployment Retention on a Vercel Project.
For more detailed information, please see the Vercel documentation https://vercel.com/docs/security/deployment-retention.
---

# vercel_project_deployment_retention (Resource)

Provides a Project Deployment Retention resource.

A Project Deployment Retention resource defines an Deployment Retention on a Vercel Project.

For more detailed information, please see the [Vercel documentation](https://vercel.com/docs/security/deployment-retention).

## Example Usage

```terraform
resource "vercel_project" "example" {
name = "example-project"

git_repository = {
type = "github"
repo = "vercel/some-repo"
}
}

# An unlimited deployment retention policy that will be created
# for this project for all deployments.
resource "vercel_project_deployment_retention" "example_unlimited" {
project_id = vercel_project.example.id
team_id = vercel_project.example.team_id
expiration_preview = "unlimited"
expiration_production = "unlimited"
expiration_canceled = "unlimited"
expiration_errored = "unlimited"
}

# A customized deployment retention policy that will be created
# for this project for all deployments.
resource "vercel_project_deployment_retention" "example_customized" {
project_id = vercel_project.example.id
team_id = vercel_project.example.team_id
expiration_preview = "3m"
expiration_production = "1y"
expiration_canceled = "1m"
expiration_errored = "2m"
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `project_id` (String) The ID of the Project for the retention policy

### Optional

- `expiration_canceled` (String) The retention period for canceled deployments. Should be one of '1m', '2m', '3m', '6m', '1y', 'unlimited'.
- `expiration_errored` (String) The retention period for errored deployments. Should be one of '1m', '2m', '3m', '6m', '1y', 'unlimited'.
- `expiration_preview` (String) The retention period for preview deployments. Should be one of '1m', '2m', '3m', '6m', '1y', 'unlimited'.
- `expiration_production` (String) The retention period for production deployments. Should be one of '1m', '2m', '3m', '6m', '1y', 'unlimited'.
- `team_id` (String) The ID of the Vercel team.

## Import

Import is supported using the following syntax:

```shell
# You can import via the team_id and project_id.
# - team_id can be found in the team `settings` tab in the Vercel UI.
# - project_id can be found in the project `settings` tab in the Vercel UI.
terraform import vercel_project_deployment_retention.example team_xxxxxxxxxxxxxxxxxxxxxxxx/prj_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# You can import via the team_id and project_id.
# - team_id can be found in the team `settings` tab in the Vercel UI.
# - project_id can be found in the project `settings` tab in the Vercel UI.
terraform import vercel_project_deployment_retention.example team_xxxxxxxxxxxxxxxxxxxxxxxx/prj_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
resource "vercel_project" "example" {
name = "example-project"

git_repository = {
type = "github"
repo = "vercel/some-repo"
}
}

# An unlimited deployment retention policy that will be created
# for this project for all deployments.
resource "vercel_project_deployment_retention" "example_unlimited" {
project_id = vercel_project.example.id
team_id = vercel_project.example.team_id
expiration_preview = "unlimited"
expiration_production = "unlimited"
expiration_canceled = "unlimited"
expiration_errored = "unlimited"
}

# A customized deployment retention policy that will be created
# for this project for all deployments.
resource "vercel_project_deployment_retention" "example_customized" {
project_id = vercel_project.example.id
team_id = vercel_project.example.team_id
expiration_preview = "3m"
expiration_production = "1y"
expiration_canceled = "1m"
expiration_errored = "2m"
}
Loading
Loading