Skip to content

Commit 2b6b2bd

Browse files
add docker-agent.yaml config autodiscovery
1 parent f41413d commit 2b6b2bd

2 files changed

Lines changed: 112 additions & 0 deletions

File tree

pkg/config/resolve.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,36 @@ func singleSource(key string, source Source) Sources {
142142
return Sources{key: source}
143143
}
144144

145+
// autodiscoverConfigFile checks the current working directory for a
146+
// docker-agent.yaml or docker-agent.yml file. It returns the absolute
147+
// path of the first match found, or "" if neither file exists.
148+
var autodiscoverConfigNames = []string{"docker-agent.yaml", "docker-agent.yml"}
149+
150+
func autodiscoverConfigFile() string {
151+
wd, err := os.Getwd()
152+
if err != nil {
153+
return ""
154+
}
155+
for _, name := range autodiscoverConfigNames {
156+
path := filepath.Join(wd, name)
157+
if fileExists(path) {
158+
slog.Debug("Auto-discovered agent config", "path", path)
159+
return path
160+
}
161+
}
162+
return ""
163+
}
164+
145165
// resolve resolves an agent reference, handling aliases and defaults
146166
func resolve(agentFilename string) (string, error) {
167+
// When no agent file is specified, try to auto-discover a config file
168+
// in the current directory before falling back to the embedded default.
169+
if agentFilename == "" {
170+
if discovered := autodiscoverConfigFile(); discovered != "" {
171+
agentFilename = discovered
172+
}
173+
}
174+
147175
agentFilename = cmp.Or(agentFilename, "default")
148176

149177
// Try to resolve as an alias first

pkg/config/resolve_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,96 @@ func TestResolveAgentFile_EmptyIsDefault(t *testing.T) {
8989
home := t.TempDir()
9090
t.Setenv("HOME", home)
9191

92+
// Ensure no docker-agent.yaml in the working directory
93+
t.Chdir(t.TempDir())
94+
95+
resolved, err := resolve("")
96+
97+
require.NoError(t, err)
98+
assert.Equal(t, "default", resolved)
99+
}
100+
101+
func TestResolveAgentFile_AutodiscoverYaml(t *testing.T) {
102+
home := t.TempDir()
103+
t.Setenv("HOME", home)
104+
105+
dir := t.TempDir()
106+
configFile := filepath.Join(dir, "docker-agent.yaml")
107+
require.NoError(t, os.WriteFile(configFile, []byte(`version: "1"`), 0o644))
108+
t.Chdir(dir)
109+
110+
resolved, err := resolve("")
111+
112+
require.NoError(t, err)
113+
assert.Equal(t, configFile, resolved)
114+
}
115+
116+
func TestResolveAgentFile_AutodiscoverYml(t *testing.T) {
117+
home := t.TempDir()
118+
t.Setenv("HOME", home)
119+
120+
dir := t.TempDir()
121+
configFile := filepath.Join(dir, "docker-agent.yml")
122+
require.NoError(t, os.WriteFile(configFile, []byte(`version: "1"`), 0o644))
123+
t.Chdir(dir)
124+
125+
resolved, err := resolve("")
126+
127+
require.NoError(t, err)
128+
assert.Equal(t, configFile, resolved)
129+
}
130+
131+
func TestResolveAgentFile_AutodiscoverYamlTakesPrecedenceOverYml(t *testing.T) {
132+
home := t.TempDir()
133+
t.Setenv("HOME", home)
134+
135+
dir := t.TempDir()
136+
primaryConfig := filepath.Join(dir, "docker-agent.yaml")
137+
secondaryConfig := filepath.Join(dir, "docker-agent.yml")
138+
require.NoError(t, os.WriteFile(primaryConfig, []byte(`version: "1"`), 0o644))
139+
require.NoError(t, os.WriteFile(secondaryConfig, []byte(`version: "1"`), 0o644))
140+
t.Chdir(dir)
141+
92142
resolved, err := resolve("")
93143

144+
require.NoError(t, err)
145+
assert.Equal(t, primaryConfig, resolved)
146+
}
147+
148+
func TestResolveAgentFile_AutodiscoverIgnoredWhenExplicitArg(t *testing.T) {
149+
home := t.TempDir()
150+
t.Setenv("HOME", home)
151+
152+
dir := t.TempDir()
153+
// Place a docker-agent.yaml in cwd
154+
require.NoError(t, os.WriteFile(filepath.Join(dir, "docker-agent.yaml"), []byte(`version: "1"`), 0o644))
155+
t.Chdir(dir)
156+
157+
// Explicitly passing "default" should not trigger autodiscovery
158+
resolved, err := resolve("default")
159+
94160
require.NoError(t, err)
95161
assert.Equal(t, "default", resolved)
96162
}
97163

164+
func TestResolveAgentFile_AutodiscoverIgnoredWhenExplicitFile(t *testing.T) {
165+
home := t.TempDir()
166+
t.Setenv("HOME", home)
167+
168+
dir := t.TempDir()
169+
// Place a docker-agent.yaml in cwd
170+
require.NoError(t, os.WriteFile(filepath.Join(dir, "docker-agent.yaml"), []byte(`version: "1"`), 0o644))
171+
// Place an explicit agent file
172+
explicitFile := filepath.Join(dir, "my-agent.yaml")
173+
require.NoError(t, os.WriteFile(explicitFile, []byte(`version: "1"`), 0o644))
174+
t.Chdir(dir)
175+
176+
resolved, err := resolve(explicitFile)
177+
178+
require.NoError(t, err)
179+
assert.Equal(t, explicitFile, resolved)
180+
}
181+
98182
func TestResolveAgentFile_DefaultIsDefault(t *testing.T) {
99183
home := t.TempDir()
100184
t.Setenv("HOME", home)

0 commit comments

Comments
 (0)