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,217 +0,0 @@
1
- require "kontena/cli/apps/deploy_command"
2
-
3
- describe Kontena::Cli::Apps::DeployCommand do
4
- include FixturesHelpers
5
- include ClientHelpers
6
-
7
- let(:subject) do
8
- described_class.new(File.basename($0))
9
- end
10
-
11
- let(:docker_compose_yml) do
12
- fixture('docker-compose.yml')
13
- end
14
-
15
- let(:kontena_yml) do
16
- fixture('kontena.yml')
17
- end
18
-
19
- let(:services) do
20
- {
21
- 'wordpress' => {
22
- 'image' => 'wordpress:latest',
23
- 'links' => ['mysql:db'],
24
- 'ports' => ['80:80'],
25
- 'instances' => 2,
26
- 'deploy' => {
27
- 'strategy' => 'ha'
28
- }
29
- },
30
- 'mysql' => {
31
- 'image' => 'mysql:5.6',
32
- 'stateful' => true
33
- }
34
- }
35
- end
36
-
37
- let(:options) do
38
- double({prefix: false, file: false, service: nil})
39
- end
40
-
41
- let(:env_vars) do
42
- ["#comment line", "TEST_ENV_VAR=test", "MYSQL_ADMIN_PASSWORD=abcdef"]
43
- end
44
-
45
- let(:dot_env) do
46
- ["TEST_ENV_VAR=test2","", "TEST_ENV_VAR2=test3"]
47
- end
48
-
49
- describe '.run' do
50
-
51
- before(:each) do
52
- allow(subject).to receive(:wait_for_deploy_to_finish).and_return(true)
53
- end
54
-
55
- context 'when api_url is nil' do
56
- it 'raises error' do
57
- allow(subject.config).to receive(:current_master).and_return(
58
- Kontena::Cli::Config::Server.new
59
- )
60
- expect{subject.run([])}.to exit_with_error
61
- end
62
- end
63
-
64
- context 'when token is nil' do
65
- it 'raises error' do
66
- allow(subject.config).to receive(:current_master).and_return(
67
- Kontena::Cli::Config::Server.new(url: 'http://foo.com')
68
- )
69
- expect{subject.run([])}.to exit_with_error
70
- end
71
- end
72
-
73
- context 'when api url and token are valid' do
74
- before(:each) do
75
- allow(File).to receive(:exists?).and_return(true)
76
- allow(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
77
- allow(File).to receive(:read).with("#{Dir.getwd}/docker-compose.yml").and_return(docker_compose_yml)
78
- allow(subject).to receive(:get_service).and_raise(Kontena::Errors::StandardError.new(404, 'Not Found'))
79
- allow(subject).to receive(:create_service).and_return({'id' => 'cli/kontena-test-mysql', 'name' => 'kontena-test-mysql'},{'id' => 'cli/kontena-test-wordpress', 'name' => 'kontena-test-wordpress'})
80
- allow(subject).to receive(:current_grid).and_return('1')
81
- allow(subject).to receive(:deploy_service).and_return(nil)
82
- end
83
-
84
- it 'reads ./kontena.yml file by default' do
85
- expect(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
86
- subject.run([])
87
- end
88
-
89
- it 'reads given yml file' do
90
- allow(subject).to receive(:project_name_from_yaml).and_return nil
91
- expect(File).to receive(:read).with("#{Dir.getwd}/custom.yml").and_return(kontena_yml)
92
- subject.run(["--file", "custom.yml"])
93
- end
94
-
95
- it 'uses current directory as service name prefix by default' do
96
- current_dir = '/kontena/tests/stacks'
97
- allow(Dir).to receive(:getwd).and_return(current_dir)
98
- expect(File).to receive(:basename).with(current_dir).and_return('stacks')
99
- subject.run([])
100
- end
101
-
102
- context 'when yml file has multiple env files' do
103
- it 'merges environment variables correctly' do
104
- allow(subject).to receive(:current_dir).and_return("kontena-test")
105
- services['wordpress']['environment'] = ['MYSQL_ADMIN_PASSWORD=password']
106
- services['wordpress']['env_file'] = %w(/path/to/env_file .env)
107
- allow(YAML).to receive(:safe_load).and_return(services)
108
-
109
- expect(File).to receive(:readlines).with('/path/to/env_file').and_return(env_vars)
110
- expect(File).to receive(:readlines).with('.env').and_return(dot_env)
111
-
112
- data = {
113
- 'name' => 'kontena-test-wordpress',
114
- 'image' => 'wordpress:latest',
115
- 'env' => ['MYSQL_ADMIN_PASSWORD=password', 'TEST_ENV_VAR=test', 'TEST_ENV_VAR2=test3'],
116
- }
117
-
118
- expect(subject).to receive(:create_service).with(duck_type(:access_token), '1', hash_including(data))
119
- subject.run([])
120
- end
121
- end
122
-
123
- context 'when yml file has one env file' do
124
- it 'merges environment variables correctly' do
125
- allow(subject).to receive(:current_dir).and_return("kontena-test")
126
- services['wordpress']['environment'] = ['MYSQL_ADMIN_PASSWORD=password']
127
- services['wordpress']['env_file'] = '/path/to/env_file'
128
- allow(YAML).to receive(:safe_load).and_return(services)
129
-
130
- expect(File).to receive(:readlines).with('/path/to/env_file').and_return(env_vars)
131
-
132
- data = {
133
- 'name' => 'kontena-test-wordpress',
134
- 'image' => 'wordpress:latest',
135
- 'env' => ['MYSQL_ADMIN_PASSWORD=password', 'TEST_ENV_VAR=test']
136
- }
137
-
138
- expect(subject).to receive(:create_service).with(duck_type(:access_token), '1', hash_including(data))
139
- subject.run([])
140
- end
141
- end
142
-
143
- it 'merges external links to links' do
144
- allow(subject).to receive(:current_dir).and_return("kontena-test")
145
- services['wordpress']['external_links'] = ['loadbalancer:loadbalancer']
146
- allow(YAML).to receive(:safe_load).and_return(services)
147
- data = {
148
- 'name' => 'kontena-test-wordpress',
149
- 'image' => 'wordpress:latest',
150
- 'links' => [
151
- {
152
- 'name' => 'kontena-test-mysql',
153
- 'alias' => 'db'
154
- },
155
- {
156
- 'name' => 'loadbalancer',
157
- 'alias' => 'loadbalancer'
158
- }
159
- ]
160
- }
161
-
162
- expect(subject).to receive(:create_service).with(duck_type(:access_token), '1', hash_including(data))
163
- subject.run([])
164
- end
165
-
166
- it 'creates mysql service before wordpress' do
167
- allow(subject).to receive(:current_dir).and_return("kontena-test")
168
- data = {
169
- 'name' => 'kontena-test-mysql',
170
- 'image' => 'mysql:5.6',
171
- 'env' => ['MYSQL_ROOT_PASSWORD=kontena-test_secret'],
172
- 'instances' => nil,
173
- 'stateful' => true,
174
- }
175
- expect(subject).to receive(:create_service).with(duck_type(:access_token), '1', hash_including(data))
176
-
177
- subject.run([])
178
- end
179
-
180
- it 'creates wordpress service' do
181
- allow(subject).to receive(:current_dir).and_return('kontena-test')
182
-
183
- data = {
184
- 'name' => 'kontena-test-wordpress',
185
- 'image' => 'wordpress:4.1',
186
- 'env' => ['WORDPRESS_DB_PASSWORD=kontena-test_secret'],
187
- 'instances' => 2,
188
- 'stateful' => true,
189
- 'strategy' => 'ha',
190
- 'links' => [{ 'name' => 'kontena-test-mysql', 'alias' => 'mysql' }],
191
- 'ports' => [{ 'ip' => '0.0.0.0','container_port' => '80', 'node_port' => '80', 'protocol' => 'tcp' }]
192
- }
193
- expect(subject).to receive(:create_service).with(duck_type(:access_token), '1', hash_including(data))
194
-
195
- subject.run([])
196
- end
197
-
198
- it 'deploys services' do
199
- allow(subject).to receive(:current_dir).and_return('kontena-test')
200
- expect(subject).to receive(:deploy_service).with(duck_type(:access_token), 'kontena-test-mysql', {})
201
- expect(subject).to receive(:deploy_service).with(duck_type(:access_token), 'kontena-test-wordpress', {})
202
- subject.run([])
203
- end
204
-
205
- context 'when giving service option' do
206
- it 'deploys only given services' do
207
- allow(subject).to receive(:current_dir).and_return("kontena-test")
208
- allow(subject).to receive(:deploy_services).and_return({})
209
- expect(subject).to receive(:create).once.with('wordpress', anything).and_return({})
210
- expect(subject).not_to receive(:create).with('mysql', services['mysql'])
211
-
212
- subject.run(['wordpress'])
213
- end
214
- end
215
- end
216
- end
217
- end
@@ -1,155 +0,0 @@
1
- require "kontena/cli/apps/docker_helper"
2
-
3
- describe Kontena::Cli::Apps::DockerHelper do
4
-
5
- let(:subject) do
6
- Class.new { include Kontena::Cli::Apps::DockerHelper}.new
7
- end
8
-
9
- let(:services_with_valid_hooks) do
10
- {
11
- 'test_service' => {
12
- 'build' => { 'context' => '.' },
13
- 'image' => 'test_service',
14
- 'hooks' => {
15
- 'pre_build' => [
16
- { 'cmd' => "echo PREBUILD1", 'name' => 'hook1' },
17
- { 'cmd' => "echo PREBUILD2", 'name' => 'hook2' }
18
- ]
19
- }
20
- }
21
- }
22
- end
23
-
24
- let(:services_with_invalid_hook) do
25
- {
26
- 'test_service' => {
27
- 'build' => { 'context' => '.' },
28
- 'image' => 'test_service',
29
- 'hooks' => {
30
- 'pre_build' => [
31
- { 'cmd' => "echo PREBUILD1", 'name' => 'hook1' },
32
- { 'cmd' => "some_non_existing_command", 'name' => 'failing hook' },
33
- ]
34
- }
35
- }
36
- }
37
- end
38
-
39
- let(:services_with_no_hook) do
40
- {
41
- 'test_service' => {
42
- 'build' => { 'context' => '.' },
43
- 'image' => 'test_service',
44
- }
45
- }
46
- end
47
-
48
- before :each do
49
- # image does not exist
50
- allow(subject).to receive(:image_exist?).with('test_service').and_return(false)
51
- end
52
-
53
- describe '#validate_image_name' do
54
- context 'when image name is valid' do
55
- it 'returns true' do
56
- expect(subject.validate_image_name('registry.kontena.local/image-name:latest')).to be_truthy
57
- expect(subject.validate_image_name('my-registry.com/organization/image_name:latest')).to be_truthy
58
- expect(subject.validate_image_name('my-registry.com:5000/organization/image_name:latest')).to be_truthy
59
- expect(subject.validate_image_name('mysql:5.1')).to be_truthy
60
- expect(subject.validate_image_name('wordpress')).to be_truthy
61
- end
62
-
63
- end
64
- end
65
-
66
- describe '#validate_image_name' do
67
- context 'when image name is invalid' do
68
- it 'returns false' do
69
- expect(subject.validate_image_name('registry.kontena.local/image-name:')).to be_falsey
70
- expect(subject.validate_image_name('mysql 5.1')).to be_falsey
71
- expect(subject.validate_image_name('*.mydomain.com/mysql')).to be_falsey
72
- end
73
- end
74
- end
75
-
76
- describe '#run_pre_build_hook' do
77
-
78
- context 'when hook defined' do
79
- it 'runs the hook' do
80
- allow(subject).to receive(:build_docker_image)
81
- allow(subject).to receive(:push_docker_image)
82
- expect(subject).to receive(:system).with("echo PREBUILD1"). and_return(true)
83
- expect(subject).to receive(:system).with("echo PREBUILD2"). and_return(true)
84
-
85
- subject.process_docker_images(services_with_valid_hooks)
86
- end
87
-
88
- it 'fails to run the hook' do
89
- allow(subject).to receive(:build_docker_image)
90
- allow(subject).to receive(:push_docker_image)
91
- expect(subject).to receive(:system).with("echo PREBUILD1"). and_return(true)
92
- expect(subject).to receive(:system).with("some_non_existing_command"). and_return(false)
93
-
94
- expect {
95
- subject.process_docker_images(services_with_invalid_hook)
96
- }.to raise_error(StandardError)
97
- end
98
- end
99
- context 'when no hook defined' do
100
- it 'runs no hooks' do
101
- allow(subject).to receive(:build_docker_image)
102
- allow(subject).to receive(:push_docker_image)
103
- expect(subject).not_to receive(:run_pre_build_hook)
104
-
105
- subject.process_docker_images(services_with_no_hook)
106
- end
107
- end
108
- end
109
-
110
- describe '#build_docker_image' do
111
- it 'builds image' do
112
- service = {
113
- 'build' => { 'context' => '.' },
114
- 'image' => 'test_service'
115
- }
116
- expect(subject).to receive(:system).with('docker', 'build', '-t', 'test_service', '.'). and_return(true)
117
- subject.build_docker_image(service)
118
- end
119
-
120
- it 'builds image with no-cache' do
121
- service = {
122
- 'build' => { 'context' => '.' },
123
- 'image' => 'test_service'
124
- }
125
- expect(subject).to receive(:system).with('docker', 'build', '-t', 'test_service', '--no-cache', '.'). and_return(true)
126
- subject.build_docker_image(service, true)
127
- end
128
-
129
- it 'builds image with alternate dockerfile' do
130
- service = {
131
- 'build' => { 'context' => '.', 'dockerfile' => 'other_dockerfile' },
132
- 'image' => 'test_service'
133
- }
134
- expected_path = File.join(File.expand_path('.'), 'other_dockerfile')
135
- expect(subject).to receive(:system).with('docker', 'build', '-t', 'test_service', '-f', expected_path, '.'). and_return(true)
136
- subject.build_docker_image(service)
137
- end
138
-
139
- it 'builds image' do
140
- service = {
141
- 'build' => {
142
- 'context' => '.',
143
- 'args' => {
144
- 'FOO' => 'bar',
145
- 'BAR' => 'foo'
146
- }
147
- },
148
- 'image' => 'test_service'
149
- }
150
- expect(subject).to receive(:system).with('docker', 'build', '-t', 'test_service', '--build-arg=FOO=bar', '--build-arg=BAR=foo', '.'). and_return(true)
151
- subject.build_docker_image(service)
152
- end
153
- end
154
-
155
- end
@@ -1,109 +0,0 @@
1
- require 'kontena/cli/apps/init_command'
2
-
3
- describe Kontena::Cli::Apps::InitCommand do
4
- include FixturesHelpers
5
-
6
- let(:subject) do
7
- described_class.new(File.basename($0))
8
- end
9
-
10
- let(:app_json) do
11
- fixture('app.json')
12
- end
13
-
14
- before(:each) do
15
- allow(File).to receive(:exist?).and_return false
16
- allow(subject).to receive(:create_yml).and_return nil
17
- allow(subject).to receive(:create_dockerfile?).and_return false
18
- allow(subject).to receive(:create_env_file).and_return nil
19
- allow(subject).to receive(:create_docker_compose_yml?).and_return false
20
- allow(Kontena::Cli::Apps::KontenaYmlGenerator).to receive(:new).and_return spy
21
- end
22
-
23
- describe '#execute' do
24
- it 'detects Dockerfile' do
25
- expect(File).to receive(:exist?).with('Dockerfile').once.and_return true
26
- subject.run([])
27
- end
28
-
29
- it 'reads Procfile' do
30
- allow(File).to receive(:exist?).with('Procfile').once.and_return true
31
- expect(File).to receive(:read).with('Procfile').once.and_return 'web: bundle exec rails s'
32
- subject.run([])
33
- end
34
-
35
- it 'reads app.json file' do
36
- allow(File).to receive(:exist?).with('app.json').once.and_return true
37
- expect(File).to receive(:read).with('app.json').once.and_return '{}'
38
- subject.run([])
39
- end
40
-
41
- it 'asks creation of docker-compose.yml' do
42
- expect(subject).to receive(:create_docker_compose_yml?).and_return false
43
- subject.run([])
44
- end
45
-
46
- it 'creates docker-compose.yml if accepted' do
47
- allow(subject).to receive(:create_docker_compose_yml?).and_return true
48
- generator = spy
49
- generator_klass = Kontena::Cli::Apps::DockerComposeGenerator
50
- expect(generator_klass).to receive(:new).with('docker-compose.yml').and_return(generator)
51
- expect(generator).to receive(:generate).with({}, [], nil)
52
- subject.run([])
53
- end
54
-
55
- it 'passes Procfile services to docker-compose.yml creation' do
56
- allow(File).to receive(:exist?).with('Procfile').once.and_return true
57
- allow(File).to receive(:read).with('Procfile').once.and_return 'web: bundle exec rails s'
58
- allow(subject).to receive(:create_docker_compose_yml?).and_return true
59
- generator = spy
60
- generator_klass = Kontena::Cli::Apps::DockerComposeGenerator
61
- expect(generator_klass).to receive(:new).with('docker-compose.yml').and_return(generator)
62
- expect(generator).to receive(:generate).with({ 'web' => 'bundle exec rails s' }, [], nil)
63
- subject.run([])
64
- end
65
-
66
- it 'passes app.json options to docker-compose.yml creation' do
67
- expect(File).to receive(:exist?).with('app.json').and_return true
68
- expect(File).to receive(:read).with('app.json').and_return app_json
69
- allow(subject).to receive(:create_docker_compose_yml?).and_return true
70
- generator = spy
71
- generator_klass = Kontena::Cli::Apps::DockerComposeGenerator
72
- expect(generator_klass).to receive(:new).with('docker-compose.yml').and_return(generator)
73
- expect(generator).to receive(:generate).with({}, ["openredis","mongolab:shared-single-small"], nil)
74
- subject.run([])
75
- end
76
-
77
- it 'creates .env file' do
78
- allow(File).to receive(:exist?).with('app.json').and_return true
79
- allow(File).to receive(:read).with('app.json').and_return app_json
80
- allow(subject).to receive(:create_docker_compose_yml?).and_return true
81
- generator = spy
82
- generator_klass = Kontena::Cli::Apps::DockerComposeGenerator
83
- allow(generator_klass).to receive(:new).with('docker-compose.yml').and_return(generator)
84
- app_env = JSON.parse(app_json)['env']
85
- expect(subject).to receive(:create_env_file).with(app_env).and_return nil
86
- subject.run([])
87
- end
88
-
89
- it 'creates kontena.yml from docker-compose.yml' do
90
- allow(File).to receive(:exist?).with('docker-compose.yml').and_return true
91
- generator = spy
92
- generator_klass = Kontena::Cli::Apps::KontenaYmlGenerator
93
- expect(generator_klass).to receive(:new).with(nil, 'cli').and_return(generator)
94
- expect(generator).to receive(:generate_from_compose_file).with('docker-compose.yml')
95
- subject.run([])
96
- end
97
-
98
- context 'when docker-compose.yml not created' do
99
- it 'creates dummy kontena.yml' do
100
- allow(File).to receive(:exist?).with('docker-compose.yml').and_return false
101
- generator = spy
102
- generator_klass = Kontena::Cli::Apps::KontenaYmlGenerator
103
- expect(generator_klass).to receive(:new).with(nil, 'cli').and_return(generator)
104
- expect(generator).to receive(:generate).with({}, [], nil)
105
- subject.run([])
106
- end
107
- end
108
- end
109
- end