diff --git a/manifest/manifest.go b/manifest/manifest.go index 731bbb4..2d40e8e 100644 --- a/manifest/manifest.go +++ b/manifest/manifest.go @@ -61,18 +61,29 @@ func (m *Manifest) SlotNames() []string { // DefaultDaemon returns the name, spec, and true for the default daemon. // A daemon is the default if it has Default:true, or if it is the only daemon -// in the map. Returns empty values and false if no default can be determined. +// in the map. If multiple daemons have Default:true, returns false (ambiguous). +// Returns empty values and false if no default can be determined. func (m *Manifest) DefaultDaemon() (string, DaemonSpec, bool) { if len(m.Daemons) == 0 { return "", DaemonSpec{}, false } - // Look for an explicit default. + // Look for an explicit default; reject ambiguous multiple defaults. + var defaultName string + var defaultSpec DaemonSpec for name, spec := range m.Daemons { if spec.Default { - return name, spec, true + if defaultName != "" { + // Multiple defaults — ambiguous. + return "", DaemonSpec{}, false + } + defaultName = name + defaultSpec = spec } } + if defaultName != "" { + return defaultName, defaultSpec, true + } // If exactly one daemon exists, treat it as the implicit default. if len(m.Daemons) == 1 { diff --git a/manifest/manifest_test.go b/manifest/manifest_test.go index bcf551b..04a61fb 100644 --- a/manifest/manifest_test.go +++ b/manifest/manifest_test.go @@ -132,6 +132,28 @@ func TestManifest_DefaultDaemon_Bad_NoDaemons(t *testing.T) { assert.Empty(t, spec.Binary) } +func TestManifest_DefaultDaemon_Bad_MultipleDefaults(t *testing.T) { + m := Manifest{ + Daemons: map[string]DaemonSpec{ + "api": {Binary: "./bin/api", Default: true}, + "worker": {Binary: "./bin/worker", Default: true}, + }, + } + _, _, ok := m.DefaultDaemon() + assert.False(t, ok) +} + +func TestManifest_DefaultDaemon_Bad_MultipleNoneDefault(t *testing.T) { + m := Manifest{ + Daemons: map[string]DaemonSpec{ + "api": {Binary: "./bin/api"}, + "worker": {Binary: "./bin/worker"}, + }, + } + _, _, ok := m.DefaultDaemon() + assert.False(t, ok) +} + func TestManifest_DefaultDaemon_Good_SingleImplicit(t *testing.T) { m := Manifest{ Daemons: map[string]DaemonSpec{