-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #105 from VinozzZ/user-agent
Set azure user agent env for azure provider
- Loading branch information
Showing
8 changed files
with
248 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
package terraform | ||
|
||
import ( | ||
"strconv" | ||
"strings" | ||
|
||
"get.porter.sh/porter/pkg" | ||
) | ||
|
||
const ( | ||
// AzureUserAgentEnvVar is the environment variable used by the azure provider to set | ||
// the user agent string sent to Azure. | ||
AzureUserAgentEnvVar = "AZURE_HTTP_USER_AGENT" | ||
|
||
// UserAgentOptOutEnvVar is the name of the environment variable that disables | ||
// user agent reporting. | ||
UserAgentOptOutEnvVar = "PORTER_TERRAFORM_MIXIN_USER_AGENT_OPT_OUT" | ||
) | ||
|
||
// SetUserAgent sets the AZURE_HTTP_USER_AGENT environment variable with | ||
// the full user agent string, which includes both a portion for porter and the | ||
// mixin. | ||
func (m *Mixin) SetUserAgent() { | ||
// Check if PORTER_TERRAFORM_MIXIN_USER_AGENT_OPT_OUT=true, which disables editing the user agent string | ||
if optOut, _ := strconv.ParseBool(m.Getenv(UserAgentOptOutEnvVar)); optOut { | ||
return | ||
} | ||
|
||
// Check if we have already set the user agent | ||
if m.userAgent != "" { | ||
return | ||
} | ||
|
||
porterUserAgent := pkg.UserAgent() | ||
mixinUserAgent := m.GetMixinUserAgent() | ||
userAgent := []string{porterUserAgent, mixinUserAgent} | ||
// Append porter and the mixin's version to the user agent string. Some clouds and | ||
// environments will have set the environment variable already and we don't want | ||
// to clobber it. | ||
value := strings.Join(userAgent, " ") | ||
if agentStr, ok := m.LookupEnv(AzureUserAgentEnvVar); ok { | ||
|
||
// Check if we have already set the user agent | ||
if strings.Contains(agentStr, value) { | ||
value = agentStr | ||
} else { | ||
userAgent = append(userAgent, agentStr) | ||
value = strings.Join(userAgent, " ") | ||
} | ||
} | ||
|
||
m.userAgent = value | ||
|
||
// Set the environment variable so that when we call the | ||
// azure provider, it's automatically passed too. | ||
m.Setenv(AzureUserAgentEnvVar, m.userAgent) | ||
} | ||
|
||
// GetMixinUserAgent returns the portion of the user agent string for the mixin. | ||
func (m *Mixin) GetMixinUserAgent() string { | ||
v := m.Version() | ||
return "getporter/" + v.Name + "/" + v.Version | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package terraform | ||
|
||
import ( | ||
"os" | ||
"testing" | ||
|
||
"get.porter.sh/mixin/terraform/pkg" | ||
"get.porter.sh/porter/pkg/runtime" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestMixinSetsUserAgentEnvVar(t *testing.T) { | ||
// CI sets this value and we need to clear it out to make the test reproducible | ||
os.Unsetenv(AzureUserAgentEnvVar) | ||
|
||
t.Run("sets env var", func(t *testing.T) { | ||
pkg.Commit = "abc123" | ||
pkg.Version = "v1.2.3" | ||
m := New() | ||
expected := "getporter/porter getporter/terraform/" + pkg.Version | ||
require.Equal(t, expected, m.Getenv(AzureUserAgentEnvVar)) | ||
require.Equal(t, expected, m.userAgent, "validate we remember the user agent string for later") | ||
}) | ||
t.Run("edits env var", func(t *testing.T) { | ||
os.Unsetenv(AzureUserAgentEnvVar) | ||
// Validate that if the user customizations of the env var are preserved | ||
pkg.Commit = "abc123" | ||
pkg.Version = "v1.2.3" | ||
cfg := runtime.NewConfig() | ||
customUserAgent := "mycustom/v1.2.3" | ||
cfg.Setenv(AzureUserAgentEnvVar, customUserAgent) | ||
m := NewFor(cfg) | ||
expected := "getporter/porter getporter/terraform/v1.2.3 mycustom/v1.2.3" | ||
require.Equal(t, expected, m.Getenv(AzureUserAgentEnvVar)) | ||
require.Equal(t, expected, m.userAgent, "validate we remember the user agent string for later") | ||
}) | ||
|
||
t.Run("env var already set", func(t *testing.T) { | ||
// Validate that calling multiple times doesn't make a messed up env var | ||
os.Unsetenv(AzureUserAgentEnvVar) | ||
pkg.Commit = "abc123" | ||
pkg.Version = "v1.2.3" | ||
cfg := runtime.NewConfig() | ||
customUserAgent := "getporter/porter getporter/terraform/v1.2.3" | ||
cfg.Setenv(AzureUserAgentEnvVar, customUserAgent) | ||
m := New() | ||
m.SetUserAgent() | ||
expected := "getporter/porter getporter/terraform/v1.2.3" | ||
require.Equal(t, expected, m.Getenv(AzureUserAgentEnvVar)) | ||
require.Equal(t, expected, m.userAgent, "validate we remember the user agent string for later") | ||
}) | ||
t.Run("call multiple times", func(t *testing.T) { | ||
// Validate that calling multiple times doesn't make a messed up env var | ||
os.Unsetenv(AzureUserAgentEnvVar) | ||
pkg.Commit = "abc123" | ||
pkg.Version = "v1.2.3" | ||
m := New() | ||
m.SetUserAgent() | ||
m.SetUserAgent() | ||
expected := "getporter/porter getporter/terraform/v1.2.3" | ||
require.Equal(t, expected, m.Getenv(AzureUserAgentEnvVar)) | ||
require.Equal(t, expected, m.userAgent, "validate we remember the user agent string for later") | ||
}) | ||
} | ||
|
||
func TestMixinSetsUserAgentEnvVar_OptOut(t *testing.T) { | ||
// CI sets this value and we need to clear it out to make the test reproducible | ||
os.Unsetenv(AzureUserAgentEnvVar) | ||
|
||
t.Run("opt-out", func(t *testing.T) { | ||
// Validate that at runtime when we are calling the az cli, that if the bundle author opted-out, we don't set the user agent string | ||
cfg := runtime.NewConfig() | ||
cfg.Setenv(UserAgentOptOutEnvVar, "true") | ||
m := NewFor(cfg) | ||
_, hasEnv := m.LookupEnv(AzureUserAgentEnvVar) | ||
require.False(t, hasEnv, "expected the opt out to skip setting the AZURE_HTTP_USER_AGENT environment variable") | ||
}) | ||
t.Run("opt-out preserves original value", func(t *testing.T) { | ||
// Validate that at runtime when we are calling the az cli, that if the bundle author opted-out, we don't set the user agent string | ||
cfg := runtime.NewConfig() | ||
cfg.Setenv(UserAgentOptOutEnvVar, "true") | ||
customUserAgent := "mycustom/v1.2.3" | ||
cfg.Setenv(AzureUserAgentEnvVar, customUserAgent) | ||
m := NewFor(cfg) | ||
require.Equal(t, customUserAgent, m.Getenv(AzureUserAgentEnvVar), "expected opting out to not prevent the user from setting a custom user agent") | ||
require.Empty(t, m.userAgent, "validate we remember that we opted out") | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
...rm/testdata/build-input-with-version.yaml → ...orm/testdata/build-input-with-config.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
config: | ||
clientVersion: 0.13.0-rc1 | ||
userAgentOptOut: true | ||
install: | ||
- terraform: | ||
description: "noop" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters