-
Notifications
You must be signed in to change notification settings - Fork 31
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
Closed
Changes from all commits
Commits
Show all changes
72 commits
Select commit
Hold shift + click to select a range
797b9cd
start terraform provider
dimitropoulos 6e9343b
wip: adding get delete
dimitropoulos 9be0fbe
it compiles
dimitropoulos 757452a
rename
dimitropoulos 11ea650
[tf] feat: support for rolling release
brookemosby ae54c84
[rolling-release] add in docs
brookemosby ba41d20
[rolling-release] add in docs
brookemosby c1370d6
[rolling-release] add in docs
brookemosby 53f04f3
Update resource_project_rolling_release.go
brookemosby 2796b4b
fix error
dimitropoulos 2bd5d9e
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos 717d6de
gofmt
dimitropoulos dab88e5
gofmt
dimitropoulos d4f277c
rr test
dimitropoulos e4172a6
fixes resource name
dimitropoulos 2708ab1
resource name
dimitropoulos 71edcef
removes test
dimitropoulos 374a372
[rolling-release]
brookemosby 5792285
removes doRequestWithResponse
dimitropoulos 0b9b0d7
review
dimitropoulos 3647bd7
more review
dimitropoulos 10fcb76
review
dimitropoulos 5031a0d
remove sorting
dimitropoulos b9dd027
add import.sh
dimitropoulos 7fea6aa
eof
dimitropoulos 935d69d
fix name
dimitropoulos 206a8d1
eof
dimitropoulos 6b272c6
update nil to empty array
dimitropoulos f29fde5
Update vercel/data_source_project_rolling_release.go
dimitropoulos 0efd0a6
update TF prefix names
dimitropoulos 92f0f0b
removes more validation
dimitropoulos 96303ab
fix docs
dimitropoulos d263950
fix docs
dimitropoulos 6a5c6b1
fix docs even harder
dimitropoulos bc4af5e
[rr] fix tests
brookemosby c298f7d
[rr]
brookemosby 4efcb1c
[rr]
brookemosby 6e1389c
Delete examples/resources/vercel_project_rolling_release/import.sh
brookemosby 472eb7f
[rr]
brookemosby 9f2ae2d
[rr]
brookemosby 607fe39
[rr]
brookemosby 65607d8
[rr]
brookemosby 1d7d81c
[rr]
brookemosby 87c4c99
[rr]
brookemosby b93fdf8
[rr]
brookemosby afd0809
Tweak and delete a load of stuff
dglsparsons 9926350
More fixes
dglsparsons afbba0f
Update data_source_project_rolling_release_test.go
brookemosby 6acb266
[rr]
brookemosby 08370ec
[rr]
brookemosby 5ec8a67
[rr]
brookemosby 1562ef5
[rr]
brookemosby ed0fef6
[rr]
brookemosby 3e90d29
Update examples/resources/vercel_project_rolling_release/resource.tf
brookemosby d58f6e3
[rr]
brookemosby 9d249ac
Update project.go
brookemosby ddaec53
Merge remote-tracking branch 'origin/main' into dimitri/rolling-release
dimitropoulos 65ba997
[rolling-release]
brookemosby 305ca2b
[rolling-release]
brookemosby edead8f
[rolling-release]
brookemosby 13c8964
[rolling-release]
brookemosby 802c9a3
[rolling-release]
brookemosby 2bd7a50
[rolling-release]
brookemosby f7313ee
[rolling-release]
brookemosby f4a07cb
[rolling-release]
brookemosby 8d196ce
[rolling-release]
brookemosby 81d7ca8
[rolling-release]
brookemosby 3c65334
[rolling-release]
brookemosby 2f401da
[rolling-release]
brookemosby ad6201f
[rolling-release]
brookemosby 0d24b07
[rolling-release]
brookemosby 687becd
[rolling-release]
brookemosby File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
--- | ||
dimitropoulos marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# 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. |
7 changes: 7 additions & 0 deletions
7
examples/data-sources/vercel_project_rolling_release/data-source.tf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
26
examples/resources/vercel_project_rolling_release/resource.tf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
] | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.