Skip to content

Commit 13546f9

Browse files
committed
use SSHKey struct to map SSHConfig for the ssh property in build section
Signed-off-by: Guillaume Lours <[email protected]>
1 parent d4fbd6f commit 13546f9

File tree

5 files changed

+74
-23
lines changed

5 files changed

+74
-23
lines changed

loader/full-struct_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func services(workingDir, homeDir string) []types.ServiceConfig {
5353
Context: "./dir",
5454
Dockerfile: "Dockerfile",
5555
Args: map[string]*string{"foo": strPtr("bar")},
56-
SSH: map[string]string{"default": ""},
56+
SSH: []types.SSHKey{{ID: "default", Path: ""}},
5757
Target: "foo",
5858
Network: "foo",
5959
CacheFrom: []string{"foo", "bar"},
@@ -571,7 +571,7 @@ services:
571571
args:
572572
foo: bar
573573
ssh:
574-
default: ""
574+
- default
575575
labels:
576576
FOO: BAR
577577
cache_from:
@@ -1085,9 +1085,9 @@ func fullExampleJSON(workingDir, homeDir string) string {
10851085
"args": {
10861086
"foo": "bar"
10871087
},
1088-
"ssh": {
1089-
"default": ""
1090-
},
1088+
"ssh": [
1089+
"default"
1090+
],
10911091
"labels": {
10921092
"FOO": "BAR"
10931093
},

loader/loader.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -981,17 +981,19 @@ var transformServiceNetworkMap TransformerFunc = func(value interface{}) (interf
981981

982982
var transformSSHConfig TransformerFunc = func(data interface{}) (interface{}, error) {
983983
switch value := data.(type) {
984-
case map[string]interface{}:
985-
return toMapStringString(value, true), nil
986984
case []interface{}:
987-
return transformMappingOrList(value, "=", true)
985+
var result []types.SSHKey
986+
for _, value := range value {
987+
key, val := transformValueToMapEntry(value.(string), "=", false)
988+
result = append(result, types.SSHKey{ID: key, Path: val.(string)})
989+
}
990+
return result, nil
988991
case string:
989-
result := make(map[string]interface{})
990992
if value == "" {
991993
value = "default"
992994
}
993-
key, val := transformValueToMapEntry(value, "=", true)
994-
result[key] = val
995+
key, val := transformValueToMapEntry(value, "=", false)
996+
result := []types.SSHKey{{ID: key, Path: val.(string)}}
995997
return result, nil
996998
}
997999
return nil, errors.Errorf("expected a sting, map or a list, got %T: %#v", data, data)

loader/loader_test.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,13 +1898,30 @@ services:
18981898
test:
18991899
build:
19001900
context: .
1901-
ssh: ssh-agent
1901+
ssh: default
19021902
`)
19031903
assert.NilError(t, err)
19041904
svc, err := actual.GetService("test")
19051905
assert.NilError(t, err)
1906-
assert.Assert(t, is.Contains(svc.Build.SSH, "ssh-agent"))
1907-
assert.Equal(t, "", svc.Build.SSH["ssh-agent"])
1906+
sshValue, err := svc.Build.SSH.Get("default")
1907+
assert.NilError(t, err)
1908+
assert.Equal(t, "", sshValue)
1909+
}
1910+
1911+
func TestLoadSSHWithKeyValueInBuildConfig(t *testing.T) {
1912+
actual, err := loadYAML(`
1913+
services:
1914+
test:
1915+
build:
1916+
context: .
1917+
ssh: key1=value1
1918+
`)
1919+
assert.NilError(t, err)
1920+
svc, err := actual.GetService("test")
1921+
assert.NilError(t, err)
1922+
sshValue, err := svc.Build.SSH.Get("key1")
1923+
assert.NilError(t, err)
1924+
assert.Equal(t, "value1", sshValue)
19081925
}
19091926

19101927
func TestLoadSSHWithKeysValuesInBuildConfig(t *testing.T) {
@@ -1920,6 +1937,12 @@ services:
19201937
assert.NilError(t, err)
19211938
svc, err := actual.GetService("test")
19221939
assert.NilError(t, err)
1923-
assert.Equal(t, "value1", svc.Build.SSH["key1"])
1924-
assert.Equal(t, "value2", svc.Build.SSH["key2"])
1940+
1941+
sshValue, err := svc.Build.SSH.Get("key1")
1942+
assert.NilError(t, err)
1943+
assert.Equal(t, "value1", sshValue)
1944+
1945+
sshValue, err = svc.Build.SSH.Get("key2")
1946+
assert.NilError(t, err)
1947+
assert.Equal(t, "value2", sshValue)
19251948
}

schema/compose-spec.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,8 @@
9393
"args": {"$ref": "#/definitions/list_or_dict"},
9494
"ssh": {
9595
"oneOf": [
96-
{
97-
"type": "string"
98-
},
99-
{
100-
"$ref": "#/definitions/list_or_dict"
101-
}
96+
{"type": "string"},
97+
{"$ref": "#/definitions/list_or_dict"}
10298
]
10399
},
104100
"labels": {"$ref": "#/definitions/list_or_dict"},

types/types.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,38 @@ func (l Labels) Add(key, value string) Labels {
427427
return l
428428
}
429429

430+
type SSHKey struct {
431+
ID string
432+
Path string
433+
}
434+
430435
// SSHConfig is a mapping type for SSH build config
431-
type SSHConfig map[string]string
436+
type SSHConfig []SSHKey
437+
438+
func (s SSHConfig) Get(id string) (string, error) {
439+
for _, sshKey := range s {
440+
if sshKey.ID == id {
441+
return sshKey.Path, nil
442+
}
443+
}
444+
return "", fmt.Errorf("ID %s not found in SSH keys", id)
445+
}
446+
447+
// MarshalYAML makes SSHKey implement yaml.Marshaller
448+
func (s SSHKey) MarshalYAML() (interface{}, error) {
449+
if s.Path == "" {
450+
return s.ID, nil
451+
}
452+
return fmt.Sprintf("%s: %s", s.ID, s.Path), nil
453+
}
454+
455+
// MarshalJSON makes SSHKey implement json.Marshaller
456+
func (s SSHKey) MarshalJSON() ([]byte, error) {
457+
if s.Path == "" {
458+
return []byte(fmt.Sprintf(`"%s"`, s.ID)), nil
459+
}
460+
return []byte(fmt.Sprintf(`"%s": %s`, s.ID, s.Path)), nil
461+
}
432462

433463
// MappingWithColon is a mapping type that can be converted from a list of
434464
// 'key: value' strings

0 commit comments

Comments
 (0)