kontena-plugin-cloud 1.2.0.pre1 → 1.2.0.pre2

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
- SHA1:
3
- metadata.gz: dc3a8c3040ed8e7a6b9cbd96270d24839b536afc
4
- data.tar.gz: af258da9b87003457ff111d2e484f7f1d44ce645
2
+ SHA256:
3
+ metadata.gz: e982c9ea1499f2618665e250c4f5c6e2b11511f96c14afc77ef0f288f4e2eaf5
4
+ data.tar.gz: 009906cfbb8b95082e41823fb62feaa5ed10105237a096fa9805be0628933319
5
5
  SHA512:
6
- metadata.gz: 9776738f6ee1d8b0299a1dd526d2156f8642487924327e6f1f2e55de5264a14a84dd9ec80791dc8731252ca9581b728ead499c0de3da016b70c57da190282245
7
- data.tar.gz: b9a5a54c84f784a5e1b70bbae31d4587e9504169ff043a14974f00be329f6293eaadbc20ead6a05efcc8a07bb5ab66f32b46597c817ee2ebd3343293c5f1b304
6
+ metadata.gz: 93af9ac05619ca85c45af77e68eead3d048081e7e3d00b593c2bde695ca219a38fb651586bad1572d3f78b4e7e3111df07582262e99b04d51215a67199de3a8f
7
+ data.tar.gz: 03e5054dda9fc13beda51de24be52ca125e7b329d8a6fe1d3547441b4c8c433182c6894fd479e269e1aaf7b89944b816930c505aa7bb728fa9e608c8c026a3a0
@@ -1,17 +1,9 @@
1
1
  require_relative '../../../cli/models/node'
2
2
  require_relative '../../../cli/models/platform'
3
+ require_relative 'platform_option'
3
4
 
4
5
  module Kontena::Plugin::Cloud::Node::Common
5
6
 
6
- def self.included(base)
7
- if base.respond_to?(:option)
8
- base.option '--platform', 'PLATFORM', 'Specify Kontena Cloud platform to use' do |platform|
9
- config.current_master = platform
10
- config.current_grid = platform.split('/')[1]
11
- end
12
- end
13
- end
14
-
15
7
  def compute_client
16
8
  @compute_client ||= Kontena::Client.new(compute_url, config.current_account.token, prefix: '/')
17
9
  end
@@ -21,7 +13,7 @@ module Kontena::Plugin::Cloud::Node::Common
21
13
  end
22
14
 
23
15
  def compute_url
24
- ENV['COMPUTE_URL'] || 'https://compute.kontena.io'
16
+ ENV['KONTENA_COMPUTE_URL'] || 'https://compute.kontena.io'
25
17
  end
26
18
 
27
19
  def get_platform(org, id)
@@ -7,6 +7,7 @@ class Kontena::Plugin::Cloud::Node::CreateCommand < Kontena::Command
7
7
  include Kontena::Cli::Common
8
8
  include Kontena::Machine::RandomName
9
9
  include Kontena::Plugin::Cloud::Node::Common
10
+ include Kontena::Plugin::Cloud::Node::PlatformOption
10
11
  include Kontena::Plugin::Cloud::Organization::Common
11
12
  include Kontena::Plugin::Cloud::Platform::Common
12
13
 
@@ -17,6 +18,7 @@ class Kontena::Plugin::Cloud::Node::CreateCommand < Kontena::Command
17
18
  end
18
19
  option "--type", "TYPE", "Node type", required: true
19
20
  option "--region", "REGION", "Region (us-east-1, eu-west-1, defaults to current platform region)"
21
+ option "--ssh-key", "SSH_KEY", "Path to ssh public key"
20
22
 
21
23
  def execute
22
24
  org, platform = parse_platform_name(current_master.name)
@@ -31,6 +33,16 @@ class Kontena::Plugin::Cloud::Node::CreateCommand < Kontena::Command
31
33
  name = "#{generate_name}-#{rand(1..999)}"
32
34
  node_token = SecureRandom.hex(32)
33
35
  target_region = self.region || platform.region
36
+ ssh_keys = []
37
+ if ssh_key
38
+ begin
39
+ key_path = File.realpath(ssh_key)
40
+ ssh_keys << File.read(key_path)
41
+ rescue Errno::ENOENT
42
+ exit_with_error "ssh key #{ssh_key} does not exist"
43
+ end
44
+ end
45
+
34
46
  spinner "Provisioning a node #{pastel.cyan(name)} to platform #{pastel.cyan(platform.to_path)}, region #{pastel.cyan(target_region)}" do
35
47
  client.post("grids/#{current_grid}/nodes", {
36
48
  name: name,
@@ -46,7 +58,8 @@ class Kontena::Plugin::Cloud::Node::CreateCommand < Kontena::Command
46
58
  tokens: {
47
59
  grid: token,
48
60
  node: node_token
49
- }
61
+ },
62
+ 'ssh-keys': ssh_keys
50
63
  },
51
64
  relationships: {
52
65
  platform: {
@@ -11,27 +11,55 @@ class Kontena::Plugin::Cloud::Node::ListCommand < Kontena::Command
11
11
 
12
12
  requires_current_account_token
13
13
 
14
+ option ['--organization', '--org'], 'ORG', 'Organization', environment_variable: "KONTENA_ORGANIZATION"
15
+ option ['--quiet', '-q'], :flag, 'Output the identifying column only'
16
+
14
17
  def execute
15
- org, platform = parse_platform_name(current_master.name)
16
- platform = require_platform("#{org}/#{platform}")
17
- nodes = compute_client.get("/organizations/#{org}/nodes")['data']
18
+ nodes = compute_client.get("/organizations/#{self.organization}/nodes")['data']
18
19
  nodes.delete_if { |n| n.dig('attributes', 'state') == 'terminated' }
20
+ if quiet?
21
+ puts nodes.map { |n| n.dig('attributes', 'name')}
22
+ return
23
+ end
24
+ platforms = fetch_platforms(nodes)
19
25
  print_table(nodes) do |n|
20
26
  node = Kontena::Cli::Models::Node.new(n)
21
27
  n['name'] = "#{state_icon(node.state)} #{node.name}"
22
28
  n['type'] = node.type
23
29
  n['region'] = node.region
30
+ if platform = platforms[node.platform_id]
31
+ n['platform'] = platform.to_path
32
+ else
33
+ n['platform'] = pastel.red('<orphan>')
34
+ end
24
35
  end
25
36
  end
26
37
 
38
+ def fetch_platforms(nodes)
39
+ platform_ids = nodes.map { |n| Kontena::Cli::Models::Node.new(n).platform_id }.compact.uniq
40
+ platforms = {}
41
+ platform_ids.each { |id|
42
+ platform_data = cloud_client.get("/organizations/#{self.organization}/platforms/#{id}")['data'] rescue nil
43
+ if platform_data
44
+ platforms[id] = Kontena::Cli::Models::Platform.new(platform_data)
45
+ end
46
+ }
47
+ platforms
48
+ end
49
+
27
50
  def default_organization
28
- prompt_organization
51
+ unless current_master
52
+ exit_with_error "Organization is required"
53
+ end
54
+ org, _ = parse_platform_name(current_master.name)
55
+ org
29
56
  end
30
57
 
31
58
  def fields
32
59
  {
33
60
  'name' => 'name',
34
61
  'type' => 'type',
62
+ 'platform' => 'platform',
35
63
  'region' => 'region'
36
64
  }
37
65
  end
@@ -0,0 +1,11 @@
1
+ module Kontena::Plugin::Cloud::Node::PlatformOption
2
+
3
+ def self.included(base)
4
+ if base.respond_to?(:option)
5
+ base.option '--platform', 'PLATFORM', 'Specify Kontena Cloud platform to use' do |platform|
6
+ config.current_master = platform
7
+ config.current_grid = platform.split('/')[1]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'common'
2
+ require_relative '../organization/common'
3
+ require_relative '../platform/common'
4
+
5
+ class Kontena::Plugin::Cloud::Node::RebootCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Plugin::Cloud::Platform::Common
8
+ include Kontena::Plugin::Cloud::Node::Common
9
+
10
+ requires_current_account_token
11
+
12
+ option ['--organization', '--org'], 'ORG', 'Organization', environment_variable: "KONTENA_ORGANIZATION"
13
+ parameter "NAME", "Node name"
14
+
15
+ def execute
16
+ node = find_node(name)
17
+ exit_with_error "Node not found" unless node
18
+ spinner "Sending reboot request to #{pastel.cyan(name)}" do
19
+ compute_client.post("/organizations/#{self.organization}/nodes/#{node.dig('id')}/reboot", {})
20
+ end
21
+ end
22
+
23
+ def find_node(name)
24
+ nodes = compute_client.get("/organizations/#{self.organization}/nodes")['data']
25
+ nodes.find { |n| n.dig('attributes', 'name') == name }
26
+ end
27
+
28
+ def default_organization
29
+ unless current_master
30
+ exit_with_error "Organization is required"
31
+ end
32
+ org, _ = parse_platform_name(current_master.name)
33
+ org
34
+ end
35
+ end
@@ -5,6 +5,7 @@ require_relative '../platform/common'
5
5
  class Kontena::Plugin::Cloud::Node::ShellCommand < Kontena::Command
6
6
  include Kontena::Cli::Common
7
7
  include Kontena::Plugin::Cloud::Platform::Common
8
+ include Kontena::Plugin::Cloud::Node::PlatformOption
8
9
  include Kontena::Plugin::Cloud::Node::Common
9
10
 
10
11
  requires_current_account_token
@@ -6,6 +6,7 @@ class Kontena::Plugin::Cloud::Node::TerminateCommand < Kontena::Command
6
6
  include Kontena::Cli::Common
7
7
  include Kontena::Plugin::Cloud::Platform::Common
8
8
  include Kontena::Plugin::Cloud::Node::Common
9
+ include Kontena::Plugin::Cloud::Node::PlatformOption
9
10
 
10
11
  requires_current_account_token
11
12
 
@@ -3,7 +3,8 @@ class Kontena::Plugin::Cloud::NodeCommand < Kontena::Command
3
3
  subcommand ['list', 'ls'], 'List cloud nodes', load_subcommand('kontena/plugin/cloud/node/list_command')
4
4
  subcommand ['shell'], 'Jump into node shell', load_subcommand('kontena/plugin/cloud/node/shell_command')
5
5
  subcommand ['create'], 'Create cloud node', load_subcommand('kontena/plugin/cloud/node/create_command')
6
- subcommand ['terminate'], 'Terminate cloud node', load_subcommand('kontena/plugin/cloud/node/terminate_command')
6
+ subcommand ['reboot'], 'Reboot cloud node', load_subcommand('kontena/plugin/cloud/node/reboot_command')
7
+ subcommand ['terminate', 'rm'], 'Terminate cloud node', load_subcommand('kontena/plugin/cloud/node/terminate_command')
7
8
 
8
9
  def execute
9
10
  end
@@ -8,22 +8,31 @@ class Kontena::Plugin::Cloud::Platform::CreateCommand < Kontena::Command
8
8
  parameter "[NAME]", "Platform name"
9
9
 
10
10
  option ['--organization', '--org'], 'ORG', 'Organization name', environment_variable: 'KONTENA_ORGANIZATION'
11
+ option ['--type'], 'TYPE', 'Platform type (mini, standard)'
11
12
  option ['--region'], 'region', 'Region (us-east-1, eu-west-1)'
12
13
  option ['--initial-size', '-i'], 'SIZE', 'Initial size (number of nodes) for platform'
13
14
  option '--[no-]use', :flag, 'Switch to use created platform', default: true
14
15
  option '--version', 'VERSION', 'Platform version', visible: false
15
16
 
16
17
  def execute
17
- confirm("This will create managed platform to Kontena Cloud, proceed?")
18
-
19
18
  self.name = prompt.ask("Name:") unless self.name
20
19
  self.organization = prompt_organization unless self.organization
21
- self.region = prompt_region unless self.region
22
- self.initial_size = prompt_initial_size unless self.initial_size
20
+ self.type = prompt_type unless self.type
21
+ if self.type == 'mini' && self.region
22
+ exit_with_error "mini does not support region selection"
23
+ elsif self.type == 'mini'
24
+ self.region = nil
25
+ self.initial_size = 1 unless self.initial_size
26
+ else
27
+ self.region = prompt_region unless self.region
28
+ self.initial_size = 3 unless self.initial_size
29
+ end
23
30
 
24
31
  platform = nil
25
- spinner "Creating platform #{pastel.cyan(name)} to region #{pastel.cyan(region)}" do
26
- platform = create_platform(name, organization, initial_size, region)
32
+ spinner_text = "Creating platform #{pastel.cyan(name)}"
33
+ spinner_text = spinner_text + " to region #{pastel.cyan(region)}" if region
34
+ spinner spinner_text do
35
+ platform = create_platform(name, organization, type, initial_size, region)
27
36
  end
28
37
  spinner "Waiting for platform #{pastel.cyan(name)} to come online" do
29
38
  while !platform.online? do
@@ -32,6 +41,11 @@ class Kontena::Plugin::Cloud::Platform::CreateCommand < Kontena::Command
32
41
  end
33
42
  end
34
43
  use_platform(platform) if use?
44
+
45
+ puts ""
46
+ puts " Platform #{pastel.cyan(name)} needs at least #{pastel.cyan(self.initial_size)} node(s) to be functional."
47
+ puts " You can add nodes from Kontena Cloud ('kontena cloud node create --count #{self.initial_size}') or you can bring your own nodes (https://www.kontena.io/docs/using-kontena/install-nodes/)."
48
+ puts ""
35
49
  end
36
50
 
37
51
  # @param [Kontena::Cli::Models::Platform] platform
@@ -62,17 +76,20 @@ class Kontena::Plugin::Cloud::Platform::CreateCommand < Kontena::Command
62
76
  end
63
77
  end
64
78
 
65
- def prompt_initial_size
66
- prompt.select("Initial platform size (number of nodes):") do |menu|
67
- menu.choice "1 (dev/test)", 1
68
- menu.choice "3 (tolerates 1 initial node failure)", 3
69
- menu.choice "5 (tolerates 2 initial node failures)", 5
79
+ def prompt_type
80
+ prompt.select("Platform type:") do |menu|
81
+ menu.choice "standard (high-availability, business critical services)", "standard"
82
+ menu.choice "mini (non-business critical services)", "mini"
70
83
  end
71
84
  end
72
85
 
73
- def create_platform(name, organization, initial_size, region)
86
+ def create_platform(name, organization, type, initial_size, region)
74
87
  data = {
75
- attributes: { "name" => name, "initial-size" => initial_size },
88
+ attributes: {
89
+ "name" => name,
90
+ "initial-size" => initial_size,
91
+ "hosted-type" => type
92
+ },
76
93
  relationships: {
77
94
  region: {
78
95
  "data" => { "type" => "region", "id" => region }
@@ -18,7 +18,7 @@ class Kontena::Plugin::Cloud::Platform::ListCommand < Kontena::Command
18
18
  platform = Kontena::Cli::Models::Platform.new(p)
19
19
  p['name'] = "#{state_icon(platform.state)} #{organization}/#{platform.name}"
20
20
  p['organization'] = platform.organization
21
- p['url'] = platform.url
21
+ p['hosted_type'] = platform.hosted_type
22
22
  p['region'] = platform.region
23
23
  end
24
24
  end
@@ -30,6 +30,7 @@ class Kontena::Plugin::Cloud::Platform::ListCommand < Kontena::Command
30
30
  def fields
31
31
  {
32
32
  name: 'name',
33
+ type: 'hosted_type',
33
34
  region: 'region'
34
35
  }
35
36
  end
@@ -14,11 +14,11 @@ class Kontena::Plugin::Cloud::Platform::ShowCommand < Kontena::Command
14
14
  require_platform(name)
15
15
 
16
16
  platform = find_platform_by_name(current_platform, current_organization)
17
-
18
17
  puts "#{name}:"
19
18
  puts " name: #{platform.name}"
20
19
  puts " organization: #{current_organization}"
21
20
  puts " version: #{platform.version}"
21
+ puts " type: #{platform.hosted_type}"
22
22
  puts " state: #{platform.state}"
23
23
  puts " online: #{platform.online}"
24
24
  puts " region: #{platform.region || '-'}"
@@ -1,7 +1,7 @@
1
1
  module Kontena
2
2
  module Plugin
3
3
  module Cloud
4
- VERSION = "1.2.0.pre1"
4
+ VERSION = "1.2.0.pre2"
5
5
 
6
6
  module Organization
7
7
  module User; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kontena-plugin-cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.pre1
4
+ version: 1.2.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-27 00:00:00.000000000 Z
11
+ date: 2017-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kontena-cli
@@ -78,6 +78,8 @@ files:
78
78
  - lib/kontena/plugin/cloud/node/common.rb
79
79
  - lib/kontena/plugin/cloud/node/create_command.rb
80
80
  - lib/kontena/plugin/cloud/node/list_command.rb
81
+ - lib/kontena/plugin/cloud/node/platform_option.rb
82
+ - lib/kontena/plugin/cloud/node/reboot_command.rb
81
83
  - lib/kontena/plugin/cloud/node/shell_command.rb
82
84
  - lib/kontena/plugin/cloud/node/terminate_command.rb
83
85
  - lib/kontena/plugin/cloud/node_command.rb
@@ -133,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
135
  version: 1.3.1
134
136
  requirements: []
135
137
  rubyforge_project:
136
- rubygems_version: 2.6.14
138
+ rubygems_version: 2.7.1
137
139
  signing_key:
138
140
  specification_version: 4
139
141
  summary: Kontena Cloud management for Kontena CLI