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

rolling release config #336

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

Closed
wants to merge 72 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
797b9cd
start terraform provider
dimitropoulos Jun 3, 2025
6e9343b
wip: adding get delete
dimitropoulos Jun 5, 2025
9be0fbe
it compiles
dimitropoulos Jun 5, 2025
757452a
rename
dimitropoulos Jun 5, 2025
11ea650
[tf] feat: support for rolling release
brookemosby Jun 5, 2025
ae54c84
[rolling-release] add in docs
brookemosby Jun 6, 2025
ba41d20
[rolling-release] add in docs
brookemosby Jun 6, 2025
c1370d6
[rolling-release] add in docs
brookemosby Jun 6, 2025
53f04f3
Update resource_project_rolling_release.go
brookemosby Jun 6, 2025
2796b4b
fix error
dimitropoulos Jun 9, 2025
2bd5d9e
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos Jun 9, 2025
717d6de
gofmt
dimitropoulos Jun 9, 2025
dab88e5
gofmt
dimitropoulos Jun 9, 2025
d4f277c
rr test
dimitropoulos Jun 10, 2025
e4172a6
fixes resource name
dimitropoulos Jun 10, 2025
2708ab1
resource name
dimitropoulos Jun 10, 2025
71edcef
removes test
dimitropoulos Jun 11, 2025
374a372
[rolling-release]
brookemosby Jun 11, 2025
5792285
removes doRequestWithResponse
dimitropoulos Jun 12, 2025
0b9b0d7
review
dimitropoulos Jun 12, 2025
3647bd7
more review
dimitropoulos Jun 12, 2025
10fcb76
review
dimitropoulos Jun 12, 2025
5031a0d
remove sorting
dimitropoulos Jun 12, 2025
b9dd027
add import.sh
dimitropoulos Jun 12, 2025
7fea6aa
eof
dimitropoulos Jun 12, 2025
935d69d
fix name
dimitropoulos Jun 12, 2025
206a8d1
eof
dimitropoulos Jun 12, 2025
6b272c6
update nil to empty array
dimitropoulos Jun 12, 2025
f29fde5
Update vercel/data_source_project_rolling_release.go
dimitropoulos Jun 12, 2025
0efd0a6
update TF prefix names
dimitropoulos Jun 12, 2025
92f0f0b
removes more validation
dimitropoulos Jun 12, 2025
96303ab
fix docs
dimitropoulos Jun 12, 2025
d263950
fix docs
dimitropoulos Jun 12, 2025
6a5c6b1
fix docs even harder
dimitropoulos Jun 12, 2025
bc4af5e
[rr] fix tests
brookemosby Jun 13, 2025
c298f7d
[rr]
brookemosby Jun 13, 2025
4efcb1c
[rr]
brookemosby Jun 13, 2025
6e1389c
Delete examples/resources/vercel_project_rolling_release/import.sh
brookemosby Jun 13, 2025
472eb7f
[rr]
brookemosby Jun 13, 2025
9f2ae2d
[rr]
brookemosby Jun 13, 2025
607fe39
[rr]
brookemosby Jun 13, 2025
65607d8
[rr]
brookemosby Jun 13, 2025
1d7d81c
[rr]
brookemosby Jun 13, 2025
87c4c99
[rr]
brookemosby Jun 13, 2025
b93fdf8
[rr]
brookemosby Jun 13, 2025
afd0809
Tweak and delete a load of stuff
dglsparsons Jun 13, 2025
9926350
More fixes
dglsparsons Jun 13, 2025
afbba0f
Update data_source_project_rolling_release_test.go
brookemosby Jun 13, 2025
6acb266
[rr]
brookemosby Jun 13, 2025
08370ec
[rr]
brookemosby Jun 13, 2025
5ec8a67
[rr]
brookemosby Jun 13, 2025
1562ef5
[rr]
brookemosby Jun 13, 2025
ed0fef6
[rr]
brookemosby Jun 13, 2025
3e90d29
Update examples/resources/vercel_project_rolling_release/resource.tf
brookemosby Jun 13, 2025
d58f6e3
[rr]
brookemosby Jun 13, 2025
9d249ac
Update project.go
brookemosby Jun 13, 2025
ddaec53
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos Jun 17, 2025
65ba997
[rolling-release]
brookemosby Jun 17, 2025
305ca2b
[rolling-release]
brookemosby Jun 17, 2025
edead8f
[rolling-release]
brookemosby Jun 17, 2025
13c8964
[rolling-release]
brookemosby Jun 17, 2025
802c9a3
[rolling-release]
brookemosby Jun 17, 2025
2bd7a50
[rolling-release]
brookemosby Jun 17, 2025
f7313ee
[rolling-release]
brookemosby Jun 17, 2025
f4a07cb
[rolling-release]
brookemosby Jun 17, 2025
8d196ce
[rolling-release]
brookemosby Jun 17, 2025
81d7ca8
[rolling-release]
brookemosby Jun 17, 2025
3c65334
[rolling-release]
brookemosby Jun 17, 2025
2f401da
[rolling-release]
brookemosby Jun 17, 2025
ad6201f
[rolling-release]
brookemosby Jun 17, 2025
0d24b07
[rolling-release]
brookemosby Jun 17, 2025
687becd
[rolling-release]
brookemosby Jun 17, 2025
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
1 change: 1 addition & 0 deletions client/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ type ProjectResponse struct {
ResourceConfig *ResourceConfigResponse `json:"resourceConfig"`
NodeVersion string `json:"nodeVersion"`
Crons *ProjectCronsResponse `json:"crons"`
RollingRelease *RollingRelease `json:"rollingRelease"`
}

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

import (
"context"
"fmt"

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

// RollingReleaseStage represents a stage in a rolling release
type RollingReleaseStage struct {
TargetPercentage int `json:"targetPercentage"` // Required: 0-100
Duration *int `json:"duration,omitempty"` // Required for automatic advancement: 1-10000 minutes
RequireApproval bool `json:"requireApproval,omitempty"` // Only in response for manual-approval type
}

// RollingRelease represents the rolling release configuration
type RollingRelease struct {
Enabled bool `json:"enabled"` // Required
AdvancementType string `json:"advancementType"` // Required when enabled=true: 'automatic' or 'manual-approval'
Stages []RollingReleaseStage `json:"stages"` // Required when enabled=true: 2-10 stages
}

type RollingReleaseInfo struct {
RollingRelease RollingRelease `json:"rollingRelease"`
ProjectID string `json:"projectId"`
TeamID string `json:"teamId"`
}

// GetRollingRelease returns the rolling release for a given project.
func (c *Client) GetRollingRelease(ctx context.Context, projectID, teamID string) (RollingReleaseInfo, error) {
teamId := c.TeamID(teamID)
url := fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, projectID, teamId)

var d RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "GET",
url: url,
}, &d)

if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error getting rolling-release: %w", err)
}

d.ProjectID = projectID
d.TeamID = teamId

return d, nil
}

// UpdateRollingReleaseRequest defines the information that needs to be passed to Vercel in order to
// update a rolling release.
type UpdateRollingReleaseRequest struct {
RollingRelease RollingRelease `json:"rollingRelease"`
ProjectID string `json:"projectId"`
TeamID string `json:"teamId"`
}

// UpdateRollingRelease will update an existing rolling release to the latest information.
func (c *Client) UpdateRollingRelease(ctx context.Context, request UpdateRollingReleaseRequest) (RollingReleaseInfo, error) {
request.TeamID = c.TeamID(request.TeamID)
if request.RollingRelease.Enabled {
enableRequest := map[string]any{
"enabled": true,
"advancementType": request.RollingRelease.AdvancementType,
"stages": request.RollingRelease.Stages,
}

var result RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, request.ProjectID, request.TeamID),
body: string(mustMarshal(enableRequest)),
}, &result)
if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error enabling rolling release: %w", err)
}

result.ProjectID = request.ProjectID
result.TeamID = request.TeamID
tflog.Info(ctx, "enabled rolling release", map[string]any{
"response": result,
"request": request,
})
return result, nil
} else {
// For disabling, just send the request as is
disabledRequest := UpdateRollingReleaseRequest{
RollingRelease: RollingRelease{
Enabled: false,
AdvancementType: "",
Stages: []RollingReleaseStage{},
},
}

var result RollingReleaseInfo
err := c.doRequest(clientRequest{
ctx: ctx,
method: "PATCH",
url: fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, request.ProjectID, request.TeamID),
body: string(mustMarshal(disabledRequest.RollingRelease)),
}, &result)
if err != nil {
return RollingReleaseInfo{}, fmt.Errorf("error disabling rolling release: %w", err)
}

result.ProjectID = request.ProjectID
result.TeamID = request.TeamID

return result, nil
}
}

// DeleteRollingRelease will delete the rolling release for a given project.
func (c *Client) DeleteRollingRelease(ctx context.Context, projectID, teamID string) error {
teamId := c.TeamID(teamID)
url := fmt.Sprintf("%s/v1/projects/%s/rolling-release/config?teamId=%s", c.baseURL, projectID, teamId)

err := c.doRequest(clientRequest{
ctx: ctx,
method: "DELETE",
url: url,
}, nil)
return err
}
56 changes: 56 additions & 0 deletions docs/data-sources/project_rolling_release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_rolling_release Data Source - terraform-provider-vercel"
subcategory: ""
description: |-
Data source for a Vercel project rolling release configuration.
---

# vercel_project_rolling_release (Data Source)

Data source for a Vercel project rolling release configuration.

## Example Usage

```terraform
data "vercel_project" "example" {
name = "example-project"
}

data "vercel_project_rolling_release" "example" {
project_id = data.vercel_project_rolling_release.example.id
}
```

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

### Required

- `project_id` (String) The ID of the project.

### Optional

- `rolling_release` (Attributes) The rolling release configuration. (see [below for nested schema](#nestedatt--rolling_release))
- `team_id` (String) The ID of the Vercel team.

<a id="nestedatt--rolling_release"></a>
### Nested Schema for `rolling_release`

Read-Only:

- `advancement_type` (String) The type of advancement between stages. Must be either 'automatic' or 'manual-approval'. Required when enabled is true.
- `enabled` (Boolean) Whether rolling releases are enabled.
- `stages` (Attributes List) The stages of the rolling release. Required when enabled is true. (see [below for nested schema](#nestedatt--rolling_release--stages))

<a id="nestedatt--rolling_release--stages"></a>
### Nested Schema for `rolling_release.stages`

Optional:

- `duration` (Number) The duration in minutes to wait before advancing to the next stage. Required for all stages except the final stage when using automatic advancement.

Read-Only:

- `require_approval` (Boolean) Whether approval is required before advancing to the next stage.
- `target_percentage` (Number) The percentage of traffic to route to this stage.
81 changes: 81 additions & 0 deletions docs/resources/project_rolling_release.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "vercel_project_rolling_release Resource - terraform-provider-vercel"
subcategory: ""
description: |-
Manages rolling release configuration for a Vercel project.
---

# vercel_project_rolling_release (Resource)

Manages rolling release configuration for a Vercel project.

## Example Usage

```terraform
resource "vercel_project" "example" {
name = "example-project"
skew_protection = "12 hours"
}

resource "vercel_project_rolling_release" "example" {
project_id = vercel_project.example.id
rolling_release = {
enabled = true
advancement_type = "manual-approval"
stages = [
{
require_approval = true
target_percentage = 20
},
{
require_approval = true
target_percentage = 50
},
{
require_approval = true
target_percentage = 100
}
]
}
}
```

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

### Required

- `project_id` (String) The ID of the project.
- `rolling_release` (Attributes) The rolling release configuration. (see [below for nested schema](#nestedatt--rolling_release))

### Optional

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

<a id="nestedatt--rolling_release"></a>
### Nested Schema for `rolling_release`

Required:

- `enabled` (Boolean) Whether rolling releases are enabled.

Optional:

- `advancement_type` (String) The type of advancement between stages. Must be either 'automatic' or 'manual-approval'. Required when enabled is true.
- `stages` (Attributes List) The stages of the rolling release. Required when enabled is true. (see [below for nested schema](#nestedatt--rolling_release--stages))

<a id="nestedatt--rolling_release--stages"></a>
### Nested Schema for `rolling_release.stages`

Required:

- `target_percentage` (Number) The percentage of traffic to route to this stage.

Optional:

- `duration` (Number) The duration in minutes to wait before advancing to the next stage. Required for non-last stages when advancement_type is 'automatic'.

Read-Only:

- `require_approval` (Boolean) Whether approval is required before advancing to the next stage.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
data "vercel_project" "example" {
name = "example-project"
}

data "vercel_project_rolling_release" "example" {
project_id = data.vercel_project_rolling_release.example.id
}
26 changes: 26 additions & 0 deletions examples/resources/vercel_project_rolling_release/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
resource "vercel_project" "example" {
name = "example-project"
skew_protection = "12 hours"
}

resource "vercel_project_rolling_release" "example" {
project_id = vercel_project.example.id
rolling_release = {
enabled = true
advancement_type = "manual-approval"
stages = [
{
require_approval = true
target_percentage = 20
},
{
require_approval = true
target_percentage = 50
},
{
require_approval = true
target_percentage = 100
}
]
}
}
Loading