Skip to content

Commit f97276d

Browse files
committed
fixes
Signed-off-by: Suleiman Dibirov <idsulik@gmail.com>
1 parent fe61eaf commit f97276d

File tree

5 files changed

+91
-46
lines changed

5 files changed

+91
-46
lines changed

pkg/api/labels.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ const (
3232
// ConfigHashLabel stores configuration hash for a compose service
3333
ConfigHashLabel = "com.docker.compose.config-hash"
3434
// ServiceConfigsHash stores configuration hash for a compose service configs
35-
ServiceConfigsHash = "com.docker.compose.service.configs-hash"
35+
ServiceConfigsHash = "com.docker.compose.service.%s.configs.hash"
3636
// ServiceSecretsHash stores configuration hash for a compose service secrets
37-
ServiceSecretsHash = "com.docker.compose.service.secrets-hash"
37+
ServiceSecretsHash = "com.docker.compose.service.%s.secrets.hash"
3838
// ContainerNumberLabel stores the container index of a replicated service
3939
ContainerNumberLabel = "com.docker.compose.container-number"
4040
// VolumeLabel allow to track resource related to a compose volume

pkg/compose/convergence.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ func (c *convergence) resolveSharedNamespaces(service *types.ServiceConfig) erro
323323
return nil
324324
}
325325

326-
func (c *convergence) mustRecreate(project *types.Project,, expected types.ServiceConfig, actual containerType.Summary, policy string) (bool, error) {
326+
//nolint:gocyclo
327+
func (c *convergence) mustRecreate(project *types.Project, expected types.ServiceConfig, actual containerType.Summary, policy string) (bool, error) {
327328
if policy == api.RecreateNever {
328329
return false, nil
329330
}
@@ -343,20 +344,26 @@ func (c *convergence) mustRecreate(project *types.Project,, expected types.Servi
343344
return true, nil
344345
}
345346

346-
serviceConfigsHash, err := ServiceConfigsHash(project, expected)
347+
serviceNameToConfigHash, err := ServiceConfigsHash(project, expected)
347348
if err != nil {
348349
return false, err
349350
}
350351

352+
for serviceName, hash := range serviceNameToConfigHash {
353+
if actual.Labels[fmt.Sprintf(api.ServiceConfigsHash, serviceName)] != hash {
354+
return true, nil
355+
}
356+
}
357+
351358
serviceSecretsHash, err := ServiceSecretsHash(project, expected)
352359
if err != nil {
353360
return false, err
354361
}
355-
serviceConfigsChanged := actual.Labels[api.ServiceConfigsHash] != serviceConfigsHash
356-
serviceSecretsChanged := actual.Labels[api.ServiceSecretsHash] != serviceSecretsHash
357362

358-
if serviceConfigsChanged || serviceSecretsChanged {
359-
return true, nil
363+
for serviceName, hash := range serviceSecretsHash {
364+
if actual.Labels[fmt.Sprintf(api.ServiceSecretsHash, serviceName)] != hash {
365+
return true, nil
366+
}
360367
}
361368

362369
if c.networks != nil && actual.State == "running" {

pkg/compose/create.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -513,23 +513,29 @@ func (s *composeService) prepareLabels(labels types.Labels, project *types.Proje
513513
return nil, err
514514
}
515515

516-
serviceConfigsHash, err := ServiceConfigsHash(project, service)
516+
serviceNameToConfigHash, err := ServiceConfigsHash(project, service)
517517
if err != nil {
518518
return nil, err
519519
}
520520

521-
serviceSecretsHash, err := ServiceSecretsHash(project, service)
521+
for serviceName, hash := range serviceNameToConfigHash {
522+
labels[fmt.Sprintf(api.ServiceConfigsHash, serviceName)] = hash
523+
}
524+
525+
serviceNameToSecretHash, err := ServiceSecretsHash(project, service)
522526
if err != nil {
523527
return nil, err
524528
}
525529

530+
for serviceName, hash := range serviceNameToSecretHash {
531+
labels[fmt.Sprintf(api.ServiceSecretsHash, serviceName)] = hash
532+
}
533+
526534
if number > 0 {
527535
// One-off containers are not indexed
528536
labels[api.ContainerNumberLabel] = strconv.Itoa(number)
529537
}
530538
labels[api.ConfigHashLabel] = serviceHash
531-
labels[api.ServiceConfigsHash] = serviceConfigsHash
532-
labels[api.ServiceSecretsHash] = serviceSecretsHash
533539
labels[api.ContainerNumberLabel] = strconv.Itoa(number)
534540

535541
var dependencies []string

pkg/compose/hash.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,37 +47,37 @@ func ServiceHash(o types.ServiceConfig) (string, error) {
4747
}
4848

4949
// ServiceConfigsHash computes the configuration hash for service configs.
50-
func ServiceConfigsHash(project *types.Project, serviceConfig types.ServiceConfig) (string, error) {
51-
data := make([]byte, 0)
50+
func ServiceConfigsHash(project *types.Project, serviceConfig types.ServiceConfig) (map[string]string, error) {
51+
serviceNameToHash := make(map[string]string)
5252
for _, config := range serviceConfig.Configs {
5353
file := project.Configs[config.Source]
5454
b, err := createTarForConfig(project, types.FileReferenceConfig(config), types.FileObjectConfig(file))
5555

5656
if err != nil {
57-
return "", err
57+
return nil, err
5858
}
5959

60-
data = append(data, b.Bytes()...)
60+
serviceNameToHash[config.Target] = digest.SHA256.FromBytes(b.Bytes()).Encoded()
6161
}
6262

63-
return digest.SHA256.FromBytes(data).Encoded(), nil
63+
return serviceNameToHash, nil
6464
}
6565

6666
// ServiceSecretsHash computes the configuration hash for service secrets.
67-
func ServiceSecretsHash(project *types.Project, serviceConfig types.ServiceConfig) (string, error) {
68-
data := make([]byte, 0)
67+
func ServiceSecretsHash(project *types.Project, serviceConfig types.ServiceConfig) (map[string]string, error) {
68+
serviceNameToHash := make(map[string]string)
6969
for _, secret := range serviceConfig.Secrets {
7070
file := project.Secrets[secret.Source]
7171
b, err := createTarForConfig(project, types.FileReferenceConfig(secret), types.FileObjectConfig(file))
7272

7373
if err != nil {
74-
return "", err
74+
return nil, err
7575
}
7676

77-
data = append(data, b.Bytes()...)
77+
serviceNameToHash[secret.Target] = digest.SHA256.FromBytes(b.Bytes()).Encoded()
7878
}
7979

80-
return digest.SHA256.FromBytes(data).Encoded(), nil
80+
return serviceNameToHash, nil
8181
}
8282

8383
func createTarForConfig(

pkg/compose/hash_test.go

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,79 +40,111 @@ func TestServiceHashWithIgnorableValues(t *testing.T) {
4040
}
4141

4242
func TestServiceConfigsHashWithoutChangesContent(t *testing.T) {
43-
hash1, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext1", "always", 1))
43+
serviceNameToConfigHash1, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext1", "always", 1))
4444
assert.NilError(t, err)
45-
hash2, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext2", "never", 2))
45+
serviceNameToConfigHas2, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext2", "never", 2))
4646
assert.NilError(t, err)
47-
assert.Assert(t, hash1 == hash2)
47+
assert.Equal(t, len(serviceNameToConfigHash1), len(serviceNameToConfigHas2))
48+
49+
for serviceName, hash := range serviceNameToConfigHash1 {
50+
assert.Equal(t, hash, serviceNameToConfigHas2[serviceName])
51+
}
4852
}
4953

5054
func TestServiceConfigsHashWithChangedConfigContent(t *testing.T) {
51-
hash1, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext1", "always", 1))
55+
serviceNameToConfigHash1, err := ServiceConfigsHash(projectWithConfigs("a", "", ""), serviceConfig("myContext1", "always", 1))
5256
assert.NilError(t, err)
53-
hash2, err := ServiceConfigsHash(projectWithConfigs("b", "", ""), serviceConfig("myContext2", "never", 2))
57+
serviceNameToConfigHash2, err := ServiceConfigsHash(projectWithConfigs("b", "", ""), serviceConfig("myContext2", "never", 2))
5458
assert.NilError(t, err)
55-
assert.Assert(t, hash1 != hash2)
59+
assert.Equal(t, len(serviceNameToConfigHash1), len(serviceNameToConfigHash2))
60+
61+
for serviceName, hash := range serviceNameToConfigHash1 {
62+
assert.Assert(t, hash != serviceNameToConfigHash2[serviceName])
63+
}
5664
}
5765

5866
func TestServiceConfigsHashWithChangedConfigEnvironment(t *testing.T) {
59-
hash1, err := ServiceConfigsHash(projectWithConfigs("", "a", ""), serviceConfig("myContext1", "always", 1))
67+
serviceNameToConfigHash1, err := ServiceConfigsHash(projectWithConfigs("", "a", ""), serviceConfig("myContext1", "always", 1))
6068
assert.NilError(t, err)
61-
hash2, err := ServiceConfigsHash(projectWithConfigs("", "b", ""), serviceConfig("myContext2", "never", 2))
69+
serviceNameToConfigHash2, err := ServiceConfigsHash(projectWithConfigs("", "b", ""), serviceConfig("myContext2", "never", 2))
6270
assert.NilError(t, err)
63-
assert.Assert(t, hash1 != hash2)
71+
assert.Equal(t, len(serviceNameToConfigHash1), len(serviceNameToConfigHash2))
72+
73+
for serviceName, hash := range serviceNameToConfigHash1 {
74+
assert.Assert(t, hash != serviceNameToConfigHash2[serviceName])
75+
}
6476
}
6577

6678
func TestServiceConfigsHashWithChangedConfigFile(t *testing.T) {
67-
hash1, err := ServiceConfigsHash(
79+
serviceNameToConfigHash1, err := ServiceConfigsHash(
6880
projectWithConfigs("", "", "./testdata/config1.txt"),
6981
serviceConfig("myContext1", "always", 1),
7082
)
7183
assert.NilError(t, err)
72-
hash2, err := ServiceConfigsHash(
84+
serviceNameToConfigHash2, err := ServiceConfigsHash(
7385
projectWithConfigs("", "", "./testdata/config2.txt"),
7486
serviceConfig("myContext2", "never", 2),
7587
)
7688
assert.NilError(t, err)
77-
assert.Assert(t, hash1 != hash2)
89+
assert.Equal(t, len(serviceNameToConfigHash1), len(serviceNameToConfigHash2))
90+
91+
for serviceName, hash := range serviceNameToConfigHash1 {
92+
assert.Assert(t, hash != serviceNameToConfigHash2[serviceName])
93+
}
7894
}
7995

8096
func TestServiceSecretsHashWithoutChangesContent(t *testing.T) {
81-
hash1, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext1", "always", 1))
97+
serviceNameToSecretHash1, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext1", "always", 1))
8298
assert.NilError(t, err)
83-
hash2, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext2", "never", 2))
99+
serviceNameToSecretHash2, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext2", "never", 2))
84100
assert.NilError(t, err)
85-
assert.Assert(t, hash1 == hash2)
101+
assert.Equal(t, len(serviceNameToSecretHash1), len(serviceNameToSecretHash2))
102+
103+
for serviceName, hash := range serviceNameToSecretHash1 {
104+
assert.Equal(t, hash, serviceNameToSecretHash2[serviceName])
105+
}
86106
}
87107

88108
func TestServiceSecretsHashWithChangedSecretContent(t *testing.T) {
89-
hash1, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext1", "always", 1))
109+
serviceNameToSecretHash1, err := ServiceSecretsHash(projectWithSecrets("a", "", ""), serviceConfig("myContext1", "always", 1))
90110
assert.NilError(t, err)
91-
hash2, err := ServiceSecretsHash(projectWithSecrets("b", "", ""), serviceConfig("myContext2", "never", 2))
111+
serviceNameToSecretHash2, err := ServiceSecretsHash(projectWithSecrets("b", "", ""), serviceConfig("myContext2", "never", 2))
92112
assert.NilError(t, err)
93-
assert.Assert(t, hash1 != hash2)
113+
assert.Equal(t, len(serviceNameToSecretHash1), len(serviceNameToSecretHash2))
114+
115+
for serviceName, hash := range serviceNameToSecretHash1 {
116+
assert.Assert(t, hash != serviceNameToSecretHash2[serviceName])
117+
}
94118
}
95119

96120
func TestServiceSecretsHashWithChangedSecretEnvironment(t *testing.T) {
97-
hash1, err := ServiceSecretsHash(projectWithSecrets("", "a", ""), serviceConfig("myContext1", "always", 1))
121+
serviceNameToSecretHash1, err := ServiceSecretsHash(projectWithSecrets("", "a", ""), serviceConfig("myContext1", "always", 1))
98122
assert.NilError(t, err)
99-
hash2, err := ServiceSecretsHash(projectWithSecrets("", "b", ""), serviceConfig("myContext2", "never", 2))
123+
serviceNameToSecretHash2, err := ServiceSecretsHash(projectWithSecrets("", "b", ""), serviceConfig("myContext2", "never", 2))
100124
assert.NilError(t, err)
101-
assert.Assert(t, hash1 != hash2)
125+
assert.Equal(t, len(serviceNameToSecretHash1), len(serviceNameToSecretHash2))
126+
127+
for serviceName, hash := range serviceNameToSecretHash1 {
128+
assert.Assert(t, hash != serviceNameToSecretHash2[serviceName])
129+
}
102130
}
103131

104132
func TestServiceSecretsHashWithChangedSecretFile(t *testing.T) {
105-
hash1, err := ServiceSecretsHash(
133+
serviceNameToSecretHash1, err := ServiceSecretsHash(
106134
projectWithSecrets("", "", "./testdata/config1.txt"),
107135
serviceConfig("myContext1", "always", 1),
108136
)
109137
assert.NilError(t, err)
110-
hash2, err := ServiceSecretsHash(
138+
serviceNameToSecretHash2, err := ServiceSecretsHash(
111139
projectWithSecrets("", "", "./testdata/config2.txt"),
112140
serviceConfig("myContext2", "never", 2),
113141
)
114142
assert.NilError(t, err)
115-
assert.Assert(t, hash1 != hash2)
143+
assert.Equal(t, len(serviceNameToSecretHash1), len(serviceNameToSecretHash2))
144+
145+
for serviceName, hash := range serviceNameToSecretHash1 {
146+
assert.Assert(t, hash != serviceNameToSecretHash2[serviceName])
147+
}
116148
}
117149

118150
func projectWithConfigs(configContent, configEnvironmentValue, configFile string) *types.Project {

0 commit comments

Comments
 (0)