1
+ require 'deep_merge'
2
+
1
3
Puppet ::Type . type ( :docker_compose ) . provide ( :ruby ) do
2
4
desc 'Support for Puppet running Docker Compose'
3
5
8
10
def exists?
9
11
Puppet . info ( "Checking for compose project #{ name } " )
10
12
compose_services = { }
13
+ compose_containers = [ ]
11
14
resource [ :compose_files ] . each do |file |
12
15
compose_file = YAML . safe_load ( File . read ( file ) )
13
16
containers = docker ( [
@@ -17,36 +20,38 @@ def exists?
17
20
'--filter' ,
18
21
"label=com.docker.compose.project=#{ name } " ,
19
22
] ) . split ( "\n " )
23
+ compose_containers . push ( *containers )
24
+ compose_containers . uniq!
20
25
case compose_file [ 'version' ]
21
26
when %r{^2(\. [0-3])?$} , %r{^3(\. [0-6])?$}
22
- compose_services = compose_services . merge ( compose_file [ 'services' ] )
27
+ compose_services = compose_services . deep_merge ( compose_file [ 'services' ] )
23
28
# in compose v1 "version" parameter is not specified
24
29
when nil
25
- compose_services = compose_services . merge ( compose_file )
30
+ compose_services = compose_services . deep_merge ( compose_file )
26
31
else
27
32
raise ( Puppet ::Error , "Unsupported docker compose file syntax version \" #{ compose_file [ 'version' ] } \" !" )
28
33
end
34
+ end
29
35
30
- if compose_services . count != containers . count
31
- return false
32
- end
36
+ if compose_services . count != compose_containers . count
37
+ return false
38
+ end
33
39
34
- counts = Hash [ *compose_services . each . map { |key , array |
35
- image = ( array [ 'image' ] ) ? array [ 'image' ] : get_image ( key , compose_services )
36
- Puppet . info ( "Checking for compose service #{ key } #{ image } " )
37
- [ "#{ key } -#{ image } " , containers . count ( "#{ key } -#{ image } " ) ]
38
- } . flatten ]
40
+ counts = Hash [ *compose_services . each . map { |key , array |
41
+ image = ( array [ 'image' ] ) ? array [ 'image' ] : get_image ( key , compose_services )
42
+ Puppet . info ( "Checking for compose service #{ key } #{ image } " )
43
+ [ "#{ key } -#{ image } " , compose_containers . count ( "#{ key } -#{ image } " ) ]
44
+ } . flatten ]
39
45
40
- # No containers found for the project
41
- if counts . empty? ||
42
- # Containers described in the compose file are not running
43
- counts . any? { |_k , v | v . zero? } ||
44
- # The scaling factors in the resource do not match the number of running containers
45
- resource [ :scale ] && counts . merge ( resource [ :scale ] ) != counts
46
- false
47
- else
48
- true
49
- end
46
+ # No containers found for the project
47
+ if counts . empty? ||
48
+ # Containers described in the compose file are not running
49
+ counts . any? { |_k , v | v . zero? } ||
50
+ # The scaling factors in the resource do not match the number of running containers
51
+ resource [ :scale ] && counts . merge ( resource [ :scale ] ) != counts
52
+ false
53
+ else
54
+ true
50
55
end
51
56
end
52
57
0 commit comments