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
@@ -24,6 +24,7 @@ describe Kontena::Cli::Nodes::ShowCommand do
24
24
  ' connected: yes',
25
25
  ' last connect: 2017-07-04T08:36:02.235Z',
26
26
  ' last seen: 2017-07-04T08:36:02.280Z',
27
+ ' availability: active',
27
28
  ' public ip: 91.150.10.190',
28
29
  ' private ip: 192.168.66.101',
29
30
  ' overlay ip: 10.81.0.1',
@@ -43,4 +44,34 @@ describe Kontena::Cli::Nodes::ShowCommand do
43
44
  ' - /var/lib/docker: 2.89 of 15.57 GB',
44
45
  ])
45
46
  end
47
+
48
+ it 'does not fail with missing fs stats' do
49
+ node_info = node
50
+ node_info.delete('resource_usage')
51
+ allow(client).to receive(:get).with('nodes/test-grid/core-01').and_return(node_info)
52
+
53
+ expect{subject.run(['core-01'])}.to output_lines([
54
+ 'development/core-01:',
55
+ ' id: XI4K:NPOL:EQJ4:S4V7:EN3B:DHC5:KZJD:F3U2:PCAN:46EV:IO4A:63S5',
56
+ ' agent version: 1.4.0.dev',
57
+ ' docker version: 1.12.6',
58
+ ' connected: yes',
59
+ ' last connect: 2017-07-04T08:36:02.235Z',
60
+ ' last seen: 2017-07-04T08:36:02.280Z',
61
+ ' availability: active',
62
+ ' public ip: 91.150.10.190',
63
+ ' private ip: 192.168.66.101',
64
+ ' overlay ip: 10.81.0.1',
65
+ ' os: Container Linux by CoreOS 1409.5.0 (Ladybug)',
66
+ ' kernel: 4.11.6-coreos-r1',
67
+ ' drivers:',
68
+ ' storage: overlay',
69
+ ' volume: local',
70
+ ' initial node: yes',
71
+ ' labels:',
72
+ ' - test',
73
+ ' stats:',
74
+ ' cpus: 1'
75
+ ])
76
+ end
46
77
  end
@@ -16,9 +16,24 @@ describe Kontena::Cli::Nodes::SshCommand do
16
16
  allow(client).to receive(:get).with('nodes/test-grid/test-node').and_return(node)
17
17
  end
18
18
 
19
- it "fails if using both --any and a node name as a command" do
20
- expect(subject).to_not receive(:exec)
21
- expect{subject.run(['--any', 'ls', '-l'])}.to exit_with_error.and output(/Cannot combine --any with a node name/).to_stderr
19
+ describe '--any flag' do
20
+ context 'used together with a node name' do
21
+ it "fails and outputs an error message" do
22
+ expect(subject).to_not receive(:exec)
23
+ expect{subject.run(['--any', 'ls', '-l'])}.to exit_with_error.and output(/Cannot combine --any with a node name/).to_stderr
24
+ end
25
+ end
26
+
27
+ context 'used when there are no connected nodes' do
28
+ before do
29
+ expect(subject.client).to receive(:get).with("grids/test-grid/nodes").and_return('nodes' => [ { 'connected' => false } ])
30
+ end
31
+
32
+ it "fails and outputs an error message" do
33
+ expect(subject).to_not receive(:exec)
34
+ expect{subject.run(['--any'])}.to exit_with_error.and output(/no online nodes/).to_stderr
35
+ end
36
+ end
22
37
  end
23
38
 
24
39
  it "uses the public IP by default" do
@@ -4,7 +4,7 @@ describe Kontena::Cli::Plugins::InstallCommand do
4
4
  let(:subject) { described_class.new([]) }
5
5
 
6
6
  it 'exits with error if plugin not found' do
7
- expect(Kontena::PluginManager.instance).to receive(:install_plugin).and_raise(StandardError, 'bar')
7
+ expect(subject).to receive(:installer).and_raise(StandardError, 'bar')
8
8
  expect{subject.run(['foofoo'])}.to exit_with_error.and output(/StandardError/).to_stderr
9
9
  end
10
10
  end
@@ -6,6 +6,10 @@ describe Kontena::Cli::Stacks::BuildCommand do
6
6
 
7
7
  mock_current_master
8
8
 
9
+ before(:each) do
10
+ ENV['STACK'] = nil
11
+ end
12
+
9
13
  let(:subject) do
10
14
  described_class.new(File.basename($0))
11
15
  end
@@ -33,24 +37,14 @@ describe Kontena::Cli::Stacks::BuildCommand do
33
37
  end
34
38
 
35
39
  before(:each) do
36
- allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
37
- allow(subject).to receive(:stack_read_and_dump).with('kontena.yml', hash_including(:name, :values)).and_return(stack)
40
+ allow(subject).to receive(:stack_name).and_return('stack-a')
41
+ allow(subject).to receive(:stack).and_return(stack)
38
42
  allow(subject).to receive(:system).and_return(true)
39
43
  end
40
44
 
41
45
  expect_to_require_current_master
42
46
  expect_to_require_current_master_token
43
47
 
44
- it 'requires config file' do
45
- expect(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
46
- subject.run([])
47
- end
48
-
49
- it 'reads stack file' do
50
- expect(subject).to receive(:stack_read_and_dump).with('kontena.yml', hash_including(:name, :values)).and_return(stack)
51
- subject.run([])
52
- end
53
-
54
48
  it 'builds docker image' do
55
49
  expect(subject).to receive(:system).with('docker', 'build', '-t', 'registry.kontena.local/test:latest', '--pull', File.expand_path('.'))
56
50
  subject.run([])
@@ -2,101 +2,74 @@ require "kontena/cli/stacks/common"
2
2
  require "kontena/cli/stacks/yaml/reader"
3
3
 
4
4
  describe Kontena::Cli::Stacks::Common do
5
+ include FixturesHelpers
5
6
 
6
7
  let(:klass) do
7
8
  Class.new(Kontena::Command) do
8
9
  include Kontena::Cli::Stacks::Common
9
10
  include Kontena::Cli::Common
10
- include Kontena::Cli::Stacks::Common::StackNameParam
11
11
  include Kontena::Cli::Stacks::Common::StackFileOrNameParam
12
12
  include Kontena::Cli::Stacks::Common::StackNameOption
13
13
  include Kontena::Cli::Stacks::Common::StackValuesToOption
14
14
  include Kontena::Cli::Stacks::Common::StackValuesFromOption
15
- end
16
- end
17
-
18
- let(:subject) { klass.new('') }
19
-
20
- context 'stack yaml reader methods' do
21
- let(:reader) { double(:reader) }
22
-
23
- before(:each) do
24
- allow(reader).to receive(:execute).and_return({ errors: [], notifications: [] })
25
- allow(reader).to receive(:raw_content).and_return("")
26
- allow(reader).to receive(:stack_name).and_return('foo')
27
- allow(subject).to receive(:set_env_variables).and_return(true)
28
- end
29
-
30
- describe '#stack_read_and_dump' do
31
- it 'passes args to reader' do
32
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).with('foo', values: { 'value' => 'value' }, defaults: { 'default' => 'default' }).and_return(reader)
33
- subject.stack_read_and_dump('foo', name: 'name', values: { 'value' => 'value' }, defaults: { 'default' => 'default' })
34
- end
35
-
36
- it 'returns a stack hash' do
37
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).and_return(reader)
38
- expect(subject.stack_read_and_dump('foo')).to be_kind_of Hash
39
- end
40
- end
41
-
42
- describe '#stack_from_yaml' do
43
- it 'passes args to reader' do
44
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).with('foo', values: { 'value' => 'value' }, defaults: { 'default' => 'default' }).and_return(reader)
45
- subject.stack_from_yaml('foo', name: 'name', values: { 'value' => 'value' }, defaults: { 'default' => 'default' })
46
- end
47
-
48
- it 'returns a stack hash' do
49
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).and_return(reader)
50
- expect(subject.stack_from_yaml('foo')).to be_kind_of Hash
51
- end
52
- end
53
-
54
- describe '#reader_from_yaml' do
55
- it 'passes args to reader' do
56
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).with('foo', values: { 'value' => 'value' }, defaults: { 'default' => 'default' }).and_return(reader)
57
- subject.reader_from_yaml('foo', name: 'name', values: { 'value' => 'value' }, defaults: { 'default' => 'default' })
58
- end
59
15
 
60
- it 'returns a reader' do
61
- expect(Kontena::Cli::Stacks::YAML::Reader).to receive(:new).and_return(reader)
62
- expect(subject.reader_from_yaml('foo')).to eq reader
16
+ def what
17
+ [source]
63
18
  end
64
19
  end
65
20
  end
66
21
 
67
- describe '#stack_name' do
68
- end
69
-
70
- describe '#stack_from_reader' do
71
- end
72
-
73
- describe '#stack_from_yaml' do
74
- end
22
+ let(:subject) { klass.new('kontena') }
75
23
 
76
- describe '#require_config_file' do
24
+ before do
25
+ allow(ENV).to receive(:[]).with('GRID').and_return('test-grid')
26
+ allow(ENV).to receive(:[]).with('STACK').and_return('test-stack')
77
27
  end
78
28
 
79
- describe '#generate_volumes' do
29
+ describe '#loader' do
30
+ it 'returns a loader' do
31
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).loader).to respond_to(:reader)
32
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).loader).to respond_to(:dependencies)
33
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).loader).to respond_to(:stack_name)
34
+ end
80
35
  end
81
36
 
82
- describe '#generate_services' do
37
+ describe '#reader' do
38
+ it 'returns a YAML reader for the stack file param' do
39
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).reader).to respond_to(:execute)
40
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).reader).to respond_to(:variable_values)
41
+ end
83
42
  end
84
43
 
85
- describe '#set_env_variables' do
86
- end
44
+ describe '#stack' do
45
+ it 'returns a stack result' do
46
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).stack).to respond_to(:[])
47
+ expect(subject.instance([fixture_path('kontena_v3.yml')]).stack['name']).to eq ::YAML.safe_load(fixture('kontena_v3.yml'))['stack'].split('/').last
48
+ end
87
49
 
88
- describe '#current_dir' do
50
+ it 'sets the stack name' do
51
+ expect(subject.instance(['-n', 'foo', fixture_path('kontena_v3.yml')]).stack['name']).to eq 'foo'
52
+ end
89
53
  end
90
54
 
91
- describe '#display_notifications' do
92
- end
55
+ describe '#values_from_options' do
56
+ it 'is a hash that has key value pairs from -v params' do
57
+ expect(subject.instance(['-v', 'foo=bar', '-v', 'bar=baz', fixture_path('kontena_v3.yml')]).values_from_options).to match hash_including('foo' => 'bar', 'bar' => 'baz')
58
+ end
93
59
 
94
- describe '#hint_on_validation_notifications' do
95
- end
60
+ context '--values-from' do
61
+ before do
62
+ allow(File).to receive(:exist?).with('vars.yml').and_return(true)
63
+ expect(File).to receive(:read).with('vars.yml').and_return(::YAML.dump('baz' => 'bag', 'bar' => 'boo'))
64
+ end
96
65
 
97
- describe '#abort_on_validation_errors' do
98
- end
66
+ it 'includes values read from --values-from file' do
67
+ expect(subject.instance(['--values-from', 'vars.yml', fixture_path('kontena_v3.yml')]).values_from_options).to match hash_including('baz' => 'bag', 'bar' => 'boo')
68
+ end
99
69
 
100
- describe '#stacks_client' do
70
+ it 'includes values read from --values-from file, overriden by -v values' do
71
+ expect(subject.instance(['-v', 'foo=bar', '-v', 'bar=baz', '--values-from', 'vars.yml', fixture_path('kontena_v3.yml')]).values_from_options).to match hash_including('foo' => 'bar', 'bar' => 'baz', 'baz' => 'bag')
72
+ end
73
+ end
101
74
  end
102
75
  end
@@ -4,56 +4,82 @@ describe Kontena::Cli::Stacks::InstallCommand do
4
4
 
5
5
  include ClientHelpers
6
6
  include RequirementsHelper
7
+ include FixturesHelpers
8
+
7
9
  mock_current_master
8
10
 
11
+ before(:each) do
12
+ ENV['STACK'] = nil
13
+ end
14
+
9
15
  describe '#execute' do
10
- let(:stack) do
16
+ let(:stack_expectation) do
11
17
  {
12
- name: 'stack-a',
13
- stack: 'user/stack-a',
14
- version: '1.0.0',
15
- registry: 'file://kontena.yml',
16
- source: "YAML content",
17
- services: []
18
+ 'name' => 'stackname',
19
+ 'stack' => 'user/stackname',
20
+ 'version' => '0.1.1',
21
+ 'registry' => 'file://',
22
+ 'services' => array_including(hash_including('name', 'image')),
23
+ 'variables' => {},
24
+ 'volumes' => [],
25
+ 'dependencies' => nil,
26
+ 'source' => /stack:/,
27
+ 'parent_name' => nil,
28
+ 'expose' => nil
18
29
  }
19
30
  end
20
31
 
21
32
  expect_to_require_current_master
22
33
  expect_to_require_current_master_token
23
34
 
24
- before(:each) do
25
- allow(subject).to receive(:yaml_content).and_return("YAML content")
26
- end
27
-
28
35
  it 'sends stack to master' do
29
- allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
30
- allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
31
- allow(subject).to receive(:stack_read_and_dump).with('kontena.yml', hash_including(name: nil, values: nil)).and_return(stack)
32
- expect(client).to receive(:post).with(
33
- 'grids/test-grid/stacks', stack
34
- )
35
- subject.run([])
36
+ expect(client).to receive(:post) do |path, data|
37
+ expect(path).to eq 'grids/test-grid/stacks'
38
+ expect(data).to match hash_including(stack_expectation)
39
+ expect(data['services'].find { |s| s['name'] == 'wordpress' }['env']).to match array_including("WORDPRESS_DB_PASSWORD=stackname_secret")
40
+ expect(data['services'].find { |s| s['name'] == 'mysql' }['env']).to match array_including("MYSQL_ROOT_PASSWORD=stackname_secret")
41
+ end.and_return({})
42
+ subject.run(['--no-deploy', fixture_path('kontena_v3.yml')])
36
43
  end
37
44
 
38
45
  it 'allows to override stack name' do
39
- allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
40
- allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
41
- allow(subject).to receive(:stack_read_and_dump).with('kontena.yml', hash_including(name: 'stack-b', values: nil)).and_return(stack)
42
- stack_b = stack
43
- stack_b[:name] = 'stack-b'
44
- expect(client).to receive(:post).with(
45
- 'grids/test-grid/stacks', stack
46
- )
47
- subject.run(['--name', 'stack-b'])
46
+ expect(client).to receive(:post) do |path, data|
47
+ expect(path).to eq 'grids/test-grid/stacks'
48
+ expect(data).to match hash_including(stack_expectation.merge('name' => 'stack-a'))
49
+ expect(data['services'].find { |s| s['name'] == 'wordpress' }['env']).to match array_including("WORDPRESS_DB_PASSWORD=stack-a_secret")
50
+ expect(data['services'].find { |s| s['name'] == 'mysql' }['env']).to match array_including("MYSQL_ROOT_PASSWORD=stack-a_secret")
51
+ end.and_return({})
52
+ subject.run(['--no-deploy', '--name', 'stack-a', fixture_path('kontena_v3.yml')])
48
53
  end
49
54
 
50
55
  it 'accepts a stack name as filename' do
51
- expect(File).to receive(:exist?).with('user/stack:1.0.0').and_return(false)
52
- expect(subject).to receive(:stack_read_and_dump).with('user/stack:1.0.0', name: nil, values: nil).and_return(stack)
56
+ allow(File).to receive(:exist?).with('user/stack:1.0.0').at_least(:once).and_return(false)
57
+ expect(subject.loader_class).to receive(:for).with('user/stack:1.0.0').and_return(subject.loader_class.for(fixture_path('kontena_v3.yml')))
58
+ allow(subject.loader_class).to receive(:for).and_call_original
53
59
  expect(client).to receive(:post).with(
54
- 'grids/test-grid/stacks', stack
60
+ 'grids/test-grid/stacks', hash_including(stack_expectation)
55
61
  )
56
- subject.run(['user/stack:1.0.0'])
62
+ subject.run(['--no-deploy', 'user/stack:1.0.0'])
63
+ end
64
+
65
+ context '--[no-]deploy' do
66
+ it 'runs deploy for the stack after install by default' do
67
+ expect(client).to receive(:post).with(
68
+ 'grids/test-grid/stacks', hash_including(stack_expectation)
69
+ )
70
+ expect(Kontena).to receive(:run!).with(['stack', 'deploy', 'stackname']).and_return(true)
71
+ subject.run([fixture_path('kontena_v3.yml')])
72
+ end
73
+ end
74
+
75
+ context 'with a stack including dependencies' do
76
+
77
+ it 'installs all the dependencies' do
78
+ expect(Kontena).to receive(:run!).with(["stack", "install", "-n", "deptest-dep_1", "--parent-name", "deptest", '-v', 'dep_1.dep_var=1', '--no-deploy', fixture_path('stack-with-dependencies-dep-1.yml')])
79
+ expect(Kontena).to receive(:run!).with(["stack", "install", "-n", "deptest-dep_2", "--parent-name", "deptest", "-v", "dep_var=1", '--no-deploy', fixture_path('stack-with-dependencies-dep-2.yml')])
80
+ expect(client).to receive(:post).with('grids/test-grid/stacks', hash_including('stack' => 'user/depstack1', 'name' => 'deptest'))
81
+ subject.run(['-n', 'deptest', '--no-deploy', '-v', 'dep_1.dep_1.dep_var=1', fixture_path('stack-with-dependencies.yml')])
82
+ end
57
83
  end
58
84
  end
59
85
  end
@@ -16,4 +16,48 @@ describe Kontena::Cli::Stacks::ListCommand do
16
16
  subject.run([])
17
17
  end
18
18
  end
19
+
20
+ describe '#build_depths' do
21
+ it 'returns an array of hashes with "depth" field updated' do
22
+ items = [
23
+ {
24
+ 'depth' => 0, #stack1 1
25
+ 'name' => 'stack1_d1',
26
+ 'children' => [
27
+ { 'name' => 'stack2_d2' },
28
+ { 'name' => 'stack4_d2' }
29
+ ]
30
+ },
31
+ {
32
+ 'depth' => 0,
33
+ 'name' => 'stack2_d2',
34
+ 'children' => [
35
+ { 'name' => 'stack3_d3' },
36
+ ]
37
+ },
38
+ {
39
+ 'depth' => 0,
40
+ 'name' => 'stack3_d3',
41
+ 'children' => []
42
+ },
43
+ {
44
+ 'depth' => 0,
45
+ 'name' => 'stack4_d2',
46
+ 'children' => [
47
+ { 'name' => 'stack5_d3' }
48
+ ]
49
+ },
50
+ {
51
+ 'depth' => 0,
52
+ 'name' => 'stack5_d3',
53
+ 'children' => []
54
+ }
55
+ ].shuffle
56
+
57
+ subject.build_depths(items).each do |item|
58
+ depth_expectation = item['name'].split('_d').last.to_i
59
+ expect(item['depth']).to eq depth_expectation
60
+ end
61
+ end
62
+ end
19
63
  end
@@ -14,7 +14,7 @@ describe Kontena::Cli::Stacks::LogsCommand do
14
14
  },
15
15
  ]
16
16
  end
17
-
17
+
18
18
  it "shows stack logs" do
19
19
  expect(client).to receive(:get).with('stacks/test-grid/test-stack/container_logs', {
20
20
  limit: 100,
@@ -25,4 +25,15 @@ describe Kontena::Cli::Stacks::LogsCommand do
25
25
  ]
26
26
  end
27
27
 
28
+ it "shows stack service logs" do
29
+ expect(client).to receive(:get).with('grids/test-grid/container_logs', {
30
+ limit: 100,
31
+ services: 'test-stack/mysql,test-stack/myapp'
32
+ }) { { 'logs' => logs } }
33
+
34
+ expect{subject.run(['test-stack', 'mysql', 'myapp'])}.to output_lines [
35
+ "2016-09-07T15:19:04.362690 [test-stack.mysql-1]: mysql log message 1",
36
+ ]
37
+ end
38
+
28
39
  end