awx 0.1.0 → 0.2.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.
@@ -0,0 +1,271 @@
1
+ module App
2
+
3
+ class AWSReports
4
+
5
+ CONST_ALL = 'all'
6
+ CONST_GLOBAL = 'Global'
7
+ KEY_CLI = 'cli'
8
+ KEY_COLUMNS = 'columns'
9
+ KEY_COMMAND = 'command'
10
+ KEY_EXPORT = 'export'
11
+ KEY_REGION = 'region'
12
+ KEY_REGIONS = 'regions'
13
+ KEY_REGIONS_PREFERRED = 'regionsPreferred'
14
+
15
+ YML_FILE = 'aws-reports.yml'
16
+
17
+ # Parses the YML file and returns a bunch of Hashes. Throws straight-up runtime errors if something is wrong.
18
+ # @return void
19
+ def self.parse_metadata(regions)
20
+
21
+ yml_file = "#{App::Opt::get_base_path}#{App::Opt::OPT_PATH_YML}/#{YML_FILE}"
22
+ Blufin::Terminal::error("File not found: #{Blufin::Terminal::format_directory(yml_file)}", 'This file should be located in the /opt folder of the my (ruby-gem) source-code.', true) unless Blufin::Files::file_exists(yml_file)
23
+
24
+ columns = {}
25
+ table_widths = {}
26
+ export_map = {}
27
+
28
+ begin
29
+ data = YAML.load_file(File.expand_path(yml_file))
30
+ rescue => e
31
+ Blufin::Terminal::error("Unable to parse #{Blufin::Terminal::format_action('YML')} file: #{Blufin::Terminal::format_directory(yml_file)}", e.message, true)
32
+ end
33
+
34
+ data.each do |resource, data|
35
+
36
+ # Validates keys (generically).
37
+ {
38
+ KEY_REGIONS => [],
39
+ KEY_REGIONS_PREFERRED => [],
40
+ KEY_CLI => %w(command root)
41
+ }.each do |required_key, required_nested_keys|
42
+ raise RuntimeError, "Missing key: #{required_key} for \xe2\x86\x92 #{resource}" unless data.has_key?(required_key)
43
+ required_nested_keys.each do |required_nested_key|
44
+ raise RuntimeError, "Missing key: #{required_key}.#{required_nested_key} for \xe2\x86\x92 #{resource}" unless data[required_key].has_key?(required_nested_key)
45
+ end
46
+ end
47
+
48
+ # Validate regions.
49
+ validate_region_array(regions, data[KEY_REGIONS], resource) if data.has_key?(KEY_REGIONS)
50
+ validate_region_array(regions, data[KEY_REGIONS_PREFERRED], resource) if data.has_key?(KEY_REGIONS_PREFERRED)
51
+
52
+ # Validate (and parse) columns.
53
+ if !data[KEY_COLUMNS].nil? && data[KEY_COLUMNS].any?
54
+ if data.has_key?(KEY_COLUMNS) && data[KEY_COLUMNS].is_a?(Array)
55
+ columns[resource] = {} unless columns.has_key?(resource)
56
+ width_wildcard_count = 0
57
+ width_total = App::AWSOutputter::REGION_WIDTH # Start with 15 to account for hard-coded region column.
58
+ columns[resource]['Region'] = {
59
+ :key => 'region',
60
+ :width => App::AWSOutputter::REGION_WIDTH,
61
+ :formatter => 'region'
62
+ }
63
+ data[KEY_COLUMNS].each_with_index do |column, idx|
64
+ title = nil
65
+ key = nil
66
+ width = nil
67
+ color = 'default'
68
+ formatter = nil
69
+ column.each do |column_inner|
70
+ column_inner.each do |k, v|
71
+ title = v if k == 'title'
72
+ key = v if k == 'key'
73
+ width = v if k == 'width'
74
+ color = v if k == 'color'
75
+ formatter = v if k == 'formatter'
76
+ end
77
+ end
78
+ ['Region'].each do |reserved_column|
79
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 #{reserved_column} is a reserved column." if title.downcase == reserved_column.downcase
80
+ end
81
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Missing: title" if title.nil?
82
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Missing: key" if key.nil?
83
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Missing: width" if width.nil?
84
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Title already exists: #{title}" if columns[resource].has_key?(title)
85
+ raise RuntimeError, "Expected width to be wildcard (*) or Integer greater than 0, instead got: (#{width.class}) #{width}" unless width == '*' || width.is_a?(Integer)
86
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Title length (#{title.length}) is longer that column-width (#{width}) : #{title}" if title.length > width.to_i && width.to_s.strip != '*'
87
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Formatter not recognized: #{formatter}, valid formatters are: #{App::AWSOutputter::get_formatter.join(', ')}" unless App::AWSOutputter::get_formatter.include?(formatter) || formatter.nil?
88
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS}[#{idx}] \xe2\x86\x92 Color not recognized: #{color}, valid colors are: #{App::AWSOutputter::get_color.join(', ')}" unless App::AWSOutputter::get_color.include?(color)
89
+ width_wildcard_count = width_wildcard_count + 1 if width == '*'
90
+ width_total = width_total + width unless width == '*'
91
+ columns[resource][title] = {
92
+ :key => key,
93
+ :width => width,
94
+ :color => color,
95
+ :formatter => formatter
96
+ }
97
+ end
98
+ raise RuntimeError, "Wildcard width count must be exactly 1, got: #{width_wildcard_count}" unless width_wildcard_count == 1
99
+ raise RuntimeError, "#{resource}.#{KEY_COLUMNS} \xe2\x86\x92 Total width of columns (#{width_total}) minus wildcard (*) & region exceeds 210." if width_total > 210
100
+ table_widths[resource] = width_total
101
+ end
102
+ end
103
+ # Validate Exports.
104
+ if !data[KEY_EXPORT].nil? && data[KEY_EXPORT].any?
105
+ raise RuntimeError, "Expected #{Blufin::Terminal::format_highlight('export')} to be a Hash, instead got: #{data[KEY_EXPORT].class}" unless data[KEY_EXPORT].is_a?(Hash)
106
+ raise RuntimeError, "#{resource}.#{KEY_EXPORT} \xe2\x86\x92 Missing: id" unless data[KEY_EXPORT].has_key?('id')
107
+ raise RuntimeError, "#{resource}.#{KEY_EXPORT} \xe2\x86\x92 Missing: value" unless data[KEY_EXPORT].has_key?('value')
108
+ raise RuntimeError, "#{resource}.#{KEY_EXPORT} \xe2\x86\x92 Missing: description" unless data[KEY_EXPORT].has_key?('description')
109
+ # Make sure formatter exists.
110
+ App::AWSOutputter::get_formatter(data[KEY_EXPORT]['valueFormatter']) if data[KEY_EXPORT].has_key?('valueFormatter')
111
+ data[KEY_EXPORT].each { |key, val| raise RuntimeError, "Unexpected key: #{key} (#{val})" unless %w(id value valueFormatter description).include?(key) }
112
+ export_map[data[KEY_EXPORT]['id']] = resource
113
+ end
114
+ end
115
+
116
+ # TODO - Maybe add "custom" resources here for WorkMailEmails and SES Identities, etc. here...?? If so, these need custom logic.
117
+
118
+ [columns, data, export_map, table_widths]
119
+ end
120
+
121
+ # This runs the AWS GET and does various things depending on the the flags passed.
122
+ # @return void
123
+ def self.get_aws_data(regions, resource, resource_title, silent: false)
124
+ response = {}
125
+ results = []
126
+ threads = []
127
+ semaphore = Mutex.new
128
+ regions = resource.has_key?(App::AWSReports::KEY_REGIONS) ? resource[App::AWSReports::KEY_REGIONS] : regions
129
+ puts unless silent
130
+ regions.each do |region|
131
+ response[region] = {} if response[region].nil?
132
+ sleep(0.01) unless silent
133
+ threads << Thread.new {
134
+ cmd = "aws #{resource[App::AWSReports::KEY_CLI][App::AWSReports::KEY_COMMAND]}#{region == App::AWSReports::CONST_GLOBAL ? '' : " --region #{region}"}"
135
+ puts " \x1B[38;5;70m$ \x1B[38;5;240m#{cmd}\x1B[0m" unless silent
136
+ json = `#{cmd}`
137
+ begin
138
+ semaphore.synchronize do
139
+ if json.strip == ''
140
+ response[region] = []
141
+ else
142
+ response[region] = JSON.parse(json)
143
+ end
144
+ end
145
+ rescue => e
146
+ puts json.inspect
147
+ raise RuntimeError, "JSON parsing (for: #{resource_title}) failed:\n\n#{e.message}"
148
+ end
149
+ }
150
+ end
151
+ sleep(0.1) unless silent
152
+ puts unless silent
153
+
154
+ # Display spinner while waiting for threads to finish.
155
+ Blufin::Terminal::execute_proc("AWS - Fetching: #{Blufin::Terminal::format_highlight(resource_title, false)}", Proc.new {
156
+ threads.each { |thread| thread.join }
157
+ }, verbose: !silent)
158
+ puts unless silent
159
+
160
+ # Extract the regional response(s) (from multi-calls to different regions) and aggregate into a single Array.
161
+ root_keys = resource[App::AWSReports::KEY_CLI]['root']
162
+
163
+ if resource[App::AWSReports::KEY_REGIONS].length == 1 && resource[App::AWSReports::KEY_REGIONS][0] == App::AWSReports::CONST_GLOBAL
164
+ results = recursively_get_results(App::AWSReports::CONST_GLOBAL, response[App::AWSReports::CONST_GLOBAL], root_keys)
165
+ else
166
+ response.each do |region, regional_response|
167
+ recursively_get_results(region, regional_response, root_keys).each do |regional_result|
168
+ results << regional_result
169
+ end
170
+ end
171
+ end
172
+ results
173
+ end
174
+
175
+ # Returns a Hash with all the resources that can be auto-fetched using a script.
176
+ # @return Hash
177
+ def self.get_auto_fetch_resources(data)
178
+ auto_fetch_resources = {}
179
+ data.each do |resource|
180
+ if resource[1].has_key?(App::AWSReports::KEY_EXPORT)
181
+ if resource[1][App::AWSReports::KEY_EXPORT].has_key?('id')
182
+ auto_fetch_resources[resource[1][App::AWSReports::KEY_EXPORT]['id']] = {
183
+ :resource_title => resource[0],
184
+ :resource => resource[1]
185
+ }
186
+ end
187
+ end
188
+ end
189
+ auto_fetch_resources
190
+ end
191
+
192
+ # Takes AWS api results and translates it to an array of key/value pairs we can pass to Blufin::Terminal::prompt_select().
193
+ # @return Array (of Hashes)
194
+ def self.parse_results_for_prompt(resource, results)
195
+ options = []
196
+ values = []
197
+ results.each do |result|
198
+ value = result[resource[App::AWSReports::KEY_EXPORT]['value']]
199
+ value = App::AWSOutputter::get_formatter(resource[App::AWSReports::KEY_EXPORT]['valueFormatter']).call(value)[0] if resource[App::AWSReports::KEY_EXPORT].has_key?('valueFormatter')
200
+ values << value
201
+ end
202
+ results.each do |result|
203
+ value = result[resource[App::AWSReports::KEY_EXPORT]['value']]
204
+ value = App::AWSOutputter::get_formatter(resource[App::AWSReports::KEY_EXPORT]['valueFormatter']).call(value)[0] if resource[App::AWSReports::KEY_EXPORT].has_key?('valueFormatter')
205
+ options << {
206
+ :value => value,
207
+ :text => "#{value.rjust(values.max_by(&:length).length.to_i, ' ')} \x1B[38;5;246m\xe2\x80\x94 \x1B[38;5;240m#{result[resource[App::AWSReports::KEY_EXPORT]['description']]}\x1B[0m",
208
+ }
209
+ end
210
+ options
211
+ end
212
+
213
+ private
214
+
215
+ # Validates a region array such as ['us-west-1','us-west-2'].
216
+ # @return void
217
+ def self.validate_region_array(regions, region_array, resource)
218
+ has_global = false
219
+ raise RuntimeError, "#{resource} \xe2\x86\x92 Expected regions to be an Array of Strings, instead got: (#{region_array.class}) #{region_array}" unless region_array.is_a?(Array)
220
+ region_array.each do |region|
221
+ raise RuntimeError, "#{resource} \xe2\x86\x92 Expected region to be a String, instead got: (#{region.class}) #{region}" unless region.is_a?(String)
222
+ raise RuntimeError, "#{resource} \xe2\x86\x92 Invalid region: #{Blufin::Terminal::format_invalid(region)}. Valid regions are: #{regions.inspect}" unless region == App::AWSReports::CONST_GLOBAL || regions.include?(region)
223
+ has_global = true if region == App::AWSReports::CONST_GLOBAL
224
+ end
225
+ raise RuntimeError, "#{resource} \xe2\x86\x92 Cannot have more than 1 region when #{App::AWSReports::KEY_REGIONS} has the #{App::AWSReports::CONST_GLOBAL} key. Found: #{region_array.inspect}" if has_global && region_array.length > 1
226
+ end
227
+
228
+ # Recursively gets results out of the JSON returned by AWS.
229
+ # @return Array
230
+ def self.recursively_get_results(region, response, keys)
231
+ ks = keys.split('.')
232
+ first_key = ks[0]
233
+ is_array = first_key != first_key.gsub(/\[\]$/, '')
234
+ first_key = first_key.gsub(/\[\]$/, '') if is_array
235
+ results = []
236
+ if response.is_a?(Hash) || response.is_a?(Array)
237
+ check_root_key_exists(response, first_key) if response.is_a?(Hash)
238
+ ks.shift
239
+ if ks.length == 0
240
+ response[first_key].each do |result|
241
+ res = result
242
+ res[App::AWSReports::KEY_REGION] = region
243
+ results << res
244
+ end
245
+ else
246
+ if is_array
247
+ results_aggregate = []
248
+ response[first_key].each do |x|
249
+ recursively_get_results(region, x, ks.join('.')).each do |y|
250
+ results_aggregate << y
251
+ end
252
+ end
253
+ results_aggregate
254
+ else
255
+ recursively_get_results(region, response[first_key], ks.join('.')) if response.is_a?(Hash)
256
+ end
257
+ end
258
+ else
259
+ results
260
+ end
261
+ end
262
+
263
+ # Throw error if Root Key not found in response.
264
+ # @return void
265
+ def self.check_root_key_exists(data, root_key)
266
+ Blufin::Terminal::error("Root key not found in AWS response: #{Blufin::Terminal::format_invalid(root_key)}", data.to_yaml.split("\n"), true) unless data.has_key?(root_key)
267
+ end
268
+
269
+ end
270
+
271
+ end
@@ -0,0 +1,30 @@
1
+ module App
2
+
3
+ class AWSValidator
4
+
5
+ # Helper method to get + validate regions. Probably going to be used in all AWS Cli calls.
6
+ # @return Array
7
+ def self.get_and_validate_regions(region_given)
8
+ regions = App::AWSCli::get_regions
9
+ if region_given
10
+ Blufin::Terminal::error("Invalid AWS region \xe2\x86\x92 #{Blufin::Terminal::format_invalid(region_given)}. Valid regions are:", regions) unless App::AWSValidator::validate_region(region_given)
11
+ @regions << region_given
12
+ else
13
+ @regions = regions
14
+ end
15
+ end
16
+
17
+ # Validates AWS region.
18
+ # @return boolean
19
+ def self.validate_region(region)
20
+ if App::Cache::exists?(App::CacheKey::ARRAY_AWS_REGIONS)
21
+ valid_regions = App::Cache::get(App::CacheKey::ARRAY_AWS_REGIONS)
22
+ else
23
+ valid_regions = App::AWSCli::get_regions
24
+ end
25
+ valid_regions.include?(region)
26
+ end
27
+
28
+ end
29
+
30
+ end
data/lib/awx.rb CHANGED
@@ -5,9 +5,10 @@ require 'blufin-lib'
5
5
 
6
6
  require_relative 'version'
7
7
  require 'core/config_unique'
8
- require 'core/aws/aws_config'
9
- require 'core/aws/aws_credentials'
8
+ require 'aws/aws_config'
9
+ require 'aws/aws_credentials'
10
10
 
11
+ Dir["#{File.dirname(__FILE__)}/aws/**/*.rb"].each { |file| load(file) unless file =~ /\/(config_unique|aws_config|aws_credentials)\.rb\z/ }
11
12
  Dir["#{File.dirname(__FILE__)}/core/**/*.rb"].each { |file| load(file) unless file =~ /\/(config_unique|aws_config|aws_credentials)\.rb\z/ }
12
13
  Dir["#{File.dirname(__FILE__)}/routes/**/*.rb"].each { |file| load(file) }
13
14
 
@@ -21,96 +22,87 @@ module App
21
22
  App::Config.initialize
22
23
  end
23
24
 
24
- Convoy::App.create do |my|
25
+ Convoy::App.create do |awx|
25
26
 
26
- # COLOR OF TITLE TEXT
27
- title_color = 255
27
+ awx.version AWX_VERSION
28
+ awx.summary "\x1B[38;5;198mAWX\x1B[0m \x1B[38;5;134m\xe2\x80\x94 Amazon Web-Services X-Tender (Beta)\x1B[0m"
29
+ awx.description 'An abstraction layer built around the AWS-cli (written by: Albert Rannetsperger)'
28
30
 
29
- my.version VERSION
30
- my.summary "\x1B[38;5;198mMY-CLI\x1B[0m \x1B[38;5;240m\xe2\x80\x94 BETA\x1B[0m"
31
- my.description "\x1B[38;5;#{title_color}mA command line utility for myself.\nDesigned to work from anywhere on my mac.\n\nUse #{Blufin::Terminal::format_command('my')}\x1B[38;5;#{title_color}m to run.\x1B[0m"
32
-
33
- # Checks whether a AWS 'blufin-cli' profile exists within ~/.aws ...
31
+ # Checks whether a AWS 'blufin-cli' profile exists within ~/.awx ...
34
32
  unless App::AWSConfig::get_credentials(App::AWSConfig::AWS_PROFILE_ALBERT_CLI).nil?
35
- # a - AWS
36
- my.command :aws, :aliases => [:a] do |aws|
37
- aws.summary 'AWS related functionality'
38
- # cf - AWS CLOUD FORMATION
39
- aws.command :cloudformation, :aliases => [:c] do |aws_cloudformation|
40
- aws_cloudformation.summary 'Create, list and delete cloud-formation stacks'
41
- # c - AWS CLOUD FORMATION CREATE
42
- aws_cloudformation.command :create, :aliases => [:c] do |aws_cloudformation_create|
43
- aws_cloudformation_create.summary 'Create stack'
44
- aws_cloudformation_create.options do |opts|
45
- opts.opt :test, 'Run through test-template.', :short => '-t', :long => '--test', :type => :boolean
46
- end
47
- aws_cloudformation_create.action do |opts, args|
48
- AppCommand::AWSCloudFormationCreate.new(opts, args).execute
49
- end
50
- end
51
- # d - AWS CLOUD FORMATION DETECT-DRIFT
52
- aws_cloudformation.command :detect_drift, :aliases => [:d] do |aws_cloudformation_detect_drift|
53
- aws_cloudformation_detect_drift.summary 'Detect drift (for stack)'
54
- aws_cloudformation_detect_drift.action do |opts, args|
55
- AppCommand::AWSCloudFormationDetectDrift.new(opts, args).execute
56
- end
33
+ # cf - AWS CLOUD FORMATION
34
+ awx.command :cloudformation, :aliases => [:c] do |awx_cloudformation|
35
+ awx_cloudformation.summary 'Create, list and delete cloud-formation stacks'
36
+ # c - AWS CLOUD FORMATION CREATE
37
+ awx_cloudformation.command :create, :aliases => [:c] do |awx_cloudformation_create|
38
+ awx_cloudformation_create.summary 'Create stack'
39
+ awx_cloudformation_create.options do |opts|
40
+ opts.opt :test, 'Run through test-template.', :short => '-t', :long => '--test', :type => :boolean
57
41
  end
58
- # D - AWS CLOUD FORMATION DELETE
59
- aws_cloudformation.command :delete, :aliases => [:D] do |aws_cloudformation_delete|
60
- aws_cloudformation_delete.summary 'Delete stack'
61
- aws_cloudformation_delete.action do |opts, args|
62
- AppCommand::AWSCloudFormationDelete.new(opts, args).execute
63
- end
64
- end
65
- aws_cloudformation.action do
66
- system("#{ConfigUnique::GEM_NAME} a c -h")
42
+ awx_cloudformation_create.action do |opts, args|
43
+ AppCommand::AWSCloudFormationCreate.new(opts, args).execute
67
44
  end
68
45
  end
69
- # l - AWS LIST
70
- aws.command :list, :aliases => [:l] do |aws_list|
71
- aws_list.summary 'List AWS instances/resources'
72
- aws_list.options do |opts|
73
- opts.opt :json, 'Return data as JSON', :short => '-j', :long => '--json', :type => :boolean
74
- opts.opt :json_prompt, 'Return data as JSON (for Terminal::prompt)', :short => '-J', :long => '--json-prompt', :type => :boolean
75
- opts.opt :yaml, 'Return data as Yaml', :short => '-y', :long => '--yaml', :type => :boolean
76
- opts.opt :resource, "Specify a resource. For all resources type: #{Blufin::Terminal::format_command('all')}", :short => '-r', :long => '--resource', :type => :string
77
- opts.opt :verbose, 'Output the original response from AWS (with all fields).', :short => '-v', :long => '--verbose', :type => :boolean
78
- opts.opt :metadata, 'Output the YML definition file metadata.', :short => '-m', :long => '--metadata', :type => :boolean
79
- # TODO - Implement Region + Project filtering (possibly more).
80
- opts.opt :region, 'Specify a region', :short => '-R', :long => '--region', :type => :string
81
- opts.opt :project, 'Specify a project (Tag: project)', :short => '-p', :long => '--project', :type => :string
82
- end
83
- aws_list.action do |opts, args|
84
- AppCommand::AWSList.new(opts, args).execute
46
+ # d - AWS CLOUD FORMATION DETECT-DRIFT
47
+ awx_cloudformation.command :detect_drift, :aliases => [:d] do |awx_cloudformation_detect_drift|
48
+ awx_cloudformation_detect_drift.summary 'Detect drift (for stack)'
49
+ awx_cloudformation_detect_drift.action do |opts, args|
50
+ AppCommand::AWSCloudFormationDetectDrift.new(opts, args).execute
85
51
  end
86
52
  end
87
- # L - AWS LAMBDA
88
- aws.command :lambda, :aliases => [:L] do |aws_lambda|
89
- aws_lambda.summary 'Quickly invoke a Lambda function locally (without the need to deploy)'
90
- aws_lambda.options do |opts|
91
- opts.opt :headers_file, 'The path to a JSON containing HTTP Headers you want to send', :short => '-H', :long => '--headers-file', :type => :string
92
- opts.opt :payload_file, 'The path to a JSON payload you want to send', :short => '-p', :long => '--pay-load-file', :type => :string
93
- end
94
- aws_lambda.action do |opts, args|
95
- AppCommand::AWSLambda.new(opts, args).execute
53
+ # D - AWS CLOUD FORMATION DELETE
54
+ awx_cloudformation.command :delete, :aliases => [:D] do |awx_cloudformation_delete|
55
+ awx_cloudformation_delete.summary 'Delete stack'
56
+ awx_cloudformation_delete.action do |opts, args|
57
+ AppCommand::AWSCloudFormationDelete.new(opts, args).execute
96
58
  end
97
59
  end
98
- aws.action do |opts, args|
99
- system("#{ConfigUnique::GEM_NAME} a -h")
60
+ awx_cloudformation.action do
61
+ system("#{ConfigUnique::GEM_NAME} c -h")
62
+ end
63
+ end
64
+ # l - AWS LIST
65
+ awx.command :list, :aliases => [:l] do |awx_list|
66
+ awx_list.summary 'List AWS instances/resources'
67
+ awx_list.options do |opts|
68
+ opts.opt :json, 'Return data as JSON', :short => '-j', :long => '--json', :type => :boolean
69
+ opts.opt :json_prompt, 'Return data as JSON (for Terminal::prompt)', :short => '-J', :long => '--json-prompt', :type => :boolean
70
+ opts.opt :yaml, 'Return data as Yaml', :short => '-y', :long => '--yaml', :type => :boolean
71
+ opts.opt :resource, "Specify a resource. For all resources type: #{Blufin::Terminal::format_command('all')}", :short => '-r', :long => '--resource', :type => :string
72
+ opts.opt :verbose, 'Output the original response from AWS (with all fields).', :short => '-v', :long => '--verbose', :type => :boolean
73
+ opts.opt :metadata, 'Output the YML definition file metadata.', :short => '-m', :long => '--metadata', :type => :boolean
74
+ # TODO - Implement Region + Project filtering (possibly more).
75
+ opts.opt :region, "Specify a region \xe2\x80\x94 #{Blufin::Terminal::format_invalid('@NotImplemented')}", :short => '-R', :long => '--region', :type => :string
76
+ opts.opt :environment, "Specify a environment \xe2\x80\x94 #{Blufin::Terminal::format_invalid('@NotImplemented')}", :short => '-e', :long => '--environment', :type => :string
77
+ opts.opt :project, "Specify a project \xe2\x80\x94 #{Blufin::Terminal::format_invalid('@NotImplemented')}", :short => '-p', :long => '--project', :type => :string
78
+ end
79
+ awx_list.action do |opts, args|
80
+ AppCommand::AWSList.new(opts, args).execute
81
+ end
82
+ end
83
+ # L - AWS LAMBDA
84
+ awx.command :lambda, :aliases => [:L] do |awx_lambda|
85
+ awx_lambda.summary 'Quickly invoke a Lambda function locally (without the need to deploy)'
86
+ awx_lambda.options do |opts|
87
+ opts.opt :headers_file, 'The path to a JSON containing HTTP Headers you want to send', :short => '-H', :long => '--headers-file', :type => :string
88
+ opts.opt :payload_file, 'The path to a JSON payload you want to send', :short => '-p', :long => '--pay-load-file', :type => :string
89
+ end
90
+ awx_lambda.action do |opts, args|
91
+ AppCommand::AWSLambda.new(opts, args).execute
100
92
  end
101
93
  end
102
94
  end
103
95
 
104
96
  # x - SETUP
105
- my.command :setup, :aliases => [:x] do |setup|
97
+ awx.command :setup, :aliases => [:x] do |setup|
106
98
  setup.summary 'Setup your configuration file'
107
99
  setup.action do |opts, args|
108
100
  AppCommand::Setup.new(opts, args).execute
109
101
  end
110
102
  end
111
103
 
112
- # MY (DEFAULT)
113
- my.action do
104
+ # AWX (DEFAULT)
105
+ awx.action do
114
106
  system("#{ConfigUnique::GEM_NAME} -h")
115
107
  end
116
108
 
@@ -120,5 +112,7 @@ module App
120
112
 
121
113
  Blufin::Terminal::print_exception(e);
122
114
  end
115
+
123
116
  end
117
+
124
118
  end