Skip to content

Commit 87bd752

Browse files
authored
Merge pull request #316 from glours/check-service-secrets
Check service secrets existence
2 parents 4493cba + a9ba921 commit 87bd752

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

loader/validate.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ func checkConsistency(project *types.Project) error {
7070
return errors.Wrap(errdefs.ErrInvalid, fmt.Sprintf("service %q refers to undefined config %s", s.Name, config.Source))
7171
}
7272
}
73+
74+
for _, secret := range s.Secrets {
75+
if _, ok := project.Secrets[secret.Source]; !ok {
76+
return errors.Wrap(errdefs.ErrInvalid, fmt.Sprintf("service %q refers to undefined secret %s", s.Name, secret.Source))
77+
}
78+
}
7379
}
7480

7581
for name, secret := range project.Secrets {

loader/validate_test.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func TestValidateSecret(t *testing.T) {
174174
err := checkConsistency(project)
175175
assert.NilError(t, err)
176176
})
177-
t.Run("uset secret", func(t *testing.T) {
177+
t.Run("unset secret type", func(t *testing.T) {
178178
project := &types.Project{
179179
Secrets: types.Secrets{
180180
"foo": types.SecretConfig{},
@@ -183,6 +183,49 @@ func TestValidateSecret(t *testing.T) {
183183
err := checkConsistency(project)
184184
assert.Error(t, err, "secret \"foo\" must declare either `file` or `environment`: invalid compose project")
185185
})
186+
187+
t.Run("service secret exist", func(t *testing.T) {
188+
project := &types.Project{
189+
Secrets: types.Secrets{
190+
"foo": types.SecretConfig{
191+
External: types.External{
192+
External: true,
193+
},
194+
},
195+
},
196+
Services: types.Services([]types.ServiceConfig{
197+
{
198+
Name: "myservice",
199+
Image: "scratch",
200+
Secrets: []types.ServiceSecretConfig{
201+
{
202+
Source: "foo",
203+
},
204+
},
205+
},
206+
}),
207+
}
208+
err := checkConsistency(project)
209+
assert.NilError(t, err)
210+
})
211+
212+
t.Run("service secret undefined", func(t *testing.T) {
213+
project := &types.Project{
214+
Services: types.Services([]types.ServiceConfig{
215+
{
216+
Name: "myservice",
217+
Image: "scratch",
218+
Secrets: []types.ServiceSecretConfig{
219+
{
220+
Source: "foo",
221+
},
222+
},
223+
},
224+
}),
225+
}
226+
err := checkConsistency(project)
227+
assert.Error(t, err, `service "myservice" refers to undefined secret foo: invalid compose project`)
228+
})
186229
}
187230

188231
func TestValidateDependsOn(t *testing.T) {

types/project.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,25 +258,33 @@ func (p *Project) WithoutUnnecessaryResources() {
258258

259259
networks := Networks{}
260260
for k := range requiredNetworks {
261-
networks[k] = p.Networks[k]
261+
if value, ok := p.Networks[k]; ok {
262+
networks[k] = value
263+
}
262264
}
263265
p.Networks = networks
264266

265267
volumes := Volumes{}
266268
for k := range requiredVolumes {
267-
volumes[k] = p.Volumes[k]
269+
if value, ok := p.Volumes[k]; ok {
270+
volumes[k] = value
271+
}
268272
}
269273
p.Volumes = volumes
270274

271275
secrets := Secrets{}
272276
for k := range requiredSecrets {
273-
secrets[k] = p.Secrets[k]
277+
if value, ok := p.Secrets[k]; ok {
278+
secrets[k] = value
279+
}
274280
}
275281
p.Secrets = secrets
276282

277283
configs := Configs{}
278284
for k := range requiredConfigs {
279-
configs[k] = p.Configs[k]
285+
if value, ok := p.Configs[k]; ok {
286+
configs[k] = value
287+
}
280288
}
281289
p.Configs = configs
282290
}

0 commit comments

Comments
 (0)