kontena-cli 1.2.0.pre1 → 1.2.0.pre2

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/kontena/callback.rb +2 -2
  4. data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +1 -1
  5. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +6 -6
  6. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +1 -1
  7. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +1 -1
  8. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +1 -1
  9. data/lib/kontena/cli/apps/common.rb +6 -6
  10. data/lib/kontena/cli/apps/yaml/reader.rb +2 -2
  11. data/lib/kontena/cli/cloud/login_command.rb +4 -4
  12. data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
  13. data/lib/kontena/cli/common.rb +5 -5
  14. data/lib/kontena/cli/config.rb +8 -8
  15. data/lib/kontena/cli/containers/exec_command.rb +1 -1
  16. data/lib/kontena/cli/localhost_web_server.rb +3 -3
  17. data/lib/kontena/cli/master/{users → user}/invite_command.rb +5 -5
  18. data/lib/kontena/cli/master/{users → user}/list_command.rb +1 -1
  19. data/lib/kontena/cli/master/{users → user}/remove_command.rb +3 -4
  20. data/lib/kontena/cli/master/{users/roles → user/role}/add_command.rb +4 -4
  21. data/lib/kontena/cli/master/{users/roles → user/role}/remove_command.rb +3 -4
  22. data/lib/kontena/cli/master/{users → user}/role_command.rb +3 -5
  23. data/lib/kontena/cli/master/user_command.rb +11 -0
  24. data/lib/kontena/cli/master/users_command.rb +8 -5
  25. data/lib/kontena/cli/master_command.rb +2 -1
  26. data/lib/kontena/cli/nodes/show_command.rb +3 -1
  27. data/lib/kontena/cli/plugins/install_command.rb +4 -4
  28. data/lib/kontena/cli/plugins/uninstall_command.rb +3 -2
  29. data/lib/kontena/cli/services/services_helper.rb +31 -9
  30. data/lib/kontena/cli/spinner.rb +4 -8
  31. data/lib/kontena/cli/stacks/build_command.rb +3 -1
  32. data/lib/kontena/cli/stacks/common.rb +44 -37
  33. data/lib/kontena/cli/stacks/install_command.rb +2 -2
  34. data/lib/kontena/cli/stacks/upgrade_command.rb +3 -1
  35. data/lib/kontena/cli/stacks/validate_command.rb +12 -10
  36. data/lib/kontena/cli/stacks/yaml/opto/service_instances_resolver.rb +1 -0
  37. data/lib/kontena/cli/stacks/yaml/opto/service_link_resolver.rb +1 -0
  38. data/lib/kontena/cli/stacks/yaml/opto/vault_cert_prompt_resolver.rb +1 -0
  39. data/lib/kontena/cli/stacks/yaml/opto/vault_resolver.rb +4 -2
  40. data/lib/kontena/cli/stacks/yaml/opto/vault_setter.rb +4 -3
  41. data/lib/kontena/cli/stacks/yaml/reader.rb +30 -7
  42. data/lib/kontena/cli/stacks/yaml/validations.rb +10 -0
  43. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +88 -8
  44. data/lib/kontena/client.rb +14 -12
  45. data/lib/kontena/command.rb +10 -13
  46. data/lib/kontena/errors.rb +36 -0
  47. data/lib/kontena/plugin_manager.rb +8 -10
  48. data/lib/kontena/stacks_cache.rb +1 -1
  49. data/lib/kontena_cli.rb +5 -5
  50. data/spec/fixtures/stack-with-volumes.yml +33 -0
  51. data/spec/kontena/cli/master/{users → user}/invite_command_spec.rb +3 -3
  52. data/spec/kontena/cli/master/{users → user}/remove_command_spec.rb +3 -3
  53. data/spec/kontena/cli/master/{users/roles → user/role}/add_command_spec.rb +3 -3
  54. data/spec/kontena/cli/master/{users/roles → user/role}/remove_command_spec.rb +3 -3
  55. data/spec/kontena/cli/stacks/build_command_spec.rb +2 -2
  56. data/spec/kontena/cli/stacks/install_command_spec.rb +3 -3
  57. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +6 -6
  58. data/spec/kontena/cli/stacks/yaml/opto/service_link_resolver_spec.rb +5 -0
  59. data/spec/kontena/cli/stacks/yaml/opto/vault_cert_prompt_resolver_spec.rb +6 -0
  60. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +4 -2
  61. data/spec/kontena/client_spec.rb +19 -1
  62. data/spec/spec_helper.rb +2 -0
  63. metadata +19 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f03d83329e4ddcebc48f226b38df3d4eb9b6f96f
4
- data.tar.gz: 451423d5bc02c8c01a18170cbb665a455d26a3d2
3
+ metadata.gz: fc1d241dbb42a8927a437e28fee00aba525bea78
4
+ data.tar.gz: f12240579934c0bad6f3d441c2744f0f5e9a5f8d
5
5
  SHA512:
6
- metadata.gz: 24c1bd893acbaf99a21795710024e0673e79e0685f83f3478f6a708568c2f12f440f6caa463068406a22de4f232de2e6120017ca64334e8fc7dd7977932df3a1
7
- data.tar.gz: c56ff810d3d4809d2c9d8c3c705389a0c801baf407290e89ec8ee718f3ef04b2d87112122eb379c498032da63994ee0b3f58cb609f24f45105ceeaca994819bf
6
+ metadata.gz: 5137972ce9856d048eb8e972f8e20bea52c75a014e04f12a2d34290e870830c2d321fd8a2f264243f65aa12ab8446e3b6b2d1fe8cca5b8b036db947789e4d96b
7
+ data.tar.gz: 064fbf5dc12b11581a36b83ccd96fc961a23fdc5decb1995c1dd15cc8d2793ade68c060eb05dc87e38da4ff1d5f2f3332ac397c01333d0e057729fa06deb4ae1
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0.pre1
1
+ 1.2.0.pre2
@@ -9,7 +9,7 @@ class Kontena::Callback
9
9
  # Register callback for command types it is supposed to run with.
10
10
  def self.matches_commands(*commands)
11
11
  cmd_types = {}
12
-
12
+
13
13
  commands.each do |cmd|
14
14
  cmd_class, cmd_type = cmd.split(' ', 2)
15
15
 
@@ -44,7 +44,7 @@ class Kontena::Callback
44
44
  if klass.instance_methods.include?(state)
45
45
  cb = klass.new(obj)
46
46
  if cb.send(state).kind_of?(FalseClass)
47
- ENV["DEBUG"] && STDERR.puts("Execution aborted by #{klass}")
47
+ ENV["DEBUG"] && $stderr.puts("Execution aborted by #{klass}")
48
48
  exit 1
49
49
  end
50
50
  end
@@ -10,7 +10,7 @@ module Kontena
10
10
  return unless command.exit_code == 0
11
11
  return unless config.current_master
12
12
 
13
- ENV["DEBUG"] && STDERR.puts("Removing current master from config")
13
+ ENV["DEBUG"] && $stderr.puts("Removing current master from config")
14
14
  config.servers.delete_at(config.find_server_index(config.current_master.name))
15
15
  config.current_server = nil
16
16
  config.write
@@ -8,8 +8,8 @@ module Kontena
8
8
  matches_commands 'master create'
9
9
 
10
10
  def after
11
- ENV["DEBUG"] && STDERR.puts("Command result: #{command.result.inspect}")
12
- ENV["DEBUG"] && STDERR.puts("Command exit code: #{command.exit_code.inspect}")
11
+ ENV["DEBUG"] && $stderr.puts("Command result: #{command.result.inspect}")
12
+ ENV["DEBUG"] && $stderr.puts("Command exit code: #{command.exit_code.inspect}")
13
13
  return unless command.exit_code == 0
14
14
  return unless command.result.kind_of?(Hash)
15
15
  return unless command.result.has_key?(:public_ip)
@@ -35,11 +35,11 @@ module Kontena
35
35
 
36
36
  # Figure out if HTTPS works, if not, try HTTP
37
37
  begin
38
- ENV["DEBUG"] && STDERR.puts("Trying to request / from #{new_master.url}")
38
+ ENV["DEBUG"] && $stderr.puts("Trying to request / from #{new_master.url}")
39
39
  client = Kontena::Client.new(new_master.url, nil, ignore_ssl_errors: true)
40
40
  client.get('/')
41
- rescue
42
- ENV["DEBUG"] && STDERR.puts("HTTPS test failed: #{$!} #{$!.message}")
41
+ rescue => ex
42
+ ENV["DEBUG"] && $stderr.puts("HTTPS test failed: #{ex.class.name} #{ex.message}")
43
43
  unless retried
44
44
  new_master.url = "http://#{command.result[:public_ip]}"
45
45
  retried = true
@@ -51,7 +51,7 @@ module Kontena
51
51
  require 'shellwords'
52
52
  cmd = "master login --no-login-info --skip-grid-auto-select --verbose --name #{command.result[:name].shellescape} --code #{command.result[:code].shellescape} #{new_master.url.shellescape}"
53
53
  Retriable.retriable do
54
- ENV["DEBUG"] && STDERR.puts("Running: #{cmd}")
54
+ ENV["DEBUG"] && $stderr.puts("Running: #{cmd}")
55
55
  Kontena.run(cmd)
56
56
  end
57
57
  end
@@ -12,7 +12,7 @@ module Kontena
12
12
  return unless config.current_master.name == command.result[:name]
13
13
 
14
14
  cmd = "grid create --silent test"
15
- ENV["DEBUG"] && STDERR.puts("Running: #{cmd}")
15
+ ENV["DEBUG"] && $stderr.puts("Running: #{cmd}")
16
16
  Retriable.retriable do
17
17
  Kontena.run(cmd)
18
18
  end
@@ -39,7 +39,7 @@ module Kontena
39
39
  end
40
40
 
41
41
  return nil unless invite_response
42
- ENV["DEBUG"] && STDERR.puts("Got invite code: #{invite_response['invite_code']}")
42
+ ENV["DEBUG"] && $stderr.puts("Got invite code: #{invite_response['invite_code']}")
43
43
 
44
44
  role_status = nil
45
45
 
@@ -22,7 +22,7 @@ module Kontena
22
22
  puts
23
23
  end
24
24
  puts " To invite more users you can use:"
25
- puts " #{Kontena.pastel.green.on_black(" kontena master users invite email_address@example.com ")}"
25
+ puts " #{Kontena.pastel.green.on_black(" kontena master user invite email_address@example.com ")}"
26
26
  puts
27
27
  puts " The users can then join the master by using the invite code: "
28
28
  puts " #{Kontena.pastel.green.on_black(" kontena master join #{current_master.url} <invite_code> ")}"
@@ -108,15 +108,15 @@ module Kontena::Cli::Apps
108
108
  def display_notifications(messages, color = :yellow)
109
109
  messages.each do |files|
110
110
  files.each do |file, services|
111
- STDERR.puts "#{file}:".colorize(color)
111
+ $stderr.puts "#{file}:".colorize(color)
112
112
  services.each do |service|
113
113
  service.each do |name, errors|
114
- STDERR.puts " #{name}:".colorize(color)
114
+ $stderr.puts " #{name}:".colorize(color)
115
115
  if errors.is_a?(String)
116
- STDERR.puts " - #{errors}".colorize(color)
116
+ $stderr.puts " - #{errors}".colorize(color)
117
117
  else
118
118
  errors.each do |key, error|
119
- STDERR.puts " - #{key}: #{error.to_json}".colorize(color)
119
+ $stderr.puts " - #{key}: #{error.to_json}".colorize(color)
120
120
  end
121
121
  end
122
122
  end
@@ -126,12 +126,12 @@ module Kontena::Cli::Apps
126
126
  end
127
127
 
128
128
  def hint_on_validation_notifications(errors)
129
- STDERR.puts "YAML contains the following unsupported options and they were rejected:".colorize(:yellow)
129
+ $stderr.puts "YAML contains the following unsupported options and they were rejected:".colorize(:yellow)
130
130
  display_notifications(errors)
131
131
  end
132
132
 
133
133
  def abort_on_validation_errors(errors)
134
- STDERR.puts "YAML validation failed! Aborting.".colorize(:red)
134
+ $stderr.puts "YAML validation failed! Aborting.".colorize(:red)
135
135
  display_notifications(errors, :red)
136
136
  abort
137
137
  end
@@ -53,8 +53,8 @@ module Kontena::Cli::Apps
53
53
  replace_dollar_dollars(content)
54
54
  begin
55
55
  @yaml = ::YAML.safe_load(content)
56
- rescue Psych::SyntaxError => e
57
- raise "Error while parsing #{file}".colorize(:red)+ " "+e.message
56
+ rescue Psych::SyntaxError => ex
57
+ raise ex.class, "Error while parsing #{file} : #{ex.message}"
58
58
  end
59
59
  end
60
60
 
@@ -52,10 +52,10 @@ module Kontena::Cli::Cloud
52
52
 
53
53
  def web_flow
54
54
  if Kontena.browserless? && !force?
55
- STDERR.puts "Your current environment does not seem to support opening a local graphical WWW browser."
56
- STDERR.puts
57
- STDERR.puts "You can perorm a login on another computer, copy the token and use it with 'kontena cloud login --token <token>'."
58
- STDERR.puts "There will be an easier way to log in from a browserless environment soon."
55
+ $stderr.puts "Your current environment does not seem to support opening a local graphical WWW browser."
56
+ $stderr.puts
57
+ $stderr.puts "You can perorm a login on another computer, copy the token and use it with 'kontena cloud login --token <token>'."
58
+ $stderr.puts "There will be an easier way to log in from a browserless environment soon."
59
59
  exit_with_error 'Unable to launch a web browser'
60
60
  end
61
61
 
@@ -84,7 +84,7 @@ module Kontena::Cli::Cloud::Master
84
84
  puts " Cloud than the one they currently have as their username in the"
85
85
  puts " master will not be able to authenticate before an administrator"
86
86
  puts " of the Kontena Master creates an invitation code for them"
87
- puts " (kontena master users invite old@email.example.com)"
87
+ puts " (kontena master user invite old@email.example.com)"
88
88
  exit_with_error "Aborted" unless prompt.yes?("Proceed?")
89
89
  end
90
90
 
@@ -12,7 +12,7 @@ module Kontena
12
12
 
13
13
  def logger
14
14
  return @logger if @logger
15
- @logger = Logger.new(ENV["DEBUG"] ? STDERR : STDOUT)
15
+ @logger = Logger.new(ENV["DEBUG"] ? $stderr : $stdout)
16
16
  @logger.level = ENV["DEBUG"].nil? ? Logger::INFO : Logger::DEBUG
17
17
  @logger.progname = 'COMMON'
18
18
  @logger
@@ -131,8 +131,8 @@ module Kontena
131
131
  client = Kontena::Client.new(server.url, server.token)
132
132
  logger.debug "Trying to invalidate refresh token on #{server.name}"
133
133
  client.refresh_token
134
- rescue
135
- logger.debug "Refreshing failed: #{$!} : #{$!.message}"
134
+ rescue => ex
135
+ logger.debug "Refreshing failed: #{ex.class.name} : #{ex.message}"
136
136
  end
137
137
 
138
138
  def require_current_master
@@ -289,7 +289,7 @@ module Kontena
289
289
  msg = "Press any key to continue or ctrl-c to cancel.. (Automatically continuing in ? seconds)"
290
290
 
291
291
  reader_thread = Thread.new do
292
- Thread.main['any_key.char'] = STDIN.getch
292
+ Thread.main['any_key.char'] = $stdin.getch
293
293
  end
294
294
 
295
295
  countdown_thread = Thread.new do
@@ -316,7 +316,7 @@ module Kontena
316
316
  return any_key_to_continue_with_timeout(timeout) if timeout
317
317
  msg = "Press any key to continue or ctrl-c to cancel.. "
318
318
  print pastel.bright_cyan("#{msg}")
319
- char = STDIN.getch
319
+ char = $stdin.getch
320
320
  print "\r#{' ' * msg.length}\r"
321
321
  if char == "\u0003"
322
322
  error "Canceled"
@@ -22,11 +22,11 @@ module Kontena
22
22
  self
23
23
  end
24
24
 
25
- class TokenExpiredError < StandardError; end
25
+ TokenExpiredError = Class.new(StandardError)
26
26
 
27
27
  def initialize
28
28
  super
29
- @logger = Logger.new(ENV["DEBUG"] ? STDERR : STDOUT)
29
+ @logger = Logger.new(ENV["DEBUG"] ? $stderr : $stdout)
30
30
  @logger.level = ENV["DEBUG"].nil? ? Logger::INFO : Logger::DEBUG
31
31
  @logger.progname = 'CONFIG'
32
32
  load_settings_from_env || load_settings_from_config_file
@@ -41,7 +41,7 @@ module Kontena
41
41
  return nil unless ENV['KONTENA_URL']
42
42
  logger.debug 'Loading configuration from ENV'
43
43
  servers << Server.new(
44
- url: ENV['KONTENA_URL'],
44
+ url: ENV['KONTENA_URL'],
45
45
  name: 'default',
46
46
  token: Token.new(access_token: ENV['KONTENA_TOKEN'], parent_type: :master, parent_name: 'default'),
47
47
  grid: ENV['KONTENA_GRID'],
@@ -172,7 +172,7 @@ module Kontena
172
172
  logger.debug "Migrating from legacy style configuration"
173
173
  {
174
174
  'current_server' => 'default',
175
- 'servers' => [
175
+ 'servers' => [
176
176
  settings['server'].merge(
177
177
  'name' => 'default',
178
178
  'account' => 'kontena'
@@ -303,7 +303,7 @@ module Kontena
303
303
  def require_current_master_token
304
304
  require_current_master
305
305
  token = current_master.token
306
- if token && token.access_token
306
+ if token && token.access_token
307
307
  return token unless token.expired?
308
308
  raise TokenExpiredError, "The access token has expired and needs to be refreshed."
309
309
  end
@@ -364,7 +364,7 @@ module Kontena
364
364
  raise ArgumentError, "You have not selected a grid. Use: kontena grid"
365
365
  end
366
366
 
367
- # Name of the currently selected grid. Can override using
367
+ # Name of the currently selected grid. Can override using
368
368
  # KONTENA_GRID environment variable.
369
369
  #
370
370
  # @return [String, NilClass]
@@ -433,7 +433,7 @@ module Kontena
433
433
  JSON.pretty_generate(to_hash)
434
434
  end
435
435
 
436
- # Write the current configuration to config file.
436
+ # Write the current configuration to config file.
437
437
  # Does nothing if using settings from environment variables.
438
438
  def write
439
439
  return nil if ENV['KONTENA_URL']
@@ -518,7 +518,7 @@ module Kontena
518
518
  def account
519
519
  return @account if @account
520
520
  return config.find_account('master') unless parent
521
- @account =
521
+ @account =
522
522
  case parent_type
523
523
  when :master then config.find_account(parent.account)
524
524
  when :account then parent
@@ -16,7 +16,7 @@ module Kontena::Cli::Containers
16
16
  result = client(token).post("containers/#{current_grid}/#{container_id}/exec", payload)
17
17
 
18
18
  puts result[0].join(" ") unless result[0].size == 0
19
- STDERR.puts result[1].join(" ") unless result[1].size == 0
19
+ $stderr.puts result[1].join(" ") unless result[1].size == 0
20
20
  exit result[2]
21
21
  end
22
22
  end
@@ -39,7 +39,7 @@ module Kontena
39
39
  #
40
40
  # @return [Hash] query_params
41
41
  def serve_one
42
- ENV["DEBUG"] && STDERR.puts("Waiting for connection on port #{port}..")
42
+ ENV["DEBUG"] && $stderr.puts("Waiting for connection on port #{port}..")
43
43
  socket = server.accept
44
44
 
45
45
  content = socket.recvfrom(2048).first.split(/(?:\r)?\n/)
@@ -56,7 +56,7 @@ module Kontena
56
56
 
57
57
  body = content.join("\n")
58
58
 
59
- ENV["DEBUG"] && STDERR.puts("Got request: \"#{request.inspect}\n Headers: #{headers.inspect}\n Body: #{body}\"")
59
+ ENV["DEBUG"] && $stderr.puts("Got request: \"#{request.inspect}\n Headers: #{headers.inspect}\n Body: #{body}\"")
60
60
 
61
61
  get_request = request[/GET (\/cb.+?) HTTP/, 1]
62
62
  if get_request
@@ -82,7 +82,7 @@ module Kontena
82
82
  socket.close
83
83
  server.close
84
84
  uri = URI.parse("http://localhost#{get_request}")
85
- ENV["DEBUG"] && STDERR.puts(" * Parsing params: \"#{uri.query}\"")
85
+ ENV["DEBUG"] && $stderr.puts(" * Parsing params: \"#{uri.query}\"")
86
86
  params = {}
87
87
  URI.decode_www_form(uri.query).each do |key, value|
88
88
  if value.to_s == ''
@@ -1,7 +1,7 @@
1
1
  require_relative '../../common'
2
- require_relative 'roles/add_command'
2
+ require_relative 'role/add_command'
3
3
 
4
- module Kontena::Cli::Master::Users
4
+ module Kontena::Cli::Master::User
5
5
  class InviteCommand < Kontena::Command
6
6
  include Kontena::Cli::Common
7
7
 
@@ -41,9 +41,9 @@ module Kontena::Cli::Master::Users
41
41
  roles.each do |role|
42
42
  Kontena.run("master users role add #{role.shellescape} #{email.shellescape}")
43
43
  end
44
- rescue
45
- STDERR.puts "Failed to invite #{email}".colorize(:red)
46
- ENV["DEBUG"] && STDERR.puts("#{$!} - #{$!.message} -- #{$!.backtrace}")
44
+ rescue => ex
45
+ $stderr.puts pastel.red("Failed to invite #{email}")
46
+ ENV["DEBUG"] && $stderr.puts("#{ex} : #{ex.message}\n#{ex.backtrace.join("\n ")}")
47
47
  end
48
48
  end
49
49
  end
@@ -1,6 +1,6 @@
1
1
  require_relative '../../common'
2
2
 
3
- module Kontena::Cli::Master::Users
3
+ module Kontena::Cli::Master::User
4
4
  class ListCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative '../../common'
2
2
 
3
- module Kontena::Cli::Master::Users
3
+ module Kontena::Cli::Master::User
4
4
  class RemoveCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
6
 
@@ -15,9 +15,8 @@ module Kontena::Cli::Master::Users
15
15
  email_list.each do |email|
16
16
  begin
17
17
  client(token).delete("users/#{email}")
18
- rescue => exc
19
- STDERR.puts "Failed to remove user #{email}".colorize(:red)
20
- STDERR.puts exc.message
18
+ rescue => ex
19
+ $stderr.puts pastel.red("Failed to remove user #{email} : #{ex.message}")
21
20
  end
22
21
  end
23
22
  end
@@ -1,7 +1,7 @@
1
1
  require_relative '../../../common'
2
2
 
3
- module Kontena::Cli::Master::Users
4
- module Roles
3
+ module Kontena::Cli::Master::User
4
+ module Role
5
5
  class AddCommand < Kontena::Command
6
6
  include Kontena::Cli::Common
7
7
 
@@ -19,8 +19,8 @@ module Kontena::Cli::Master::Users
19
19
  begin
20
20
  response = client(token).post("users/#{email}/roles", data)
21
21
  puts "Added role #{role} to #{email}" unless running_silent?
22
- rescue => exc
23
- abort "Failed to add role #{role} to #{email} : #{exc.message}".colorize(:red)
22
+ rescue => ex
23
+ abort pastel.red("Failed to add role #{role} to #{email} : #{ex.message}")
24
24
  end
25
25
  end
26
26
  end
@@ -1,6 +1,6 @@
1
1
  require_relative '../../../common'
2
2
 
3
- module Kontena::Cli::Master::Users::Roles
3
+ module Kontena::Cli::Master::User::Role
4
4
  class RemoveCommand < Kontena::Command
5
5
  include Kontena::Cli::Common
6
6
 
@@ -18,9 +18,8 @@ module Kontena::Cli::Master::Users::Roles
18
18
  begin
19
19
  response = client(token).delete("users/#{email}/roles/#{role}")
20
20
  puts "Removed role #{role} from #{email}" if response
21
- rescue => exc
22
- puts "Failed to remove role #{role} from #{email}".colorize(:red)
23
- puts exc.message
21
+ rescue => ex
22
+ $stderr.puts pastel.red("Failed to remove role #{role} from #{email} : #{ex.message}")
24
23
  end
25
24
  end
26
25
  end
@@ -1,8 +1,6 @@
1
- module Kontena::Cli::Master::Users
2
-
3
-
1
+ module Kontena::Cli::Master::User
4
2
  class RoleCommand < Kontena::Command
5
- subcommand "add", "Add role to user", load_subcommand('master/users/roles/add_command')
6
- subcommand ["remove", "rm"], "Remove role from user", load_subcommand('master/users/roles/remove_command')
3
+ subcommand "add", "Add role to user", load_subcommand('master/user/role/add_command')
4
+ subcommand ["remove", "rm"], "Remove role from user", load_subcommand('master/user/role/remove_command')
7
5
  end
8
6
  end
@@ -0,0 +1,11 @@
1
+ require 'kontena/cli/master/user_command'
2
+
3
+ module Kontena::Cli::Master
4
+ class UserCommand < Kontena::Command
5
+ subcommand "invite", "Invite user to Kontena Master", load_subcommand('master/user/invite_command')
6
+ subcommand ["remove", "rm"], "Remove user from Kontena Master", load_subcommand('master/user/remove_command')
7
+ subcommand ["list", "ls"], "List users", load_subcommand('master/user/list_command')
8
+ subcommand "role", "User role specific commands", load_subcommand('master/user/role_command')
9
+ end
10
+ end
11
+