From ddec063e092877f5b3c6c97c0bfdb4f6e8b7b9be Mon Sep 17 00:00:00 2001 From: Edoardo Tenani <526307+endorama@users.noreply.github.com> Date: Mon, 4 Mar 2024 18:24:23 +0100 Subject: [PATCH 1/3] fix linting (#11) --- internal/plugin/manager/shellfile.go | 32 ++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/internal/plugin/manager/shellfile.go b/internal/plugin/manager/shellfile.go index 715ee31..10d4c3d 100644 --- a/internal/plugin/manager/shellfile.go +++ b/internal/plugin/manager/shellfile.go @@ -50,22 +50,40 @@ func ShellLoader(p persona.Persona) (string, error) { log.Printf("%+v", tmpl) + logPlugins(plugins) + + data.RenderedPlugins = renderPlugins(p, plugins) + + content := strings.Builder{} + if err = tmpl.Execute(&content, data); err != nil { + return "", fmt.Errorf("cannot execute shellLoaderFile template: %w", err) + } + + return content.String(), nil +} + +func logPlugins(plugins []Plugin) { availablePlugins := strings.Builder{} enabledPlugins := strings.Builder{} + for _, plg := range plugins { availablePlugins.Write([]byte(plg.Instance.Name())) + if plg.Enabled { enabledPlugins.Write([]byte(plg.Instance.Name())) } + if plg != plugins[len(plugins)-1] { availablePlugins.WriteByte(',') enabledPlugins.WriteByte(',') } } - fmt.Printf("available plugins: %s\n", availablePlugins.String()) - fmt.Printf("enabled plugins : %s\n", enabledPlugins.String()) + log.Printf("available plugins: %s\n", availablePlugins.String()) + log.Printf("enabled plugins : %s\n", enabledPlugins.String()) +} +func renderPlugins(p persona.Persona, plugins []Plugin) string { sb := strings.Builder{} for _, plg := range plugins { @@ -78,13 +96,5 @@ func ShellLoader(p persona.Persona) (string, error) { } } - data.RenderedPlugins = sb.String() - content := strings.Builder{} - - err = tmpl.Execute(&content, data) - if err != nil { - return "", fmt.Errorf("cannot execute shellLoaderFile template: %w", err) - } - - return content.String(), nil + return sb.String() } From 4e5162c3a6504696b8548ddb6e921352472c3ae1 Mon Sep 17 00:00:00 2001 From: Edoardo Tenani Date: Mon, 4 Mar 2024 17:06:55 +0100 Subject: [PATCH 2/3] aws: don't configure AWS_PROFILE The plugin currently always set AWS_PROFILE to the persona's name. This is not necessary, as having multiple personas allow to leverage the default profile for each without special AWS configurations. Updates the plugin to accept an additional custom_profile_name configuration that specifies the custom profile name to use. When empty, AWS_PROFILE is not set. When set to `$PERSONA`, the value is replaced with current persona's name. **This is a breaking change.** --- plugins/aws/configurable.go | 3 ++- plugins/aws/renderable.go | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/aws/configurable.go b/plugins/aws/configurable.go index 49f88f1..6fbf410 100644 --- a/plugins/aws/configurable.go +++ b/plugins/aws/configurable.go @@ -11,7 +11,8 @@ type Config struct { // configuration. When true it the plugin will set AWS_CONFIG to a file within the persona // folder. // Default is false. - LocalConfig bool `mapstructure:"local_config"` + LocalConfig bool `mapstructure:"local_config"` + CustomProfileName string `mapstructure:"custom_profile_name"` } func (p *Plugin) Configure(v *viper.Viper) error { diff --git a/plugins/aws/renderable.go b/plugins/aws/renderable.go index 0d79535..861cfa7 100644 --- a/plugins/aws/renderable.go +++ b/plugins/aws/renderable.go @@ -11,7 +11,14 @@ func (p *Plugin) Render(personaName, personaDirectory string) string { sb.WriteString("export AWS_CONFIG_FILE=" + personaDirectory + "/aws/config\n") } - sb.WriteString("export AWS_PROFILE=\"" + personaName + "\"\n") + if p.config.CustomProfileName != "" { + profile := p.config.CustomProfileName + if p.config.CustomProfileName == "$PERSONA" { + profile = personaName + } + sb.WriteString("export AWS_PROFILE=\"" + profile + "\"\n") + } + sb.WriteString("export AWS_SHARED_CREDENTIALS_FILE=" + personaDirectory + "/aws/credentials\n") return sb.String() From 12a694b2dd89264762d205fe7efbe0aa8085d775 Mon Sep 17 00:00:00 2001 From: Edoardo Tenani Date: Mon, 4 Mar 2024 17:15:26 +0100 Subject: [PATCH 3/3] fix tests --- plugins/aws/configurable_test.go | 15 +++++++++++ plugins/aws/renderable_test.go | 46 +++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/plugins/aws/configurable_test.go b/plugins/aws/configurable_test.go index 6b3b923..0efca70 100644 --- a/plugins/aws/configurable_test.go +++ b/plugins/aws/configurable_test.go @@ -31,6 +31,21 @@ func TestPlugin_Configure(t *testing.T) { assert.Nil(t, err, "err should be nil") } +func TestPlugin_ConfigureCustomProfileName(t *testing.T) { + config := plugintest.GetConfig(t, "charlie").Sub("aws") + require.NotNil(t, config) + + p := aws.NewPlugin() + + err := p.Configure(config) + if err != nil { + t.Errorf(fmt.Errorf("cannot load plugin config: %w", err).Error()) + } + + require.Nil(t, err, "err should be nil") + require.Equal(t, "foobar", p.Config().CustomProfileName) +} + func TestPlugin_ConfigureLocalConfig(t *testing.T) { config := plugintest.GetConfig(t, "bob").Sub("aws") require.NotNil(t, config) diff --git a/plugins/aws/renderable_test.go b/plugins/aws/renderable_test.go index 875871f..1da619b 100644 --- a/plugins/aws/renderable_test.go +++ b/plugins/aws/renderable_test.go @@ -25,8 +25,7 @@ func TestPlugin_Render(t *testing.T) { r := i.Render(p.Name(), p.Location()) - expected := `export AWS_PROFILE="alice" -export AWS_SHARED_CREDENTIALS_FILE=testdata/alice/aws/credentials + expected := `export AWS_SHARED_CREDENTIALS_FILE=testdata/alice/aws/credentials ` assert.Equal(t, expected, r) } @@ -47,8 +46,49 @@ func TestPlugin_RenderWithLocalConfig(t *testing.T) { r := i.Render(p.Name(), p.Location()) expected := `export AWS_CONFIG_FILE=testdata/bob/aws/config -export AWS_PROFILE="bob" export AWS_SHARED_CREDENTIALS_FILE=testdata/bob/aws/credentials ` assert.Equal(t, expected, r) } + +func TestPlugin_RenderWithCustomProfileName(t *testing.T) { + config := plugintest.GetConfig(t, "charlie").Sub("aws") + require.NotNil(t, config) + + p := plugintest.GetPersona(t, "charlie") + + i := aws.NewPlugin() + + err := i.Configure(config) + require.NoError(t, err) + + assert.True(t, plugintest.IsEnabled(t, "aws", p.Config), "plugin is not enabled for this persona") + + r := i.Render(p.Name(), p.Location()) + + expected := `export AWS_PROFILE="foobar" +export AWS_SHARED_CREDENTIALS_FILE=testdata/charlie/aws/credentials +` + assert.Equal(t, expected, r) +} + +func TestPlugin_RenderWithCustomProfileNamePersona(t *testing.T) { + config := plugintest.GetConfig(t, "dan").Sub("aws") + require.NotNil(t, config) + + p := plugintest.GetPersona(t, "dan") + + i := aws.NewPlugin() + + err := i.Configure(config) + require.NoError(t, err) + + assert.True(t, plugintest.IsEnabled(t, "aws", p.Config), "plugin is not enabled for this persona") + + r := i.Render(p.Name(), p.Location()) + + expected := `export AWS_PROFILE="dan" +export AWS_SHARED_CREDENTIALS_FILE=testdata/dan/aws/credentials +` + assert.Equal(t, expected, r) +}