Skip to content

Commit f9d5987

Browse files
paddycarverPaddy
authored andcommitted
Restore user agent append logic, add tests.
Restore the logic that adds a user agent when an environment variable is set; apparently Terraform Cloud uses that. Also, add some tests to demonstrate what results we'll get in various scenarios.
1 parent bfb5cb5 commit f9d5987

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

helper/schema/provider.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"errors"
66
"fmt"
77
"log"
8+
"os"
89
"sort"
10+
"strings"
911

1012
"github.com/hashicorp/go-multierror"
1113

@@ -15,6 +17,8 @@ import (
1517
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1618
)
1719

20+
const uaEnvVar = "TF_APPEND_USER_AGENT"
21+
1822
var ReservedProviderFields = []string{
1923
"alias",
2024
"version",
@@ -433,6 +437,25 @@ func (p *Provider) DataSources() []terraform.DataSource {
433437
// version of Terraform, the Plugin SDK, and the provider used to generate the
434438
// request. `name` should be the hyphen-separated reporting name of the
435439
// provider, and `version` should be the version of the provider.
440+
//
441+
// If TF_APPEND_USER_AGENT is set, its value will be appended to the returned
442+
// string.
436443
func (p *Provider) UserAgent(name, version string) string {
437-
return fmt.Sprintf("Terraform/%s (+https://www.terraform.io) Terraform-Plugin-SDK/%s %s/%s", p.TerraformVersion, meta.SDKVersionString(), name, version)
444+
ua := fmt.Sprintf("Terraform/%s (+https://www.terraform.io) Terraform-Plugin-SDK/%s", p.TerraformVersion, meta.SDKVersionString())
445+
if name != "" {
446+
ua += " " + name
447+
if version != "" {
448+
ua += "/" + version
449+
}
450+
}
451+
452+
if add := os.Getenv(uaEnvVar); add != "" {
453+
add = strings.TrimSpace(add)
454+
if len(add) > 0 {
455+
ua += " " + add
456+
log.Printf("[DEBUG] Using modified User-Agent: %s", ua)
457+
}
458+
}
459+
460+
return ua
438461
}

helper/schema/provider_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package schema
33
import (
44
"context"
55
"fmt"
6+
"os"
67
"reflect"
78
"strings"
89
"testing"
@@ -14,6 +15,7 @@ import (
1415
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/internal/configs/configschema"
1617
"github.com/hashicorp/terraform-plugin-sdk/v2/internal/diagutils"
18+
"github.com/hashicorp/terraform-plugin-sdk/v2/meta"
1719
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1820
)
1921

@@ -780,3 +782,48 @@ func TestProvider_InternalValidate(t *testing.T) {
780782
}
781783
}
782784
}
785+
786+
func TestProviderUserAgentAppendViaEnvVar(t *testing.T) {
787+
if oldenv, isSet := os.LookupEnv(uaEnvVar); isSet {
788+
defer os.Setenv(uaEnvVar, oldenv)
789+
} else {
790+
defer os.Unsetenv(uaEnvVar)
791+
}
792+
793+
expectedBase := "Terraform/4.5.6 (+https://www.terraform.io) Terraform-Plugin-SDK/" + meta.SDKVersionString()
794+
795+
testCases := []struct {
796+
providerName string
797+
providerVersion string
798+
envVarValue string
799+
expected string
800+
}{
801+
{"", "", "", expectedBase},
802+
{"", "", " ", expectedBase},
803+
{"", "", " \n", expectedBase},
804+
{"", "", "test/1", expectedBase + " test/1"},
805+
{"", "", "test/1 (comment)", expectedBase + " test/1 (comment)"},
806+
{"My-Provider", "", "", expectedBase + " My-Provider"},
807+
{"My-Provider", "", " ", expectedBase + " My-Provider"},
808+
{"My-Provider", "", " \n", expectedBase + " My-Provider"},
809+
{"My-Provider", "", "test/1", expectedBase + " My-Provider test/1"},
810+
{"My-Provider", "", "test/1 (comment)", expectedBase + " My-Provider test/1 (comment)"},
811+
{"My-Provider", "1.2.3", "", expectedBase + " My-Provider/1.2.3"},
812+
{"My-Provider", "1.2.3", " ", expectedBase + " My-Provider/1.2.3"},
813+
{"My-Provider", "1.2.3", " \n", expectedBase + " My-Provider/1.2.3"},
814+
{"My-Provider", "1.2.3", "test/1", expectedBase + " My-Provider/1.2.3 test/1"},
815+
{"My-Provider", "1.2.3", "test/1 (comment)", expectedBase + " My-Provider/1.2.3 test/1 (comment)"},
816+
}
817+
818+
for i, tc := range testCases {
819+
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
820+
os.Unsetenv(uaEnvVar)
821+
os.Setenv(uaEnvVar, tc.envVarValue)
822+
p := &Provider{TerraformVersion: "4.5.6"}
823+
givenUA := p.UserAgent(tc.providerName, tc.providerVersion)
824+
if givenUA != tc.expected {
825+
t.Fatalf("Expected User-Agent '%s' does not match '%s'", tc.expected, givenUA)
826+
}
827+
})
828+
}
829+
}

0 commit comments

Comments
 (0)