diff --git a/vault/config.go b/vault/config.go index 68f903b13..4eafd3d22 100644 --- a/vault/config.go +++ b/vault/config.go @@ -310,7 +310,7 @@ func (cl *ConfigLoader) populateFromConfigFile(config *Config, profileName strin } // Ignore source_profile if it recursively refers to the profile - if config.SourceProfileName == profileName { + if config.SourceProfileName == config.ProfileName { config.SourceProfileName = "" } diff --git a/vault/config_test.go b/vault/config_test.go index 8e99ac1ca..a237a62bc 100644 --- a/vault/config_test.go +++ b/vault/config_test.go @@ -345,3 +345,40 @@ source_profile=foo t.Fatalf("Expected '%s', got '%s'", expectedSourceProfileName, config.SourceProfileName) } } + +func TestSourceProfileCanReferToParent(t *testing.T) { + f := newConfigFile(t, []byte(` +[profile root] + +[profile foo] +parent_profile=root +source_profile=root +`)) + defer os.Remove(f) + + configFile, err := vault.LoadConfig(f) + if err != nil { + t.Fatal(err) + } + + def, ok := configFile.ProfileSection("foo") + if !ok { + t.Fatalf("Couldn't load profile foo") + } + + expectedSourceProfile := "root" + if def.SourceProfile != expectedSourceProfile { + t.Fatalf("Expected '%s', got '%s'", expectedSourceProfile, def.SourceProfile) + } + + configLoader := &vault.ConfigLoader{File: configFile} + config, err := configLoader.LoadFromProfile("foo") + if err != nil { + t.Fatalf("Should have found a profile: %v", err) + } + + expectedSourceProfileName := "root" + if config.SourceProfileName != expectedSourceProfileName { + t.Fatalf("Expected '%s', got '%s'", expectedSourceProfileName, config.SourceProfileName) + } +}