kontena-cli 1.1.6 → 1.2.0.dev1

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/VERSION +1 -1
  4. data/bin/kontena +8 -28
  5. data/kontena-cli.gemspec +2 -2
  6. data/lib/kontena/cli/app_command.rb +14 -27
  7. data/lib/kontena/cli/certificate_command.rb +4 -7
  8. data/lib/kontena/cli/cloud/master_command.rb +5 -12
  9. data/lib/kontena/cli/cloud_command.rb +4 -7
  10. data/lib/kontena/cli/container_command.rb +4 -9
  11. data/lib/kontena/cli/etcd/health_command.rb +1 -0
  12. data/lib/kontena/cli/etcd_command.rb +6 -13
  13. data/lib/kontena/cli/external_registry_command.rb +3 -7
  14. data/lib/kontena/cli/grid_command.rb +14 -29
  15. data/lib/kontena/cli/grids/cloud_config_command.rb +1 -0
  16. data/lib/kontena/cli/grids/common.rb +2 -0
  17. data/lib/kontena/cli/grids/create_command.rb +5 -0
  18. data/lib/kontena/cli/grids/trusted_subnet_command.rb +6 -8
  19. data/lib/kontena/cli/grids/user_command.rb +3 -6
  20. data/lib/kontena/cli/master/config_command.rb +6 -12
  21. data/lib/kontena/cli/master/token_command.rb +6 -11
  22. data/lib/kontena/cli/master/users/role_command.rb +2 -4
  23. data/lib/kontena/cli/master/users_command.rb +4 -8
  24. data/lib/kontena/cli/master_command.rb +14 -33
  25. data/lib/kontena/cli/node_command.rb +7 -15
  26. data/lib/kontena/cli/nodes/health_command.rb +1 -1
  27. data/lib/kontena/cli/nodes/label_command.rb +3 -9
  28. data/lib/kontena/cli/nodes/show_command.rb +1 -1
  29. data/lib/kontena/cli/nodes/ssh_command.rb +13 -4
  30. data/lib/kontena/cli/plugin_command.rb +5 -9
  31. data/lib/kontena/cli/registry_command.rb +2 -5
  32. data/lib/kontena/cli/service_command.rb +22 -45
  33. data/lib/kontena/cli/services/container_command.rb +2 -3
  34. data/lib/kontena/cli/services/env_command.rb +3 -6
  35. data/lib/kontena/cli/services/secret_command.rb +2 -4
  36. data/lib/kontena/cli/stack_command.rb +11 -24
  37. data/lib/kontena/cli/stacks/registry_command.rb +5 -12
  38. data/lib/kontena/cli/stacks/upgrade_command.rb +6 -0
  39. data/lib/kontena/cli/stacks/yaml/reader.rb +17 -2
  40. data/lib/kontena/cli/subcommand_loader.rb +82 -0
  41. data/lib/kontena/cli/vault_command.rb +7 -15
  42. data/lib/kontena/cli/version.rb +6 -1
  43. data/lib/kontena/cli/vpn_command.rb +3 -7
  44. data/lib/kontena/command.rb +28 -1
  45. data/lib/kontena/machine/cloud_config/cloudinit.yml +1 -1
  46. data/lib/kontena/main_command.rb +22 -38
  47. data/lib/kontena/scripts/completer +2 -233
  48. data/lib/kontena/scripts/completer.rb +230 -0
  49. data/lib/kontena/scripts/init +5 -8
  50. data/lib/kontena/scripts/kontena.bash +8 -0
  51. data/lib/kontena/scripts/kontena.zsh +11 -0
  52. data/lib/kontena_cli.rb +9 -1
  53. data/omnibus/wrappers/sh/kontena +1 -1
  54. data/spec/fixtures/stack-with-liquid-optional.yml +14 -0
  55. data/spec/fixtures/stack-with-liquid-undefined.yml +12 -0
  56. data/spec/kontena/cli/app/build_command_spec.rb +1 -2
  57. data/spec/kontena/cli/app/common_spec.rb +1 -2
  58. data/spec/kontena/cli/app/config_command_spec.rb +0 -1
  59. data/spec/kontena/cli/app/deploy_command_spec.rb +2 -3
  60. data/spec/kontena/cli/app/docker_helper_spec.rb +0 -1
  61. data/spec/kontena/cli/app/init_command_spec.rb +0 -1
  62. data/spec/kontena/cli/app/logs_command_spec.rb +0 -1
  63. data/spec/kontena/cli/app/scale_spec.rb +2 -3
  64. data/spec/kontena/cli/app/service_generator_spec.rb +1 -2
  65. data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -1
  66. data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -1
  67. data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -1
  68. data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -1
  69. data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -1
  70. data/spec/kontena/cli/cloud/login_command_spec.rb +0 -1
  71. data/spec/kontena/cli/cloud/logout_command_spec.rb +0 -1
  72. data/spec/kontena/cli/cloud/master/add_command_spec.rb +0 -1
  73. data/spec/kontena/cli/common_spec.rb +0 -1
  74. data/spec/kontena/cli/containers/list_command_spec.rb +0 -1
  75. data/spec/kontena/cli/containers/logs_command_spec.rb +0 -1
  76. data/spec/kontena/cli/etcd/health_command_spec.rb +2 -0
  77. data/spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb +0 -11
  78. data/spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb +4 -13
  79. data/spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb +0 -11
  80. data/spec/kontena/cli/grids/use_command_spec.rb +0 -1
  81. data/spec/kontena/cli/helpers/log_helper_spec.rb +0 -1
  82. data/spec/kontena/cli/main_command_spec.rb +2 -3
  83. data/spec/kontena/cli/master/current_command_spec.rb +5 -15
  84. data/spec/kontena/cli/master/init_cloud_command_spec.rb +0 -1
  85. data/spec/kontena/cli/master/login_command_spec.rb +0 -1
  86. data/spec/kontena/cli/master/logout_command_spec.rb +0 -1
  87. data/spec/kontena/cli/master/use_command_spec.rb +0 -1
  88. data/spec/kontena/cli/master/users/invite_command_spec.rb +1 -5
  89. data/spec/kontena/cli/master/users/remove_command_spec.rb +2 -14
  90. data/spec/kontena/cli/master/users/roles/add_command_spec.rb +0 -1
  91. data/spec/kontena/cli/master/users/roles/remove_command_spec.rb +0 -1
  92. data/spec/kontena/cli/nodes/list_command_spec.rb +2 -0
  93. data/spec/kontena/cli/services/containers_command_spec.rb +0 -18
  94. data/spec/kontena/cli/services/exec_command_spec.rb +6 -4
  95. data/spec/kontena/cli/services/link_command_spec.rb +5 -19
  96. data/spec/kontena/cli/services/restart_command_spec.rb +0 -16
  97. data/spec/kontena/cli/services/secrets/link_command_spec.rb +0 -11
  98. data/spec/kontena/cli/services/secrets/unlink_command_spec.rb +1 -12
  99. data/spec/kontena/cli/services/services_helper_spec.rb +0 -1
  100. data/spec/kontena/cli/services/unlink_command_spec.rb +7 -21
  101. data/spec/kontena/cli/services/update_command_spec.rb +0 -15
  102. data/spec/kontena/cli/stacks/build_command_spec.rb +0 -1
  103. data/spec/kontena/cli/stacks/deploy_command_spec.rb +10 -13
  104. data/spec/kontena/cli/stacks/install_command_spec.rb +0 -15
  105. data/spec/kontena/cli/stacks/list_command_spec.rb +4 -10
  106. data/spec/kontena/cli/stacks/remove_command_spec.rb +1 -16
  107. data/spec/kontena/cli/stacks/service_generator_spec.rb +0 -1
  108. data/spec/kontena/cli/stacks/service_generator_v2_spec.rb +0 -1
  109. data/spec/kontena/cli/stacks/show_command_spec.rb +1 -14
  110. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +19 -1
  111. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +163 -130
  112. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +0 -1
  113. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +0 -1
  114. data/spec/kontena/cli/vault/export_spec.rb +0 -1
  115. data/spec/kontena/cli/vault/import_spec.rb +4 -5
  116. data/spec/kontena/cli/version_command_spec.rb +8 -6
  117. data/spec/kontena/cli/vpn/create_command_spec.rb +3 -4
  118. data/spec/kontena/client_spec.rb +0 -1
  119. data/spec/kontena/config_spec.rb +0 -1
  120. data/spec/kontena/kontena_cli_spec.rb +1 -1
  121. data/spec/kontena/main_command_spec.rb +0 -1
  122. data/spec/kontena/plugin_manager_spec.rb +0 -1
  123. data/spec/spec_helper.rb +1 -0
  124. data/spec/support/client_helpers.rb +1 -1
  125. data/spec/support/exit_with_error_helper.rb +36 -0
  126. data/spec/support/fixtures_helpers.rb +5 -2
  127. metadata +18 -7
@@ -0,0 +1,82 @@
1
+ module Kontena::Cli
2
+ class SubcommandLoader
3
+ attr_reader :path
4
+
5
+ # Create a subcommand loader instance
6
+ #
7
+ # @param [String] path path to command definition
8
+ def initialize(path)
9
+ @path = path
10
+ end
11
+
12
+ # Takes something like /foo/bar/cli/master/foo_coimmand and returns [:Master, :FooCommand]
13
+ #
14
+ # @param path [String]
15
+ # @return [Array<Symbol>]
16
+ def symbolize_path(path)
17
+ path.gsub(/.*\/cli\//, '').split('/').map do |path_part|
18
+ path_part.split('_').map{ |e| e.capitalize }.join
19
+ end.map(&:to_sym)
20
+ end
21
+
22
+ # Takes an array such as [:Foo] or [:Cli, :Foo] and returns [:Kontena, :Cli, :Foo]
23
+ def prepend_kontena_cli(tree)
24
+ [:Kontena, :Cli] + (tree - [:Cli])
25
+ end
26
+
27
+ # Takes an array such as [:Master, :FooCommand] and returns Master::FooCommand
28
+ #
29
+ # @param tree [Array<Symbol]
30
+ # @return [Class]
31
+ def const_get_tree(tree)
32
+ if tree.size == 1
33
+ Object.const_get(tree.first)
34
+ else
35
+ tree[1..-1].inject(Object.const_get(tree.first)) { |new_base, part| new_base.const_get(part) }
36
+ end
37
+ rescue
38
+ raise ArgumentError, "Can't figure out command class name from path #{path} - tried #{tree}"
39
+ end
40
+
41
+ # Tries to require a file, returns false instead of raising LoadError unless succesful
42
+ #
43
+ # @param path [String]
44
+ # @return [TrueClass,FalseClass]
45
+ def safe_require(path)
46
+ require path
47
+ true
48
+ rescue LoadError
49
+ false
50
+ end
51
+
52
+ def klass
53
+ return @subcommand_class if @subcommand_class
54
+ unless safe_require(path) || safe_require(Kontena.cli_root(path))
55
+ raise ArgumentError, "Can't load #{path} or #{Kontena.cli_root(path)}"
56
+ end
57
+ @subcommand_class = const_get_tree(prepend_kontena_cli(symbolize_path(path)))
58
+ end
59
+
60
+ def new(*args)
61
+ klass.new(*args)
62
+ end
63
+
64
+ def method_missing(meth, *args)
65
+ klass.send(meth, *args)
66
+ end
67
+
68
+ def respond_to_missing?(meth)
69
+ klass.respond_to?(meth)
70
+ end
71
+
72
+ def const_get(const)
73
+ klass.const_get(const)
74
+ end
75
+
76
+ def const_defined?(const)
77
+ klass.const_defined?(const)
78
+ end
79
+
80
+ alias_method :class, :klass
81
+ end
82
+ end
@@ -1,20 +1,12 @@
1
- require_relative 'vault/export_command'
2
- require_relative 'vault/import_command'
3
- require_relative 'vault/list_command'
4
- require_relative 'vault/read_command'
5
- require_relative 'vault/remove_command'
6
- require_relative 'vault/update_command'
7
- require_relative 'vault/write_command'
8
-
9
1
  class Kontena::Cli::VaultCommand < Kontena::Command
10
2
 
11
- subcommand ["list", "ls"], "List secrets", Kontena::Cli::Vault::ListCommand
12
- subcommand "write", "Write a secret", Kontena::Cli::Vault::WriteCommand
13
- subcommand "read", "Read secret", Kontena::Cli::Vault::ReadCommand
14
- subcommand "update", "Update secret", Kontena::Cli::Vault::UpdateCommand
15
- subcommand ["remove", "rm"], "Remove secret", Kontena::Cli::Vault::RemoveCommand
16
- subcommand "export", "Export secrets to STDOUT", Kontena::Cli::Vault::ExportCommand
17
- subcommand "import", "Import secrets from a file or STDIN", Kontena::Cli::Vault::ImportCommand
3
+ subcommand ["list", "ls"], "List secrets", load_subcommand('vault/list_command')
4
+ subcommand "write", "Write a secret", load_subcommand('vault/write_command')
5
+ subcommand "read", "Read secret", load_subcommand('vault/read_command')
6
+ subcommand "update", "Update secret", load_subcommand('vault/update_command')
7
+ subcommand ["remove", "rm"], "Remove secret", load_subcommand('vault/remove_command')
8
+ subcommand "export", "Export secrets to STDOUT", load_subcommand('vault/export_command')
9
+ subcommand "import", "Import secrets from a file or STDIN", load_subcommand('vault/import_command')
18
10
 
19
11
  def execute
20
12
  end
@@ -1,5 +1,10 @@
1
1
  module Kontena
2
2
  module Cli
3
- VERSION = File.read(File.realpath(File.join(__dir__, '../../../VERSION'))).strip unless const_defined?(:VERSION)
3
+ unless const_defined?(:VERSION)
4
+ require 'pathname'
5
+ version_file = Pathname.new(__FILE__).dirname.join('../../../VERSION').realpath
6
+ is_head = ENV["KONTENA_EXTRA_BUILDTAGS"].to_s.include?('head')
7
+ VERSION = "#{version_file.read.strip}#{"-head" if is_head}"
8
+ end
4
9
  end
5
10
  end
@@ -1,12 +1,8 @@
1
- require_relative 'vpn/create_command'
2
- require_relative 'vpn/config_command'
3
- require_relative 'vpn/remove_command'
4
-
5
1
  class Kontena::Cli::VpnCommand < Kontena::Command
6
2
 
7
- subcommand "create", "Create VPN service", Kontena::Cli::Vpn::CreateCommand
8
- subcommand "config", "Show/Export VPN config", Kontena::Cli::Vpn::ConfigCommand
9
- subcommand ["remove", "rm"], "Remove VPN service", Kontena::Cli::Vpn::RemoveCommand
3
+ subcommand "create", "Create VPN service", load_subcommand('vpn/create_command')
4
+ subcommand "config", "Show/Export VPN config", load_subcommand('vpn/config_command')
5
+ subcommand ["remove", "rm"], "Remove VPN service", load_subcommand('vpn/remove_command')
10
6
 
11
7
  def execute
12
8
  end
@@ -1,4 +1,5 @@
1
1
  require 'clamp'
2
+ require_relative 'cli/subcommand_loader'
2
3
 
3
4
  class Kontena::Command < Clamp::Command
4
5
 
@@ -62,6 +63,10 @@ class Kontena::Command < Clamp::Command
62
63
  end
63
64
  end
64
65
 
66
+ def self.load_subcommand(path)
67
+ Kontena::Cli::SubcommandLoader.new(path)
68
+ end
69
+
65
70
  def self.inherited(where)
66
71
  where.extend Finalizer
67
72
  end
@@ -197,8 +202,30 @@ class Kontena::Command < Clamp::Command
197
202
  run_callbacks :after unless help_requested?
198
203
  exit(@exit_code) if @exit_code.to_i > 0
199
204
  @result
205
+ rescue Excon::Errors::SocketError => exc
206
+ if exc.message.include?('Unable to verify certificate')
207
+ $stderr.puts " [#{Kontena.pastel.red('error')}] The server uses a certificate signed by an unknown authority."
208
+ $stderr.puts " You can trust this server by copying server CA pem file to: #{Kontena.pastel.yellow("~/.kontena/certs/<hostname>.pem")}"
209
+ $stderr.puts " Protip: you can bypass the certificate check by setting #{Kontena.pastel.yellow('SSL_IGNORE_ERRORS=true')} env variable, but any data you send to the server could be intercepted by others."
210
+ abort
211
+ else
212
+ abort(exc.message)
213
+ end
214
+ rescue Kontena::Errors::StandardError => exc
215
+ raise exc if ENV['DEBUG']
216
+ puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
217
+ abort
218
+ rescue Errno::EPIPE
219
+ # If user is piping the command outputs to some other command that might exit before CLI has outputted everything
220
+ abort
221
+ rescue Clamp::HelpWanted, Clamp::UsageError
222
+ raise
223
+ rescue => exc
224
+ raise exc if ENV['DEBUG']
225
+ $stderr.puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
226
+ $stderr.puts " Rerun the command with environment DEBUG=true set to get the full exception"
227
+ abort
200
228
  end
201
-
202
229
  end
203
230
 
204
231
  require_relative 'callback'
@@ -11,7 +11,7 @@ write_files:
11
11
  - path: /etc/systemd/system/docker.service.d/50-kontena.conf
12
12
  content: |
13
13
  [Service]
14
- Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/16" --bip="<%= docker_bip %>"'
14
+ Environment='DOCKER_OPTS=--insecure-registry="<%= grid_subnet %>" --bip="<%= docker_bip %>"'
15
15
  - path: /etc/sysctl.d/99-inotify.conf
16
16
  owner: root
17
17
  permissions: 0644
@@ -5,53 +5,37 @@ require_relative 'command'
5
5
  require_relative 'callback'
6
6
  require_relative 'cli/bytes_helper'
7
7
  require_relative 'cli/grid_options'
8
- require_relative 'cli/app_command'
9
- require_relative 'cli/logout_command'
10
- require_relative 'cli/whoami_command'
11
- require_relative 'cli/container_command'
12
- require_relative 'cli/grid_command'
13
- require_relative 'cli/master_command'
14
- require_relative 'cli/node_command'
15
- require_relative 'cli/service_command'
16
- require_relative 'cli/vpn_command'
17
- require_relative 'cli/registry_command'
18
- require_relative 'cli/external_registry_command'
19
- require_relative 'cli/app_command'
20
- require_relative 'cli/etcd_command'
21
- require_relative 'cli/vault_command'
22
- require_relative 'cli/plugin_command'
23
- require_relative 'cli/version_command'
24
- require_relative 'cli/stack_command'
25
- require_relative 'cli/certificate_command'
26
- require_relative 'cli/cloud_command'
27
8
 
28
9
  class Kontena::MainCommand < Kontena::Command
29
10
  include Kontena::Util
30
11
  include Kontena::Cli::Common
31
12
 
32
13
  option ['-v', '--version'], :flag, "Output Kontena CLI version #{Kontena::Cli::VERSION}" do
33
- puts ['kontena-cli', Kontena::Cli::VERSION, '[ruby' + RUBY_VERSION + '+' + RUBY_PLATFORM + ']'].join(' ')
14
+ build_tags = [ 'ruby' + RUBY_VERSION ]
15
+ build_tags << RUBY_PLATFORM
16
+ build_tags += ENV["KONTENA_EXTRA_BUILDTAGS"].to_s.split(',')
17
+ puts ['kontena-cli', Kontena::Cli::VERSION, "[#{build_tags.join('+')}]"].join(' ')
34
18
  exit 0
35
19
  end
36
20
 
37
- subcommand "cloud", "Kontena Cloud specific commands", Kontena::Cli::CloudCommand
38
- subcommand "logout", "Logout from Kontena Masters or Kontena Cloud accounts", Kontena::Cli::LogoutCommand
39
- subcommand "grid", "Grid specific commands", Kontena::Cli::GridCommand
40
- subcommand "app", "App specific commands", Kontena::Cli::AppCommand
41
- subcommand "stack", "Stack specific commands", Kontena::Cli::StackCommand
42
- subcommand "service", "Service specific commands", Kontena::Cli::ServiceCommand
43
- subcommand "vault", "Vault specific commands", Kontena::Cli::VaultCommand
44
- subcommand "certificate", "LE Certificate specific commands", Kontena::Cli::CertificateCommand
45
- subcommand "node", "Node specific commands", Kontena::Cli::NodeCommand
46
- subcommand "master", "Master specific commands", Kontena::Cli::MasterCommand
47
- subcommand "vpn", "VPN specific commands", Kontena::Cli::VpnCommand
48
- subcommand "registry", "Registry specific commands", Kontena::Cli::RegistryCommand
49
- subcommand "container", "Container specific commands", Kontena::Cli::ContainerCommand
50
- subcommand "etcd", "Etcd specific commands", Kontena::Cli::EtcdCommand
51
- subcommand "external-registry", "External registry specific commands", Kontena::Cli::ExternalRegistryCommand
52
- subcommand "whoami", "Shows current logged in user", Kontena::Cli::WhoamiCommand
53
- subcommand "plugin", "Plugin related commands", Kontena::Cli::PluginCommand
54
- subcommand "version", "Show version", Kontena::Cli::VersionCommand
21
+ subcommand "cloud", "Kontena Cloud specific commands", load_subcommand('cloud_command')
22
+ subcommand "logout", "Logout from Kontena Masters or Kontena Cloud accounts", load_subcommand('logout_command')
23
+ subcommand "grid", "Grid specific commands", load_subcommand('grid_command')
24
+ subcommand "app", "App specific commands", load_subcommand('app_command')
25
+ subcommand "stack", "Stack specific commands", load_subcommand('stack_command')
26
+ subcommand "service", "Service specific commands", load_subcommand('service_command')
27
+ subcommand "vault", "Vault specific commands", load_subcommand('vault_command')
28
+ subcommand "certificate", "LE Certificate specific commands", load_subcommand('certificate_command')
29
+ subcommand "node", "Node specific commands", load_subcommand('node_command')
30
+ subcommand "master", "Master specific commands", load_subcommand('master_command')
31
+ subcommand "vpn", "VPN specific commands", load_subcommand('vpn_command')
32
+ subcommand "registry", "Registry specific commands", load_subcommand('registry_command')
33
+ subcommand "container", "Container specific commands", load_subcommand('container_command')
34
+ subcommand "etcd", "Etcd specific commands", load_subcommand('etcd_command')
35
+ subcommand "external-registry", "External registry specific commands", load_subcommand('external_registry_command')
36
+ subcommand "whoami", "Shows current logged in user", load_subcommand('whoami_command')
37
+ subcommand "plugin", "Plugin related commands", load_subcommand('plugin_command')
38
+ subcommand "version", "Show CLI and current master version", load_subcommand('version_command')
55
39
 
56
40
  def execute
57
41
  end
@@ -3,238 +3,7 @@
3
3
 
4
4
  # resolve bin path, ignoring symlinks
5
5
  require 'pathname'
6
- require 'yaml'
7
6
  bin_file = Pathname.new(__FILE__).realpath
7
+ $:.unshift File.expand_path('../../..', bin_file)
8
8
 
9
- # add self to libpath
10
- $:.unshift File.expand_path('../../lib', bin_file)
11
-
12
- require_relative '../client'
13
- require_relative '../cli/common'
14
-
15
- class Helper
16
- include Kontena::Cli::Common
17
-
18
- def client
19
- token = require_token
20
- super(token)
21
- end
22
-
23
- def grids
24
- client.get("grids")['grids'].map{|grid| grid['id']}
25
- rescue
26
- []
27
- end
28
-
29
- def nodes
30
- client.get("grids/#{current_grid}/nodes")['nodes'].map{|node| node['name']}
31
- rescue
32
- []
33
- end
34
-
35
- def stacks
36
- stacks = client.get("grids/#{current_grid}/stacks")['stacks']
37
- results = []
38
- results.push stacks.map{|s| s['name']}
39
- results.delete('null')
40
- results
41
- rescue
42
- []
43
- end
44
-
45
- def services
46
- services = client.get("grids/#{current_grid}/services")['services']
47
- results = []
48
- results.push services.map{ |s|
49
- stack = s['stack']['id'].split('/').last
50
- if stack != 'null'
51
- "#{stack}/#{s['name']}"
52
- else
53
- s['name']
54
- end
55
- }
56
- results
57
- rescue
58
- []
59
- end
60
-
61
- def containers
62
- results = []
63
- client.get("grids/#{current_grid}/services")['services'].each do |service|
64
- containers = client.get("services/#{service['id']}/containers")['containers']
65
- results.push(containers.map{|c| c['name'] })
66
- results.push(containers.map{|c| c['id'] })
67
- end
68
- results
69
- rescue
70
- []
71
- end
72
-
73
- def yml_services
74
- if File.exist?('kontena.yml')
75
- yaml = YAML.safe_load(File.read('kontena.yml'))
76
- services = yaml['services']
77
- services.keys
78
- end
79
- rescue
80
- []
81
- end
82
-
83
- def yml_files
84
- Dir["./*.yml"].map{|file| file.sub('./', '')}
85
- rescue
86
- []
87
- end
88
-
89
- def master_names
90
- config_file = File.expand_path('~/.kontena_client.json')
91
- if(File.exist?(config_file))
92
- config = JSON.parse(File.read(config_file))
93
- return config['servers'].map{|s| s['name']}
94
- end
95
- rescue
96
- []
97
- end
98
-
99
- end
100
-
101
- helper = Helper.new
102
-
103
- words = ARGV
104
- words.delete_at(0)
105
-
106
- completion = []
107
- completion.push %w(cloud logout grid app service stack vault certificate node master vpn registry container etcd external-registry whoami plugin version) if words.size < 2
108
- if words.size > 0
109
- case words[0]
110
- when 'plugin'
111
- completion.clear
112
- sub_commands = %w(list ls search install uninstall)
113
- if words[1]
114
- completion.push(sub_commands) unless sub_commands.include?(words[1])
115
- else
116
- completion.push sub_commands
117
- end
118
- when 'etcd'
119
- completion.clear
120
- sub_commands = %w(get set mkdir mk list ls rm)
121
- if words[1]
122
- completion.push(sub_commands) unless sub_commands.include?(words[1])
123
- else
124
- completion.push sub_commands
125
- end
126
- when 'registry'
127
- completion.clear
128
- sub_commands = %w(create remove rm)
129
- if words[1]
130
- completion.push(sub_commands) unless sub_commands.include?(words[1])
131
- else
132
- completion.push sub_commands
133
- end
134
- when 'grid'
135
- completion.clear
136
- sub_commands = %w(add-user audit-log create current list user remove show use)
137
- if words[1]
138
- completion.push(sub_commands) unless sub_commands.include?(words[1])
139
- completion.push helper.grids
140
- else
141
- completion.push sub_commands
142
- end
143
- when 'node'
144
- completion.clear
145
- sub_commands = %w(list show remove)
146
- if words[1]
147
- completion.push(sub_commands) unless sub_commands.include?(words[1])
148
- completion.push helper.nodes
149
- else
150
- completion.push sub_commands
151
- end
152
- when 'master'
153
- completion.clear
154
- sub_commands = %w(list use users current remove rm config cfg login logout token join audit-log init-cloud)
155
- if words[1] && words[1] == 'use'
156
- completion.push helper.master_names
157
- elsif words[1] && words[1] == 'users'
158
- users_sub_commands = %(invite list role)
159
- completion.push users_sub_commands
160
- elsif words[1] && ['config', 'cfg'].include?(words[1])
161
- config_sub_commands = %(set get dump load import export unset)
162
- completion.push config_sub_commands
163
- elsif words[1] && words[1] == 'token'
164
- token_sub_commands = %(list ls rm remove show current create)
165
- completion.push token_sub_commands
166
- elsif words[1]
167
- completion.push(sub_commands) unless sub_commands.include?(words[1])
168
- else
169
- completion.push sub_commands
170
- end
171
- when 'cloud'
172
- completion.clear
173
- sub_commands = %w(login logout master)
174
- if words[1] && words[1] == 'master'
175
- cloud_master_sub_commands = %(list ls remove rm add show update)
176
- completion.push cloud_master_sub_commands
177
- elsif words[1]
178
- completion.push(sub_commands) unless sub_commands.include?(words[1])
179
- else
180
- completion.push sub_commands
181
- end
182
- when 'service'
183
- completion.clear
184
- sub_commands = %w(containers create delete deploy list logs restart
185
- scale show start stats stop update monitor env
186
- secret link unlink)
187
- if words[1]
188
- completion.push(sub_commands) unless sub_commands.include?(words[1])
189
- completion.push helper.services
190
- else
191
- completion.push sub_commands
192
- end
193
- when 'container'
194
- completion.clear
195
- sub_commands = %w(exec inspect logs)
196
- if words[1]
197
- completion.push(sub_commands) unless sub_commands.include?(words[1])
198
- completion.push helper.containers
199
- else
200
- completion.push sub_commands
201
- end
202
- when 'vpn'
203
- completion.clear
204
- completion.push %w(config create delete)
205
- when 'external-registry'
206
- completion.clear
207
- completion.push %w(add list delete)
208
- when 'app'
209
- completion.clear
210
- sub_commands = %w(init build config deploy start stop remove rm ps list
211
- logs monitor show)
212
- if words[1]
213
- completion.push(sub_commands) unless sub_commands.include?(words[1])
214
- completion.push helper.yml_services
215
- else
216
- completion.push sub_commands
217
- end
218
- when 'stack'
219
- completion.clear
220
- sub_commands = %w(build install upgrade deploy start stop remove rm ls list
221
- logs monitor show registry)
222
- if words[1]
223
- if words[1] == 'registry'
224
- registry_sub_commands = %(push pull search show rm)
225
- completion.push registry_sub_commands
226
- elsif %w(install).include?(words[1])
227
- completion.push helper.yml_files
228
- elsif words[1] == 'upgrade' && words[3]
229
- completion.push helper.yml_files
230
- else
231
- completion.push(sub_commands) unless sub_commands.include?(words[1])
232
- completion.push helper.stacks
233
- end
234
- else
235
- completion.push sub_commands
236
- end
237
- end
238
- end
239
-
240
- puts completion
9
+ require 'kontena/scripts/completer'