kontena-cli 1.0.0.pre3 → 1.0.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
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