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,127 +0,0 @@
1
- require 'kontena/cli/apps/yaml/service_extender'
2
-
3
- describe Kontena::Cli::Apps::YAML::ServiceExtender do
4
- let(:options) do
5
- {
6
- 'image' => 'alpine:latest',
7
- 'ports' => '80:80'
8
- }
9
- end
10
-
11
- let(:parent_options) do
12
- {
13
- 'build' => '.'
14
- }
15
- end
16
-
17
- describe '#extend' do
18
- it 'merges options' do
19
- result = described_class.new(options).extend(parent_options)
20
- expected_result = {
21
- 'image' => 'alpine:latest',
22
- 'build' => '.',
23
- 'ports' => '80:80',
24
- 'environment' => [],
25
- 'secrets' => []
26
- }
27
- expect(result).to eq(expected_result)
28
- end
29
-
30
- context 'environment variables' do
31
- it 'inherites env vars from upper level' do
32
- from = { 'environment' => ['FOO=bar'] }
33
- to = {}
34
- result = described_class.new(to).extend(from)
35
- expect(result['environment']).to eq(['FOO=bar'])
36
- end
37
-
38
- it 'overrides values' do
39
- from = { 'environment' => ['FOO=bar'] }
40
- to = { 'environment' => ['FOO=baz'] }
41
- result = described_class.new(to).extend(from)
42
- expect(result['environment']).to eq(['FOO=baz'])
43
- end
44
-
45
- it 'combines variables' do
46
- from = { 'environment' => ['FOO=bar'] }
47
- to = { 'environment' => ['BAR=baz'] }
48
- result = described_class.new(to).extend(from)
49
- expect(result['environment']).to eq(['BAR=baz', 'FOO=bar'])
50
- end
51
- end
52
-
53
- context 'secrets' do
54
- it 'inherites secrets from upper level' do
55
- secret = {
56
- 'secret' => 'CUSTOMER_DB_PASSWORD',
57
- 'name' => 'MYSQL_PASSWORD',
58
- 'type' => 'env'
59
- }
60
- from = { 'secrets' => [secret] }
61
- to = {}
62
- result = described_class.new(to).extend(from)
63
- expect(result['secrets']).to eq([secret])
64
- end
65
-
66
- it 'overrides secrets' do
67
- from_secret = {
68
- 'secret' => 'CUSTOMER_DB_PASSWORD',
69
- 'name' => 'MYSQL_PASSWORD',
70
- 'type' => 'env'
71
- }
72
-
73
- to_secret = {
74
- 'secret' => 'CUSTOMER_DB_PASSWORD',
75
- 'name' => 'MYSQL_ROOT_PASSWORD',
76
- 'type' => 'env'
77
- }
78
- from = { 'secrets' => [from_secret] }
79
- to = { 'secrets' => [to_secret] }
80
- result = described_class.new(to).extend(from)
81
- expect(result['secrets']).to eq([to_secret])
82
- end
83
-
84
- it 'combines secrets' do
85
- from_secret = {
86
- 'secret' => 'CUSTOMER_DB_PASSWORD',
87
- 'name' => 'MYSQL_PASSWORD',
88
- 'type' => 'env'
89
- }
90
-
91
- to_secret = {
92
- 'secret' => 'CUSTOMER_API_TOKEN',
93
- 'name' => 'API_TOKEN',
94
- 'type' => 'env'
95
- }
96
- from = { 'secrets' => [from_secret] }
97
- to = { 'secrets' => [to_secret] }
98
- result = described_class.new(to).extend(from)
99
- expect(result['secrets']).to eq([to_secret, from_secret])
100
- end
101
- end
102
-
103
- context 'build args' do
104
- it 'inherits build args from upper level' do
105
- from = { 'build' => { 'args' => {'foo' => 'bar'}} }
106
- to = {}
107
- result = described_class.new(to).extend(from)
108
- expect(result['build']['args']).to eq({'foo' => 'bar'})
109
- end
110
-
111
- it 'overrides values' do
112
- from = { 'build' => { 'args' => {'foo' => 'bar'}} }
113
- to = { 'build' => { 'args' => {'foo' => 'baz'}} }
114
- result = described_class.new(to).extend(from)
115
- expect(result['build']['args']).to eq({'foo' => 'baz'})
116
- end
117
-
118
- it 'combines variables' do
119
- from = { 'build' => { 'args' => {'foo' => 'bar'}} }
120
- to = { 'build' => { 'args' => {'baz' => 'baf'}} }
121
- result = described_class.new(to).extend(from)
122
- expect(result['build']['args']).to eq({'foo' => 'bar', 'baz' => 'baf'})
123
- end
124
- end
125
-
126
- end
127
- end
@@ -1,380 +0,0 @@
1
- require 'kontena/cli/apps/yaml/validator'
2
-
3
- describe Kontena::Cli::Apps::YAML::Validator do
4
-
5
- describe '#validate_options' do
6
- context 'build' do
7
- it 'is optional' do
8
- result = subject.validate_options({})
9
- expect(result.valid?).to be_truthy
10
-
11
- expect(result.errors.key?('build')).to be_falsey
12
- end
13
-
14
- it 'must be string' do
15
- result = subject.validate_options('build' => 12345)
16
- expect(result.errors.key?('build')).to be_truthy
17
-
18
- result = subject.validate_options('build' => '.')
19
- expect(result.errors.key?('build')).to be_falsey
20
- end
21
- end
22
-
23
- context 'image' do
24
- it 'is optional' do
25
- result = subject.validate_options('build' => '.')
26
- expect(result.valid?).to be_truthy
27
- expect(result.errors.key?('image')).to be_falsey
28
- end
29
-
30
- it 'must be string' do
31
- result = subject.validate_options('image' => 10)
32
- expect(result.valid?).to be_falsey
33
- expect(result.errors.key?('image')).to be_truthy
34
- end
35
- end
36
-
37
- it 'validates stateful is boolean' do
38
- result = subject.validate_options('stateful' => 'bool')
39
- expect(result.errors.key?('stateful')).to be_truthy
40
- end
41
-
42
- it 'validates net is host or bridge' do
43
- result = subject.validate_options('net' => 'invalid')
44
- expect(result.errors.key?('net')).to be_truthy
45
-
46
- result = subject.validate_options('net' => 'bridge')
47
- expect(result.errors.key?('net')).to be_falsey
48
-
49
- result = subject.validate_options('net' => 'host')
50
- expect(result.errors.key?('net')).to be_falsey
51
- end
52
-
53
- context 'affinity' do
54
- it 'is optional' do
55
- result = subject.validate_options({})
56
- expect(result.errors.key?('affinity')).to be_falsey
57
- end
58
-
59
- it 'must be array' do
60
- result = subject.validate_options('affinity' => 'node==node1')
61
- expect(result.errors.key?('affinity')).to be_truthy
62
- result = subject.validate_options('affinity' => ['node==node1'])
63
- expect(result.errors.key?('affinity')).to be_falsey
64
- end
65
-
66
- it 'validates format' do
67
- result = subject.validate_options('affinity' => ['node=node1'])
68
- expect(result.errors.key?('affinity')).to be_truthy
69
-
70
- result = subject.validate_options('affinity' => ['node==node1', 'service!=mariadb'])
71
- expect(result.errors.key?('affinity')).to be_falsey
72
- end
73
- end
74
-
75
- context 'deploy' do
76
- it 'is optional' do
77
- result = subject.validate_options({})
78
- expect(result.errors.key?('deploy')).to be_falsey
79
- end
80
-
81
- context 'strategy' do
82
- it 'accepts daemon' do
83
- result = subject.validate_options('deploy' => {'strategy' => 'daemon'})
84
- expect(result.errors.key?('deploy')).to be_falsey
85
- end
86
-
87
- it 'accepts random' do
88
- result = subject.validate_options('deploy' => {'strategy' => 'random'})
89
- expect(result.errors.key?('deploy')).to be_falsey
90
- end
91
-
92
- it 'accepts ha' do
93
- result = subject.validate_options('deploy' => {'strategy' => 'ha'})
94
- expect(result.errors.key?('deploy')).to be_falsey
95
- end
96
-
97
- it 'rejects invalid values' do
98
- result = subject.validate_options('deploy' => {'strategy' => 'global'})
99
- expect(result.errors.key?('deploy')).to be_truthy
100
- end
101
- end
102
-
103
- context 'interval' do
104
- it 'rejects wrong format' do
105
- result = subject.validate_options('deploy' => {'interval' => '1xyz'})
106
- expect(result.errors.key?('deploy')).to be_truthy
107
- end
108
-
109
- it 'accepts 1min as value' do
110
- result = subject.validate_options('deploy' => {'interval' => '1min'})
111
- expect(result.errors.key?('deploy')).to be_falsey
112
- end
113
-
114
- it 'accepts 1h as value' do
115
- result = subject.validate_options('deploy' => {'interval' => '1h'})
116
- expect(result.errors.key?('deploy')).to be_falsey
117
- end
118
-
119
- it 'accepts 1d as value' do
120
- result = subject.validate_options('deploy' => {'interval' => '1d'})
121
- expect(result.errors.key?('deploy')).to be_falsey
122
- end
123
-
124
- it 'accepts integer as value' do
125
- result = subject.validate_options('deploy' => {'interval' => '100'})
126
- expect(result.errors.key?('deploy')).to be_falsey
127
- end
128
- end
129
- end
130
-
131
- context 'command' do
132
- it 'is optional' do
133
- result = subject.validate_options({})
134
- expect(result.errors.key?('command')).to be_falsey
135
- end
136
-
137
- it 'must be string or empty' do
138
- result = subject.validate_options('command' => 1234)
139
- expect(result.errors.key?('command')).to be_truthy
140
-
141
- result = subject.validate_options('command' => nil)
142
- expect(result.errors.key?('command')).to be_falsey
143
-
144
- result = subject.validate_options('command' => 'bundle exec rails s')
145
- expect(result.errors.key?('command')).to be_falsey
146
- end
147
- end
148
-
149
- it 'validates cpu_shares is integer' do
150
- result = subject.validate_options('cpu_shares' => '1m')
151
- expect(result.errors.key?('cpu_shares')).to be_truthy
152
- result = subject.validate_options('cpu_shares' => 1024)
153
- expect(result.errors.key?('cpu_shares')).to be_falsey
154
- result = subject.validate_options({})
155
- expect(result.errors.key?('cpu_shares')).to be_falsey
156
- end
157
-
158
- it 'validates environment is array or hash' do
159
- result = subject.validate_options('environment' => 'KEY=VALUE')
160
- expect(result.errors.key?('environment')).to be_truthy
161
- result = subject.validate_options('environment' => ['KEY=VALUE'])
162
- expect(result.errors.key?('environment')).to be_falsey
163
- result = subject.validate_options('environment' => { 'KEY' => 'VALUE' })
164
- expect(result.errors.key?('environment')).to be_falsey
165
- end
166
-
167
- context 'validates secrets' do
168
- it 'must be array' do
169
- result = subject.validate_options('secrets' => {})
170
- expect(result.errors.key?('secrets')).to be_truthy
171
- end
172
-
173
- context 'item' do
174
- it 'must contain secret' do
175
- result = subject.validate_options('secrets' => [{ 'name' => 'test', 'type' => 'env' }])
176
- expect(result.errors.key?('secrets')).to be_truthy
177
- end
178
-
179
- it 'must contain name' do
180
- result = subject.validate_options('secrets' => [{ 'secret' => 'test', 'type' => 'env' }])
181
- expect(result.errors.key?('secrets')).to be_truthy
182
- end
183
-
184
- it 'must contain type' do
185
- result = subject.validate_options('secrets' => [{ 'secret' => 'test', 'name' => 'test' }])
186
- expect(result.errors.key?('secrets')).to be_truthy
187
- end
188
-
189
- it 'accepts valid input' do
190
- result = subject.validate_options('secrets' =>
191
- [
192
- {
193
- 'secret' => 'test',
194
- 'name' => 'test',
195
- 'type' => 'env'
196
- }
197
- ])
198
- expect(result.errors.key?('secrets')).to be_falsey
199
- end
200
- end
201
- end
202
-
203
- context 'validates extends' do
204
- it 'accepts string value' do
205
- result = subject.validate_options('extends' => 'web')
206
- expect(result.errors.key?('extends')).to be_falsey
207
- end
208
-
209
- context 'when value is hash' do
210
- it 'must contain service' do
211
- result = subject.validate_options('extends' => { 'file' => 'docker_compose.yml'})
212
- expect(result.errors.key?('extends')).to be_truthy
213
- end
214
- end
215
-
216
- context 'when value is not string or hash' do
217
- it 'returns error' do
218
- result = subject.validate_options('extends' => ['array is invalid'])
219
- expect(result.errors.key?('extends')).to be_truthy
220
- end
221
- end
222
- end
223
- context 'validates hooks' do
224
- context 'validates pre_build' do
225
- it 'must be array' do
226
- result = subject.validate_options('hooks' => { 'pre_build' => {} })
227
- expect(result.errors.key?('hooks')).to be_truthy
228
- data = {
229
- 'hooks' => {
230
- 'pre_build' => [
231
- {
232
- 'cmd' => 'rake db:migrate'
233
- }
234
- ]
235
- }
236
- }
237
- result = subject.validate_options(data)
238
- expect(result.errors.key?('hooks')).to be_falsey
239
- end
240
- end
241
- context 'validates post_start' do
242
- it 'must be array' do
243
- result = subject.validate_options('hooks' => { 'post_start' => {} })
244
- expect(result.errors.key?('hooks')).to be_truthy
245
- data = {
246
- 'hooks' => {
247
- 'post_start' => [
248
- {
249
- 'name' => 'migrate',
250
- 'cmd' => 'rake db:migrate',
251
- 'instances' => '*'
252
- }
253
- ]
254
- }
255
- }
256
- result = subject.validate_options(data)
257
- expect(result.errors.key?('hooks')).to be_falsey
258
- end
259
-
260
- context 'item' do
261
- it 'must contain name' do
262
- result = subject.validate_options('hooks' =>
263
- {
264
- 'post_start' => [
265
- {
266
- 'cmd' => 'rake db:migrate',
267
- 'instances' => '1'
268
- }
269
- ]
270
- })
271
- expect(result.errors.key?('hooks.post_start')).to be_truthy
272
- end
273
-
274
- it 'must contain cmd' do
275
- result = subject.validate_options('hooks' =>
276
- {
277
- 'post_start' => [
278
- {
279
- 'name' => 'migrate',
280
- 'instances' => '1'
281
- }
282
- ]
283
- })
284
- expect(result.errors.key?('hooks.post_start')).to be_truthy
285
- end
286
-
287
- it 'must contain instance number or *' do
288
- result = subject.validate_options('hooks' =>
289
- {
290
- 'post_start' => [
291
- { 'name' => 'migrate',
292
- 'cmd' => 'rake db:migrate'
293
- }
294
- ]
295
- })
296
- expect(result.errors.key?('hooks.post_start')).to be_truthy
297
- data = {
298
- 'hooks' => {
299
- 'post_start' => [
300
- {
301
- 'name' => 'migrate',
302
- 'cmd' => 'rake db:migrate',
303
- 'instances' => 'all',
304
- 'oneshot' => true
305
- }
306
- ]
307
- }
308
- }
309
- result = subject.validate_options(data)
310
- expect(result.errors.key?('hooks.post_start')).to be_truthy
311
- end
312
-
313
- it 'may contain boolean oneshot' do
314
- data = {
315
- 'hooks' => {
316
- 'post_start' => [
317
- {
318
- 'name' => 'migrate',
319
- 'cmd' => 'rake db:migrate',
320
- 'instances' => '*',
321
- 'oneshot' => 'true'
322
- }
323
- ]
324
- }
325
- }
326
- result = subject.validate_options(data)
327
- expect(result.errors.key?('hooks.post_start')).to be_truthy
328
- end
329
- end
330
-
331
- it 'validates volumes is array' do
332
- result = subject.validate_options('volumes' => '/app')
333
- expect(result.errors.key?('volumes')).to be_truthy
334
-
335
- result = subject.validate_options('volumes' => ['/app'])
336
- expect(result.errors.key?('volumes')).to be_falsey
337
- end
338
-
339
- it 'validates volumes_from is array' do
340
- result = subject.validate_options('volumes_from' => 'mysql_data')
341
- expect(result.errors.key?('volumes_from')).to be_truthy
342
-
343
- result = subject.validate_options('volumes_from' => ['mysql_data'])
344
- expect(result.errors.key?('volumes_from')).to be_falsey
345
- end
346
- end
347
- end
348
-
349
- context 'validates health_check' do
350
- it 'validates health_check' do
351
- result = subject.validate_options('health_check' => {})
352
- expect(result.errors.key?('health_check')).to be_truthy
353
- end
354
-
355
- it 'validates health_check port ' do
356
- result = subject.validate_options('health_check' => { 'protocol' => 'http', 'port' => 'abc'})
357
- expect(result.errors.key?('health_check')).to be_truthy
358
-
359
- result = subject.validate_options('health_check' => { 'protocol' => 'http', 'port' => 8080})
360
- expect(result.errors.key?('health_check')).to be_falsey
361
- end
362
-
363
- it 'validates health_check uri' do
364
- result = subject.validate_options('health_check' => { 'protocol' => 'http', 'port' => 8080, 'uri' => 'foobar'})
365
- expect(result.errors.key?('health_check')).to be_truthy
366
-
367
- result = subject.validate_options('health_check' => { 'protocol' => 'http', 'port' => 8080, 'uri' => '/health/foo/bar'})
368
- expect(result.errors.key?('health_check')).to be_falsey
369
- end
370
-
371
- it 'validates health_check protocol' do
372
- result = subject.validate_options('health_check' => { 'protocol' => 'foo', 'port' => 8080, 'uri' => 'foobar'})
373
- expect(result.errors.key?('health_check')).to be_truthy
374
-
375
- result = subject.validate_options('health_check' => { 'protocol' => 'tcp', 'port' => 3306 })
376
- expect(result.errors.key?('health_check')).to be_falsey
377
- end
378
- end
379
- end
380
- end