kontena-cli 1.4.0.pre6 → 1.4.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/VERSION +1 -1
  4. data/bin/kontena +1 -1
  5. data/kontena-cli.gemspec +3 -3
  6. data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
  7. data/lib/kontena/cli/certificate/get_command.rb +7 -0
  8. data/lib/kontena/cli/certificate/list_command.rb +75 -0
  9. data/lib/kontena/cli/certificate/register_command.rb +13 -2
  10. data/lib/kontena/cli/certificate/request_command.rb +20 -0
  11. data/lib/kontena/cli/certificate/show_command.rb +19 -0
  12. data/lib/kontena/cli/certificate_command.rb +4 -1
  13. data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
  14. data/lib/kontena/cli/common.rb +21 -33
  15. data/lib/kontena/cli/etcd/health_command.rb +21 -27
  16. data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
  17. data/lib/kontena/cli/helpers/health_helper.rb +12 -0
  18. data/lib/kontena/cli/helpers/log_helper.rb +2 -2
  19. data/lib/kontena/cli/helpers/time_helper.rb +29 -0
  20. data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
  21. data/lib/kontena/cli/master/list_command.rb +1 -1
  22. data/lib/kontena/cli/master/ssh_command.rb +3 -1
  23. data/lib/kontena/cli/master/use_command.rb +1 -2
  24. data/lib/kontena/cli/node_command.rb +1 -0
  25. data/lib/kontena/cli/nodes/health_command.rb +28 -13
  26. data/lib/kontena/cli/nodes/list_command.rb +19 -3
  27. data/lib/kontena/cli/nodes/show_command.rb +4 -2
  28. data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
  29. data/lib/kontena/cli/nodes/update_command.rb +2 -0
  30. data/lib/kontena/cli/plugins/install_command.rb +11 -8
  31. data/lib/kontena/cli/plugins/list_command.rb +5 -3
  32. data/lib/kontena/cli/plugins/search_command.rb +4 -2
  33. data/lib/kontena/cli/plugins/show_command.rb +17 -0
  34. data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
  35. data/lib/kontena/cli/registry/create_command.rb +1 -1
  36. data/lib/kontena/cli/services/create_command.rb +6 -0
  37. data/lib/kontena/cli/services/services_helper.rb +33 -6
  38. data/lib/kontena/cli/services/update_command.rb +6 -0
  39. data/lib/kontena/cli/stacks/build_command.rb +3 -3
  40. data/lib/kontena/cli/stacks/common.rb +105 -90
  41. data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
  42. data/lib/kontena/cli/stacks/install_command.rb +39 -6
  43. data/lib/kontena/cli/stacks/list_command.rb +36 -4
  44. data/lib/kontena/cli/stacks/logs_command.rb +9 -2
  45. data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
  46. data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
  47. data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
  48. data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
  49. data/lib/kontena/cli/stacks/remove_command.rb +27 -1
  50. data/lib/kontena/cli/stacks/service_generator.rb +12 -2
  51. data/lib/kontena/cli/stacks/show_command.rb +35 -5
  52. data/lib/kontena/cli/stacks/stack_name.rb +71 -0
  53. data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
  54. data/lib/kontena/cli/stacks/validate_command.rb +38 -10
  55. data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
  56. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
  57. data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
  58. data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
  59. data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
  60. data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
  61. data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
  62. data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
  63. data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
  64. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
  65. data/lib/kontena/client.rb +2 -2
  66. data/lib/kontena/command.rb +11 -0
  67. data/lib/kontena/main_command.rb +3 -1
  68. data/lib/kontena/plugin_manager.rb +11 -198
  69. data/lib/kontena/plugin_manager/cleaner.rb +33 -0
  70. data/lib/kontena/plugin_manager/common.rb +86 -0
  71. data/lib/kontena/plugin_manager/installer.rb +54 -0
  72. data/lib/kontena/plugin_manager/loader.rb +93 -0
  73. data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
  74. data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
  75. data/lib/kontena/util.rb +24 -0
  76. data/lib/kontena_cli.rb +1 -0
  77. data/omnibus/config/projects/kontena.rb +7 -1
  78. data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
  79. data/spec/fixtures/api/node.json +2 -1
  80. data/spec/fixtures/stack-internal-extend.yml +6 -1
  81. data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
  82. data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
  83. data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
  84. data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
  85. data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
  86. data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
  87. data/spec/fixtures/stack-with-dependencies.yml +22 -0
  88. data/spec/fixtures/stack-with-variables.yml +3 -0
  89. data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
  90. data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
  91. data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
  92. data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
  93. data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
  94. data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
  95. data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
  96. data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
  97. data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
  98. data/spec/kontena/cli/stacks/common_spec.rb +42 -69
  99. data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
  100. data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
  101. data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
  102. data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
  103. data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
  104. data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
  105. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
  106. data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
  107. data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
  108. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
  109. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
  110. data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
  111. data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
  112. data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
  113. data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
  114. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
  115. data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
  116. data/spec/kontena/plugin_manager/common_spec.rb +39 -0
  117. data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
  118. data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
  119. data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
  120. data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
  121. data/spec/kontena/plugin_manager_spec.rb +7 -7
  122. metadata +64 -97
  123. data/lib/kontena/cli/app_command.rb +0 -22
  124. data/lib/kontena/cli/apps/build_command.rb +0 -28
  125. data/lib/kontena/cli/apps/common.rb +0 -172
  126. data/lib/kontena/cli/apps/config_command.rb +0 -25
  127. data/lib/kontena/cli/apps/deploy_command.rb +0 -137
  128. data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
  129. data/lib/kontena/cli/apps/docker_helper.rb +0 -80
  130. data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
  131. data/lib/kontena/cli/apps/init_command.rb +0 -89
  132. data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
  133. data/lib/kontena/cli/apps/list_command.rb +0 -59
  134. data/lib/kontena/cli/apps/logs_command.rb +0 -37
  135. data/lib/kontena/cli/apps/monitor_command.rb +0 -93
  136. data/lib/kontena/cli/apps/remove_command.rb +0 -74
  137. data/lib/kontena/cli/apps/restart_command.rb +0 -39
  138. data/lib/kontena/cli/apps/scale_command.rb +0 -33
  139. data/lib/kontena/cli/apps/service_generator.rb +0 -114
  140. data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
  141. data/lib/kontena/cli/apps/show_command.rb +0 -23
  142. data/lib/kontena/cli/apps/start_command.rb +0 -40
  143. data/lib/kontena/cli/apps/stop_command.rb +0 -40
  144. data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
  145. data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
  146. data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
  147. data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
  148. data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
  149. data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
  150. data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
  151. data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
  152. data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
  153. data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
  154. data/spec/fixtures/app.json +0 -42
  155. data/spec/fixtures/health.yml +0 -26
  156. data/spec/fixtures/kontena-build.yml +0 -16
  157. data/spec/fixtures/kontena-internal-extend.yml +0 -8
  158. data/spec/fixtures/kontena-invalid.yml +0 -4
  159. data/spec/fixtures/kontena-with-env-file.yml +0 -18
  160. data/spec/fixtures/kontena-with-variables.yml +0 -19
  161. data/spec/fixtures/kontena.yml +0 -17
  162. data/spec/fixtures/kontena_build_v2.yml +0 -26
  163. data/spec/fixtures/kontena_numeric_version.yml +0 -9
  164. data/spec/fixtures/kontena_v2.yml +0 -35
  165. data/spec/fixtures/mysql.yml +0 -3
  166. data/spec/fixtures/wordpress-scaled.yml +0 -3
  167. data/spec/fixtures/wordpress.yml +0 -2
  168. data/spec/kontena/cli/app/build_command_spec.rb +0 -55
  169. data/spec/kontena/cli/app/common_spec.rb +0 -110
  170. data/spec/kontena/cli/app/config_command_spec.rb +0 -78
  171. data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
  172. data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
  173. data/spec/kontena/cli/app/init_command_spec.rb +0 -109
  174. data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
  175. data/spec/kontena/cli/app/scale_spec.rb +0 -51
  176. data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
  177. data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
  178. data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
  179. data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
  180. data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
  181. data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
@@ -1,73 +0,0 @@
1
- require "kontena/cli/apps/service_generator_v2"
2
- require 'ruby_dig'
3
-
4
- describe Kontena::Cli::Apps::ServiceGeneratorV2 do
5
- let(:subject) do
6
- described_class.new({})
7
- end
8
-
9
- describe '#parse_data' do
10
- it 'parses network_mode' do
11
- data = {
12
- 'image' => 'wordpress:latest',
13
- 'network_mode' => 'bridge'
14
- }
15
- result = subject.send(:parse_data, data)
16
- expect(result['net']).to eq('bridge')
17
- end
18
-
19
- it 'parses logging' do
20
- data = {
21
- 'image' => 'wordpress:latest',
22
- 'logging' => {
23
- 'driver' => 'influxdb',
24
- 'options' => {
25
- 'syslog-address' => 'tcp://192.168.0.42:123'
26
- }
27
- }
28
- }
29
- result = subject.send(:parse_data, data)
30
- expect(result['log_driver']).to eq('influxdb')
31
- expect(result['log_opts']).to eq({
32
- 'syslog-address' => 'tcp://192.168.0.42:123'
33
- })
34
- end
35
-
36
- it 'adds depends_on to links' do
37
- data = {
38
- 'image' => 'wordpress:latest',
39
- 'depends_on' => ['mysql']
40
- }
41
- result = subject.send(:parse_data, data)
42
- expect(result['links']).to eq([{
43
- 'name' => 'mysql',
44
- 'alias' => 'mysql'
45
- }])
46
- end
47
- end
48
-
49
- describe '#parse_build_options' do
50
- context 'when build option is a string' do
51
- it 'converts build option to hash' do
52
- data = {
53
- 'build' => '.',
54
- 'image' => 'myapp'
55
- }
56
- result = subject.send(:parse_build_options, data)
57
- expect(result).to eq({ 'context' => '.' })
58
- end
59
- end
60
- context 'when build options is a hash' do
61
- it 'uses it as build options' do
62
- data = {
63
- 'build' => {
64
- 'context' => '.',
65
- 'dockerfile' => 'alternate-dockerfile'
66
- }
67
- }
68
- result = subject.send(:parse_build_options, data)
69
- expect(result).to eq(data['build'])
70
- end
71
- end
72
- end
73
- end
@@ -1,457 +0,0 @@
1
- require 'kontena/cli/apps/yaml/reader'
2
-
3
- describe Kontena::Cli::Apps::YAML::Reader do
4
- include FixturesHelpers
5
-
6
- def absolute_yaml_path(file = 'kontena.yml')
7
- "#{Dir.pwd}/#{file}"
8
- end
9
-
10
- let(:subject) do
11
- described_class.new('kontena.yml')
12
- end
13
-
14
- let(:service_extender) do
15
- spy
16
- end
17
-
18
- let(:env_file) do
19
- ['APIKEY=12345
20
- ', 'MYSQL_ROOT_PASSWORD=secret
21
- ', 'WP_ADMIN_PASSWORD=verysecret']
22
- end
23
-
24
- let(:valid_result) do
25
- {
26
- 'wordpress' => {
27
- 'extends' => {
28
- 'file' => 'docker-compose.yml',
29
- 'service' => 'wordpress'
30
- },
31
- 'image' => 'wordpress:4.1',
32
- 'ports' => ['80:80'],
33
- 'links' => ['mysql:mysql'],
34
- 'stateful' => true,
35
- 'environment' => ['WORDPRESS_DB_PASSWORD=test_secret'],
36
- 'instances' => 2,
37
- 'deploy' => { 'strategy' => 'ha' },
38
- 'secrets' => []
39
- },
40
- 'mysql' => {
41
- 'extends' => {
42
- 'file' => 'docker-compose.yml',
43
- 'service' => 'mysql'
44
- },
45
- 'image' => 'mysql:5.6',
46
- 'stateful' => true,
47
- 'environment' => ['MYSQL_ROOT_PASSWORD=test_secret'],
48
- 'secrets' => []
49
- }
50
- }
51
- end
52
-
53
- let(:valid_v2_result) do
54
- {
55
- 'version' => '2',
56
- 'services' => {
57
- 'wordpress' => {
58
- 'image' => 'wordpress:4.1',
59
- 'ports' => ['80:80'],
60
- 'depends_on' => ['mysql'],
61
- 'stateful' => true,
62
- 'environment' => ['WORDPRESS_DB_PASSWORD=test_secret'],
63
- 'instances' => 2,
64
- 'deploy' => { 'strategy' => 'ha' },
65
- 'networks' => ['front-tier', 'back-tier'],
66
- 'secrets' => []
67
- },
68
- 'mysql' => {
69
- 'image' => 'mysql:5.6',
70
- 'stateful' => true,
71
- 'environment' => ['MYSQL_ROOT_PASSWORD=test_secret'],
72
- 'volumes' => ['mysql-data:/var/lib/mysql'],
73
- 'networks' => ['back-tier'],
74
- 'secrets' => []
75
- }
76
- },
77
- 'volumes' => {
78
- 'mysql-data' => { 'driver' => 'local' }
79
- },
80
- 'networks' => {
81
- 'front-tier' => { 'driver' => 'bridge' },
82
- 'back-tier' => { 'driver' => 'bridge' }
83
- }
84
- }
85
- end
86
-
87
- describe '#initialize' do
88
- before(:each) do
89
- allow(File).to receive(:read)
90
- .with(absolute_yaml_path('kontena.yml'))
91
- .and_return(fixture('kontena.yml'))
92
- allow(File).to receive(:read)
93
- .with(absolute_yaml_path('docker-compose.yml'))
94
- .and_return(fixture('docker-compose.yml'))
95
- end
96
-
97
- it 'reads given file' do
98
- expect(File).to receive(:read)
99
- .with(absolute_yaml_path)
100
- .and_return(fixture('kontena.yml'))
101
- subject
102
- end
103
-
104
- context 'variable interpolation' do
105
- before(:each) do
106
- allow(ENV).to receive(:key?).and_return(true)
107
- allow(ENV).to receive(:[]).with('TAG').and_return('4.1')
108
- allow(ENV).to receive(:[]).with('project').and_return('test')
109
- allow(ENV).to receive(:[]).with('grid').and_return('test-grid')
110
- allow(ENV).to receive(:[]).with('MYSQL_IMAGE').and_return('mariadb:latest')
111
- end
112
-
113
- it 'interpolates $VAR variables' do
114
- allow(File).to receive(:read)
115
- .with(absolute_yaml_path)
116
- .and_return(fixture('kontena-with-variables.yml'))
117
- services = subject.yaml
118
- expect(services['wordpress']['image']).to eq('wordpress:4.1')
119
- end
120
-
121
- it 'interpolates ${VAR} variables' do
122
- allow(File).to receive(:read)
123
- .with(absolute_yaml_path)
124
- .and_return(fixture('kontena-with-variables.yml'))
125
- services = subject.yaml
126
- expect(services['mysql']['image']).to eq('mariadb:latest')
127
- end
128
-
129
- it 'warns about empty variables' do
130
- allow(File).to receive(:read)
131
- .with(absolute_yaml_path)
132
- .and_return(fixture('kontena-with-variables.yml'))
133
- allow(ENV).to receive(:key?)
134
- .with('MYSQL_IMAGE')
135
- .and_return(false)
136
-
137
- expect {
138
- subject
139
- }.to output('The MYSQL_IMAGE is not set. Substituting an empty string.
140
- ').to_stdout
141
- end
142
- end
143
-
144
- it 'replaces $$VAR variables to $VAR format' do
145
- allow(ENV).to receive(:key?).and_return(true)
146
- allow(ENV).to receive(:[]).with('TAG').and_return('4.1')
147
- allow(ENV).to receive(:[]).with('MYSQL_IMAGE').and_return('mariadb:latest')
148
- allow(ENV).to receive(:[]).with('project').and_return('test')
149
- allow(ENV).to receive(:[]).with('grid').and_return('test-grid')
150
- allow(File).to receive(:read)
151
- .with(absolute_yaml_path)
152
- .and_return(fixture('kontena-with-variables.yml'))
153
- services = subject.execute[:services]
154
- expect(services['mysql']['environment'].first).to eq('INTERNAL_VAR=$INTERNAL_VAR')
155
- end
156
- end
157
-
158
- context 'when yaml file is malformed' do
159
- it 'exits the execution' do
160
- allow(File).to receive(:read)
161
- .with(absolute_yaml_path)
162
- .and_return(fixture('kontena-malformed-yaml.yml'))
163
- expect {
164
- subject.execute
165
- }.to raise_error(StandardError)
166
- end
167
- end
168
-
169
- context 'when service config is not hash' do
170
- it 'returns error' do
171
- allow(File).to receive(:read)
172
- .with(absolute_yaml_path)
173
- .and_return(fixture('kontena-not-hash-service-config.yml'))
174
-
175
- outcome = subject.execute
176
- expect(outcome[:errors].size).to eq(1)
177
- end
178
- end
179
-
180
- describe '#v2?' do
181
- context 'version 1' do
182
- it 'returns false' do
183
- allow(File).to receive(:read)
184
- .with(absolute_yaml_path('docker-compose.yml'))
185
- .and_return(fixture('docker-compose.yml'))
186
- allow(File).to receive(:read)
187
- .with(absolute_yaml_path('kontena.yml'))
188
- .and_return(fixture('kontena.yml'))
189
- expect(subject.v2?).to be_falsey
190
- end
191
- end
192
- context 'version 2' do
193
- it 'returns true' do
194
- allow(File).to receive(:read)
195
- .with(absolute_yaml_path('docker-compose_v2.yml'))
196
- .and_return(fixture('docker-compose_v2.yml'))
197
- allow(File).to receive(:read)
198
- .with(absolute_yaml_path('kontena.yml'))
199
- .and_return(fixture('kontena_v2.yml'))
200
- expect(subject.v2?).to be_truthy
201
- end
202
- end
203
- end
204
-
205
- describe '#execute' do
206
- before(:each) do
207
- allow(ENV).to receive(:[]).with('project').and_return('test')
208
- allow(ENV).to receive(:[]).with('grid').and_return('test-grid')
209
-
210
- allow(File).to receive(:read)
211
- .with(absolute_yaml_path('kontena.yml'))
212
- .and_return(fixture('kontena.yml'))
213
- allow(File).to receive(:read)
214
- .with(absolute_yaml_path('docker-compose.yml'))
215
- .and_return(fixture('docker-compose.yml'))
216
- end
217
-
218
- context 'when extending services' do
219
- it 'extends services from external file' do
220
- docker_compose_yml = YAML.load(fixture('docker-compose.yml') % { project: 'test' })
221
- wordpress_options = {
222
- 'extends' => {
223
- 'file' => 'docker-compose.yml',
224
- 'service' => 'wordpress'
225
- },
226
- 'stateful' => true,
227
- 'environment' => ['WORDPRESS_DB_PASSWORD=test_secret'],
228
- 'instances' => 2,
229
- 'deploy' => { 'strategy' => 'ha' }
230
- }
231
- mysql_options = {
232
- 'extends' => {
233
- 'file' => 'docker-compose.yml',
234
- 'service' => 'mysql'
235
- },
236
- 'stateful' => true,
237
- 'environment' => ['MYSQL_ROOT_PASSWORD=test_secret']
238
- }
239
- expect(Kontena::Cli::Apps::YAML::ServiceExtender).to receive(:new)
240
- .with(wordpress_options)
241
- .once
242
- .and_return(service_extender)
243
- expect(Kontena::Cli::Apps::YAML::ServiceExtender).to receive(:new)
244
- .with(mysql_options)
245
- .once
246
- .and_return(service_extender)
247
- expect(service_extender).to receive(:extend).with(docker_compose_yml['wordpress'])
248
- expect(service_extender).to receive(:extend).with(docker_compose_yml['mysql'])
249
-
250
- subject.execute
251
- end
252
-
253
- it 'extends services from the same file' do
254
- allow(File).to receive(:read)
255
- .with(absolute_yaml_path('kontena.yml'))
256
- .and_return(fixture('kontena-internal-extend.yml'))
257
- kontena_yml = YAML.load(fixture('kontena-internal-extend.yml') % { project: 'test' })
258
- expect(Kontena::Cli::Apps::YAML::ServiceExtender).to receive(:new)
259
- .with(kontena_yml['app'])
260
- .once
261
- .and_return(service_extender)
262
- expect(service_extender).to receive(:extend).with(kontena_yml['base'])
263
- subject.execute
264
- end
265
- end
266
-
267
- context 'environment variables' do
268
- it 'converts env hash to array' do
269
- result = subject.execute[:services]
270
- expect(result['wordpress']['environment']).to eq(['WORDPRESS_DB_PASSWORD=test_secret'])
271
- end
272
-
273
- it 'does nothing to env array' do
274
- result = subject.execute[:services]
275
- expect(result['mysql']['environment']).to eq(['MYSQL_ROOT_PASSWORD=test_secret'])
276
- end
277
-
278
- context 'when introduced env_file' do
279
- before(:each) do
280
- allow(File).to receive(:read)
281
- .with(absolute_yaml_path('kontena.yml'))
282
- .and_return(fixture('kontena-with-env-file.yml'))
283
- allow(File).to receive(:readlines).with('.env').and_return(env_file)
284
- end
285
-
286
- it 'reads given file' do
287
- expect(File).to receive(:readlines).with('.env').and_return(env_file)
288
- subject.send(:read_env_file, '.env')
289
- end
290
-
291
- it 'discards comment lines' do
292
- result = env_file
293
- result << "#COMMENTLINE"
294
- allow(File).to receive(:readlines).with('.env').and_return(result)
295
-
296
- variables = subject.send(:read_env_file, '.env')
297
- expect(variables).to eq([
298
- 'APIKEY=12345',
299
- 'MYSQL_ROOT_PASSWORD=secret',
300
- 'WP_ADMIN_PASSWORD=verysecret'
301
- ])
302
- end
303
-
304
- it 'discards empty lines' do
305
- result = env_file
306
- result << '
307
- '
308
- allow(File).to receive(:readlines).with('.env').and_return(result)
309
- variables = subject.send(:read_env_file, '.env')
310
- expect(variables).to eq([
311
- 'APIKEY=12345',
312
- 'MYSQL_ROOT_PASSWORD=secret',
313
- 'WP_ADMIN_PASSWORD=verysecret'
314
- ])
315
- end
316
-
317
- it 'merges variables' do
318
- result = subject.execute[:services]
319
- expect(result['wordpress']['environment']).to eq([
320
- 'WORDPRESS_DB_PASSWORD=test_secret',
321
- 'APIKEY=12345',
322
- 'MYSQL_ROOT_PASSWORD=secret',
323
- 'WP_ADMIN_PASSWORD=verysecret'
324
- ])
325
- end
326
-
327
- end
328
- end
329
- it 'returns result hash' do
330
- outcome = subject.execute
331
- expect(outcome[:services]).to eq(valid_result)
332
- end
333
-
334
- it 'returns validation errors' do
335
- allow(File).to receive(:read)
336
- .with(absolute_yaml_path('kontena.yml'))
337
- .and_return(fixture('kontena-invalid.yml'))
338
- outcome = subject.execute
339
- expect(outcome[:errors].size).to eq(1)
340
- end
341
- end
342
-
343
- context 'when build option is string' do
344
- it 'expands build option to absolute path' do
345
- allow(File).to receive(:read)
346
- .with(absolute_yaml_path('docker-compose.yml'))
347
- .and_return(fixture('docker-compose.yml'))
348
- allow(File).to receive(:read)
349
- .with(absolute_yaml_path('kontena.yml'))
350
- .and_return(fixture('kontena-build.yml'))
351
- outcome = subject.execute
352
-
353
- expect(outcome[:services]['wordpress']['build']).to eq(File.expand_path('.'))
354
- end
355
- end
356
-
357
- context 'when build option is Hash' do
358
- it 'expands build context to absolute path' do
359
- allow(File).to receive(:read)
360
- .with(absolute_yaml_path('docker-compose.yml'))
361
- .and_return(fixture('docker-compose.yml'))
362
- allow(File).to receive(:read)
363
- .with(absolute_yaml_path('kontena.yml'))
364
- .and_return(fixture('kontena_build_v2.yml'))
365
- outcome = subject.execute
366
- expect(outcome[:services]['webapp']['build']['context']).to eq(File.expand_path('.'))
367
- end
368
- end
369
-
370
- context 'normalize_build_args' do
371
- context 'when build option is string' do
372
- it 'skips normalizing' do
373
- allow(File).to receive(:read)
374
- .with(absolute_yaml_path('kontena.yml'))
375
- .and_return(fixture('kontena_build_v2.yml'))
376
- allow(subject).to receive(:v2?).and_return(true)
377
-
378
- options = {
379
- 'build' => '.'
380
- }
381
- expect {
382
- subject.send(:normalize_build_args, options)
383
- }.not_to raise_error
384
- end
385
- end
386
-
387
- context 'when build arguments option is Hash' do
388
- it 'does not do anything' do
389
- allow(File).to receive(:read)
390
- .with(absolute_yaml_path('kontena.yml'))
391
- .and_return(fixture('kontena_build_v2.yml'))
392
- allow(subject).to receive(:v2?).and_return(true)
393
-
394
- options = {
395
- 'build' => {
396
- 'context' => '.',
397
- 'args' => {
398
- 'foo' => 'bar'
399
- }
400
- }
401
- }
402
-
403
- subject.send(:normalize_build_args, options)
404
- expect(options.dig('build', 'args')).to eq({
405
- 'foo' => 'bar'
406
- })
407
- end
408
- end
409
-
410
- context 'when build arguments option is Array' do
411
- it 'converts it to array' do
412
- allow(File).to receive(:read)
413
- .with(absolute_yaml_path('kontena.yml'))
414
- .and_return(fixture('kontena_build_v2.yml'))
415
- allow(subject).to receive(:v2?).and_return(true)
416
-
417
- options = {
418
- 'build' => {
419
- 'context' => '.',
420
- 'args' => ['foo=bar']
421
- }
422
- }
423
-
424
- subject.send(:normalize_build_args, options)
425
- expect(options.dig('build', 'args')).to eq({
426
- 'foo' => 'bar'
427
- })
428
- end
429
- end
430
- end
431
-
432
- describe '#stack_name' do
433
- it 'returns nil for v1' do
434
- allow(File).to receive(:read)
435
- .with(absolute_yaml_path('kontena.yml'))
436
- .and_return(fixture('kontena.yml'))
437
- name = subject.stack_name
438
- expect(name).to be_nil
439
- end
440
-
441
- it 'returns name for v2 if defined' do
442
- allow(File).to receive(:read)
443
- .with(absolute_yaml_path('kontena.yml'))
444
- .and_return(fixture('kontena_v2.yml'))
445
- name = subject.stack_name
446
- expect(name).to eq('test-project')
447
- end
448
-
449
- it 'returns nil for v2 if not defined' do
450
- allow(File).to receive(:read)
451
- .with(absolute_yaml_path('kontena.yml'))
452
- .and_return(fixture('docker-compose.yml'))
453
- name = subject.stack_name
454
- expect(name).to be_nil
455
- end
456
- end
457
- end