From eb1f1136934d0cadbca3d481be08a9aba17558d7 Mon Sep 17 00:00:00 2001 From: CJ Horton Date: Thu, 13 May 2021 21:14:15 -0700 Subject: [PATCH] backend/remote: validate API version for refresh and replace --- internal/backend/remote/backend_apply.go | 32 ++++++++++++++++++++++++ internal/backend/remote/backend_plan.go | 16 ++++++++++++ 2 files changed, 48 insertions(+) diff --git a/internal/backend/remote/backend_apply.go b/internal/backend/remote/backend_apply.go index 14be147ba..2ec123d30 100644 --- a/internal/backend/remote/backend_apply.go +++ b/internal/backend/remote/backend_apply.go @@ -108,6 +108,38 @@ func (b *Remote) opApply(stopCtx, cancelCtx context.Context, op *backend.Operati } } + if op.PlanMode == plans.RefreshOnlyMode { + desiredAPIVersion, _ := version.NewVersion("2.4") + + if parseErr != nil || currentAPIVersion.LessThan(desiredAPIVersion) { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Refresh-only mode is not supported", + fmt.Sprintf( + `The host %s does not support -refresh-only mode for `+ + `remote plans.`, + b.hostname, + ), + )) + } + } + + if len(op.ForceReplace) != 0 { + desiredAPIVersion, _ := version.NewVersion("2.4") + + if parseErr != nil || currentAPIVersion.LessThan(desiredAPIVersion) { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Planning resource replacements is not supported", + fmt.Sprintf( + `The host %s does not support the -replace option for `+ + `remote plans.`, + b.hostname, + ), + )) + } + } + if len(op.Targets) != 0 { desiredAPIVersion, _ := version.NewVersion("2.3") diff --git a/internal/backend/remote/backend_plan.go b/internal/backend/remote/backend_plan.go index 9f208a7fb..430131050 100644 --- a/internal/backend/remote/backend_plan.go +++ b/internal/backend/remote/backend_plan.go @@ -146,6 +146,22 @@ func (b *Remote) opPlan(stopCtx, cancelCtx context.Context, op *backend.Operatio } } + if op.PlanMode == plans.RefreshOnlyMode { + desiredAPIVersion, _ := version.NewVersion("2.4") + + if parseErr != nil || currentAPIVersion.LessThan(desiredAPIVersion) { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Refresh-only mode is not supported", + fmt.Sprintf( + `The host %s does not support -refresh-only mode for `+ + `remote plans.`, + b.hostname, + ), + )) + } + } + // Return if there are any errors. if diags.HasErrors() { return nil, diags.Err()