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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/bin/kontena +1 -1
- data/kontena-cli.gemspec +3 -3
- data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
- data/lib/kontena/cli/certificate/get_command.rb +7 -0
- data/lib/kontena/cli/certificate/list_command.rb +75 -0
- data/lib/kontena/cli/certificate/register_command.rb +13 -2
- data/lib/kontena/cli/certificate/request_command.rb +20 -0
- data/lib/kontena/cli/certificate/show_command.rb +19 -0
- data/lib/kontena/cli/certificate_command.rb +4 -1
- data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
- data/lib/kontena/cli/common.rb +21 -33
- data/lib/kontena/cli/etcd/health_command.rb +21 -27
- data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
- data/lib/kontena/cli/helpers/health_helper.rb +12 -0
- data/lib/kontena/cli/helpers/log_helper.rb +2 -2
- data/lib/kontena/cli/helpers/time_helper.rb +29 -0
- data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
- data/lib/kontena/cli/master/list_command.rb +1 -1
- data/lib/kontena/cli/master/ssh_command.rb +3 -1
- data/lib/kontena/cli/master/use_command.rb +1 -2
- data/lib/kontena/cli/node_command.rb +1 -0
- data/lib/kontena/cli/nodes/health_command.rb +28 -13
- data/lib/kontena/cli/nodes/list_command.rb +19 -3
- data/lib/kontena/cli/nodes/show_command.rb +4 -2
- data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
- data/lib/kontena/cli/nodes/update_command.rb +2 -0
- data/lib/kontena/cli/plugins/install_command.rb +11 -8
- data/lib/kontena/cli/plugins/list_command.rb +5 -3
- data/lib/kontena/cli/plugins/search_command.rb +4 -2
- data/lib/kontena/cli/plugins/show_command.rb +17 -0
- data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
- data/lib/kontena/cli/registry/create_command.rb +1 -1
- data/lib/kontena/cli/services/create_command.rb +6 -0
- data/lib/kontena/cli/services/services_helper.rb +33 -6
- data/lib/kontena/cli/services/update_command.rb +6 -0
- data/lib/kontena/cli/stacks/build_command.rb +3 -3
- data/lib/kontena/cli/stacks/common.rb +105 -90
- data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
- data/lib/kontena/cli/stacks/install_command.rb +39 -6
- data/lib/kontena/cli/stacks/list_command.rb +36 -4
- data/lib/kontena/cli/stacks/logs_command.rb +9 -2
- data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
- data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
- data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
- data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
- data/lib/kontena/cli/stacks/remove_command.rb +27 -1
- data/lib/kontena/cli/stacks/service_generator.rb +12 -2
- data/lib/kontena/cli/stacks/show_command.rb +35 -5
- data/lib/kontena/cli/stacks/stack_name.rb +71 -0
- data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
- data/lib/kontena/cli/stacks/validate_command.rb +38 -10
- data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
- data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
- data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
- data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
- data/lib/kontena/client.rb +2 -2
- data/lib/kontena/command.rb +11 -0
- data/lib/kontena/main_command.rb +3 -1
- data/lib/kontena/plugin_manager.rb +11 -198
- data/lib/kontena/plugin_manager/cleaner.rb +33 -0
- data/lib/kontena/plugin_manager/common.rb +86 -0
- data/lib/kontena/plugin_manager/installer.rb +54 -0
- data/lib/kontena/plugin_manager/loader.rb +93 -0
- data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
- data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
- data/lib/kontena/util.rb +24 -0
- data/lib/kontena_cli.rb +1 -0
- data/omnibus/config/projects/kontena.rb +7 -1
- data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
- data/spec/fixtures/api/node.json +2 -1
- data/spec/fixtures/stack-internal-extend.yml +6 -1
- data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
- data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
- data/spec/fixtures/stack-with-dependencies.yml +22 -0
- data/spec/fixtures/stack-with-variables.yml +3 -0
- data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
- data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
- data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
- data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
- data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
- data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
- data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
- data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
- data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
- data/spec/kontena/cli/stacks/common_spec.rb +42 -69
- data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
- data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
- data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
- data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
- data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
- data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
- data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
- data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
- data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
- data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
- data/spec/kontena/plugin_manager/common_spec.rb +39 -0
- data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
- data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
- data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
- data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
- data/spec/kontena/plugin_manager_spec.rb +7 -7
- metadata +64 -97
- data/lib/kontena/cli/app_command.rb +0 -22
- data/lib/kontena/cli/apps/build_command.rb +0 -28
- data/lib/kontena/cli/apps/common.rb +0 -172
- data/lib/kontena/cli/apps/config_command.rb +0 -25
- data/lib/kontena/cli/apps/deploy_command.rb +0 -137
- data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
- data/lib/kontena/cli/apps/docker_helper.rb +0 -80
- data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
- data/lib/kontena/cli/apps/init_command.rb +0 -89
- data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
- data/lib/kontena/cli/apps/list_command.rb +0 -59
- data/lib/kontena/cli/apps/logs_command.rb +0 -37
- data/lib/kontena/cli/apps/monitor_command.rb +0 -93
- data/lib/kontena/cli/apps/remove_command.rb +0 -74
- data/lib/kontena/cli/apps/restart_command.rb +0 -39
- data/lib/kontena/cli/apps/scale_command.rb +0 -33
- data/lib/kontena/cli/apps/service_generator.rb +0 -114
- data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
- data/lib/kontena/cli/apps/show_command.rb +0 -23
- data/lib/kontena/cli/apps/start_command.rb +0 -40
- data/lib/kontena/cli/apps/stop_command.rb +0 -40
- data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
- data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
- data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
- data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
- data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
- data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
- data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
- data/spec/fixtures/app.json +0 -42
- data/spec/fixtures/health.yml +0 -26
- data/spec/fixtures/kontena-build.yml +0 -16
- data/spec/fixtures/kontena-internal-extend.yml +0 -8
- data/spec/fixtures/kontena-invalid.yml +0 -4
- data/spec/fixtures/kontena-with-env-file.yml +0 -18
- data/spec/fixtures/kontena-with-variables.yml +0 -19
- data/spec/fixtures/kontena.yml +0 -17
- data/spec/fixtures/kontena_build_v2.yml +0 -26
- data/spec/fixtures/kontena_numeric_version.yml +0 -9
- data/spec/fixtures/kontena_v2.yml +0 -35
- data/spec/fixtures/mysql.yml +0 -3
- data/spec/fixtures/wordpress-scaled.yml +0 -3
- data/spec/fixtures/wordpress.yml +0 -2
- data/spec/kontena/cli/app/build_command_spec.rb +0 -55
- data/spec/kontena/cli/app/common_spec.rb +0 -110
- data/spec/kontena/cli/app/config_command_spec.rb +0 -78
- data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
- data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
- data/spec/kontena/cli/app/init_command_spec.rb +0 -109
- data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
- data/spec/kontena/cli/app/scale_spec.rb +0 -51
- data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
- data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
- data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
- 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
|
-
|
20
|
-
|
21
|
-
|
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(
|
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(:
|
37
|
-
allow(subject).to receive(:
|
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
|
-
|
61
|
-
|
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
|
-
|
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
|
-
|
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 '#
|
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 '#
|
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 '#
|
86
|
-
|
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
|
-
|
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 '#
|
92
|
-
|
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
|
-
|
95
|
-
|
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
|
-
|
98
|
-
|
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
|
-
|
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(:
|
16
|
+
let(:stack_expectation) do
|
11
17
|
{
|
12
|
-
name
|
13
|
-
stack
|
14
|
-
version
|
15
|
-
registry
|
16
|
-
|
17
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
'
|
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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
52
|
-
expect(subject).to receive(:
|
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',
|
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
|