mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Merge pull request #31617 from glennsarti/gs/TF-410-add-prep-plan
Add Pre-Plan Run Tasks to Terraform CLI
This commit is contained in:
commit
76d40d281d
@ -36,6 +36,7 @@ ENHANCEMENTS:
|
|||||||
* The COS backend now supports global acceleration. ([#31425](https://github.com/hashicorp/terraform/issues/31425))
|
* The COS backend now supports global acceleration. ([#31425](https://github.com/hashicorp/terraform/issues/31425))
|
||||||
* providercache: include host in provider installation error ([#31524](https://github.com/hashicorp/terraform/issues/31524))
|
* providercache: include host in provider installation error ([#31524](https://github.com/hashicorp/terraform/issues/31524))
|
||||||
* refactoring: `moved` blocks can now be used to move resources to and from external modules ([#31556](https://github.com/hashicorp/terraform/issues/31556))
|
* refactoring: `moved` blocks can now be used to move resources to and from external modules ([#31556](https://github.com/hashicorp/terraform/issues/31556))
|
||||||
|
* When showing the progress of a remote operation running in Terraform Cloud, Terraform CLI will include information about pre-plan run tasks ([#31617](https://github.com/hashicorp/terraform/issues/31617))
|
||||||
|
|
||||||
BUG FIXES:
|
BUG FIXES:
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -40,7 +40,7 @@ require (
|
|||||||
github.com/hashicorp/go-multierror v1.1.1
|
github.com/hashicorp/go-multierror v1.1.1
|
||||||
github.com/hashicorp/go-plugin v1.4.3
|
github.com/hashicorp/go-plugin v1.4.3
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.1
|
github.com/hashicorp/go-retryablehttp v0.7.1
|
||||||
github.com/hashicorp/go-tfe v1.6.0
|
github.com/hashicorp/go-tfe v1.7.0
|
||||||
github.com/hashicorp/go-uuid v1.0.3
|
github.com/hashicorp/go-uuid v1.0.3
|
||||||
github.com/hashicorp/go-version v1.6.0
|
github.com/hashicorp/go-version v1.6.0
|
||||||
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f
|
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f
|
||||||
|
4
go.sum
4
go.sum
@ -375,8 +375,8 @@ github.com/hashicorp/go-slug v0.9.1/go.mod h1:Ib+IWBYfEfJGI1ZyXMGNbu2BU+aa3Dzu41
|
|||||||
github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
|
github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
github.com/hashicorp/go-tfe v1.6.0 h1:lRfyTVLBP1njo2wShE9FimALzVZBfOqMGNuBdsor38w=
|
github.com/hashicorp/go-tfe v1.7.0 h1:GELRhS5dizF6giwjZBqUC/xPaSuNYB+hWRtUnf6i8K8=
|
||||||
github.com/hashicorp/go-tfe v1.6.0/go.mod h1:E8a90lC4kjU5Lc2c0D+SnWhUuyuoCIVm4Ewzv3jCD3A=
|
github.com/hashicorp/go-tfe v1.7.0/go.mod h1:E8a90lC4kjU5Lc2c0D+SnWhUuyuoCIVm4Ewzv3jCD3A=
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
@ -199,6 +199,17 @@ func (b *Cloud) waitForRun(stopCtx, cancelCtx context.Context, op *backend.Opera
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Cloud) waitTaskStage(stopCtx, cancelCtx context.Context, op *backend.Operation, r *tfe.Run, stageID string, outputTitle string) error {
|
||||||
|
integration := &IntegrationContext{
|
||||||
|
B: b,
|
||||||
|
StopContext: stopCtx,
|
||||||
|
CancelContext: cancelCtx,
|
||||||
|
Op: op,
|
||||||
|
Run: r,
|
||||||
|
}
|
||||||
|
return b.runTasks(integration, integration.BeginOutput(outputTitle), stageID)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Cloud) costEstimate(stopCtx, cancelCtx context.Context, op *backend.Operation, r *tfe.Run) error {
|
func (b *Cloud) costEstimate(stopCtx, cancelCtx context.Context, op *backend.Operation, r *tfe.Run) error {
|
||||||
if r.CostEstimate == nil {
|
if r.CostEstimate == nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -291,6 +291,28 @@ in order to capture the filesystem context the remote workspace expects:
|
|||||||
runHeader, b.hostname, b.organization, op.Workspace, r.ID)) + "\n"))
|
runHeader, b.hostname, b.organization, op.Workspace, r.ID)) + "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the run to get task stages.
|
||||||
|
// Task Stages are calculated upfront so we only need to call this once for the run.
|
||||||
|
taskStages := make([]*tfe.TaskStage, 0)
|
||||||
|
result, err := b.client.Runs.ReadWithOptions(stopCtx, r.ID, &tfe.RunReadOptions{
|
||||||
|
Include: []tfe.RunIncludeOpt{tfe.RunTaskStages},
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
taskStages = result.TaskStages
|
||||||
|
} else {
|
||||||
|
// This error would be expected for older versions of TFE that do not allow
|
||||||
|
// fetching task_stages.
|
||||||
|
if !strings.HasSuffix(err.Error(), "Invalid include parameter") {
|
||||||
|
return r, generalError("Failed to retrieve run", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if stageID := getTaskStageIDByName(taskStages, tfe.PrePlan); stageID != nil {
|
||||||
|
if err := b.waitTaskStage(stopCtx, cancelCtx, op, r, *stageID, "Pre-plan Tasks"); err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
r, err = b.waitForRun(stopCtx, cancelCtx, op, "plan", r, w)
|
r, err = b.waitForRun(stopCtx, cancelCtx, op, "plan", r, w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r, err
|
return r, err
|
||||||
@ -324,21 +346,10 @@ in order to capture the filesystem context the remote workspace expects:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the run to get its current status.
|
// Retrieve the run to get its current status.
|
||||||
runID := r.ID
|
r, err = b.client.Runs.Read(stopCtx, r.ID)
|
||||||
r, err = b.client.Runs.ReadWithOptions(stopCtx, runID, &tfe.RunReadOptions{
|
|
||||||
Include: []tfe.RunIncludeOpt{tfe.RunTaskStages},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
// This error would be expected for older versions of TFE that do not allow
|
|
||||||
// fetching task_stages.
|
|
||||||
if strings.HasSuffix(err.Error(), "Invalid include parameter") {
|
|
||||||
r, err = b.client.Runs.Read(stopCtx, runID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r, generalError("Failed to retrieve run", err)
|
return r, generalError("Failed to retrieve run", err)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// If the run is canceled or errored, we still continue to the
|
// If the run is canceled or errored, we still continue to the
|
||||||
// cost-estimation and policy check phases to ensure we render any
|
// cost-estimation and policy check phases to ensure we render any
|
||||||
@ -346,18 +357,8 @@ in order to capture the filesystem context the remote workspace expects:
|
|||||||
// status of the run will be "errored", but there is still policy
|
// status of the run will be "errored", but there is still policy
|
||||||
// information which should be shown.
|
// information which should be shown.
|
||||||
|
|
||||||
// Await post-plan run tasks
|
if stageID := getTaskStageIDByName(taskStages, tfe.PostPlan); stageID != nil {
|
||||||
integration := &IntegrationContext{
|
if err := b.waitTaskStage(stopCtx, cancelCtx, op, r, *stageID, "Post-plan Tasks"); err != nil {
|
||||||
B: b,
|
|
||||||
StopContext: stopCtx,
|
|
||||||
CancelContext: cancelCtx,
|
|
||||||
Op: op,
|
|
||||||
Run: r,
|
|
||||||
}
|
|
||||||
|
|
||||||
if stageID := getTaskStageIDByName(r.TaskStages, tfe.PostPlan); stageID != nil {
|
|
||||||
err = b.runTasks(integration, integration.BeginOutput("Run Tasks (post-plan)"), *stageID)
|
|
||||||
if err != nil {
|
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ func (b *Cloud) runTasksWithTaskResults(context *IntegrationContext, output Inte
|
|||||||
stage, err := fetchTaskStage(b, context.StopContext)
|
stage, err := fetchTaskStage(b, context.StopContext)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, generalError("Failed to retrieve pre-apply task stage", err)
|
return false, generalError("Failed to retrieve task stage", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
summary := summarizeTaskResults(stage.TaskResults)
|
summary := summarizeTaskResults(stage.TaskResults)
|
||||||
|
Loading…
Reference in New Issue
Block a user