kontena-cli 1.4.0.pre6 → 1.4.0.pre7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,301 +0,0 @@
1
- require 'kontena/cli/apps/yaml/validator_v2'
2
-
3
- describe Kontena::Cli::Apps::YAML::ValidatorV2 do
4
- describe '#validate_options' do
5
- context 'build' do
6
- it 'can be string' do
7
- result = subject.validate_options('build' => '.')
8
- expect(result.valid?).to be_truthy
9
- expect(result.errors.key?('build')).to be_falsey
10
- end
11
-
12
- it 'can be hash' do
13
- result = subject.validate_options('build' => { 'context' => '.' })
14
- expect(result.valid?).to be_truthy
15
- expect(result.errors.key?('build')).to be_falsey
16
- end
17
-
18
- it 'returns error if build is hash and context is missing' do
19
- result = subject.validate_options('build' => {})
20
- expect(result.valid?).to be_falsey
21
- expect(result.errors.key?('build')).to be_truthy
22
- end
23
-
24
- it 'returns error if optional dockerfile is not string' do
25
- result = subject.validate_options('build' => {
26
- 'context' => '.',
27
- 'dockerfile' => 123
28
- })
29
- expect(result.valid?).to be_falsey
30
- expect(result.errors.key?('build')).to be_truthy
31
- end
32
- end
33
- it 'validates image is string' do
34
- result = subject.validate_options('image' => true)
35
- expect(result.valid?).to be_falsey
36
- expect(result.errors.key?('image')).to be_truthy
37
- end
38
-
39
- it 'validates stateful is boolean' do
40
- result = subject.validate_options('stateful' => 'bool')
41
- expect(result.errors.key?('stateful')).to be_truthy
42
- end
43
-
44
- it 'validates network_mode is host or bridge' do
45
- result = subject.validate_options('network_mode' => 'invalid')
46
- expect(result.errors.key?('network_mode')).to be_truthy
47
-
48
- result = subject.validate_options('network_mode' => 'bridge')
49
- expect(result.errors.key?('network_mode')).to be_falsey
50
-
51
- result = subject.validate_options('network_mode' => 'host')
52
- expect(result.errors.key?('network_mode')).to be_falsey
53
- end
54
-
55
- context 'affinity' do
56
- it 'is optional' do
57
- result = subject.validate_options({})
58
- expect(result.errors.key?('affinity')).to be_falsey
59
- end
60
-
61
- it 'must be array' do
62
- result = subject.validate_options('affinity' => 'node==node1')
63
- expect(result.errors.key?('affinity')).to be_truthy
64
- result = subject.validate_options('affinity' => ['node==node1'])
65
- expect(result.errors.key?('affinity')).to be_falsey
66
- end
67
-
68
- it 'validates format' do
69
- result = subject.validate_options('affinity' => ['node=node1'])
70
- expect(result.errors.key?('affinity')).to be_truthy
71
-
72
- result = subject.validate_options('affinity' => ['node==node1', 'service!=mariadb'])
73
- expect(result.errors.key?('affinity')).to be_falsey
74
- end
75
- end
76
-
77
- context 'command' do
78
- it 'is optional' do
79
- result = subject.validate_options({})
80
- expect(result.errors.key?('command')).to be_falsey
81
- end
82
-
83
- it 'must be string or empty' do
84
- result = subject.validate_options('command' => 1234)
85
- expect(result.errors.key?('command')).to be_truthy
86
-
87
- result = subject.validate_options('command' => nil)
88
- expect(result.errors.key?('command')).to be_falsey
89
-
90
- result = subject.validate_options('command' => 'bundle exec rails s')
91
- expect(result.errors.key?('command')).to be_falsey
92
- end
93
- end
94
-
95
- it 'validates cpu_shares is integer' do
96
- result = subject.validate_options('cpu_shares' => '1m')
97
- expect(result.errors.key?('cpu_shares')).to be_truthy
98
- result = subject.validate_options('cpu_shares' => 1024)
99
- expect(result.errors.key?('cpu_shares')).to be_falsey
100
- result = subject.validate_options({})
101
- expect(result.errors.key?('cpu_shares')).to be_falsey
102
- end
103
-
104
- it 'validates environment is array or hash' do
105
- result = subject.validate_options('environment' => 'KEY=VALUE')
106
- expect(result.errors.key?('environment')).to be_truthy
107
- result = subject.validate_options('environment' => ['KEY=VALUE'])
108
- expect(result.errors.key?('environment')).to be_falsey
109
- result = subject.validate_options('environment' => { 'KEY' => 'VALUE' })
110
- expect(result.errors.key?('environment')).to be_falsey
111
- end
112
-
113
- context 'validates secrets' do
114
- it 'must be array' do
115
- result = subject.validate_options('secrets' => {})
116
- expect(result.errors.key?('secrets')).to be_truthy
117
- end
118
-
119
- context 'item' do
120
- it 'must contain secret' do
121
- result = subject.validate_options('secrets' => [{ 'name' => 'test', 'type' => 'env' }])
122
- expect(result.errors.key?('secrets')).to be_truthy
123
- end
124
-
125
- it 'must contain name' do
126
- result = subject.validate_options('secrets' => [{ 'secret' => 'test', 'type' => 'env' }])
127
- expect(result.errors.key?('secrets')).to be_truthy
128
- end
129
-
130
- it 'must contain type' do
131
- result = subject.validate_options('secrets' => [{ 'secret' => 'test', 'name' => 'test' }])
132
- expect(result.errors.key?('secrets')).to be_truthy
133
- end
134
-
135
- it 'accepts valid input' do
136
- result = subject.validate_options('secrets' =>
137
- [
138
- {
139
- 'secret' => 'test',
140
- 'name' => 'test',
141
- 'type' => 'env'
142
- }
143
- ])
144
- expect(result.errors.key?('secrets')).to be_falsey
145
- end
146
- end
147
- end
148
-
149
- context 'logging' do
150
- context 'options' do
151
- it 'must be hash' do
152
- result = subject.validate_options('logging' => { 'options' => [] })
153
- expect(result.errors.key?('logging')).to be_truthy
154
- data = {
155
- 'logging' => {
156
- 'options' => {
157
- 'syslog-address' => "tcp://192.168.0.42:123"
158
- }
159
- }
160
- }
161
- result = subject.validate_options(data)
162
- expect(result.errors.key?('logging')).to be_falsey
163
- end
164
- end
165
- end
166
-
167
- context 'hooks' do
168
- context 'validates pre_build' do
169
- it 'must be array' do
170
- result = subject.validate_options('hooks' => { 'pre_build' => {} })
171
- expect(result.errors.key?('hooks')).to be_truthy
172
- data = {
173
- 'hooks' => {
174
- 'pre_build' => [
175
- {
176
- 'cmd' => 'rake db:migrate'
177
- }
178
- ]
179
- }
180
- }
181
- result = subject.validate_options(data)
182
- expect(result.errors.key?('hooks')).to be_falsey
183
- end
184
- end
185
- context 'post_start' do
186
- it 'must be array' do
187
- result = subject.validate_options('hooks' => { 'post_start' => {} })
188
- expect(result.errors.key?('hooks')).to be_truthy
189
- data = {
190
- 'hooks' => {
191
- 'post_start' => [
192
- {
193
- 'name' => 'migrate',
194
- 'cmd' => 'rake db:migrate',
195
- 'instances' => '*'
196
- }
197
- ]
198
- }
199
- }
200
- result = subject.validate_options(data)
201
- expect(result.errors.key?('hooks')).to be_falsey
202
- end
203
-
204
- context 'item' do
205
- it 'must contain name' do
206
- result = subject.validate_options('hooks' =>
207
- {
208
- 'post_start' => [
209
- {
210
- 'cmd' => 'rake db:migrate',
211
- 'instances' => '1'
212
- }
213
- ]
214
- })
215
- expect(result.errors.key?('hooks.post_start')).to be_truthy
216
- end
217
-
218
- it 'must contain cmd' do
219
- result = subject.validate_options('hooks' =>
220
- {
221
- 'post_start' => [
222
- {
223
- 'name' => 'migrate',
224
- 'instances' => '1'
225
- }
226
- ]
227
- })
228
- expect(result.errors.key?('hooks.post_start')).to be_truthy
229
- end
230
-
231
- it 'must contain instance number or *' do
232
- result = subject.validate_options('hooks' =>
233
- {
234
- 'post_start' => [
235
- { 'name' => 'migrate',
236
- 'cmd' => 'rake db:migrate'
237
- }
238
- ]
239
- })
240
- expect(result.errors.key?('hooks.post_start')).to be_truthy
241
- data = {
242
- 'hooks' => {
243
- 'post_start' => [
244
- {
245
- 'name' => 'migrate',
246
- 'cmd' => 'rake db:migrate',
247
- 'instances' => 'all',
248
- 'oneshot' => true
249
- }
250
- ]
251
- }
252
- }
253
- result = subject.validate_options(data)
254
- expect(result.errors.key?('hooks.post_start')).to be_truthy
255
- end
256
-
257
- it 'may contain boolean oneshot' do
258
- data = {
259
- 'hooks' => {
260
- 'post_start' => [
261
- {
262
- 'name' => 'migrate',
263
- 'cmd' => 'rake db:migrate',
264
- 'instances' => '*',
265
- 'oneshot' => 'true'
266
- }
267
- ]
268
- }
269
- }
270
- result = subject.validate_options(data)
271
- expect(result.errors.key?('hooks.post_start')).to be_truthy
272
- end
273
- end
274
-
275
- it 'validates depends_on is array' do
276
- result = subject.validate_options('depends_on' => 'web')
277
- expect(result.errors.key?('depends_on')).to be_truthy
278
-
279
- result = subject.validate_options('depends_on' => ['web'])
280
- expect(result.errors.key?('depends_on')).to be_falsey
281
- end
282
-
283
- it 'validates volumes is array' do
284
- result = subject.validate_options('volumes' => '/app')
285
- expect(result.errors.key?('volumes')).to be_truthy
286
-
287
- result = subject.validate_options('volumes' => ['/app'])
288
- expect(result.errors.key?('volumes')).to be_falsey
289
- end
290
-
291
- it 'validates volumes_from is array' do
292
- result = subject.validate_options('volumes_from' => 'mysql_data')
293
- expect(result.errors.key?('volumes_from')).to be_truthy
294
-
295
- result = subject.validate_options('volumes_from' => ['mysql_data'])
296
- expect(result.errors.key?('volumes_from')).to be_falsey
297
- end
298
- end
299
- end
300
- end
301
- end