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