Skip to content

Commit bbbdf2b

Browse files
authored
Merge pull request #359 from ndeloof/fix_profiles
2 parents 7a7b593 + 5b5e141 commit bbbdf2b

File tree

5 files changed

+76
-6
lines changed

5 files changed

+76
-6
lines changed

consts/consts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ const (
2020
ComposeProjectName = "COMPOSE_PROJECT_NAME"
2121
ComposePathSeparator = "COMPOSE_PATH_SEPARATOR"
2222
ComposeFilePath = "COMPOSE_FILE"
23+
ComposeProfiles = "COMPOSE_PROFILES"
2324
)

loader/loader.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,10 @@ func Load(configDetails types.ConfigDetails, options ...func(*Options)) (*types.
246246
}
247247
}
248248

249-
if len(opts.Profiles) > 0 {
250-
project.ApplyProfiles(opts.Profiles)
249+
if profiles, ok := project.Environment[consts.ComposeProfiles]; ok && len(opts.Profiles) == 0 {
250+
opts.Profiles = strings.Split(profiles, ",")
251251
}
252+
project.ApplyProfiles(opts.Profiles)
252253

253254
err = project.ResolveServicesEnvironment(opts.discardEnvFiles)
254255

loader/merge_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1223,7 +1223,7 @@ func TestMergeTopLevelExtensions(t *testing.T) {
12231223
assert.DeepEqual(t, &types.Project{
12241224
Name: "",
12251225
WorkingDir: "",
1226-
Services: types.Services{},
1226+
Services: nil,
12271227
Networks: types.Networks{},
12281228
Volumes: types.Volumes{},
12291229
Secrets: types.Secrets{},

types/project.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ type Project struct {
4545

4646
// DisabledServices track services which have been disable as profile is not active
4747
DisabledServices Services `yaml:"-" json:"-"`
48+
Profiles []string `yaml:"-" json:"-"`
4849
}
4950

5051
// ServiceNames return names for all services in this Compose config
@@ -119,6 +120,16 @@ func (p *Project) GetServices(names ...string) (Services, error) {
119120
return services, nil
120121
}
121122

123+
// GetDisabledService retrieve disabled service by name
124+
func (p Project) GetDisabledService(name string) (ServiceConfig, error) {
125+
for _, config := range p.DisabledServices {
126+
if config.Name == name {
127+
return config, nil
128+
}
129+
}
130+
return ServiceConfig{}, fmt.Errorf("no such service: %s", name)
131+
}
132+
122133
// GetService retrieve a specific service by name
123134
func (p *Project) GetService(name string) (ServiceConfig, error) {
124135
services, err := p.GetServices(name)
@@ -247,7 +258,7 @@ func (p *Project) ApplyProfiles(profiles []string) {
247258
}
248259
}
249260
var enabled, disabled Services
250-
for _, service := range p.Services {
261+
for _, service := range p.AllServices() {
251262
if service.HasProfile(profiles) {
252263
enabled = append(enabled, service)
253264
} else {
@@ -256,6 +267,41 @@ func (p *Project) ApplyProfiles(profiles []string) {
256267
}
257268
p.Services = enabled
258269
p.DisabledServices = disabled
270+
p.Profiles = profiles
271+
}
272+
273+
// EnableServices ensure services are enabled and activate profiles accordingly
274+
func (p *Project) EnableServices(names ...string) error {
275+
if len(names) == 0 {
276+
return nil
277+
}
278+
var enabled []string
279+
for _, name := range names {
280+
_, err := p.GetService(name)
281+
if err == nil {
282+
// already enabled
283+
continue
284+
}
285+
def, err := p.GetDisabledService(name)
286+
if err != nil {
287+
return err
288+
}
289+
enabled = append(enabled, def.Profiles...)
290+
}
291+
292+
profiles := p.Profiles
293+
PROFILES:
294+
for _, profile := range enabled {
295+
for _, p := range profiles {
296+
if p == profile {
297+
continue PROFILES
298+
}
299+
}
300+
profiles = append(profiles, profile)
301+
}
302+
p.ApplyProfiles(profiles)
303+
304+
return p.ResolveServicesEnvironment(true)
259305
}
260306

261307
// WithoutUnnecessaryResources drops networks/volumes/secrets/configs that are not referenced by active services

types/project_test.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,22 @@ func Test_ApplyProfiles(t *testing.T) {
3131
assert.Equal(t, len(p.Services), 2)
3232
assert.Equal(t, p.Services[0].Name, "service_1")
3333
assert.Equal(t, p.Services[1].Name, "service_2")
34+
assert.Equal(t, len(p.DisabledServices), 3)
35+
assert.Equal(t, p.DisabledServices[0].Name, "service_3")
36+
assert.Equal(t, p.DisabledServices[1].Name, "service_4")
37+
assert.Equal(t, p.DisabledServices[2].Name, "service_5")
38+
39+
err := p.EnableServices("service_4")
40+
assert.NilError(t, err)
41+
42+
assert.Equal(t, len(p.Services), 4)
43+
assert.Equal(t, p.Services[0].Name, "service_1")
44+
assert.Equal(t, p.Services[1].Name, "service_2")
45+
assert.Equal(t, p.Services[2].Name, "service_4")
46+
assert.Equal(t, p.Services[3].Name, "service_5")
3447
assert.Equal(t, len(p.DisabledServices), 1)
3548
assert.Equal(t, p.DisabledServices[0].Name, "service_3")
49+
3650
}
3751

3852
func Test_WithoutUnnecessaryResources(t *testing.T) {
@@ -60,7 +74,7 @@ func Test_NoProfiles(t *testing.T) {
6074
p := makeProject()
6175
p.ApplyProfiles(nil)
6276
assert.Equal(t, len(p.Services), 1)
63-
assert.Equal(t, len(p.DisabledServices), 2)
77+
assert.Equal(t, len(p.DisabledServices), 4)
6478
assert.Equal(t, p.Services[0].Name, "service_1")
6579
}
6680

@@ -79,8 +93,10 @@ func Test_ForServices(t *testing.T) {
7993
err := p.ForServices([]string{"service_2"})
8094
assert.NilError(t, err)
8195

82-
assert.Equal(t, len(p.DisabledServices), 1)
96+
assert.Equal(t, len(p.DisabledServices), 3)
8397
assert.Equal(t, p.DisabledServices[0].Name, "service_3")
98+
assert.Equal(t, p.DisabledServices[1].Name, "service_4")
99+
assert.Equal(t, p.DisabledServices[2].Name, "service_5")
84100
}
85101

86102
func Test_ForServicesCycle(t *testing.T) {
@@ -103,6 +119,12 @@ func makeProject() Project {
103119
Name: "service_3",
104120
Profiles: []string{"bar"},
105121
DependsOn: map[string]ServiceDependency{"service_2": {}},
122+
}, ServiceConfig{
123+
Name: "service_4",
124+
Profiles: []string{"zot"},
125+
}, ServiceConfig{
126+
Name: "service_5",
127+
Profiles: []string{"zot"},
106128
}),
107129
Networks: Networks{},
108130
Volumes: Volumes{},

0 commit comments

Comments
 (0)