kontena-cli 1.0.0.pre3 → 1.0.0.pre4
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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/kontena-cli.gemspec +1 -0
- data/lib/kontena/cli/nodes/labels/add_command.rb +2 -2
- data/lib/kontena/cli/nodes/labels/list_command.rb +1 -2
- data/lib/kontena/cli/nodes/labels/remove_command.rb +2 -2
- data/lib/kontena/cli/nodes/remove_command.rb +1 -1
- data/lib/kontena/cli/nodes/show_command.rb +1 -1
- data/lib/kontena/cli/nodes/update_command.rb +1 -2
- data/lib/kontena/cli/stack_command.rb +1 -1
- data/lib/kontena/cli/stacks/build_command.rb +5 -1
- data/lib/kontena/cli/stacks/common.rb +3 -3
- data/lib/kontena/cli/stacks/install_command.rb +10 -3
- data/lib/kontena/cli/stacks/registry/show_command.rb +12 -8
- data/lib/kontena/cli/stacks/show_command.rb +2 -1
- data/lib/kontena/cli/stacks/yaml/reader.rb +1 -1
- data/lib/kontena/cli/vpn/config_command.rb +2 -1
- data/lib/kontena/cli/vpn/create_command.rb +2 -1
- data/lib/kontena/stacks_cache.rb +4 -0
- data/lib/kontena/stacks_client.rb +2 -2
- data/spec/kontena/cli/stacks/install_command_spec.rb +19 -4
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 736ce5191f521cac27f9880c5ae7c7be58dfcc0a
|
4
|
+
data.tar.gz: e0c8fe58d93e4cf7eb3c23afbe8ee93867ddda0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62ad31693e22387f9dd233523f185a2ceb8df60c579c498a6c791cc7bcc95fcda65b51ebdc4386de95dbc5caec080b820861716d818fa3757bbd1cdc8d6aade4
|
7
|
+
data.tar.gz: 76f2ee0a455f03f0966f5222572bda1686f4aa292e88ed96f0b651d550461ba38683ce267f5524d780454a641975d8257e4bd0555bb20922b3bedfcd2e333b9f
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.pre4
|
data/kontena-cli.gemspec
CHANGED
@@ -10,9 +10,9 @@ module Kontena::Cli::Nodes::Labels
|
|
10
10
|
requires_current_grid
|
11
11
|
|
12
12
|
def execute
|
13
|
-
node = client.get("
|
13
|
+
node = client.get("nodes/#{current_grid}/#{node_id}")
|
14
14
|
data = { labels: (Array(node['labels']) + label_list).uniq }
|
15
|
-
client.put("nodes/#{
|
15
|
+
client.put("nodes/#{current_grid}/#{node_id}", data)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -9,9 +9,8 @@ module Kontena::Cli::Nodes::Labels
|
|
9
9
|
requires_current_grid
|
10
10
|
|
11
11
|
def execute
|
12
|
-
node = client.get("
|
12
|
+
node = client.get("nodes/#{current_grid}/#{node_id}")
|
13
13
|
puts Array(node['labels']).join("\n")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
@@ -10,9 +10,9 @@ module Kontena::Cli::Nodes::Labels
|
|
10
10
|
requires_current_grid
|
11
11
|
|
12
12
|
def execute
|
13
|
-
node = client.get("
|
13
|
+
node = client.get("nodes/#{current_grid}/#{node_id}")
|
14
14
|
data = { labels: Array(node['labels']).reject {|label| label_list.include?(label) } }
|
15
|
-
client.put("nodes/#{node['id']}", data
|
15
|
+
client.put("nodes/#{current_grid}/#{node['id']}", data)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -13,7 +13,7 @@ module Kontena::Cli::Nodes
|
|
13
13
|
confirm_command(node_id) unless forced?
|
14
14
|
|
15
15
|
spinner "Removing #{node_id.colorize(:cyan)} node from #{current_grid.colorize(:cyan)} grid " do
|
16
|
-
client(token).delete("
|
16
|
+
client(token).delete("nodes/#{current_grid}/#{node_id}")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -11,7 +11,7 @@ module Kontena::Cli::Nodes
|
|
11
11
|
require_current_grid
|
12
12
|
token = require_token
|
13
13
|
|
14
|
-
node = client(token).get("
|
14
|
+
node = client(token).get("nodes/#{current_grid}/#{node_id}")
|
15
15
|
puts "#{node['name']}:"
|
16
16
|
puts " id: #{node['id']}"
|
17
17
|
puts " agent version: #{node['agent_version']}"
|
@@ -11,11 +11,10 @@ module Kontena::Cli::Nodes
|
|
11
11
|
require_current_grid
|
12
12
|
token = require_token
|
13
13
|
|
14
|
-
node = client(token).get("grids/#{current_grid}/nodes/#{node_id}")
|
15
14
|
data = {}
|
16
15
|
data[:labels] = label_list if label_list
|
17
16
|
spinner "Updating #{node_id.colorize(:cyan)} node " do
|
18
|
-
client.put("nodes/#{
|
17
|
+
client.put("nodes/#{current_grid}/#{node_id}", data)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
end
|
@@ -20,7 +20,7 @@ class Kontena::Cli::StackCommand < Kontena::Command
|
|
20
20
|
subcommand "logs", "Show logs from services in a stack", Kontena::Cli::Stacks::LogsCommand
|
21
21
|
subcommand "monitor", "Monitor services in a stack", Kontena::Cli::Stacks::MonitorCommand
|
22
22
|
subcommand "build", "Build images listed in a stack file and push them to an image registry", Kontena::Cli::Stacks::BuildCommand
|
23
|
-
subcommand "registry", "Stack registry related commands", Kontena::Cli::Stacks::RegistryCommand
|
23
|
+
subcommand ["reg", "registry"], "Stack registry related commands", Kontena::Cli::Stacks::RegistryCommand
|
24
24
|
|
25
25
|
def execute
|
26
26
|
end
|
@@ -15,7 +15,11 @@ module Kontena::Cli::Stacks
|
|
15
15
|
|
16
16
|
def execute
|
17
17
|
require_config_file(filename)
|
18
|
-
services =
|
18
|
+
services = Kontena::Cli::Stacks::YAML::Reader.new(filename).execute[:services]
|
19
|
+
unless service_list.empty?
|
20
|
+
services.select! { |name, _| service_list.include?(name) }
|
21
|
+
end
|
22
|
+
|
19
23
|
if services.none?{ |name, service| service['build'] }
|
20
24
|
abort 'Not found any service with a build option'.colorize(:red)
|
21
25
|
end
|
@@ -24,12 +24,12 @@ module Kontena::Cli::Stacks
|
|
24
24
|
@stack_name ||= self.name || stack_name_from_yaml(filename)
|
25
25
|
end
|
26
26
|
|
27
|
-
def stack_from_yaml(filename)
|
28
|
-
reader = Kontena::Cli::Stacks::YAML::Reader.new(filename)
|
27
|
+
def stack_from_yaml(filename, from_registry: false)
|
28
|
+
reader = Kontena::Cli::Stacks::YAML::Reader.new(filename, from_registry: from_registry)
|
29
29
|
if reader.stack_name.nil?
|
30
30
|
exit_with_error "Stack MUST have stack name in YAML top level field 'stack'! Aborting."
|
31
31
|
end
|
32
|
-
set_env_variables(
|
32
|
+
set_env_variables(reader.stack_name, current_grid)
|
33
33
|
#reader.reload
|
34
34
|
outcome = reader.execute
|
35
35
|
|
@@ -8,7 +8,7 @@ module Kontena::Cli::Stacks
|
|
8
8
|
|
9
9
|
banner "Installs a stack to a grid on Kontena Master"
|
10
10
|
|
11
|
-
parameter "[FILE]", "Kontena stack file", default: "kontena.yml", attribute_name: :filename
|
11
|
+
parameter "[FILE]", "Kontena stack file or a registry stack name (user/stack or user/stack:version)", default: "kontena.yml", attribute_name: :filename
|
12
12
|
|
13
13
|
option ['-n', '--name'], 'NAME', 'Define stack name (by default comes from stack file)'
|
14
14
|
option '--deploy', :flag, 'Deploy after installation'
|
@@ -17,8 +17,15 @@ module Kontena::Cli::Stacks
|
|
17
17
|
requires_current_master_token
|
18
18
|
|
19
19
|
def execute
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
if !File.exist?(filename) && filename =~ /\A[a-zA-Z0-9\_\.\-]+\/[a-zA-Z0-9\_\.\-]+(?::.*)?\z/
|
22
|
+
from_registry = true
|
23
|
+
else
|
24
|
+
from_registry = false
|
25
|
+
require_config_file(filename)
|
26
|
+
end
|
27
|
+
|
28
|
+
stack = stack_from_yaml(filename, from_registry: from_registry)
|
22
29
|
stack['name'] = name if name
|
23
30
|
spinner "Creating stack #{pastel.cyan(stack['name'])} " do
|
24
31
|
create_stack(stack)
|
@@ -13,15 +13,19 @@ module Kontena::Cli::Stacks::Registry
|
|
13
13
|
requires_current_account_token
|
14
14
|
|
15
15
|
def execute
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
require 'semantic'
|
17
|
+
unless versions?
|
18
|
+
stack = ::YAML.load(stacks_client.show(stack_name, stack_version))
|
19
|
+
puts "#{stack['stack']}:"
|
20
|
+
puts " #{"latest_" unless stack_version}version: #{stack['version']}"
|
21
|
+
puts " expose: #{stack['expose'] || '-'}"
|
22
|
+
puts " description: #{stack['description'] || '-'}"
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
puts " available_versions:"
|
25
|
+
end
|
26
|
+
|
27
|
+
stacks_client.versions(stack_name).reject {|s| s['version'].nil? || s['version'].empty?}.map { |s| Semantic::Version.new(s['version'])}.sort.reverse_each do |version|
|
28
|
+
puts versions? ? version : " - #{version}"
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -34,7 +34,8 @@ module Kontena::Cli::Stacks
|
|
34
34
|
|
35
35
|
# @param [String] service_id
|
36
36
|
def show_service(service_id)
|
37
|
-
|
37
|
+
token = require_token
|
38
|
+
service = get_service(token, service_id)
|
38
39
|
pad = ' '.freeze
|
39
40
|
puts "#{pad}#{service['name']}:"
|
40
41
|
puts "#{pad} image: #{service['image']}"
|
@@ -23,7 +23,7 @@ module Kontena::Cli::Stacks
|
|
23
23
|
if from_registry?
|
24
24
|
require 'shellwords'
|
25
25
|
@raw_content = Kontena::StacksCache.pull(file)
|
26
|
-
@registry = Kontena::StacksCache
|
26
|
+
@registry = Kontena::StacksCache.registry_url
|
27
27
|
else
|
28
28
|
@raw_content = File.read(File.expand_path(file))
|
29
29
|
end
|
@@ -7,7 +7,8 @@ module Kontena::Cli::Vpn
|
|
7
7
|
require 'rbconfig'
|
8
8
|
require_api_url
|
9
9
|
payload = {cmd: ['/usr/local/bin/ovpn_getclient', 'KONTENA_VPN_CLIENT']}
|
10
|
-
|
10
|
+
service = client(require_token).get("services/#{current_grid}/vpn/server/containers")['containers'][0]
|
11
|
+
stdout, stderr = client(require_token).post("containers/#{service['id']}/exec", payload)
|
11
12
|
if linux?
|
12
13
|
stdout << "\n"
|
13
14
|
stdout << "script-security 2 system\n"
|
@@ -60,9 +60,10 @@ module Kontena::Cli::Vpn
|
|
60
60
|
def wait_for_configuration_to_finish(token)
|
61
61
|
finished = false
|
62
62
|
payload = {cmd: ['/usr/local/bin/ovpn_getclient', 'KONTENA_VPN_CLIENT']}
|
63
|
+
service = client(require_token).get("services/#{current_grid}/vpn/server/containers", payload)['containers'][0]
|
63
64
|
until finished
|
64
65
|
sleep 3
|
65
|
-
stdout, stderr = client(require_token).post("
|
66
|
+
stdout, stderr = client(require_token).post("containers/#{service['id']}/exec", payload)
|
66
67
|
finished = true if stdout.join('').include?('BEGIN PRIVATE KEY'.freeze)
|
67
68
|
end
|
68
69
|
|
data/lib/kontena/stacks_cache.rb
CHANGED
@@ -15,8 +15,8 @@ module Kontena
|
|
15
15
|
post('/stack/', data, {}, CT_YAML)
|
16
16
|
end
|
17
17
|
|
18
|
-
def show(stack_name)
|
19
|
-
get("#{path_to(stack_name,
|
18
|
+
def show(stack_name, stack_version = nil)
|
19
|
+
get("#{path_to(stack_name, stack_version)}", {}, ACCEPT_JSON)
|
20
20
|
end
|
21
21
|
|
22
22
|
def versions(stack_name)
|
@@ -9,6 +9,8 @@ describe Kontena::Cli::Stacks::InstallCommand do
|
|
9
9
|
let(:stack) do
|
10
10
|
{
|
11
11
|
name: 'stack-a',
|
12
|
+
stack: 'user/stack-a',
|
13
|
+
version: '1.0.0',
|
12
14
|
registry: 'file://kontena.yml',
|
13
15
|
source: "YAML content",
|
14
16
|
services: []
|
@@ -20,20 +22,23 @@ describe Kontena::Cli::Stacks::InstallCommand do
|
|
20
22
|
end
|
21
23
|
|
22
24
|
it 'requires api url' do
|
23
|
-
allow(
|
25
|
+
allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
|
26
|
+
allow(subject).to receive(:stack_from_yaml).with('kontena.yml', hash_including(from_registry: false)).and_return(stack)
|
24
27
|
expect(described_class.requires_current_master?).to be_truthy
|
25
28
|
subject.run([])
|
26
29
|
end
|
27
30
|
|
28
31
|
it 'requires token' do
|
29
|
-
allow(
|
32
|
+
allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
|
33
|
+
allow(subject).to receive(:stack_from_yaml).with('kontena.yml', hash_including(from_registry: false)).and_return(stack)
|
30
34
|
expect(described_class.requires_current_master_token?).to be_truthy
|
31
35
|
subject.run([])
|
32
36
|
end
|
33
37
|
|
34
38
|
it 'sends stack to master' do
|
39
|
+
allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
|
35
40
|
allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
|
36
|
-
allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
|
41
|
+
allow(subject).to receive(:stack_from_yaml).with('kontena.yml', hash_including(from_registry: false)).and_return(stack)
|
37
42
|
expect(client).to receive(:post).with(
|
38
43
|
'grids/test-grid/stacks', stack
|
39
44
|
)
|
@@ -41,8 +46,9 @@ describe Kontena::Cli::Stacks::InstallCommand do
|
|
41
46
|
end
|
42
47
|
|
43
48
|
it 'allows to override stack name' do
|
49
|
+
allow(File).to receive(:exist?).with('kontena.yml').and_return(true)
|
44
50
|
allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
|
45
|
-
allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
|
51
|
+
allow(subject).to receive(:stack_from_yaml).with('kontena.yml', hash_including(from_registry: false)).and_return(stack)
|
46
52
|
stack_b = stack
|
47
53
|
stack_b[:name] = 'stack-b'
|
48
54
|
expect(client).to receive(:post).with(
|
@@ -50,5 +56,14 @@ describe Kontena::Cli::Stacks::InstallCommand do
|
|
50
56
|
)
|
51
57
|
subject.run(['--name', 'stack-b'])
|
52
58
|
end
|
59
|
+
|
60
|
+
it 'accepts a stack name as filename' do
|
61
|
+
expect(File).to receive(:exist?).with('user/stack:1.0.0').and_return(false)
|
62
|
+
expect(subject).to receive(:stack_from_yaml).with('user/stack:1.0.0', from_registry: true).and_return(stack)
|
63
|
+
expect(client).to receive(:post).with(
|
64
|
+
'grids/test-grid/stacks', stack
|
65
|
+
)
|
66
|
+
subject.run(['user/stack:1.0.0'])
|
67
|
+
end
|
53
68
|
end
|
54
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.pre4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '1.5'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: semantic
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '1.5'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '1.5'
|
153
167
|
description: Kontena command line tool
|
154
168
|
email:
|
155
169
|
- info@kontena.io
|