sonic-screwdriver 1.4.0 → 2.2.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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +72 -0
  4. data/.gitignore +2 -1
  5. data/CHANGELOG.md +29 -3
  6. data/Gemfile +3 -3
  7. data/Guardfile +17 -10
  8. data/LICENSE.txt +2 -2
  9. data/README.md +25 -28
  10. data/Rakefile +9 -2
  11. data/docs/_config.yml +3 -0
  12. data/docs/_docs/help.md +1 -1
  13. data/docs/_docs/install-bastion.md +5 -15
  14. data/docs/_docs/install.md +3 -13
  15. data/docs/_docs/next-steps.md +1 -1
  16. data/docs/_docs/settings.md +42 -56
  17. data/docs/_docs/tutorial-ecs-exec.md +16 -20
  18. data/docs/_docs/tutorial-ecs-sh.md +73 -0
  19. data/docs/_docs/tutorial-execute.md +106 -38
  20. data/docs/_docs/tutorial-ssh.md +15 -19
  21. data/docs/_docs/why-ec2-run-command.md +1 -1
  22. data/docs/_includes/commands.html +5 -5
  23. data/docs/_includes/content.html +5 -0
  24. data/docs/_includes/css/main.css +15 -9
  25. data/docs/_includes/css/sonic.css +7 -5
  26. data/docs/_includes/example.html +4 -4
  27. data/docs/_includes/footer.html +6 -4
  28. data/docs/_includes/reference.md +1 -0
  29. data/docs/_includes/subnav.html +2 -1
  30. data/docs/_reference/sonic-completion.md +44 -0
  31. data/docs/_reference/sonic-completion_script.md +25 -0
  32. data/docs/_reference/sonic-ecs-exec.md +30 -0
  33. data/docs/_reference/sonic-ecs-help.md +21 -0
  34. data/docs/_reference/sonic-ecs-sh.md +35 -0
  35. data/docs/_reference/sonic-ecs.md +25 -0
  36. data/docs/_reference/sonic-execute.md +85 -0
  37. data/docs/_reference/sonic-list.md +40 -0
  38. data/docs/_reference/sonic-ssh.md +86 -0
  39. data/docs/_reference/sonic-version.md +21 -0
  40. data/docs/bin/web +1 -1
  41. data/docs/img/tutorials/ec2-console-run-command.png +0 -0
  42. data/docs/quick-start.md +17 -22
  43. data/docs/reference.md +12 -0
  44. data/{bin → exe}/sonic +3 -3
  45. data/lib/bash_scripts/docker-exec.sh +1 -0
  46. data/lib/bash_scripts/docker-run.sh +8 -1
  47. data/lib/sonic.rb +11 -3
  48. data/lib/sonic/{aws_services.rb → aws_service.rb} +6 -1
  49. data/lib/sonic/base_command.rb +82 -0
  50. data/lib/sonic/checks.rb +2 -2
  51. data/lib/sonic/cli.rb +41 -29
  52. data/lib/sonic/command.rb +8 -22
  53. data/lib/sonic/completer.rb +161 -0
  54. data/lib/sonic/completer/script.rb +6 -0
  55. data/lib/sonic/completer/script.sh +10 -0
  56. data/lib/sonic/core.rb +15 -0
  57. data/lib/sonic/default/settings.yml +9 -16
  58. data/lib/sonic/docker.rb +30 -2
  59. data/lib/sonic/ecs.rb +22 -0
  60. data/lib/sonic/execute.rb +203 -51
  61. data/lib/sonic/help.rb +9 -0
  62. data/lib/sonic/help/command/send.md +10 -0
  63. data/lib/sonic/help/completion.md +22 -0
  64. data/lib/sonic/help/completion_script.md +3 -0
  65. data/lib/sonic/help/ecs/exec.md +8 -0
  66. data/lib/sonic/help/ecs/sh.md +13 -0
  67. data/lib/sonic/help/execute.md +59 -0
  68. data/lib/sonic/help/list.md +17 -0
  69. data/lib/sonic/help/ssh.md +60 -0
  70. data/lib/sonic/list.rb +5 -2
  71. data/lib/sonic/setting.rb +47 -0
  72. data/lib/sonic/ssh.rb +42 -23
  73. data/lib/sonic/ssh/identifier_detector.rb +7 -3
  74. data/lib/sonic/ui.rb +2 -2
  75. data/lib/sonic/version.rb +1 -1
  76. data/sonic.gemspec +14 -9
  77. data/spec/lib/cli_spec.rb +11 -11
  78. data/spec/lib/sonic/execute_spec.rb +1 -2
  79. data/spec/spec_helper.rb +18 -10
  80. metadata +115 -19
  81. data/Gemfile.lock +0 -134
  82. data/docs/_docs/tutorial-ecs-run.md +0 -100
  83. data/lib/sonic/cli/help.rb +0 -152
  84. data/lib/sonic/settings.rb +0 -115
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: sonic list
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ sonic list [FILTER]
9
+
10
+ ## Description
11
+
12
+ Lists ec2 instances.
13
+
14
+ A filter must be provided. The filter can be a mix of instance ids and ec2 tags. sonic list will auto-detect the what type of filter it is. The filter is optional.
15
+
16
+ ## Examples
17
+
18
+ $ sonic list
19
+ $ sonic list hi-web-prod
20
+ $ sonic list hi-web-prod,hi-clock-prod
21
+ $ sonic list i-09482b1a6e330fbf7
22
+
23
+ ## Example Output
24
+
25
+ $ sonic list --header i-09482b1a6e330fbf7
26
+ Instance Id Public IP Private IP Type
27
+ i-09482b1a6e330fbf7 54.202.152.168 172.31.21.108 t2.small
28
+ $
29
+
30
+ You cannot mix instance ids and tag names in the filter.
31
+
32
+
33
+ ## Options
34
+
35
+ ```
36
+ [--header], [--no-header] # Displays header
37
+ [--verbose], [--no-verbose]
38
+ [--noop], [--no-noop]
39
+ ```
40
+
@@ -0,0 +1,86 @@
1
+ ---
2
+ title: sonic ssh
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ sonic ssh [IDENTIFER]
9
+
10
+ ## Description
11
+
12
+ Ssh into a instance using identifier. identifer can be several things: instance id, ec2 tag, ECS service name, etc.
13
+
14
+ * EC2 instance id. Example: i-067c5e3f026c1e801
15
+ * EC2 tag value. Any tag value is search, the tag key does not matter only the tag value matters. Example: hi-web
16
+ * ECS service. Example: my-ecs-service
17
+ * ECS container instance id. Example: 7fbc8c75-4675-4d39-a5a4-0395ff8cd474
18
+ * ECS task id. Example: 1ed12abd-645c-4a05-9acf-739b9d790170
19
+
20
+ When using ecs identifiers the `--cluster` option is required or can be set in ~/.sonic/settings.yml.
21
+
22
+ Examples:
23
+
24
+ $ sonic ssh i-067c5e3f026c1e801
25
+ $ sonic ssh hi-web
26
+ $ sonic ssh --cluster my-cluster my-ecs-service
27
+ $ sonic ssh 7fbc8c75-4675-4d39-a5a4-0395ff8cd474
28
+ $ sonic ssh 1ed12abd-645c-4a05-9acf-739b9d790170
29
+
30
+ Sonic ssh builds up the ssh command and shells out to it. For example, the following commands:
31
+
32
+ sonic ssh i-027363802c6ff314f
33
+
34
+ Translates to:
35
+
36
+ ssh ec2-user@ec2-52-24-216-170.us-west-2.compute.amazonaws.com
37
+
38
+ You can also tack on any command to be run at the end of the command. Example:
39
+
40
+ $ sonic ssh i-027363802c6ff314f uptime
41
+ => ssh ec2-user@ec2-52-24-216-170.us-west-2.compute.amazonaws.com uptime
42
+ 15:57:02 up 18:21, 0 users, load average: 0.00, 0.01, 0.00
43
+
44
+ ## Specifying pem keys
45
+
46
+ The recommended way to specify custom private keys is to use ssh-agent as covered here: https://blog.boltops.com/2017/09/21/3-ssh-tips-ssh-agent-tunnel-and-escaping-from-the-dead
47
+
48
+ But you can also specify the pem key to use with the -i option. Example:
49
+
50
+ $ sonic ssh -i ~/.ssh/id_rsa-custom ec2-user@ec2-52-24-216-170.us-west-2.compute.amazonaws.com
51
+
52
+ ## Retry option
53
+
54
+ For newly launched instances, the instance's ssh access might not be quite ready. Typically, you must press up enter repeatedly until the instance is ready. Sonic ssh has a retry option that automates this. Example:
55
+
56
+ $ sonic ssh -r i-027363802c6ff314f
57
+
58
+ Bastion Host Support
59
+
60
+ Sonic ssh also supports a bastion host.
61
+
62
+ $ sonic ssh --bastion bastion.domain.com i-027363802c6ff314f
63
+ $ sonic ssh --bastion user@bastion.domain.com i-027363802c6ff314f
64
+
65
+ Here's what the output looks like:
66
+
67
+ $ sonic ssh --bastion 34.211.223.3 i-0f7f833131a51ce35 uptime
68
+ => ssh -At ec2-user@34.211.223.3 ssh ec2-user@10.10.110.135 uptime
69
+ 17:57:59 up 37 min, 0 users, load average: 0.00, 0.02, 0.00
70
+ Connection to 34.211.223.3 closed.
71
+ $
72
+
73
+ You can also set the bastion host and other options with a [settings file](http://sonic-screwdriver.cloud/docs/settings/).
74
+
75
+
76
+ ## Options
77
+
78
+ ```
79
+ -i, [--keys=KEYS] # comma separated list of ssh private key paths
80
+ -r, [--retry], [--no-retry] # keep retrying the server login until successful. Useful when on newly launched instances.
81
+ [--bastion=BASTION] # Bastion jump host to use. Defaults to no bastion server.
82
+ [--cluster=CLUSTER] # ECS Cluster to use. Default cluster is default
83
+ [--verbose], [--no-verbose]
84
+ [--noop], [--no-noop]
85
+ ```
86
+
@@ -0,0 +1,21 @@
1
+ ---
2
+ title: sonic version
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ sonic version
9
+
10
+ ## Description
11
+
12
+ prints version
13
+
14
+
15
+ ## Options
16
+
17
+ ```
18
+ [--verbose], [--no-verbose]
19
+ [--noop], [--no-noop]
20
+ ```
21
+
data/docs/bin/web CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/bin/bash -ex
2
2
 
3
3
  bundle exec jekyll clean
4
- exec bundle exec jekyll serve
4
+ exec bundle exec jekyll serve --host 0.0.0.0 "$@"
data/docs/quick-start.md CHANGED
@@ -6,36 +6,31 @@ In a hurry? No sweat! Here's a quick overview of how to use sonic.
6
6
 
7
7
  ### Install
8
8
 
9
- ```sh
10
- gem install sonic-screwdriver
11
- ```
9
+ gem install sonic-screwdriver
12
10
 
13
11
  ### Usage
14
12
 
15
- ```sh
16
- # ssh into an instance
17
- sonic ssh i-0f7f833131a51ce35
18
- sonic ssh hi-web-stag # ec2 tag
19
- sonic ssh hi-web-stag --cluster stag # ecs service name
20
- sonic ssh hi-web-stag --cluster stag # ecs service name
21
- sonic ssh 7fbc8c75-4675-4d39-a5a4-0395ff8cd474 --cluster stag # ECS container id
22
- sonic ssh 1ed12abd-645c-4a05-9acf-739b9d790170 --cluster stag # ECS task id
13
+ # ssh into an instance
14
+ sonic ssh i-0f7f833131a51ce35
15
+ sonic ssh demo-web # ec2 tag
16
+ sonic ssh demo-web --cluster staging # ecs service name
17
+ sonic ssh 7fbc8c75-4675-4d39-a5a4-0395ff8cd474 --cluster staging # ECS container id
18
+ sonic ssh 1ed12abd-645c-4a05-9acf-739b9d790170 --cluster staging # ECS task id
23
19
 
24
- # docker exec to a running ECS docker container
25
- sonic ecs-exec hi-web-stag
20
+ # docker exec to a running ECS docker container
21
+ sonic ecs exec demo-web
26
22
 
27
- # docker run with same environment as the ECS docker running containers
28
- sonic ecs-run hi-web-stag
23
+ # docker run with same environment as the ECS docker running containers
24
+ sonic ecs sh demo-web
29
25
 
30
- # run command on 1 instance
31
- sonic execute i-0f7f833131a51ce35 uptime
26
+ # run command on 1 instance
27
+ sonic execute --instance-ids i-0f7f833131a51ce35 uptime
32
28
 
33
- # run command on all instances tagged with hi-web-stag and worker
34
- sonic execute hi-web-stag,hi-worker-stag uptime
29
+ # run command on all instances tagged with demo-web and worker
30
+ sonic execute --tags Name=demo-web,demo-worker uptime
35
31
 
36
- # list ec2 instances
37
- sonic list hi-web-stag
38
- ```
32
+ # list ec2 instances
33
+ sonic list demo-web
39
34
 
40
35
  Congratulations! You now know the basic sonic screwdriver commands now.
41
36
 
data/docs/reference.md ADDED
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: CLI Reference
3
+ ---
4
+ {% include reference.md %}
5
+
6
+ * [sonic completion]({% link _reference/sonic-completion.md %})
7
+ * [sonic completion_script]({% link _reference/sonic-completion_script.md %})
8
+ * [sonic ecs]({% link _reference/sonic-ecs.md %})
9
+ * [sonic execute]({% link _reference/sonic-execute.md %})
10
+ * [sonic list]({% link _reference/sonic-list.md %})
11
+ * [sonic ssh]({% link _reference/sonic-ssh.md %})
12
+ * [sonic version]({% link _reference/sonic-version.md %})
data/{bin → exe}/sonic RENAMED
@@ -7,8 +7,8 @@ Signal.trap("INT") {
7
7
  exit
8
8
  }
9
9
 
10
- $:.unshift(File.expand_path('../../lib', __FILE__))
11
- require 'sonic'
12
- require 'sonic/cli'
10
+ $:.unshift(File.expand_path("../../lib", __FILE__))
11
+ require "sonic"
12
+ require "sonic/cli"
13
13
 
14
14
  Sonic::CLI.start(ARGV)
@@ -12,4 +12,5 @@ else
12
12
  COMMAND=bash
13
13
  fi
14
14
 
15
+ set -x
15
16
  exec docker exec -ti $CONTAINER_ID $COMMAND
@@ -12,4 +12,11 @@ CONTAINER_IMAGE=$(cat /tmp/sonic/docker-image.txt)
12
12
  cp /tmp/sonic/env-file.txt ~/
13
13
  rm -rf /tmp/sonic
14
14
 
15
- exec docker run -ti --env-file ~/env-file.txt $CONTAINER_IMAGE "$@"
15
+ if [ $# -eq 0 ]; then
16
+ COMMAND=bash
17
+ else
18
+ COMMAND=$@
19
+ fi
20
+
21
+ set -x
22
+ exec docker run -ti --env-file ~/env-file.txt "$CONTAINER_IMAGE" $COMMAND
data/lib/sonic.rb CHANGED
@@ -1,16 +1,24 @@
1
1
  $:.unshift(File.expand_path("../", __FILE__))
2
+ require "rainbow/ext/string"
2
3
  require "sonic/version"
3
- require "colorize"
4
4
 
5
5
  module Sonic
6
- autoload :AwsServices, 'sonic/aws_services'
6
+ autoload :Core, 'sonic/core'
7
+ autoload :Help, 'sonic/help'
8
+ autoload :AwsService, 'sonic/aws_service'
7
9
  autoload :CLI, 'sonic/cli'
10
+ autoload :BaseCommand, 'sonic/base_command'
8
11
  autoload :Command, 'sonic/command'
9
12
  autoload :Docker, 'sonic/docker'
10
13
  autoload :Execute, 'sonic/execute'
11
14
  autoload :List, 'sonic/list'
12
- autoload :Settings, 'sonic/settings'
15
+ autoload :Setting, 'sonic/setting'
13
16
  autoload :Ssh, 'sonic/ssh'
14
17
  autoload :UI, 'sonic/ui'
15
18
  autoload :Checks, 'sonic/checks'
19
+ autoload :Completion, "sonic/completion"
20
+ autoload :Completer, "sonic/completer"
21
+ autoload :Ecs, "sonic/ecs"
22
+
23
+ extend Core
16
24
  end
@@ -1,9 +1,10 @@
1
1
  require "aws-sdk-ec2"
2
2
  require "aws-sdk-ecs"
3
3
  require "aws-sdk-ssm"
4
+ require "aws-sdk-s3"
4
5
 
5
6
  module Sonic
6
- module AwsServices
7
+ module AwsService
7
8
  def ecs
8
9
  @ecs ||= Aws::ECS::Client.new
9
10
  end
@@ -19,5 +20,9 @@ module Sonic
19
20
  def ssm
20
21
  @ssm ||= Aws::SSM::Client.new
21
22
  end
23
+
24
+ def s3
25
+ @s3 ||= Aws::S3::Client.new
26
+ end
22
27
  end
23
28
  end
@@ -0,0 +1,82 @@
1
+ require "thor"
2
+
3
+ # Override thor's long_desc identation behavior
4
+ # https://github.com/erikhuda/thor/issues/398
5
+ class Thor
6
+ module Shell
7
+ class Basic
8
+ def print_wrapped(message, options = {})
9
+ message = "\n#{message}" unless message[0] == "\n"
10
+ stdout.puts message
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ module Sonic
17
+ class BaseCommand < Thor
18
+ class << self
19
+ def dispatch(m, args, options, config)
20
+ # Allow calling for help via:
21
+ # sonic command help
22
+ # sonic command -h
23
+ # sonic command --help
24
+ # sonic command -D
25
+ #
26
+ # as well thor's normal way:
27
+ #
28
+ # sonic help command
29
+ help_flags = Thor::HELP_MAPPINGS + ["help"]
30
+ if args.length > 1 && !(args & help_flags).empty?
31
+ args -= help_flags
32
+ args.insert(-2, "help")
33
+ end
34
+
35
+ # sonic version
36
+ # sonic --version
37
+ # sonic -v
38
+ version_flags = ["--version", "-v"]
39
+ if args.length == 1 && !(args & version_flags).empty?
40
+ args = ["version"]
41
+ end
42
+
43
+ super
44
+ end
45
+
46
+ # Override command_help to include the description at the top of the
47
+ # long_description.
48
+ def command_help(shell, command_name)
49
+ meth = normalize_command_name(command_name)
50
+ command = all_commands[meth]
51
+ alter_command_description(command)
52
+ super
53
+ end
54
+
55
+ def alter_command_description(command)
56
+ return unless command
57
+
58
+ # Add description to beginning of long_description
59
+ long_desc = if command.long_description
60
+ "#{command.description}\n\n#{command.long_description}"
61
+ else
62
+ command.description
63
+ end
64
+
65
+ # add reference url to end of the long_description
66
+ unless website.empty?
67
+ full_command = [command.ancestor_name, command.name].compact.join('-')
68
+ url = "#{website}/reference/sonic-#{full_command}"
69
+ long_desc += "\n\nHelp also available at: #{url}"
70
+ end
71
+
72
+ command.long_description = long_desc
73
+ end
74
+ private :alter_command_description
75
+
76
+ # meant to be overriden
77
+ def website
78
+ "http://sonic-screwdriver.cloud"
79
+ end
80
+ end
81
+ end
82
+ end
data/lib/sonic/checks.rb CHANGED
@@ -3,7 +3,7 @@ module Sonic
3
3
  def check_cluster_exists!
4
4
  cluster = ecs.describe_clusters(clusters: [@cluster]).clusters.first
5
5
  unless cluster
6
- UI.error "The #{@cluster.green} cluster does not exist. Are you sure you specified the right cluster?"
6
+ UI.error "The #{@cluster.color(:green)} cluster does not exist. Are you sure you specified the right cluster?"
7
7
  exit 1
8
8
  end
9
9
  end
@@ -20,7 +20,7 @@ module Sonic
20
20
 
21
21
  service = resp.services.first
22
22
  unless service
23
- UI.error "The #{@service.green} service does not exist in #{@cluster.green} cluster. Are you sure you specified the right service and cluster?"
23
+ UI.error "The #{@service.color(:green)} service does not exist in #{@cluster.color(:green)} cluster. Are you sure you specified the right service and cluster?"
24
24
  exit 1
25
25
  end
26
26
  end
data/lib/sonic/cli.rb CHANGED
@@ -1,49 +1,61 @@
1
1
  require 'thor'
2
- require 'sonic/cli/help'
3
2
 
4
3
  module Sonic
5
- class CLI < Command
4
+ class CLI < BaseCommand
5
+ desc "ecs SUBCOMMAND", "ecs subcommands"
6
+ long_desc Help.text(:ecs)
7
+ subcommand "ecs", Ecs
8
+
9
+ # desc "command SUBCOMMAND", "command subcommands"
10
+ # long_desc Help.text(:command)
11
+ # subcommand "command", Command
12
+
6
13
  class_option :verbose, type: :boolean
7
14
  class_option :noop, type: :boolean
8
- class_option :cluster, desc: "ECS Cluster to use. Default cluster is default"
9
- class_option :bastion, desc: "Bastion jump host to use. Defaults to no bastion server."
10
- class_option :project_root, desc: "Project root. Useful for testing.", hide: true
11
-
12
- desc "ssh [IDENTIFER]", "ssh into a instance using identifier. identifer can be several things: instance id, ec2 tag, ECS service name, etc"
13
- long_desc Help.ssh
14
- method_option :keys, :aliases => '-i', :desc => "comma separated list of ssh private key paths"
15
- method_option :retry, :aliases => '-r', :type => :boolean, :desc => "keep retrying the server login until successful. Useful when on newly launched instances."
15
+
16
+ desc "ssh [IDENTIFER]", "Ssh into a instance using identifier. identifer can be several things: instance id, ec2 tag, ECS service name, etc."
17
+ long_desc Help.text(:ssh)
18
+ option :keys, :aliases => '-i', :desc => "comma separated list of ssh private key paths"
19
+ option :retry, :aliases => '-r', :type => :boolean, :desc => "keep retrying the server login until successful. Useful when on newly launched instances."
20
+ option :bastion, desc: "Bastion jump host to use. Defaults to no bastion server."
21
+ option :cluster, desc: "ECS Cluster to use. Default cluster is default"
16
22
  def ssh(identifier, *command)
17
23
  Ssh.new(identifier, options.merge(command: command)).run
18
24
  end
19
25
 
20
- desc "ecs-exec [ECS_SERVICE]", "docker exec into running docker container associated with the service on a container instance"
21
- long_desc Help.ecs_exec
22
- def ecs_exec(service, *command)
23
- Docker.new(service, options.merge(command: command)).exec
24
- end
25
-
26
- # Cannot name the command run because that is a reserved Thor keyword :(
27
- desc "ecs-run [ECS_SERVICE]", "docker run with the service on a container instance"
28
- long_desc Help.ecs_run
29
- def ecs_run(service, *command)
30
- Docker.new(service, options.merge(command: command)).run
31
- end
32
-
33
- desc "execute [FILTER] [COMMAND]", "runs command across fleet of servers via AWS Run Command"
34
- long_desc Help.execute
26
+ desc "execute [FILTER] [COMMAND]", "Runs command across fleet of servers via AWS Run Command."
27
+ long_desc Help.text("execute")
35
28
  option :zero_warn, type: :boolean, default: true, desc: "Warns user when no instances found"
36
29
  # filter - Filter ec2 instances by tag name or instance_ids separated by commas
37
- def execute(filter, *command)
38
- Execute.new(command, options.merge(filter: filter)).execute
30
+ option :instance_ids, desc: %Q|Instance ids to execute command on. Format: --instance-ids "i-111,i-222"|
31
+ option :tags, desc: %Q|Tags used to determine what instances to execute command on. Format: --tags "Key1=v1,v2;Key2=v3"|
32
+ def execute(*command)
33
+ Execute.new(command, options).execute
39
34
  end
40
35
 
41
- desc "list [FILTER]", "lists ec2 instances"
42
- long_desc Help.list
36
+ desc "list [FILTER]", "Lists ec2 instances."
37
+ long_desc Help.text(:list)
43
38
  option :header, type: :boolean, desc: "Displays header"
44
39
  # filter - Filter ec2 instances by tag name or instance_ids separated by commas
45
40
  def list(filter)
46
41
  List.new(options.merge(filter: filter)).run
47
42
  end
43
+
44
+ desc "completion *PARAMS", "Prints words for auto-completion."
45
+ long_desc Help.text("completion")
46
+ def completion(*params)
47
+ Completer.new(CLI, *params).run
48
+ end
49
+
50
+ desc "completion_script", "Generates a script that can be eval to setup auto-completion."
51
+ long_desc Help.text("completion_script")
52
+ def completion_script
53
+ Completer::Script.generate
54
+ end
55
+
56
+ desc "version", "prints version"
57
+ def version
58
+ puts VERSION
59
+ end
48
60
  end
49
61
  end