This project is mirrored from https://:*****@github.com/hashicorp/terraform.git. Pull mirroring failed .
Repository mirroring has been paused due to too many failed attempts. It can be resumed by a project maintainer.
  1. 29 Oct, 2021 25 commits
    • Brandon Croft's avatar
      adds X-Terraform-Integration header · 6d9c919f
      Brandon Croft authored
      This can help differentiate cloud integration API requests from normal remote backend requests
      6d9c919f
    • Chris Arcand's avatar
      cloud: Fix version check regression · 3d23a8e0
      Chris Arcand authored
      When the 'select the exact version if possible' behavior was added, the
      version check below it was never updated to take the newly updated
      version in to account, resulting in a failed version check even as the
      remote workspace updated to the correct version necessary.
      3d23a8e0
    • Omar Ismail's avatar
    • Chris Arcand's avatar
    • Nick Fagerlund's avatar
      cloud.StateMgr(): Set terraform version AFTER creating workspace · c99f5972
      Nick Fagerlund authored
      Previously, if the remote TFC/TFE instance doesn't happen to have a tool_version
      record whose name exactly matches the value of `tfversion.String()`, Terraform
      would be completely blocked from using the `terraform workspace new` command
      (when configured with the tags strategy) — the API would give a 422 to the
      whole create request.
      
      This commit changes the StateMgr() function to do the work in two passes; first
      create the workspace (which should work fine regardless), THEN update the
      Terraform version and print a warning to the terminal if it fails (which 99% of
      the time is a benign failure with little impact on your future CLI usage).
      c99f5972
    • Chris Arcand's avatar
      Temporarily skip API version checking · 12a4af3e
      Chris Arcand authored
      12a4af3e
    • Nick Fagerlund's avatar
      Simplify logic flow: everything is a constraint · baa72ce2
      Nick Fagerlund authored
      Explicit version strings are actually also version constraints! And the special
      comparisons we were doing to allow a range of compatible versions can also be
      expressed as version constraints.
      
      Bonus: also simplify the way we handle version check errors, by composing the
      messages inline and only extracting the repetitive parts into a function.
      baa72ce2
    • Barrett Clark's avatar
      83538fdd
    • Nick Fagerlund's avatar
      Cloud backend: accept version constraints from workspaces · b43daeaa
      Nick Fagerlund authored
      The cloud backend (and remote before it) previously expected a TFC workspace's
      `terraform-version` attribute to be either the magic string `"latest"` or an
      explicit semver value. But a workspace might have a version constraint instead
      (like `~> 1.1.0`), in which case the version check would blow up.
      
      This commit checks whether `terraform-version` is a valid version constraint
      before erroring out, and if so, returns success if the local version meets the
      constraint.
      
      Because it's not practical to deeply introspect the slice of version space
      defined by a constraint, this check is slightly less robust than the version
      comparisons below it:
      
      - It can give a false OK on open-ended constraints like `>= 1.1.0`. Say you're
        running 1.3.0, it changed the state format, and the TFE instance admin has
        not yet added any 1.3.x Terraform versions; your workspace will now break.
      
      - It will give a false not-OK when using different minor versions within a range
        that we know to be compatible, e.g. remote constraint of `~> 0.15.0` and local
        version of 1.1.0.
      
      - This would be totally useless with the pre-0.14 versions of Terraform, where
        patch releases could change state format... but we're not going back in time
        to add this feature to them anyway.
      
      Still, in the most common likely case (`~> x.y.z`), it'll complain at you (with
      an error you can choose to override) if you're not using the same minor version,
      and that seems proportionate, useful, and expected.
      b43daeaa
    • Barrett Clark's avatar
      Remove prefix from the cloud backend config · 83337de6
      Barrett Clark authored
      Now that we have tags we no longer need prefix.
      83337de6
    • Barrett Clark's avatar
      Run apply -refresh-state instead of refresh · edbc8442
      Barrett Clark authored
      When a user runs `terraform refresh` we give them an error message that
      tells them to run `terraform apply -refresh-state`. We could just run
      that command for them, though. That is what this PR does.
      edbc8442
    • Chris Arcand's avatar
      cloud: Set minimum TFE version · 7cc53fe1
      Chris Arcand authored
      These changes remove all of the preexisting version checking for
      individual features, wiping the slate clean with an overall minimum
      requirement of a future TFP-API-Version 2.5, which at the time of this
      writing is expected to be TFE v202112-1.
      
      It also actually provides that expected TFE version as an actionable
      error message, rather than generically saying that it isn't supported or
      using the somewhat opaque API version header.
      7cc53fe1
    • Chris Arcand's avatar
      Use the 'tfe' service for everything. · 46e47ed3
      Chris Arcand authored
      The 'tfe' service was appended to with various versions to denote a new
      'feature' implemented by a new 'service'. This quickly proved to not be
      scalable, as adding an entry to the discovery document from every
      feature is bad.
      
      The new mechanism added was checking the TFP-API-Version header on
      requests for a version, instead.
      
      So we'll remove the separation here between different tfe service
      'versions' and the separate 'state' service and Just Use TFE, as well as
      the TFP-API-Version header for all feature versioning., as well as the
      TFP-API-Version header for all feature versioning.
      46e47ed3
    • Chris Arcand's avatar
      Remove all constraint checking · 41267952
      Chris Arcand authored
      This is an outdated mechanism that isn't used anymore.
      41267952
    • Chris Arcand's avatar
    • Chris Arcand's avatar
      cloud: Support interop from 0.14 to 1.1 · aba7d965
      Chris Arcand authored
      The previous conservative guarantee that we would not make backwards
      incompatible changes to the state file format until at least Terraform
      1.1 can now be extended. Terraform 0.14 through 1.1 will be able to
      interoperably use state files, so we can update the remote backend
      version compatibility check accordingly.
      
      This is a port of https://github.com/hashicorp/terraform/pull/29645
      aba7d965
    • Chris Arcand's avatar
      cloud: Align local and remote workspace name with 'name' strategy · d2b6b5f2
      Chris Arcand authored
      This changes the 'name' strategy to always align the local configured
      workspace name and the remote Terraform Cloud workspace, rather than the
      implicit use of the 'default' unnamed workspace being used instead.
      
      What this essentially means is that the Cloud integration does not fully
      support workspaces when configured for a single TFC workspace (as was
      the case with the 'remote' backend), but *does* use the
      backend.Workspaces() interface to allow for normal local behaviors like
      terraform.workspace to resolve to the correct name. It does this by
      always setting the local workspace name when the 'name' strategy is
      used, as a part of initialization.
      
      Part of the diff here is exporting all the previously unexported types
      for mapping workspaces. The command package (and init in particular)
      needs to be able to handle setting the local workspace in this
      particular scenario.
      d2b6b5f2
    • Omar Ismail's avatar
      static checker · a94b2405
      Omar Ismail authored
      a94b2405
    • Chris Arcand's avatar
      Map CLI workspaces by TFC tags · 6dcd0db2
      Chris Arcand authored
      6dcd0db2
    • Chris Arcand's avatar
    • Chris Arcand's avatar
      Refactor private workspace fields into workspaceMapping · 922a8e44
      Chris Arcand authored
      A mostly cosemetic change; The fields 'workspace' and 'prefix' don't
      really describe well what they are from a caller, so change these to use
      a workspaceMapping struct to convey they are for implementing workspace
      mapping strategies from CLI -> TFC
      922a8e44
    • Omar Ismail's avatar
      0a125c04
    • Omar Ismail's avatar
      Add testing for Cloud PrepareConfig · 8f49757f
      Omar Ismail authored
      8f49757f
    • Martin Atkins's avatar
      cloud: Backend implements new version of the backend.Local interface · f4758803
      Martin Atkins authored
      This makes the new backend compatible with the new terraform.Context API,
      which has changed in main.
      f4758803
    • Chris Arcand's avatar
      Initial commit of 'cloud' package · ea8ad0b1
      Chris Arcand authored
      The cloud package intends to implement a new integration for
      Terraform Cloud/Enterprise. The purpose of this integration is to better
      support TFC users; it will shed some overly generic UX and architecture,
      behavior changes that are otherwise backwards incompatible in the remote
      backend, and technical debt - all of which are vestiges from before
      Terraform Cloud existed.
      
      This initial commit is largely a porting of the existing 'remote'
      backend, which will serve as an underlying implementation detail and not
      be a typical user-level backend. This is because to re-implement the
      literal backend interface is orthogonal to the purpose of this
      integration, and can always be migrated away from later.
      
      As this backend is considered an implementation detail, it will not be
      registered as a declarable backend. Within these changes it is, for easy
      of initial development and a clean diff.
      ea8ad0b1
  2. 01 Oct, 2021 1 commit
    • Martin Atkins's avatar
      backend/local: Check dependency lock consistency before any operations · df578afd
      Martin Atkins authored
      In historical versions of Terraform the responsibility to check this was
      inside the terraform.NewContext function, along with various other
      assorted concerns that made that function particularly complicated.
      
      More recently, we reduced the responsibility of the "terraform" package
      only to instantiating particular named plugins, assuming that its caller
      is responsible for selecting appropriate versions of any providers that
      _are_ external. However, until this commit we were just assuming that
      "terraform init" had correctly selected appropriate plugins and recorded
      them in the lock file, and so nothing was dealing with the problem of
      ensuring that there haven't been any changes to the lock file or config
      since the most recent "terraform init" which would cause us to need to
      re-evaluate those decisions.
      
      Part of the game here is to slightly extend the role of the dependency
      locks object to also carry information about a subset of provider
      addresses whose lock entries we're intentionally disregarding as part of
      the various little edge-case features we have for overridding providers:
      dev_overrides, "unmanaged providers", and the testing overrides in our
      own unit tests. This is an in-memory-only annotation, never included in
      the serialized plan files on disk.
      
      I had originally intended to create a new package to encapsulate all of
      this plugin-selection logic, including both the version constraint
      checking here and also the handling of the provider factory functions, but
      as an interim step I've just made version constraint consistency checks
      the responsibility of the backend/local package, which means that we'll
      always catch problems as part of preparing for local operations, while
      not imposing these additional checks on commands that _don't_ run local
      operations, such as "terraform apply" when in remote operations mode.
      df578afd
  3. 24 Sep, 2021 1 commit
    • Alisdair McDiarmid's avatar
      backend/remote: Support interop from 0.14 to 1.1 · 57318ef5
      Alisdair McDiarmid authored
      The previous conservative guarantee that we would not make backwards
      incompatible changes to the state file format until at least Terraform
      1.1 can now be extended. Terraform 0.14 through 1.1 will be able to
      interoperably use state files, so we can update the remote backend
      version compatibility check accordingly.
      57318ef5
  4. 01 Sep, 2021 1 commit
  5. 30 Aug, 2021 1 commit
    • Martin Atkins's avatar
      core: Functional-style API for terraform.Context · 89b05050
      Martin Atkins authored
      Previously terraform.Context was built in an unfortunate way where all of
      the data was provided up front in terraform.NewContext and then mutated
      directly by subsequent operations. That made the data flow hard to follow,
      commonly leading to bugs, and also meant that we were forced to take
      various actions too early in terraform.NewContext, rather than waiting
      until a more appropriate time during an operation.
      
      This (enormous) commit changes terraform.Context so that its fields are
      broadly just unchanging data about the execution context (current
      workspace name, available plugins, etc) whereas the main data Terraform
      works with arrives via individual method arguments and is returned in
      return values.
      
      Specifically, this means that terraform.Context no longer "has-a" config,
      state, and "planned changes", instead holding on to those only temporarily
      during an operation. The caller is responsible for propagating the outcome
      of one step into the next step so that the data flow between operations is
      actually visible.
      
      However, since that's a change to the main entry points in the "terraform"
      package, this commit also touches every file in the codebase which
      interacted with those APIs. Most of the noise here is in updating tests
      to take the same actions using the new API style, but this also affects
      the main-code callers in the backends and in the command package.
      
      My goal here was to refactor without changing observable behavior, but in
      practice there are a couple externally-visible behavior variations here
      that seemed okay in service of the broader goal:
       - The "terraform graph" command is no longer hooked directly into the
         core graph builders, because that's no longer part of the public API.
         However, I did include a couple new Context functions whose contract
         is to produce a UI-oriented graph, and _for now_ those continue to
         return the physical graph we use for those operations. There's no
         exported API for generating the "validate" and "eval" graphs, because
         neither is particularly interesting in its own right, and so
         "terraform graph" no longer supports those graph types.
       - terraform.NewContext no longer has the responsibility for collecting
         all of the provider schemas up front. Instead, we wait until we need
         them. However, that means that some of our error messages now have a
         slightly different shape due to unwinding through a differently-shaped
         call stack. As of this commit we also end up reloading the schemas
         multiple times in some cases, which is functionally acceptable but
         likely represents a performance regression. I intend to rework this to
         use caching, but I'm saving that for a later commit because this one is
         big enough already.
      
      The proximal reason for this change is to resolve the chicken/egg problem
      whereby there was previously no single point where we could apply "moved"
      statements to the previous run state before creating a plan. With this
      change in place, we can now do that as part of Context.Plan, prior to
      forking the input state into the three separate state artifacts we use
      during planning.
      
      However, this is at least the third project in a row where the previous
      API design led to piling more functionality into terraform.NewContext and
      then working around the incorrect order of operations that produces, so
      I intend that by paying the cost/risk of this large diff now we can in
      turn reduce the cost/risk of future projects that relate to our main
      workflow actions.
      89b05050
  6. 27 May, 2021 1 commit
  7. 17 May, 2021 5 commits
    • Martin Atkins's avatar
      Move terraform/ to internal/terraform/ · 36d0a504
      Martin Atkins authored
      This is part of a general effort to move all of Terraform's non-library
      package surface under internal in order to reinforce that these are for
      internal use within Terraform only.
      
      If you were previously importing packages under this prefix into an
      external codebase, you could pin to an earlier release tag as an interim
      solution until you've make a plan to achieve the same functionality some
      other way.
      36d0a504
    • Martin Atkins's avatar
      Move states/ to internal/states/ · f40800b3
      Martin Atkins authored
      This is part of a general effort to move all of Terraform's non-library
      package surface under internal in order to reinforce that these are for
      internal use within Terraform only.
      
      If you were previously importing packages under this prefix into an
      external codebase, you could pin to an earlier release tag as an interim
      solution until you've make a plan to achieve the same functionality some
      other way.
      f40800b3
    • Martin Atkins's avatar
      Move configs/ to internal/configs/ · 31349a9c
      Martin Atkins authored
      This is part of a general effort to move all of Terraform's non-library
      package surface under internal in order to reinforce that these are for
      internal use within Terraform only.
      
      If you were previously importing packages under this prefix into an
      external codebase, you could pin to an earlier release tag as an interim
      solution until you've make a plan to achieve the same functionality some
      other way.
      31349a9c
    • Martin Atkins's avatar
      Move tfdiags/ to internal/tfdiags/ · 05caff2c
      Martin Atkins authored
      This is part of a general effort to move all of Terraform's non-library
      package surface under internal in order to reinforce that these are for
      internal use within Terraform only.
      
      If you were previously importing packages under this prefix into an
      external codebase, you could pin to an earlier release tag as an interim
      solution until you've make a plan to achieve the same functionality some
      other way.
      05caff2c
    • Martin Atkins's avatar
      Move backend/ to internal/backend/ · 73dda868
      Martin Atkins authored
      This is part of a general effort to move all of Terraform's non-library
      package surface under internal in order to reinforce that these are for
      internal use within Terraform only.
      
      If you were previously importing packages under this prefix into an
      external codebase, you could pin to an earlier release tag as an interim
      solution until you've make a plan to achieve the same functionality some
      other way.
      73dda868
  8. 12 May, 2021 1 commit
    • CJ Horton's avatar
      backend/remote: clearer error when org read fails · 8161bc3a
      CJ Horton authored
      When we fail to read the organization entitlements, it's not
      always because the organization doesn't exist; in practice, it's
      usually due to a misspelled organization name, forgetting to
      specify the correct hostname, or an invalid API token. Surfacing
      more information within the error message will help new users
      debug these issues more effectively.
      8161bc3a
  9. 16 Apr, 2021 1 commit
    • Alisdair McDiarmid's avatar
      backend/remote: Add IsLocalOperations · 8dcf768f
      Alisdair McDiarmid authored
      To ensure that the apply command can determine whether an operation is
      executed locally or remotely, we add an IsLocalOperations method on the
      remote backend. This returns the internal forceLocal boolean.
      
      We also update this flag after checking if the corresponding remote
      workspace is in local operations mode or not. This ensures that we know
      if an operation is running locally (entirely on the practitioner's
      machine), pseudo-locally (on a Terraform Cloud worker), or remotely
      (executing on a worker, rendering locally).
      8dcf768f
  10. 15 Mar, 2021 1 commit
    • Alisdair McDiarmid's avatar
      backend/remote: Fix new workspace state migration · 4b159416
      Alisdair McDiarmid authored
      When migrating state to a new workspace, the version check would error
      due to a 404 error on fetching the workspace record. This would result
      in failed state migration.
      
      Instead we should look specifically for a 404 error, and allow migration
      to continue. If we're just about to create the workspace, there can't be
      a version incompatibility problem.
      4b159416
  11. 12 Feb, 2021 1 commit
    • Alisdair McDiarmid's avatar
      backend: Add per-operation diagnostic rendering · 536c80da
      Alisdair McDiarmid authored
      The enhanced backends (local and remote) need to be able to render
      diagnostics during operations. Prior to this commit, this functionality
      was supported with a per-backend `ShowDiagnostics` function pointer.
      
      In order to allow users of these backends to control how diagnostics are
      rendered, this commit moves that function pointer to the `Operation`
      type. This means that a diagnostic renderer is configured for each
      operation, rather than once per backend initialization.
      
      Some secondary consequences of this change:
      
      - The `ReportResult` method on the backend is now moved to the
        `Operation` type, as it needs to access the `ShowDiagnostics` callback
        (and nothing else from the backend);
      - Tests which assumed that diagnostics would be written to the backend's
        `cli.Ui` instance are migrated to using a new record/playback diags
        helper function;
      - Apply, plan, and refresh commands now pass a pointer to the `Meta`
        struct's `showDiagnostics` method.
      
      This commit should not change how Terraform works, and is refactoring in
      preparation for more changes which move UI code out of the backend.
      536c80da
  12. 05 Jan, 2021 1 commit