kontena-cli 0.12.3 → 0.13.0

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/kontena +6 -4
  4. data/lib/kontena/cli/apps/common.rb +21 -7
  5. data/lib/kontena/cli/apps/deploy_command.rb +11 -4
  6. data/lib/kontena/cli/apps/docker_helper.rb +12 -0
  7. data/lib/kontena/cli/apps/logs_command.rb +0 -2
  8. data/lib/kontena/cli/apps/remove_command.rb +23 -14
  9. data/lib/kontena/cli/bytes_helper.rb +40 -0
  10. data/lib/kontena/cli/container_command.rb +0 -1
  11. data/lib/kontena/cli/grid_command.rb +4 -6
  12. data/lib/kontena/cli/grids/logs_command.rb +0 -2
  13. data/lib/kontena/cli/grids/trusted_subnet_command.rb +12 -0
  14. data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +16 -0
  15. data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +17 -0
  16. data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +20 -0
  17. data/lib/kontena/cli/grids/user_command.rb +12 -0
  18. data/lib/kontena/cli/grids/{add_user_command.rb → users/add_command.rb} +4 -4
  19. data/lib/kontena/cli/grids/{list_users_command.rb → users/list_command.rb} +4 -4
  20. data/lib/kontena/cli/grids/{remove_user_command.rb → users/remove_command.rb} +4 -4
  21. data/lib/kontena/cli/login_command.rb +4 -3
  22. data/lib/kontena/cli/master/aws/create_command.rb +3 -1
  23. data/lib/kontena/cli/master/current_command.rb +17 -0
  24. data/lib/kontena/cli/master/digital_ocean/create_command.rb +5 -3
  25. data/lib/kontena/cli/master/users/role_command.rb +10 -0
  26. data/lib/kontena/cli/master/users/{add_role_command.rb → roles/add_command.rb} +4 -4
  27. data/lib/kontena/cli/master/users/{remove_role_command.rb → roles/remove_command.rb} +4 -4
  28. data/lib/kontena/cli/master/users_command.rb +2 -4
  29. data/lib/kontena/cli/master_command.rb +2 -0
  30. data/lib/kontena/cli/node_command.rb +2 -4
  31. data/lib/kontena/cli/nodes/label_command.rb +14 -0
  32. data/lib/kontena/cli/nodes/{add_label_command.rb → labels/add_command.rb} +2 -2
  33. data/lib/kontena/cli/nodes/{remove_label_command.rb → labels/remove_command.rb} +2 -2
  34. data/lib/kontena/cli/nodes/list_command.rb +2 -1
  35. data/lib/kontena/cli/nodes/show_command.rb +19 -2
  36. data/lib/kontena/cli/registry_command.rb +0 -1
  37. data/lib/kontena/cli/service_command.rb +4 -11
  38. data/lib/kontena/cli/services/create_command.rb +10 -2
  39. data/lib/kontena/cli/services/env_command.rb +12 -0
  40. data/lib/kontena/cli/services/{add_env_command.rb → envs/add_command.rb} +4 -4
  41. data/lib/kontena/cli/services/{envs_command.rb → envs/list_command.rb} +5 -5
  42. data/lib/kontena/cli/services/{remove_env_command.rb → envs/remove_command.rb} +4 -4
  43. data/lib/kontena/cli/services/list_command.rb +3 -2
  44. data/lib/kontena/cli/services/logs_command.rb +0 -2
  45. data/lib/kontena/cli/services/secret_command.rb +10 -0
  46. data/lib/kontena/cli/services/{add_secret_command.rb → secrets/link_command.rb} +4 -4
  47. data/lib/kontena/cli/services/{remove_secret_command.rb → secrets/unlink_command.rb} +4 -4
  48. data/lib/kontena/cli/services/services_helper.rb +35 -8
  49. data/lib/kontena/cli/services/stats_command.rb +6 -1
  50. data/lib/kontena/cli/services/update_command.rb +4 -0
  51. data/lib/kontena/cli/user/forgot_password_command.rb +16 -0
  52. data/lib/kontena/cli/user/reset_password_command.rb +23 -0
  53. data/lib/kontena/cli/user/verify_command.rb +22 -0
  54. data/lib/kontena/cli/user_command.rb +13 -0
  55. data/lib/kontena/cli/vault/list_command.rb +1 -1
  56. data/lib/kontena/cli/vpn_command.rb +0 -1
  57. data/lib/kontena/cli/whoami_command.rb +17 -3
  58. data/lib/kontena/machine/aws/cloudinit_master.yml +13 -4
  59. data/lib/kontena/machine/aws/common.rb +8 -13
  60. data/lib/kontena/machine/aws/master_provisioner.rb +6 -5
  61. data/lib/kontena/machine/azure/cloudinit_master.yml +0 -2
  62. data/lib/kontena/machine/digital_ocean.rb +1 -0
  63. data/lib/kontena/machine/digital_ocean/cloudinit.yml +0 -22
  64. data/lib/kontena/machine/digital_ocean/cloudinit_master.yml +14 -4
  65. data/lib/kontena/machine/digital_ocean/master_provisioner.rb +12 -9
  66. data/lib/kontena/machine/vagrant/cloudinit.yml +2 -0
  67. data/lib/kontena/scripts/completer +4 -4
  68. data/spec/kontena/cli/app/common_spec.rb +55 -7
  69. data/spec/kontena/cli/app/docker_helper_spec.rb +74 -0
  70. data/spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb +38 -0
  71. data/spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb +31 -0
  72. data/spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb +38 -0
  73. data/spec/kontena/cli/master/current_command_spec.rb +57 -0
  74. data/spec/kontena/cli/master/users/{add_role_command_spec.rb → roles/add_command_spec.rb} +3 -3
  75. data/spec/kontena/cli/master/users/{remove_role_command_spec.rb → roles/remove_command_spec.rb} +3 -3
  76. data/spec/kontena/cli/services/{add_secret_command_spec.rb → secrets/link_command_spec.rb} +4 -3
  77. data/spec/kontena/cli/services/{remove_secret_command_spec.rb → secrets/unlink_command_spec.rb} +4 -3
  78. data/spec/kontena/cli/services/services_helper_spec.rb +44 -0
  79. metadata +45 -26
  80. data/lib/kontena/cli/forgot_password_command.rb +0 -13
  81. data/lib/kontena/cli/reset_password_command.rb +0 -19
  82. data/lib/kontena/cli/users_command.rb +0 -15
  83. data/lib/kontena/cli/verify_account_command.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac00bb9793205dc4895264f9ba4193d2a4cc45cc
4
- data.tar.gz: 084768c69c7e9bd47ccf2337f70e13565b6893e0
3
+ metadata.gz: 109ecadbdb72e79172f5be44a7c0a38143c6d2a3
4
+ data.tar.gz: 5198dbcf298ffbcc0e84f4305800b3ed7f64c85a
5
5
  SHA512:
6
- metadata.gz: 7635b70b87fec46a8ca174708bc84da6f8aaf41de60be336af25dd0d63122320f07535a6a24de4037fd9e92c5b10961c09fd3fe6719176f7034c76109297db3e
7
- data.tar.gz: 0d1f75e407710b7ecc7127163c1fd161449c4d85b68d7eec0a272d1b31a2a9b5d34198281e3909d68e15fff32aec072f7f4de64e8012f91a011d25e4a8819018
6
+ metadata.gz: 3b385cb691cb135cf2de46abcff1d4784ef8aca31420fab414635f626e88a398946dba7e545f308b54d2951b762a9850a4bc2739ca23ce0d0cf3ef5cbb7caeb6
7
+ data.tar.gz: d6dfa8ffa29cf4ac9b2641f87ab7322f4455483e63f4e0ab0f64d57c88d26845177a59dfc990c0a7aa86752cde0b1e4590a50f6247d4e4599d66e946953efb2b
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.3
1
+ 0.13.0
data/bin/kontena CHANGED
@@ -14,6 +14,7 @@ require 'clamp'
14
14
  require 'ruby_dig'
15
15
  require 'kontena/client'
16
16
  require 'kontena/cli/common'
17
+ require 'kontena/cli/bytes_helper'
17
18
  require 'kontena/cli/grid_options'
18
19
  require 'kontena/cli/app_command'
19
20
  require 'kontena/cli/register_command'
@@ -34,6 +35,7 @@ require 'kontena/cli/external_registry_command'
34
35
  require 'kontena/cli/app_command'
35
36
  require 'kontena/cli/etcd_command'
36
37
  require 'kontena/cli/vault_command'
38
+ require 'kontena/cli/user_command'
37
39
  require 'kontena/cli/version_command'
38
40
 
39
41
  class MainCommand < Clamp::Command
@@ -53,9 +55,7 @@ class MainCommand < Clamp::Command
53
55
  subcommand "login", "Login to Kontena Master", Kontena::Cli::LoginCommand
54
56
  subcommand "logout", "Logout from Kontena Master", Kontena::Cli::LogoutCommand
55
57
  subcommand "whoami", "Shows current logged in user", Kontena::Cli::WhoamiCommand
56
- subcommand "verify-account", "Verify registered account", Kontena::Cli::VerifyAccountCommand
57
- subcommand "forgot-password", "Request password reset for Kontena account", Kontena::Cli::ForgotPasswordCommand
58
- subcommand "reset-password", "Reset Kontena account password", Kontena::Cli::ResetPasswordCommand
58
+ subcommand "user", "User related commands", Kontena::Cli::UserCommand
59
59
  subcommand "version", "Show version", Kontena::Cli::VersionCommand
60
60
 
61
61
  def execute
@@ -77,6 +77,8 @@ rescue => exc
77
77
  if ENV['DEBUG']
78
78
  raise exc
79
79
  else
80
- abort(exc.message)
80
+ puts "Kontena error: #{exc.message}"
81
+ puts "Rerun the command with environment DEBUG=true set to get full the exception"
82
+ abort()
81
83
  end
82
84
  end
@@ -75,7 +75,8 @@ module Kontena::Cli::Apps
75
75
  # @return [Hash]
76
76
  def extend_options(options, file, service_name, prefix)
77
77
  parent_options = parse_services(file, service_name, prefix)
78
- options['environment'] = extend_env_vars(parent_options, options)
78
+ options['environment'] = extend_env_vars(parent_options['environment'], options['environment'])
79
+ options['secrets'] = extend_secrets(parent_options['secrets'], options['secrets'])
79
80
  parent_options.merge(options)
80
81
  end
81
82
 
@@ -86,19 +87,32 @@ module Kontena::Cli::Apps
86
87
  end
87
88
  end
88
89
 
89
- # @param [Hash] from
90
- # @param [Hash] to
90
+ # @param [Array] from
91
+ # @param [Array] to
91
92
  # @return [Array]
92
93
  def extend_env_vars(from, to)
93
- env_vars = to['environment'] || []
94
- if from['environment']
95
- from['environment'].each do |env|
96
- env_vars << env unless to['environment'] && to['environment'].find {|key| key.split('=').first == env.split('=').first}
94
+ env_vars = to || []
95
+ if from
96
+ from.each do |env|
97
+ env_vars << env unless to && to.find {|key| key.split('=').first == env.split('=').first}
97
98
  end
98
99
  end
99
100
  env_vars
100
101
  end
101
102
 
103
+ # @param [Array] from
104
+ # @param [Array] to
105
+ # @return [Array]
106
+ def extend_secrets(from, to)
107
+ secrets = to || []
108
+ if from
109
+ from.each do |from_secret|
110
+ secrets << from_secret unless to && to.any? {|to_secret| to_secret['secret'] == from_secret['secret']}
111
+ end
112
+ end
113
+ secrets
114
+ end
115
+
102
116
  # @param [Hash] services
103
117
  # @param [String] file
104
118
  def create_yml(services, file = 'kontena.yml')
@@ -149,8 +149,8 @@ module Kontena::Cli::Apps
149
149
  data[:container_count] = options['instances']
150
150
  data[:links] = parse_links(options['links'] || [])
151
151
  data[:ports] = parse_ports(options['ports'] || [])
152
- data[:memory] = parse_memory(options['mem_limit']) if options['mem_limit']
153
- data[:memory_swap] = parse_memory(options['memswap_limit']) if options['memswap_limit']
152
+ data[:memory] = parse_memory(options['mem_limit'].to_s) if options['mem_limit']
153
+ data[:memory_swap] = parse_memory(options['memswap_limit'].to_s) if options['memswap_limit']
154
154
  data[:cpu_shares] = options['cpu_shares'] if options['cpu_shares']
155
155
  data[:volumes] = options['volumes'] || []
156
156
  data[:volumes_from] = options['volumes_from'] || []
@@ -169,8 +169,15 @@ module Kontena::Cli::Apps
169
169
  deploy_opts = options['deploy'] || {}
170
170
  data[:strategy] = deploy_opts['strategy'] if deploy_opts['strategy']
171
171
  deploy = {}
172
- deploy[:wait_for_port] = deploy_opts['wait_for_port'] if deploy_opts.has_key?('wait_for_port')
173
- deploy[:min_health] = deploy_opts['min_health'] if deploy_opts.has_key?('min_health')
172
+ if deploy_opts.has_key?('wait_for_port')
173
+ deploy[:wait_for_port] = deploy_opts['wait_for_port']
174
+ end
175
+ if deploy_opts.has_key?('min_health')
176
+ deploy[:min_health] = deploy_opts['min_health']
177
+ end
178
+ if deploy_opts.has_key?('interval')
179
+ deploy[:interval] = parse_relative_time(deploy_opts['interval'])
180
+ end
174
181
  unless deploy.empty?
175
182
  data[:deploy_opts] = deploy
176
183
  end
@@ -15,6 +15,10 @@ module Kontena::Cli::Apps
15
15
  dockerfile = service['dockerfile'] || 'Dockerfile'
16
16
  abort("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
17
17
  abort("'#{service['build']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build'], dockerfile)
18
+ if service['hooks'] && service['hooks']['pre_build']
19
+ puts "Running pre_build hook".colorize(:cyan)
20
+ run_pre_build_hook(service['hooks']['pre_build'])
21
+ end
18
22
  puts "Building image #{service['image'].colorize(:cyan)}"
19
23
  build_docker_image(service['image'], service['build'], dockerfile, no_cache)
20
24
  puts "Pushing image #{service['image'].colorize(:cyan)} to registry"
@@ -65,5 +69,13 @@ module Kontena::Cli::Apps
65
69
  file = File.join(File.expand_path(path), dockerfile)
66
70
  File.exist?(file)
67
71
  end
72
+
73
+ # @param [Hash] hook
74
+ def run_pre_build_hook(hook)
75
+ hook.each do |h|
76
+ ret = system(h['cmd'])
77
+ abort("Failed to run pre_build hook: #{h['name']}!".colorize(:red)) unless ret
78
+ end
79
+ end
68
80
  end
69
81
  end
@@ -10,7 +10,6 @@ module Kontena::Cli::Apps
10
10
  option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
11
11
  option ["-l", "--lines"], "LINES", "How many lines to show", default: '100'
12
12
  option "--since", "SINCE", "Show logs since given timestamp"
13
- option ["-s", "--search"], "SEARCH", "Search from logs"
14
13
  option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
15
14
  parameter "[SERVICE] ...", "Show only specified service logs"
16
15
 
@@ -36,7 +35,6 @@ module Kontena::Cli::Apps
36
35
  query_params << "from=#{last_id}" unless last_id.nil?
37
36
  query_params << "limit=#{lines}"
38
37
  query_params << "since=#{since}" if !since.nil? && last_id.nil?
39
- query_params << "search=#{search}" if search
40
38
  logs = []
41
39
  services.each do |service_name, opts|
42
40
  service = get_service(token, prefixed_name(service_name)) rescue false
@@ -28,34 +28,43 @@ module Kontena::Cli::Apps
28
28
 
29
29
  end
30
30
 
31
+ private
31
32
  def remove_services(services)
32
33
  services.find_all {|service_name, options| options['links'] && options['links'].size > 0 }.each do |service_name, options|
33
- delete(service_name, options)
34
+ delete(service_name, options, false)
34
35
  services.delete(service_name)
35
- sleep 1
36
36
  end
37
37
  services.each do |service_name, options|
38
38
  delete(service_name, options)
39
39
  end
40
40
  end
41
41
 
42
- def delete(name, options)
42
+ def delete(name, options, async = true)
43
43
  unless deleted_services.include?(name)
44
- print "deleting #{name}"
45
- service = get_service(token, prefixed_name(name)) rescue nil
46
-
47
- if(!service.nil?)
48
- print "."
49
- delete_service(token, prefixed_name(name))
50
- print ". done"
51
- deleted_services << name
52
- puts ''
53
- else
54
- puts "No such service: #{name}".colorize(:red)
44
+ print "deleting #{name.colorize(:cyan)}"
45
+ ShellSpinner " " do
46
+ service = get_service(token, prefixed_name(name)) rescue nil
47
+ if(service)
48
+ delete_service(token, prefixed_name(name))
49
+ unless async
50
+ wait_for_delete_to_finish(service)
51
+ end
52
+ deleted_services << name
53
+ else
54
+ puts "No such service: #{name}".colorize(:red)
55
+ end
55
56
  end
56
57
  end
57
58
  end
58
59
 
60
+ def wait_for_delete_to_finish(service)
61
+ until service.nil?
62
+ service = get_service(token, service['name']) rescue nil
63
+ sleep 0.5
64
+ end
65
+ end
66
+
67
+
59
68
  ##
60
69
  #
61
70
  # @return [Array]
@@ -0,0 +1,40 @@
1
+ module Kontena
2
+ module Cli
3
+ module BytesHelper
4
+
5
+ KILOBYTE = 1024
6
+ MEGABYTE = KILOBYTE * 1024
7
+ GIGABYTE = MEGABYTE * 1024
8
+ TERABYTE = GIGABYTE * 1024
9
+
10
+ def to_kilobytes(bytes, ndigits=nil)
11
+ return 0.0 if bytes.nil?
12
+ round(bytes.to_f / KILOBYTE, ndigits)
13
+ end
14
+
15
+ def to_megabytes(bytes, ndigits=nil)
16
+ return 0.0 if bytes.nil?
17
+ round(bytes.to_f / MEGABYTE, ndigits)
18
+ end
19
+
20
+ def to_gigabytes(bytes, ndigits=nil)
21
+ return 0.0 if bytes.nil?
22
+ round(bytes.to_f / GIGABYTE, ndigits)
23
+ end
24
+
25
+ def to_terabytes(bytes, ndigits)
26
+ return 0.0 if bytes.nil?
27
+ round(bytes.to_f / TERABYTE, ndigits)
28
+ end
29
+
30
+ private
31
+ def round(value, ndigits=nil)
32
+ if ndigits.nil?
33
+ return value
34
+ end
35
+ value.round(ndigits)
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -4,7 +4,6 @@ require_relative 'containers/inspect_command'
4
4
  class Kontena::Cli::ContainerCommand < Clamp::Command
5
5
 
6
6
  subcommand "exec", "Execute command inside a container", Kontena::Cli::Containers::ExecCommand
7
-
8
7
  subcommand "inspect", "Inspect the container", Kontena::Cli::Containers::InspectCommand
9
8
 
10
9
  def execute
@@ -8,10 +8,9 @@ require_relative 'grids/remove_command'
8
8
  require_relative 'grids/current_command'
9
9
  require_relative 'grids/env_command'
10
10
  require_relative 'grids/audit_log_command'
11
- require_relative 'grids/list_users_command'
12
- require_relative 'grids/add_user_command'
13
- require_relative 'grids/remove_user_command'
11
+ require_relative 'grids/user_command'
14
12
  require_relative 'grids/cloud_config_command'
13
+ require_relative 'grids/trusted_subnet_command'
15
14
 
16
15
  class Kontena::Cli::GridCommand < Clamp::Command
17
16
 
@@ -25,10 +24,9 @@ class Kontena::Cli::GridCommand < Clamp::Command
25
24
  subcommand "current", "Show current grid details", Kontena::Cli::Grids::CurrentCommand
26
25
  subcommand "env", "Show the current grid environment details", Kontena::Cli::Grids::EnvCommand
27
26
  subcommand "audit-log", "Show audit log of the current grid", Kontena::Cli::Grids::AuditLogCommand
28
- subcommand "list-users", "List current grid users", Kontena::Cli::Grids::ListUsersCommand
29
- subcommand "add-user", "Add user to the current grid", Kontena::Cli::Grids::AddUserCommand
30
- subcommand "remove-user", "Remove user from the current grid", Kontena::Cli::Grids::RemoveUserCommand
27
+ subcommand "user", "User specific commands", Kontena::Cli::Grids::UserCommand
31
28
  subcommand "cloud-config", "Generate cloud-config", Kontena::Cli::Grids::CloudConfigCommand
29
+ subcommand "trusted-subnet", "Trusted subnet related commands", Kontena::Cli::Grids::TrustedSubnetCommand
32
30
 
33
31
  def execute
34
32
  end
@@ -3,7 +3,6 @@ module Kontena::Cli::Grids
3
3
  include Kontena::Cli::Common
4
4
 
5
5
  option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
6
- option ["-s", "--search"], "SEARCH", "Search from logs"
7
6
  option "--lines", "LINES", "Number of lines to show from the end of the logs"
8
7
  option "--since", "SINCE", "Show logs since given timestamp"
9
8
  option "--node", "NODE", "Filter by node name", multivalued: true
@@ -18,7 +17,6 @@ module Kontena::Cli::Grids
18
17
  query_params[:nodes] = node_list.join(",") unless node_list.empty?
19
18
  query_params[:services] = service_list.join(",") unless service_list.empty?
20
19
  query_params[:containers] = container_list.join(",") unless container_list.empty?
21
- query_params[:search] = search if search
22
20
  query_params[:limit] = lines if lines
23
21
  query_params[:since] = since if since
24
22
 
@@ -0,0 +1,12 @@
1
+ module Kontena::Cli::Grids
2
+
3
+ require_relative 'trusted_subnets/list_command'
4
+ require_relative 'trusted_subnets/add_command'
5
+ require_relative 'trusted_subnets/remove_command'
6
+
7
+ class TrustedSubnetCommand < Clamp::Command
8
+ subcommand ["list", "ls"], "List trusted subnets", TrustedSubnets::ListCommand
9
+ subcommand "add", "Add trusted subnet", TrustedSubnets::AddCommand
10
+ subcommand ["remove", "rm"], "Remove trusted subnet", TrustedSubnets::RemoveCommand
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module Kontena::Cli::Grids::TrustedSubnets
2
+ class AddCommand < Clamp::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NAME", "Grid name"
6
+ parameter "SUBNET", "Trusted subnet"
7
+
8
+ def execute
9
+ require_api_url
10
+ token = require_token
11
+ grid = client(token).get("grids/#{name}")
12
+ data = {trusted_subnets: grid['trusted_subnets'] + [self.subnet]}
13
+ client(token).put("grids/#{name}", data)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Kontena::Cli::Grids::TrustedSubnets
2
+ class ListCommand < Clamp::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NAME", "Grid name"
6
+
7
+ def execute
8
+ require_api_url
9
+ token = require_token
10
+ grid = client(token).get("grids/#{current_grid}")
11
+ trusted_subnets = grid['trusted_subnets'] || []
12
+ trusted_subnets.each do |subnet|
13
+ puts subnet
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Kontena::Cli::Grids::TrustedSubnets
2
+ class RemoveCommand < Clamp::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NAME", "Grid name"
6
+ parameter "SUBNET", "Trusted subnet"
7
+
8
+ def execute
9
+ require_api_url
10
+ token = require_token
11
+ grid = client(token).get("grids/#{name}")
12
+ trusted_subnets = grid['trusted_subnets'] || []
13
+ unless trusted_subnets.delete(self.subnet)
14
+ abort("Grid does not have trusted subnet #{self.subnet}")
15
+ end
16
+ data = {trusted_subnets: trusted_subnets}
17
+ client(token).put("grids/#{name}", data)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Kontena::Cli::Grids
2
+
3
+ require_relative 'users/list_command'
4
+ require_relative 'users/add_command'
5
+ require_relative 'users/remove_command'
6
+
7
+ class UserCommand < Clamp::Command
8
+ subcommand ["list", "ls"], "List grid users", Users::ListCommand
9
+ subcommand "add", "Add user to grid", Users::AddCommand
10
+ subcommand ["remove", "rm"], "Remove user from grid", Users::RemoveCommand
11
+ end
12
+ end
@@ -1,10 +1,10 @@
1
- require_relative 'common'
1
+ require_relative '../common'
2
2
 
3
- module Kontena::Cli::Grids
4
- class AddUserCommand < Clamp::Command
3
+ module Kontena::Cli::Grids::Users
4
+ class AddCommand < Clamp::Command
5
5
  include Kontena::Cli::Common
6
6
  include Kontena::Cli::GridOptions
7
- include Common
7
+ include Kontena::Cli::Grids::Common
8
8
 
9
9
  parameter "EMAIL", "Email address"
10
10
 
@@ -1,9 +1,9 @@
1
- require_relative 'common'
1
+ require_relative '../common'
2
2
 
3
- module Kontena::Cli::Grids
4
- class ListUsersCommand < Clamp::Command
3
+ module Kontena::Cli::Grids::Users
4
+ class ListCommand < Clamp::Command
5
5
  include Kontena::Cli::Common
6
- include Common
6
+ include Kontena::Cli::Grids::Common
7
7
 
8
8
  def execute
9
9
  require_api_url