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
@@ -29,21 +29,30 @@ describe Kontena::Cli::Stacks::YAML::ServiceExtender do
29
29
 
30
30
  context 'environment variables' do
31
31
  it 'inherites env vars from upper level' do
32
- from = { 'environment' => ['FOO=bar'] }
32
+ from = { 'env' => ['FOO=bar'] }
33
33
  to = {}
34
34
  result = described_class.new(to).extend_from(from)
35
35
  expect(result['environment']).to eq(['FOO=bar'])
36
36
  end
37
37
 
38
38
  it 'overrides values' do
39
- from = { 'environment' => ['FOO=bar'] }
39
+ from = { 'env' => ['FOO=bar'] }
40
40
  to = { 'environment' => ['FOO=baz'] }
41
41
  result = described_class.new(to).extend_from(from)
42
42
  expect(result['environment']).to eq(['FOO=baz'])
43
43
  end
44
44
 
45
45
  it 'combines variables' do
46
- from = { 'environment' => ['FOO=bar'] }
46
+ from = { 'env' => ['FOO=bar'] }
47
+ to = { 'environment' => ['BAR=baz'] }
48
+ result = described_class.new(to).extend_from(from)
49
+ expect(result['environment'].include?('BAR=baz')).to be_truthy
50
+ expect(result['environment'].include?('FOO=bar')).to be_truthy
51
+ expect(result['environment'].size).to eq 2
52
+ end
53
+
54
+ it 'combines and overrides variables' do
55
+ from = { 'env' => ['FOO=bar', 'BAR=buz'] }
47
56
  to = { 'environment' => ['BAR=baz'] }
48
57
  result = described_class.new(to).extend_from(from)
49
58
  expect(result['environment'].include?('BAR=baz')).to be_truthy
@@ -0,0 +1,47 @@
1
+ require 'kontena/cli/stacks/yaml/stack_file_loader'
2
+
3
+ describe Kontena::Cli::Stacks::YAML::FileLoader do
4
+ include FixturesHelpers
5
+
6
+ describe '#match' do
7
+ it 'returns false when file does not exist' do
8
+ expect(File).to receive(:exist?).and_return(false)
9
+ expect(described_class.match?('foofoo')).to be_falsey
10
+ end
11
+
12
+ it 'returns true when file exists' do
13
+ expect(File).to receive(:exist?).and_return(true)
14
+ expect(described_class.match?('foofoo')).to be_truthy
15
+ end
16
+ end
17
+
18
+ describe '#with_context' do
19
+ it 'absolutizes paths' do
20
+ some_file = Dir.glob('*').first
21
+ expect(described_class.with_context(some_file)).to eq File.absolute_path(some_file)
22
+ end
23
+ end
24
+
25
+ describe 'instance methods' do
26
+ let(:subject) { described_class.new(fixture_path('kontena_v3.yml')) }
27
+
28
+ describe '#read_content' do
29
+ it 'reads the file' do
30
+ expect(File).to receive(:read).with(fixture_path('kontena_v3.yml')).and_call_original
31
+ expect(subject.read_content).to match /^stack:/
32
+ end
33
+ end
34
+
35
+ describe '#origin' do
36
+ it 'returns "file"' do
37
+ expect(subject.origin).to eq 'file'
38
+ end
39
+ end
40
+
41
+ describe '#registry' do
42
+ it 'returns "file://"' do
43
+ expect(subject.registry).to eq 'file://'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,53 @@
1
+ require 'kontena/stacks_cache'
2
+ require 'yaml'
3
+
4
+ describe Kontena::Cli::Stacks::YAML::RegistryLoader do
5
+ include FixturesHelpers
6
+
7
+ before do
8
+ allow(File).to receive(:exist?).and_return(false)
9
+ end
10
+
11
+ describe '#match' do
12
+ it 'returns false when input is not a registry path' do
13
+ expect(described_class.match?('foofoo')).to be_falsey
14
+ end
15
+
16
+ it 'returns true when file exists' do
17
+ expect(described_class.match?('user/stack')).to be_truthy
18
+ expect(described_class.match?('user/stack:1.0.0')).to be_truthy
19
+ end
20
+ end
21
+
22
+ describe 'instance methods' do
23
+ let(:subject) { described_class.new('user/stack') }
24
+
25
+ before do
26
+ allow(Kontena::StacksCache).to receive(:pull).with('user/stack').and_return(
27
+ fixture('kontena_v3.yml')
28
+ )
29
+ end
30
+
31
+ describe '#read_content' do
32
+ it 'reads the file' do
33
+ allow(Kontena::Cli::Config).to receive(:current_account).and_return(double(stacks_url: 'foo'))
34
+ expect(subject.read_content).to match /^stack:/
35
+ end
36
+ end
37
+
38
+ describe '#origin' do
39
+ it 'returns "uri"' do
40
+ expect(subject.origin).to eq 'registry'
41
+ end
42
+ end
43
+
44
+ describe '#registry' do
45
+ it 'returns "file://"' do
46
+ allow(Kontena::Cli::Config).to receive(:current_account).and_return(double(stacks_url: 'foo'))
47
+ expect(subject.registry).to eq 'foo'
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+
@@ -0,0 +1,53 @@
1
+ require 'kontena/cli/stacks/yaml/stack_file_loader'
2
+ require 'yaml'
3
+
4
+ describe Kontena::Cli::Stacks::YAML::UriLoader do
5
+ include FixturesHelpers
6
+
7
+ before do
8
+ allow(File).to receive(:exist?).and_return(false)
9
+ end
10
+
11
+ describe '#match' do
12
+ it 'returns false when input is not an url' do
13
+ expect(described_class.match?('foofoo')).to be_falsey
14
+ end
15
+
16
+ it 'returns true when file exists' do
17
+ expect(described_class.match?('http://foofoo')).to be_truthy
18
+ end
19
+ end
20
+
21
+ describe 'instance methods' do
22
+ let(:subject) { described_class.new('http://foofoo/foo.yml') }
23
+
24
+ before do
25
+ stub_request(:get, 'http://foofoo/foo.yml').to_return(
26
+ status: 200,
27
+ headers: {
28
+ 'Content-Type' => 'application/yml',
29
+ },
30
+ body: fixture('kontena_v3.yml')
31
+ )
32
+ end
33
+
34
+ describe '#read_content' do
35
+ it 'reads the file' do
36
+ expect(subject.read_content).to match /^stack:/
37
+ end
38
+ end
39
+
40
+ describe '#origin' do
41
+ it 'returns "uri"' do
42
+ expect(subject.origin).to eq 'uri'
43
+ end
44
+ end
45
+
46
+ describe '#registry' do
47
+ it 'returns "file://"' do
48
+ expect(subject.registry).to eq 'file://'
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,104 @@
1
+ require 'kontena/cli/stacks/yaml/stack_file_loader'
2
+
3
+ describe Kontena::Cli::Stacks::YAML::StackFileLoader do
4
+ include FixturesHelpers
5
+
6
+ before do
7
+ allow(File).to receive(:exist?).and_return(false)
8
+ [:exist?, :read].each do |meth|
9
+ ['docker-compose_v2.yml', 'kontena_v3.yml'].each do |file|
10
+ allow(File).to receive(meth)
11
+ .with(fixture_path(file))
12
+ .and_call_original
13
+ end
14
+ end
15
+ end
16
+
17
+ describe '#for' do
18
+ it 'returns a loader for a file' do
19
+ expect(described_class.for(fixture_path('kontena_v3.yml')).origin).to eq 'file'
20
+ end
21
+
22
+ it 'returns a loader for an url' do
23
+ expect(described_class.for('http://foofoo.com').origin).to eq 'uri'
24
+ end
25
+
26
+ it 'returns a loader for a registry path' do
27
+ expect(described_class.for('foo/foo:1.2.3').origin).to eq 'registry'
28
+ end
29
+
30
+ it 'raises if nothing matches' do
31
+ expect{described_class.for('this-should-not-exist').origin}.to raise_error(RuntimeError)
32
+ end
33
+ end
34
+
35
+ context 'instance methods' do
36
+ let(:subject) { described_class.for(fixture_path('kontena_v3.yml')) }
37
+
38
+ describe '#reader' do
39
+ it 'returns a YAML::Reader' do
40
+ expect(subject.reader).to be_a Kontena::Cli::Stacks::YAML::Reader
41
+ expect(subject.reader.loader).to eq subject
42
+ end
43
+ end
44
+
45
+ describe '#content' do
46
+ it 'returns the raw content' do
47
+ expect(File).to receive(:read).with(fixture_path('kontena_v3.yml')).and_call_original
48
+ expect(subject.content).to match /^stack:/
49
+ end
50
+ end
51
+
52
+ describe '#stack_name' do
53
+ it 'returns an accessor to stack string components' do
54
+ expect(subject.stack_name.user).to eq 'user'
55
+ expect(subject.stack_name.stack).to eq 'stackname'
56
+ expect(subject.stack_name.version).to eq '0.1.1'
57
+ expect(subject.stack_name.to_s).to eq 'user/stackname:0.1.1'
58
+ end
59
+ end
60
+
61
+ describe '#yaml' do
62
+ it 'returns a yaml from the file content' do
63
+ expect(subject.yaml['stack']).to eq 'user/stackname'
64
+ end
65
+ end
66
+
67
+ describe '#dependencies' do
68
+ before do
69
+ [:exist?, :read].each do |meth|
70
+ Dir.glob(File.join(File.dirname(fixture_path('stack-with-dependencies.yml')), 'stack-with-dep*.yml')).each do |file|
71
+ puts file
72
+ allow(File).to receive(meth)
73
+ .with(file)
74
+ .and_call_original
75
+ end
76
+ end
77
+ end
78
+
79
+ let(:subject) { described_class.for(fixture_path('stack-with-dependencies.yml')) }
80
+
81
+ it 'returns an array of hashes' do
82
+ expect(subject.dependencies).to match array_including(
83
+ hash_including(
84
+ 'name' => 'dep_1',
85
+ 'stack' => /dep-1.yml$/,
86
+ 'variables' => {},
87
+ 'depends' => array_including(
88
+ hash_including(
89
+ 'name' => 'dep_1',
90
+ 'stack' => /-1-1.yml$/,
91
+ 'variables' => { 'dep_var' => 2 }
92
+ )
93
+ )
94
+ ),
95
+ hash_including(
96
+ 'name' => 'dep_2',
97
+ 'stack' => /dep-2.yml$/,
98
+ 'variables' => { 'dep_var' => 1 }
99
+ )
100
+ )
101
+ end
102
+ end
103
+ end
104
+ end
@@ -335,6 +335,25 @@ describe Kontena::Cli::Stacks::YAML::ValidatorV3 do
335
335
  end
336
336
  end
337
337
  end
338
+
339
+ context 'certificates' do
340
+ it 'validates certificates is array' do
341
+ result = subject.validate_options('certificates' => 'kontena.io')
342
+ expect(result.errors.key?('certificates')).to be_truthy
343
+
344
+ result = subject.validate_options('certificates' => [])
345
+ expect(result.errors.key?('certificates')).to be_falsey
346
+ end
347
+
348
+ it 'validates certificates has all needed keys' do
349
+ result = subject.validate_options('certificates' => [{}])
350
+ expect(result.errors.key?('certificates')).to be_truthy
351
+ expect(result.errors['certificates'].has_key?('subject')).to be_truthy
352
+ expect(result.errors['certificates'].has_key?('name')).to be_truthy
353
+ expect(result.errors['certificates'].has_key?('type')).to be_truthy
354
+ end
355
+
356
+ end
338
357
  end
339
358
 
340
359
  describe '#validate' do
@@ -0,0 +1,20 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ describe Kontena::PluginManager::Cleaner do
4
+ let(:subject) { described_class.new('foo') }
5
+ let(:command) { double(handle_options: anything) }
6
+
7
+ before(:each) do
8
+ allow(subject).to receive(:command).and_return(command)
9
+ end
10
+
11
+ it 'returns true if the rubygems cleanup command exits with 0' do
12
+ expect(command).to receive(:execute).and_raise(Gem::SystemExitException, 0)
13
+ expect(subject.cleanup).to be_truthy
14
+ end
15
+
16
+ it 'raises the exception if the rubygems cleanup command exits with non-zero' do
17
+ expect(command).to receive(:execute).and_raise(Gem::SystemExitException, 1)
18
+ expect{subject.cleanup}.to raise_error(Gem::SystemExitException)
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ describe Kontena::PluginManager::Common do
4
+ let(:subject) { described_class }
5
+
6
+ context '#prefix' do
7
+ it 'converts vagrant to kontena-plugin-vagrant' do
8
+ expect(subject.prefix('vagrant')).to eq 'kontena-plugin-vagrant'
9
+ end
10
+
11
+ it 'returns the same if the string is already prefixed' do
12
+ expect(subject.prefix('kontena-plugin-vagrant')).to eq 'kontena-plugin-vagrant'
13
+ end
14
+ end
15
+
16
+ context '#installed' do
17
+ before(:each) do
18
+ allow(subject).to receive(:plugins).and_return([double(name: 'kontena-plugin-foo'), double(name: 'kontena-plugin-bar')])
19
+ end
20
+
21
+ it 'returns an installed spec by name' do
22
+ expect(subject.installed('bar').name).to eq 'kontena-plugin-bar'
23
+ end
24
+
25
+ it 'returns nothing if not found' do
26
+ expect(subject.installed('baz')).to be_nil
27
+ end
28
+
29
+ context '#installed?' do
30
+ it 'returns true if the plugin is installed' do
31
+ expect(subject.installed?('bar')).to be_truthy
32
+ end
33
+
34
+ it 'returns false if the plugin is not installed' do
35
+ expect(subject.installed?('baz')).to be_falsey
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,50 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ describe Kontena::PluginManager::Installer do
4
+ context 'default version' do
5
+ let(:subject) { described_class.new('foo') }
6
+ let(:command) { double }
7
+
8
+ before(:each) do
9
+ allow(subject).to receive(:command).and_return(command)
10
+ end
11
+
12
+ context '#install' do
13
+ it 'runs the installer' do
14
+ expect(command).to receive(:install).with('kontena-plugin-foo', Gem::Requirement.default).and_return(true)
15
+ expect(command).to receive(:installed_gems).and_return([])
16
+ subject.install
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'specific version' do
22
+ let(:subject) { described_class.new('foo', version: '0.1.2') }
23
+ let(:command) { double }
24
+
25
+ before(:each) do
26
+ allow(subject).to receive(:command).and_return(command)
27
+ end
28
+
29
+ context '#install' do
30
+ it 'runs the installer' do
31
+ version = double
32
+ expect(Gem::Requirement).to receive(:new).with('0.1.2').and_return(version)
33
+ expect(command).to receive(:install).with('kontena-plugin-foo', version).and_return(true)
34
+ allow(command).to receive(:installed_gems).and_return([])
35
+ subject.install
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'pre-release version' do
41
+ let(:subject) { described_class.new('foo', pre: true) }
42
+
43
+ context '#command' do
44
+ it 'receives new with prerelease true' do
45
+ expect(Gem::DependencyInstaller).to receive(:new).with(hash_including(prerelease: true)).and_return(true)
46
+ subject.command
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ require 'kontena/plugin_manager'
2
+
3
+ describe Kontena::PluginManager::Loader do
4
+ let(:subject) { described_class.new }
5
+ end
@@ -1,4 +1,4 @@
1
- require 'kontena/plugin_manager/rubygems_client'
1
+ require 'kontena/plugin_manager'
2
2
  require 'json'
3
3
 
4
4
  describe Kontena::PluginManager::RubygemsClient do
@@ -11,36 +11,22 @@ describe Kontena::PluginManager::RubygemsClient do
11
11
 
12
12
  context '#search' do
13
13
  it 'searches rubygems and returns a hash' do
14
- expect(client)
15
- .to receive(:get)
16
- .with(
17
- hash_including(
18
- path: "/api/v1/search.json?query=foofoo",
19
- headers: hash_including(
20
- 'Content-Type' => 'application/json',
21
- 'Accept' => 'application/json'
22
- )
23
- )
24
- )
25
- .and_return(double(body: JSON.dump(foo: 'bar')))
14
+ expect(subject).to receive(:client).and_return(client)
15
+ expect(client).to receive(:request) do |req|
16
+ expect(req.path).to eq '/api/v1/search.json?query=foofoo'
17
+ expect(req['Accept']).to eq 'application/json'
18
+ end.and_return(double(body: JSON.dump(foo: 'bar'), code: "200"))
26
19
  expect(subject.search('foofoo')['foo']).to eq 'bar'
27
20
  end
28
21
  end
29
22
 
30
23
  context '#versions' do
31
24
  it 'fetches version list from rubygems and returns an array of Gem::Versions' do
32
- expect(client)
33
- .to receive(:get)
34
- .with(
35
- hash_including(
36
- path: "/api/v1/versions/foofoo.json",
37
- headers: hash_including(
38
- 'Content-Type' => 'application/json',
39
- 'Accept' => 'application/json'
40
- )
41
- )
42
- )
43
- .and_return(double(body: JSON.dump([{'number' => '0.1.0'}, {'number' => '0.2.0'}])))
25
+ expect(subject).to receive(:client).and_return(client)
26
+ expect(client).to receive(:request) do |req|
27
+ expect(req.path).to eq '/api/v1/versions/foofoo.json'
28
+ expect(req['Accept']).to eq 'application/json'
29
+ end.and_return(double(body: JSON.dump([{'number' => '0.1.0'}, {'number' => '0.2.0'}]), code: "200"))
44
30
  versions = subject.versions('foofoo')
45
31
  expect(versions.first).to be_kind_of Gem::Version
46
32
  expect(versions.first.to_s).to eq '0.2.0'