Skip to content

Commit 2630eb9

Browse files
committed
Add IsCloud and IsEnterprise methods to client struct
1 parent 2172f99 commit 2630eb9

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

tfe.go

+26
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const (
3535
_userAgent = "go-tfe"
3636
_headerRateLimit = "X-RateLimit-Limit"
3737
_headerRateReset = "X-RateLimit-Reset"
38+
_headerAppName = "TFP-AppName"
3839
_headerAPIVersion = "TFP-API-Version"
3940
_headerTFEVersion = "X-TFE-Version"
4041
_includeQueryParam = "include"
@@ -120,6 +121,7 @@ type Client struct {
120121
retryServerErrors bool
121122
remoteAPIVersion string
122123
remoteTFEVersion string
124+
appName string
123125

124126
Admin Admin
125127
Agents Agents
@@ -361,6 +363,9 @@ func NewClient(cfg *Config) (*Client, error) {
361363
// Save the TFE version
362364
client.remoteTFEVersion = meta.TFEVersion
363365

366+
// Save the app name
367+
client.appName = meta.AppName
368+
364369
// Create Admin
365370
client.Admin = Admin{
366371
Organizations: &adminOrganizations{client: client},
@@ -431,6 +436,23 @@ func NewClient(cfg *Config) (*Client, error) {
431436
return client, nil
432437
}
433438

439+
// IsCloud returns true if the client is configured against a Terraform Cloud
440+
// instance.
441+
//
442+
// Whether an instance is TFC or TFE is derived from the TFP-AppName header.
443+
func (c Client) IsCloud() bool {
444+
return c.appName == "Terraform Cloud"
445+
}
446+
447+
// IsEnterprise returns true if the client is configured against a Terraform
448+
// Enterprise instance.
449+
//
450+
// Whether an instance is TFC or TFE is derived from the TFP-AppName header. Note:
451+
// not all TFE releases include this header in API responses.
452+
func (c Client) IsEnterprise() bool {
453+
return !c.IsCloud()
454+
}
455+
434456
// RemoteAPIVersion returns the server's declared API version string.
435457
//
436458
// A Terraform Cloud or Enterprise API server returns its API version in an
@@ -565,6 +587,9 @@ type rawAPIMetadata struct {
565587
// X-RateLimit-Limit response header, or an empty string if that header
566588
// field was not included in the response.
567589
RateLimit string
590+
591+
// AppName is either 'Terraform Cloud' or 'Terraform Enterprise'
592+
AppName string
568593
}
569594

570595
func (c *Client) getRawAPIMetadata() (rawAPIMetadata, error) {
@@ -597,6 +622,7 @@ func (c *Client) getRawAPIMetadata() (rawAPIMetadata, error) {
597622
meta.APIVersion = resp.Header.Get(_headerAPIVersion)
598623
meta.RateLimit = resp.Header.Get(_headerRateLimit)
599624
meta.TFEVersion = resp.Header.Get(_headerTFEVersion)
625+
meta.AppName = resp.Header.Get(_headerAppName)
600626

601627
return meta, nil
602628
}

tfe_integration_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ func TestClient_newClient(t *testing.T) {
2525
w.Header().Set("X-RateLimit-Limit", "30")
2626
w.Header().Set("TFP-API-Version", "34.21.9")
2727
w.Header().Set("X-TFE-Version", "202205-1")
28+
if enterpriseEnabled() {
29+
w.Header().Set("TFP-AppName", "Terraform Enterprise")
30+
} else {
31+
w.Header().Set("TFP-AppName", "Terraform Cloud")
32+
}
2833
w.WriteHeader(204) // We query the configured ping URL which should return a 204.
2934
}))
3035
defer ts.Close()
@@ -85,6 +90,12 @@ func TestClient_newClient(t *testing.T) {
8590
t.Errorf("unexpected remote TFE version %q; want %q", client.RemoteTFEVersion(), want)
8691
}
8792

93+
if enterpriseEnabled() {
94+
assert.True(t, client.IsEnterprise())
95+
} else {
96+
assert.True(t, client.IsCloud())
97+
}
98+
8899
client.SetFakeRemoteAPIVersion("1.0")
89100

90101
if want := "1.0"; client.RemoteAPIVersion() != want {

0 commit comments

Comments
 (0)