Merge pull request #20379 from hashicorp/svh/f-state-service

backend/remote: use `state.v2` for remote state only
This commit is contained in:
Sander van Harmelen 2019-02-20 10:48:05 +01:00 committed by GitHub
commit 43eb7c08e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 9 deletions

View File

@ -24,7 +24,7 @@ func New() backend.Backend {
"endpoints": &schema.Schema{ "endpoints": &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
Description: "A space-separated list of the etcd endpoints<Paste>", Description: "A space-separated list of the etcd endpoints",
}, },
"username": &schema.Schema{ "username": &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,

View File

@ -33,6 +33,7 @@ import (
const ( const (
defaultHostname = "app.terraform.io" defaultHostname = "app.terraform.io"
defaultParallelism = 10 defaultParallelism = 10
stateServiceID = "state.v2"
tfeServiceID = "tfe.v2.1" tfeServiceID = "tfe.v2.1"
) )
@ -211,9 +212,17 @@ func (b *Remote) Configure(obj cty.Value) tfdiags.Diagnostics {
} }
} }
// Determine if we are forced to use the local backend.
b.forceLocal = os.Getenv("TF_FORCE_LOCAL_BACKEND") != ""
serviceID := tfeServiceID
if b.forceLocal {
serviceID = stateServiceID
}
// Discover the service URL for this host to confirm that it provides // Discover the service URL for this host to confirm that it provides
// a remote backend API and to get the version constraints. // a remote backend API and to get the version constraints.
service, constraints, err := b.discover() service, constraints, err := b.discover(serviceID)
// First check any contraints we might have received. // First check any contraints we might have received.
if constraints != nil { if constraints != nil {
@ -313,13 +322,13 @@ func (b *Remote) Configure(obj cty.Value) tfdiags.Diagnostics {
// Configure a local backend for when we need to run operations locally. // Configure a local backend for when we need to run operations locally.
b.local = backendLocal.NewWithBackend(b) b.local = backendLocal.NewWithBackend(b)
b.forceLocal = !entitlements.Operations || os.Getenv("TF_FORCE_LOCAL_BACKEND") != "" b.forceLocal = b.forceLocal || !entitlements.Operations
return diags return diags
} }
// discover the remote backend API service URL and version constraints. // discover the remote backend API service URL and version constraints.
func (b *Remote) discover() (*url.URL, *disco.Constraints, error) { func (b *Remote) discover(serviceID string) (*url.URL, *disco.Constraints, error) {
hostname, err := svchost.ForComparison(b.hostname) hostname, err := svchost.ForComparison(b.hostname)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -330,7 +339,7 @@ func (b *Remote) discover() (*url.URL, *disco.Constraints, error) {
return nil, nil, err return nil, nil, err
} }
service, err := host.ServiceURL(tfeServiceID) service, err := host.ServiceURL(serviceID)
// Return the error, unless its a disco.ErrVersionNotSupported error. // Return the error, unless its a disco.ErrVersionNotSupported error.
if _, ok := err.(*disco.ErrVersionNotSupported); !ok && err != nil { if _, ok := err.(*disco.ErrVersionNotSupported); !ok && err != nil {
return nil, nil, err return nil, nil, err
@ -338,7 +347,7 @@ func (b *Remote) discover() (*url.URL, *disco.Constraints, error) {
// We purposefully ignore the error and return the previous error, as // We purposefully ignore the error and return the previous error, as
// checking for version constraints is considered optional. // checking for version constraints is considered optional.
constraints, _ := host.VersionConstraints(tfeServiceID, "terraform") constraints, _ := host.VersionConstraints(serviceID, "terraform")
return service, constraints, err return service, constraints, err
} }

View File

@ -6,6 +6,7 @@ import (
"io" "io"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"path"
"testing" "testing"
tfe "github.com/hashicorp/go-tfe" tfe "github.com/hashicorp/go-tfe"
@ -184,6 +185,7 @@ func testServer(t *testing.T) *httptest.Server {
mux.HandleFunc("/well-known/terraform.json", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/well-known/terraform.json", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
io.WriteString(w, `{ io.WriteString(w, `{
"state.v2": "/api/v2/",
"tfe.v2.1": "/api/v2/", "tfe.v2.1": "/api/v2/",
"versions.v1": "/v1/versions/" "versions.v1": "/v1/versions/"
}`) }`)
@ -192,12 +194,12 @@ func testServer(t *testing.T) *httptest.Server {
// Respond to service version constraints calls. // Respond to service version constraints calls.
mux.HandleFunc("/v1/versions/", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/v1/versions/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
io.WriteString(w, `{ io.WriteString(w, fmt.Sprintf(`{
"service": "tfe.v2.1", "service": "%s",
"product": "terraform", "product": "terraform",
"minimum": "0.1.0", "minimum": "0.1.0",
"maximum": "10.0.0" "maximum": "10.0.0"
}`) }`, path.Base(r.URL.Path)))
}) })
// Respond to the initial query to read the hashicorp org entitlements. // Respond to the initial query to read the hashicorp org entitlements.
@ -259,6 +261,7 @@ func testServer(t *testing.T) *httptest.Server {
// localhost to a local test server. // localhost to a local test server.
func testDisco(s *httptest.Server) *disco.Disco { func testDisco(s *httptest.Server) *disco.Disco {
services := map[string]interface{}{ services := map[string]interface{}{
"state.v2": fmt.Sprintf("%s/api/v2/", s.URL),
"tfe.v2.1": fmt.Sprintf("%s/api/v2/", s.URL), "tfe.v2.1": fmt.Sprintf("%s/api/v2/", s.URL),
"versions.v1": fmt.Sprintf("%s/v1/versions/", s.URL), "versions.v1": fmt.Sprintf("%s/v1/versions/", s.URL),
} }