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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ba22a3516366cf0d4cb3d9b44e4460984a0cabf
4
- data.tar.gz: 9e220dd6c8231906600723523ca8e59badc537ab
3
+ metadata.gz: 736ce5191f521cac27f9880c5ae7c7be58dfcc0a
4
+ data.tar.gz: e0c8fe58d93e4cf7eb3c23afbe8ee93867ddda0d
5
5
  SHA512:
6
- metadata.gz: 4088c0e1841b305ff61091f29adcae757045ecdf629840dd0988c83efc91e4b63d22e993c6766c3c36642c5e0fcdca3a48ef4a3e8c4ce405d73c0f1d6a9e9d9a
7
- data.tar.gz: c15c7cee466cd4510f09616651d1ade116ba0b62e2c7dc8c6d415b630d88efbd88a665058dc2e474176dfbc1d846c454411cca16a80d0827c486d66bb10aa86d
6
+ metadata.gz: 62ad31693e22387f9dd233523f185a2ceb8df60c579c498a6c791cc7bcc95fcda65b51ebdc4386de95dbc5caec080b820861716d818fa3757bbd1cdc8d6aade4
7
+ data.tar.gz: 76f2ee0a455f03f0966f5222572bda1686f4aa292e88ed96f0b651d550461ba38683ce267f5524d780454a641975d8257e4bd0555bb20922b3bedfcd2e333b9f
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.pre3
1
+ 1.0.0.pre4
data/kontena-cli.gemspec CHANGED
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_runtime_dependency "hash_validator", "~> 0.7.0"
31
31
  spec.add_runtime_dependency "retriable", "~> 2.1.0"
32
32
  spec.add_runtime_dependency "opto", "~> 1.5"
33
+ spec.add_runtime_dependency "semantic", "~> 1.5"
33
34
  end
@@ -10,9 +10,9 @@ module Kontena::Cli::Nodes::Labels
10
10
  requires_current_grid
11
11
 
12
12
  def execute
13
- node = client.get("grids/#{current_grid}/nodes/#{node_id}")
13
+ node = client.get("nodes/#{current_grid}/#{node_id}")
14
14
  data = { labels: (Array(node['labels']) + label_list).uniq }
15
- client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
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("grids/#{current_grid}/nodes/#{node_id}")
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("grids/#{current_grid}/nodes/#{node_id}")
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, {}, {'Kontena-Grid-Token' => node['grid']['token']})
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("grids/#{current_grid}/nodes/#{node_id}")
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("grids/#{current_grid}/nodes/#{node_id}")
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/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
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 = services_from_yaml(filename, service_list, service_prefix)
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(self.name || reader.stack_name, current_grid)
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
- require_config_file(filename)
21
- stack = stack_from_yaml(filename)
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
- stack = ::YAML.load(stacks_client.show(stack_name))
17
- puts "#{stack['stack']}:"
18
- puts " latest_version: #{stack['version']}"
19
- puts " expose: #{stack['expose'] || '-'}"
20
- puts " description: #{stack['description'] || '-'}"
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
- puts " available_versions:"
23
- stacks_client.versions(stack_name).map { |s| s['version']}.sort.reverse_each do |version|
24
- puts " - #{version}"
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
- service = get_service(service_id)
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::RegistryClientFactory.new.stacks_client.api_url
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
- stdout, stderr = client(require_token).post("services/#{current_grid}/vpn/server/containers/1/exec", payload)
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("services/#{current_grid}/vpn/server/containers/1/exec", payload)
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
 
@@ -94,6 +94,10 @@ module Kontena
94
94
  stack
95
95
  end
96
96
 
97
+ def registry_url
98
+ client.api_url
99
+ end
100
+
97
101
  def client
98
102
  @client ||= RegistryClientFactory.new.stacks_client
99
103
  end
@@ -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, nil)}", {}, ACCEPT_JSON)
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(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
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(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
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.pre3
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-28 00:00:00.000000000 Z
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