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,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