Merge pull request #20379 from hashicorp/svh/f-state-service
backend/remote: use `state.v2` for remote state only
This commit is contained in:
commit
43eb7c08e0
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue