kontena-cli 0.0.1
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 +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +191 -0
- data/README.md +40 -0
- data/Rakefile +2 -0
- data/bin/kontena +14 -0
- data/kontena-cli.gemspec +27 -0
- data/lib/kontena/cli/commands.rb +19 -0
- data/lib/kontena/cli/common.rb +83 -0
- data/lib/kontena/cli/containers/commands.rb +12 -0
- data/lib/kontena/cli/containers/containers.rb +17 -0
- data/lib/kontena/cli/grids/audit_log.rb +20 -0
- data/lib/kontena/cli/grids/commands.rb +89 -0
- data/lib/kontena/cli/grids/grids.rb +105 -0
- data/lib/kontena/cli/grids/users.rb +32 -0
- data/lib/kontena/cli/nodes/commands.rb +27 -0
- data/lib/kontena/cli/nodes/nodes.rb +61 -0
- data/lib/kontena/cli/server/commands.rb +92 -0
- data/lib/kontena/cli/server/server.rb +45 -0
- data/lib/kontena/cli/server/user.rb +111 -0
- data/lib/kontena/cli/services/commands.rb +131 -0
- data/lib/kontena/cli/services/containers.rb +24 -0
- data/lib/kontena/cli/services/logs.rb +26 -0
- data/lib/kontena/cli/services/services.rb +196 -0
- data/lib/kontena/cli/services/stats.rb +79 -0
- data/lib/kontena/cli/version.rb +5 -0
- data/lib/kontena/client.rb +177 -0
- data/lib/kontena/errors.rb +11 -0
- metadata +157 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'kontena/client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Grids
|
5
|
+
class AuditLog
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
def show(options)
|
9
|
+
require_api_url
|
10
|
+
require_current_grid
|
11
|
+
token = require_token
|
12
|
+
audit_logs = client(token).get("grids/#{current_grid}/audit_log", {limit: options.limit})
|
13
|
+
puts '%-30.30s %-10s %-15s %-25s %-15s %-25s %-15s %-15s' % ['Time', 'Grid', 'Resource Type', 'Resource Name', 'Event Name', 'User', 'Source IP', 'User-Agent']
|
14
|
+
audit_logs['logs'].each do |log|
|
15
|
+
puts '%-30.30s %-10s %-15s %-25s %-15s %-25s %-15s %-15s' % [ log['time'], log['grid'], log['resource_type'], log['resource_name'], log['event_name'], log['user_identity']['email'], log['source_ip'], log['user_agent']]
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Kontena::Cli::Grids; end;
|
2
|
+
|
3
|
+
require_relative 'grids'
|
4
|
+
require_relative 'users'
|
5
|
+
require_relative 'audit_log'
|
6
|
+
|
7
|
+
|
8
|
+
command 'grid list' do |c|
|
9
|
+
c.syntax = 'kontena grid list'
|
10
|
+
c.description = 'List all grids'
|
11
|
+
c.action do |args, options|
|
12
|
+
Kontena::Cli::Grids::Grids.new.list
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
command 'grid use' do |c|
|
17
|
+
c.syntax = 'kontena grid use <name>'
|
18
|
+
c.description = 'Switch to use specific grid'
|
19
|
+
c.action do |args, options|
|
20
|
+
raise ArgumentError.new('grid name is required. For a list of existing grids please run: kontena grid list') if args[0].nil?
|
21
|
+
Kontena::Cli::Grids::Grids.new.use(args[0])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
command 'grid show' do |c|
|
26
|
+
c.syntax = 'kontena grid show <name>'
|
27
|
+
c.description = 'Show grid details'
|
28
|
+
c.action do |args, options|
|
29
|
+
raise ArgumentError.new('grid name is required. For a list of existing grids please run: kontena grid list') if args[0].nil?
|
30
|
+
Kontena::Cli::Grids::Grids.new.show(args[0])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
command 'grid current' do |c|
|
35
|
+
c.syntax = 'kontena grid current'
|
36
|
+
c.description = 'Show current grid details'
|
37
|
+
c.action do |args, options|
|
38
|
+
Kontena::Cli::Grids::Grids.new.current
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
command 'grid audit-log' do |c|
|
43
|
+
c.syntax = 'kontena grid audit-log'
|
44
|
+
c.description = 'Show audit log of the current grid'
|
45
|
+
c.option '-l', '--limit INTEGER', Integer, 'Number of lines'
|
46
|
+
c.action do |args, options|
|
47
|
+
Kontena::Cli::Grids::AuditLog.new.show(options)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
command 'grid create' do |c|
|
52
|
+
c.syntax = 'kontena grid create <name>'
|
53
|
+
c.description = 'Create a new grid'
|
54
|
+
c.action do |args, options|
|
55
|
+
Kontena::Cli::Grids::Grids.new.create(args[0])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
command 'grid remove' do |c|
|
60
|
+
c.syntax = 'kontena grid remove <name>'
|
61
|
+
c.description = 'Removes grid'
|
62
|
+
c.action do |args, options|
|
63
|
+
Kontena::Cli::Platform::Grids.new.destroy(args[0])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
command 'grid list-users' do |c|
|
68
|
+
c.syntax = 'kontena grid list-users'
|
69
|
+
c.description = 'Show grid users'
|
70
|
+
c.action do |args, options|
|
71
|
+
Kontena::Cli::Grids::Users.new.list
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
command 'grid add-user' do |c|
|
76
|
+
c.syntax = 'kontena grid add-user <email>'
|
77
|
+
c.description = 'Assign user to grid'
|
78
|
+
c.action do |args, options|
|
79
|
+
Kontena::Cli::Grids::Users.new.add(args[0])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
command 'grid remove-user' do |c|
|
84
|
+
c.syntax = 'kontena grid remove-user <email>'
|
85
|
+
c.description = 'Unassign user from grid'
|
86
|
+
c.action do |args, options|
|
87
|
+
Kontena::Cli::Grids::Users.new.remove(args[0])
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'kontena/client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Grids
|
5
|
+
class Grids
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
def list
|
9
|
+
require_api_url
|
10
|
+
|
11
|
+
if grids['grids'].size == 0
|
12
|
+
print color("You don't have any grids yet. Create first one with 'kontena grids create' command", :yellow)
|
13
|
+
end
|
14
|
+
|
15
|
+
puts '%-30.30s %-10s %-10s %-10s' % ['Name', 'Nodes', 'Containers', 'Users']
|
16
|
+
grids['grids'].each do |grid|
|
17
|
+
if grid['id'] == current_grid
|
18
|
+
name = "#{grid['name']} *"
|
19
|
+
else
|
20
|
+
name = grid['name']
|
21
|
+
end
|
22
|
+
puts '%-30.30s %-10s %-10s %-10s' % [name, grid['nodeCount'], grid['containerCount'], grid['userCount']]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def use(name)
|
27
|
+
require_api_url
|
28
|
+
|
29
|
+
grid = find_grid_by_name(name)
|
30
|
+
if !grid.nil?
|
31
|
+
self.current_grid = grid
|
32
|
+
print color("Using #{grid['name']}", :green)
|
33
|
+
else
|
34
|
+
print color('Could not resolve grid by name. For a list of existing grids please run: kontena grid list', :red)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def show(name)
|
40
|
+
require_api_url
|
41
|
+
|
42
|
+
grid = find_grid_by_name(name)
|
43
|
+
print_grid(grid)
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
def current
|
48
|
+
require_api_url
|
49
|
+
if current_grid.nil?
|
50
|
+
puts 'No grid selected. To select grid, please run: kontena use <grid name>'
|
51
|
+
|
52
|
+
else
|
53
|
+
grid = client(require_token).get("grids/#{current_grid}")
|
54
|
+
print_grid(grid)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create(name=nil)
|
59
|
+
require_api_url
|
60
|
+
|
61
|
+
token = require_token
|
62
|
+
payload = {
|
63
|
+
name: name
|
64
|
+
}
|
65
|
+
grid = client(token).post('grids', payload)
|
66
|
+
puts "created #{grid['name']} (#{grid['id']})" if grid
|
67
|
+
end
|
68
|
+
|
69
|
+
def destroy(name)
|
70
|
+
require_api_url
|
71
|
+
|
72
|
+
grid = find_grid_by_name(name)
|
73
|
+
|
74
|
+
if !grid.nil?
|
75
|
+
response = client(token).delete("grids/#{grid['id']}")
|
76
|
+
if response
|
77
|
+
clear_current_grid if grid['id'] == current_grid
|
78
|
+
puts "removed #{grid['name']} (#{grid['id']})"
|
79
|
+
end
|
80
|
+
else
|
81
|
+
print color('Could not resolve grid by name. For a list of existing grids please run: kontena grid list', :red)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
##
|
88
|
+
# @param [Hash] grid
|
89
|
+
def print_grid(grid)
|
90
|
+
puts "#{grid['name']}:"
|
91
|
+
puts " token: #{grid['token']}"
|
92
|
+
puts " users: #{grid['userCount']}"
|
93
|
+
puts " nodes: #{grid['nodeCount']}"
|
94
|
+
puts " containers: #{grid['containerCount']}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def grids
|
98
|
+
@grids ||= client(require_token).get('grids')
|
99
|
+
end
|
100
|
+
|
101
|
+
def find_grid_by_name(name)
|
102
|
+
grids['grids'].find {|grid| grid['name'] == name }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'kontena/client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Grids
|
5
|
+
class Users
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
def add(email)
|
9
|
+
require_api_url
|
10
|
+
token = require_token
|
11
|
+
data = { email: email }
|
12
|
+
client(token).post("grids/#{current_grid}/users", data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def remove(email)
|
16
|
+
require_api_url
|
17
|
+
token = require_token
|
18
|
+
result = client(token).delete("grids/#{current_grid}/users/#{email}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def list
|
22
|
+
require_api_url
|
23
|
+
token = require_token
|
24
|
+
result = client(token).get("grids/#{current_grid}/users")
|
25
|
+
puts "%-40s %-40s" % ['Email', 'Name']
|
26
|
+
result['users'].each { |user|
|
27
|
+
puts "%-40.40s %-40.40s" % [user['email'], user['name']]
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Kontena::Cli::Nodes; end;
|
2
|
+
|
3
|
+
require_relative 'nodes'
|
4
|
+
|
5
|
+
command 'node list' do |c|
|
6
|
+
c.syntax = 'kontena node list'
|
7
|
+
c.description = 'List all nodes'
|
8
|
+
c.action do |args, options|
|
9
|
+
Kontena::Cli::Nodes::Nodes.new.list
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
command 'node show' do |c|
|
14
|
+
c.syntax = 'kontena node show'
|
15
|
+
c.description = 'Show node details'
|
16
|
+
c.action do |args, options|
|
17
|
+
Kontena::Cli::Nodes::Nodes.new.show(args[0])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
command 'node remove' do |c|
|
22
|
+
c.syntax = 'kontena node remove'
|
23
|
+
c.description = 'Remove node'
|
24
|
+
c.action do |args, options|
|
25
|
+
Kontena::Cli::Nodes::Nodes.new.destroy(args[0])
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'kontena/client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Nodes
|
5
|
+
class Nodes
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
def list
|
9
|
+
require_api_url
|
10
|
+
require_current_grid
|
11
|
+
token = require_token
|
12
|
+
|
13
|
+
grids = client(token).get("grids/#{current_grid}/nodes")
|
14
|
+
puts "%-20s %-20s %-10s %-20s %-10s" % ['Name', 'OS', 'Driver', 'Labels', 'Status']
|
15
|
+
grids['nodes'].each do |node|
|
16
|
+
if node['connected']
|
17
|
+
status = 'online'
|
18
|
+
else
|
19
|
+
status = 'offline'
|
20
|
+
end
|
21
|
+
puts "%-20.20s %-20.20s %-10s %-20.20s %-10s" % [
|
22
|
+
node['name'],
|
23
|
+
node['os'],
|
24
|
+
node['driver'],
|
25
|
+
(node['labels'] || ['-']).join(","),
|
26
|
+
status
|
27
|
+
]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def show(id)
|
32
|
+
require_api_url
|
33
|
+
require_current_grid
|
34
|
+
token = require_token
|
35
|
+
|
36
|
+
node = client(token).get("grids/#{current_grid}/nodes/#{id}")
|
37
|
+
puts "#{node['name']}:"
|
38
|
+
puts " id: #{node['id']}"
|
39
|
+
puts " connected: #{node['connected'] ? 'yes': 'no'}"
|
40
|
+
puts " last connect: #{node['updated_at']}"
|
41
|
+
puts " os: #{node['os']}"
|
42
|
+
puts " driver: #{node['driver']}"
|
43
|
+
puts " kernel: #{node['kernel_version']}"
|
44
|
+
puts " cpus: #{node['cpus']}"
|
45
|
+
puts " memory: #{node['mem_total'] / 1024 / 1024}M"
|
46
|
+
puts " labels:"
|
47
|
+
if node['labels']
|
48
|
+
node['labels'].each{|l| puts " - #{l}"}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def destroy(id)
|
53
|
+
require_api_url
|
54
|
+
require_current_grid
|
55
|
+
token = require_token
|
56
|
+
|
57
|
+
node = client(token).delete("grids/#{current_grid}/nodes/#{id}")
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Kontena::Cli::Server; end;
|
2
|
+
|
3
|
+
require_relative 'server'
|
4
|
+
require_relative 'user'
|
5
|
+
|
6
|
+
command 'connect' do |c|
|
7
|
+
c.syntax = 'kontena connect <url>'
|
8
|
+
c.description = 'Connect to Kontena server'
|
9
|
+
c.action do |args, options|
|
10
|
+
Kontena::Cli::Server::Server.new.connect(args[0], options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
command 'disconnect' do |c|
|
15
|
+
c.syntax = 'kontena disconnect'
|
16
|
+
c.description = 'Disconnect from Kontena server'
|
17
|
+
c.action do |args, options|
|
18
|
+
Kontena::Cli::Server::Server.new.disconnect
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
command 'login' do |c|
|
23
|
+
c.syntax = 'kontena login'
|
24
|
+
c.description = 'Login to Kontena server'
|
25
|
+
c.action do |args, options|
|
26
|
+
Kontena::Cli::Server::User.new.login
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
command 'logout' do |c|
|
31
|
+
c.syntax = 'kontena logout'
|
32
|
+
c.description = 'Logout from Kontena server'
|
33
|
+
c.action do |args, options|
|
34
|
+
Kontena::Cli::Server::User.new.logout
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
command 'whoami' do |c|
|
39
|
+
c.syntax = 'kontena whoami'
|
40
|
+
c.description = 'Display your Kontena email address and server url'
|
41
|
+
c.action do |args, options|
|
42
|
+
Kontena::Cli::Server::User.new.whoami
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
command 'register' do |c|
|
47
|
+
c.syntax = 'kontena register'
|
48
|
+
c.description = 'Register to Kontena.io'
|
49
|
+
c.action do |args, options|
|
50
|
+
Kontena::Cli::Server::User.new.register
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
command 'verify account' do |c|
|
55
|
+
c.syntax = 'kontena verify account <token>'
|
56
|
+
c.description = 'Verify Kontena.io account'
|
57
|
+
c.action do |args, options|
|
58
|
+
Kontena::Cli::Server::User.new.verify_account(args[0])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
command 'invite' do |c|
|
63
|
+
c.syntax = 'kontena invite <email>'
|
64
|
+
c.description = 'Invite user to Kontena server'
|
65
|
+
c.action do |args, options|
|
66
|
+
Kontena::Cli::Server::User.new.invite(args[0])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
command 'forgot password' do |c|
|
71
|
+
c.syntax = 'kontena forgot password <email>'
|
72
|
+
c.description = 'Request password reset for Kontena account'
|
73
|
+
c.action do |args, options|
|
74
|
+
Kontena::Cli::Server::User.new.request_password_reset(args[0])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
command 'reset password' do |c|
|
79
|
+
c.syntax = 'kontena reset password <token>'
|
80
|
+
c.description = 'Reset Kontena password'
|
81
|
+
c.action do |args, options|
|
82
|
+
Kontena::Cli::Server::User.new.reset_password(args[0])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
command 'registry add' do |c|
|
87
|
+
c.syntax = 'kontena registry add'
|
88
|
+
c.description = 'Add registry information'
|
89
|
+
c.action do |args, options|
|
90
|
+
Kontena::Cli::Server::User.new.add_registry
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'kontena/client'
|
2
|
+
require_relative '../common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Server
|
5
|
+
class Server
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
def connect(api_url = nil, options)
|
9
|
+
until !api_url.nil? && !api_url.empty?
|
10
|
+
api_url = ask('Kontena server url: ')
|
11
|
+
end
|
12
|
+
inifile['server']['url'] = api_url
|
13
|
+
inifile.save(filename: ini_filename)
|
14
|
+
|
15
|
+
sleep 0.1
|
16
|
+
if client.get('ping') # test server connection
|
17
|
+
display_logo
|
18
|
+
else
|
19
|
+
print color('Could not connect to server', :red)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def disconnect
|
25
|
+
inifile['server'].delete('url')
|
26
|
+
inifile.save(filename: ini_filename)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def display_logo
|
31
|
+
logo = <<LOGO
|
32
|
+
_ _
|
33
|
+
| | _____ _ __ | |_ ___ _ __ __ _
|
34
|
+
| |/ / _ \\| '_ \\| __/ _ \\ '_ \\ / _` |
|
35
|
+
| < (_) | | | | || __/ | | | (_| |
|
36
|
+
|_|\\_\\___/|_| |_|\\__\\___|_| |_|\\__,_|
|
37
|
+
-------------------------------------
|
38
|
+
Copyright (c)2015 Kontena, Inc.
|
39
|
+
|
40
|
+
LOGO
|
41
|
+
puts logo
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|