elastic-mapreduce 0.0.3 → 2011.11.23

Sign up to get free protection for your applications and to get access to all the features.
data/NOTICE.txt CHANGED
@@ -1,12 +1,12 @@
1
- Copyright 2008-2009 Amazon.com, Inc. or its affiliates. All Rights Reserved.
1
+ Copyright 2008-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
 
3
- Licensed under the Apache License, Version 2.0 (the License).
3
+ Licensed under the Apache License, Version 2.0 (the "License").
4
4
  You may not use this file except in compliance with the License. A
5
5
  copy of the License is located at
6
6
 
7
7
  http://aws.amazon.com/apache2.0/
8
8
 
9
- or in the license file accompanying this file. This file is
9
+ or in the "license" file accompanying this file. This file is
10
10
  distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
11
11
  OF ANY KIND, either express or implied. See the License for the
12
12
  specific language governing permissions and limitations under the
data/README CHANGED
@@ -4,7 +4,9 @@
4
4
  $ gem install elastic-mapreduce
5
5
  $ elastic-mapreduce --help
6
6
 
7
- = Amazon Elastic Map Reduce Ruby Client Readme (Original)
7
+ == Original Readme
8
+
9
+ = Amazon Elastic Map Reduce Ruby Client Readme
8
10
 
9
11
  Location of the Ruby Client:
10
12
 
@@ -132,7 +134,7 @@ http://aws.amazon.com website under "Your Account/Access Identifiers"
132
134
  "private-key": "<insert your AWS secret access key here>",
133
135
  "key-pair": "<insert the name of your Amazon ec2 key-pair here>",
134
136
  "key-pair-file": "<insert the path to the .pem file for your Amazon ec2 key pair here>",
135
- "region": "<The region where you wish to launch your job flows. Should be one of us-east-1, us-west-1, eu-west-1, ap-southeast-1 or ap-northeast-1>"
137
+ "region": "<The region where you wish to launch your job flows. Should be one of us-east-1, us-west-1, us-west-2, eu-west-1, ap-southeast-1, or ap-northeast-1, sa-east-1>"
136
138
  }
137
139
 
138
140
  Windows Users: If you are running a Windows computer then create a
@@ -0,0 +1,8 @@
1
+ = Amazon Elastic Map Reduce Ruby Client Readme (Unofficial Gem and Ruby 1.9 Version)
2
+
3
+ == Usage
4
+ $ gem install elastic-mapreduce
5
+ $ elastic-mapreduce --help
6
+
7
+ == Original Readme
8
+
data/Rakefile CHANGED
@@ -25,6 +25,43 @@ Jeweler::Tasks.new do |gem|
25
25
  end
26
26
  Jeweler::RubygemsDotOrgTasks.new
27
27
 
28
+ require 'fileutils'
29
+
30
+ desc 'update files from original git repository'
31
+ task :update do
32
+ system 'git submodule update --init'
33
+ include FileUtils
34
+
35
+ rm_r('lib')
36
+ mkdir_p('lib')
37
+
38
+ target_dir = 'vendor/elastic-mapreduce-ruby/'
39
+
40
+ Dir.glob(target_dir + '*').each do |file|
41
+ case file
42
+ when /\/(amazon|json|uuidtools|.*\.rb|cacert\.pem)$/
43
+ cp_r(file, 'lib/')
44
+ when /\/elastic-mapreduce$/
45
+ cp_r(file, 'bin/')
46
+ else
47
+ cp_r(file, '.')
48
+ end
49
+ end
50
+
51
+ readme = File.read('README')
52
+ File.open('README', 'w') {|f|
53
+ f.puts File.read('README.header')
54
+ f.puts readme
55
+ }
56
+
57
+ last_changelog_date = File.read('CHANGELOG').scan(/^==\s+(\d+-\d+-\d+)/m).flatten.last
58
+ open('VERSION', 'w') {|f|
59
+ f.puts last_changelog_date.gsub('-', '.')
60
+ }
61
+
62
+ Rake::Task["gemspec:generate"].invoke
63
+ end
64
+
28
65
  require 'rake/testtask'
29
66
  Rake::TestTask.new(:test) do |test|
30
67
  test.libs << 'lib' << 'test'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 2011.11.23
@@ -3,25 +3,4 @@
3
3
  # Copyright 2008-2010 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
4
 
5
5
  $LOAD_PATH.unshift File.dirname(__FILE__)
6
-
7
- require 'commands'
8
- require 'simple_logger'
9
- require 'simple_executor'
10
-
11
- exit_code = 0
12
- begin
13
- logger = SimpleLogger.new
14
- executor = SimpleExecutor.new
15
- commands = Commands::create_and_execute_commands(
16
- ARGV, Amazon::Coral::ElasticMapReduceClient, logger, executor
17
- )
18
- rescue SystemExit => e
19
- exit_code = -1
20
- rescue Exception => e
21
- STDERR.puts("Error: " + e.message)
22
- STDERR.puts(e.backtrace.join("\n"))
23
- exit_code = -1
24
- end
25
-
26
- exit(exit_code)
27
-
6
+ require 'elastic-mapreduce-cli'
@@ -4,26 +4,29 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{elastic-mapreduce}
8
- s.version = "0.0.3"
7
+ s.name = "elastic-mapreduce"
8
+ s.version = "2011.11.23"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = [%q{Amazon.com}, %q{Koichi Fujikawa}]
12
- s.date = %q{2011-08-30}
13
- s.description = %q{Original is official but this is Unofficial gem.}
14
- s.email = %q{fujibee@hapyrus.com}
15
- s.executables = [%q{elastic-mapreduce}]
11
+ s.authors = ["Amazon.com", "Koichi Fujikawa"]
12
+ s.date = "2012-06-28"
13
+ s.description = "Original is official but this is Unofficial gem."
14
+ s.email = "fujibee@hapyrus.com"
15
+ s.executables = ["elastic-mapreduce"]
16
16
  s.extra_rdoc_files = [
17
17
  "LICENSE.txt",
18
- "README"
18
+ "README",
19
+ "README.header"
19
20
  ]
20
21
  s.files = [
22
+ ".gitmodules",
21
23
  "CHANGELOG",
22
24
  "Gemfile",
23
25
  "Gemfile.lock",
24
26
  "LICENSE.txt",
25
27
  "NOTICE.txt",
26
28
  "README",
29
+ "README.header",
27
30
  "Rakefile",
28
31
  "VERSION",
29
32
  "bin/elastic-mapreduce",
@@ -63,9 +66,11 @@ Gem::Specification.new do |s|
63
66
  "lib/commands.rb",
64
67
  "lib/credentials.rb",
65
68
  "lib/ec2_client_wrapper.rb",
69
+ "lib/elastic-mapreduce-cli.rb",
66
70
  "lib/json.rb",
67
71
  "lib/json/lexer.rb",
68
72
  "lib/json/objects.rb",
73
+ "lib/run_tests.rb",
69
74
  "lib/simple_executor.rb",
70
75
  "lib/simple_logger.rb",
71
76
  "lib/uuidtools.rb",
@@ -78,11 +83,11 @@ Gem::Specification.new do |s|
78
83
  "tests/credentials.json",
79
84
  "tests/example.json"
80
85
  ]
81
- s.homepage = %q{http://github.com/hapyrus/elastic-mapreduce}
82
- s.licenses = [%q{Apache License}]
83
- s.require_paths = [%q{lib}]
84
- s.rubygems_version = %q{1.8.8}
85
- s.summary = %q{Amazon's commandline client for EMR (Elastic Map-Reduce) invocation (Unofficial Gem and Ruby 1.9 Version)}
86
+ s.homepage = "http://github.com/hapyrus/elastic-mapreduce"
87
+ s.licenses = ["Apache License"]
88
+ s.require_paths = ["lib"]
89
+ s.rubygems_version = "1.8.15"
90
+ s.summary = "Amazon's commandline client for EMR (Elastic Map-Reduce) invocation (Unofficial Gem and Ruby 1.9 Version)"
86
91
 
87
92
  if s.respond_to? :specification_version then
88
93
  s.specification_version = 3
@@ -40,7 +40,7 @@ module Amazon
40
40
  # Invoke the remote service and return the result.
41
41
  def call(input = {})
42
42
  begin
43
- @request_id = UUID.random_create if @request_id.nil?
43
+ @request_id = UUIDTools::UUID.random_create if @request_id.nil?
44
44
 
45
45
  return @dispatcher.dispatch(self, input)
46
46
  rescue Timeout::Error => timeout
@@ -16,7 +16,7 @@ module Amazon
16
16
  @log = LogFactory.getLog('Amazon::Coral::HttpDestinationHandler')
17
17
 
18
18
  @uri = case endpoint
19
- when URI
19
+ when URI then
20
20
  endpoint
21
21
  else
22
22
  URI.parse(endpoint)
@@ -41,7 +41,7 @@ module Amazon
41
41
  @timeout = args[:timeout]
42
42
 
43
43
  @connect_timeout = 5.0 if @connect_timeout.nil?
44
- @timeout = 5.0 if @timeout.nil?
44
+ @timeout = 120.0 if @timeout.nil?
45
45
 
46
46
  raise ArgumentError, "connect_timeout must be non-negative" if @connect_timeout < 0
47
47
  raise ArgumentError, "timeout must be non-negative" if @timeout < 0
@@ -47,7 +47,7 @@ module Amazon
47
47
  return if obj.nil?
48
48
 
49
49
  case obj
50
- when Hash
50
+ when Hash then
51
51
 
52
52
  obj.each_pair { |k,v|
53
53
  stack.push(k)
@@ -55,7 +55,7 @@ module Amazon
55
55
  stack.pop
56
56
  }
57
57
 
58
- when Array
58
+ when Array then
59
59
 
60
60
  # Do artificial list member wrapping (Coral requires this
61
61
  # level of indirection, but doesn't validate the member name)
@@ -69,7 +69,6 @@ module Amazon
69
69
  }
70
70
 
71
71
  stack.pop
72
-
73
72
  else
74
73
 
75
74
  # this works for symbols also, because sym.id2name == sym.to_s
@@ -48,7 +48,7 @@ module Amazon
48
48
  rescue Exception => e
49
49
  if retries_remaining > 0 && is_retry_exception(e) then
50
50
  if @log != nil then
51
- @log.info "Exception #{e} while calling #{method} on #{@client.class}, retrying in #{@backoff_seconds * backoff_mult} seconds."
51
+ @log.info "Exception #{e.to_s} while calling #{method} on #{@client.class}, retrying in #{@backoff_seconds * backoff_mult} seconds."
52
52
  end
53
53
  sleep(@backoff_seconds * backoff_mult)
54
54
  backoff_mult *= 2
@@ -56,7 +56,7 @@ module Amazon
56
56
  retry
57
57
  else
58
58
  if @log != nil then
59
- @log.info "Exception #{e} while calling #{method} on #{@client.class}, failing"
59
+ @log.info "Exception #{e.to_s} while calling #{method} on #{@client.class}, failing"
60
60
  end
61
61
  raise e
62
62
  end
@@ -20,7 +20,9 @@ class EmrClient
20
20
  :aws_secret_key => @options[:aws_secret_key],
21
21
  :signature_algorithm => :V2,
22
22
  :content_type => 'JSON',
23
- :verbose => (@options[:verbose] != nil)
23
+ :verbose => (@options[:verbose] != nil),
24
+ :connect_timeout => 60.0,
25
+ :timeout => 160.0
24
26
  }
25
27
 
26
28
  @client = Amazon::RetryDelegator.new(
@@ -10,7 +10,7 @@ require 'open3'
10
10
 
11
11
  module Commands
12
12
 
13
- ELASTIC_MAPREDUCE_CLIENT_VERSION = "2010-11-11"
13
+ ELASTIC_MAPREDUCE_CLIENT_VERSION = "2011-11-23"
14
14
 
15
15
  class Commands
16
16
  attr_accessor :opts, :global_options, :commands, :logger, :executor
@@ -514,6 +514,11 @@ module Commands
514
514
 
515
515
  GENERIC_OPTIONS = Set.new(%w(-conf -D -fs -jt -files -libjars -archives))
516
516
 
517
+ def initialize(*args)
518
+ super(*args)
519
+ @jobconf = []
520
+ end
521
+
517
522
  def steps
518
523
  timestr = Time.now.strftime("%Y-%m-%dT%H%M%S")
519
524
  stream_options = []
@@ -574,6 +579,24 @@ module Commands
574
579
  CLOSED_DOWN_STATES = Set.new(%w(TERMINATED SHUTTING_DOWN COMPLETED FAILED))
575
580
  WAITING_OR_RUNNING_STATES = Set.new(%w(WAITING RUNNING))
576
581
 
582
+ def initialize(*args)
583
+ super(*args)
584
+ @ssh_opts = ["-o ServerAliveInterval=10", "-o StrictHostKeyChecking=no"]
585
+ @scp_opts = ["-r"]
586
+ end
587
+
588
+ def opts
589
+ (get_field(:ssh_opts, []) + get_field(:scp_opts, [])).join(" ")
590
+ end
591
+
592
+ def get_ssh_opts
593
+ get_field(:ssh_opts, []).join(" ")
594
+ end
595
+
596
+ def get_scp_opts
597
+ get_field(:scp_opts, []).join(" ")
598
+ end
599
+
577
600
  def exec(cmd)
578
601
  commands.exec(cmd)
579
602
  end
@@ -605,7 +628,7 @@ module Commands
605
628
  end
606
629
 
607
630
  class SSHCommand < AbstractSSHCommand
608
- attr_accessor :cmd
631
+ attr_accessor :cmd, :ssh_opts, :scp_opts
609
632
 
610
633
  def initialize(*args)
611
634
  super(*args)
@@ -618,7 +641,7 @@ module Commands
618
641
 
619
642
  def enact(client)
620
643
  super(client)
621
- exec "ssh -i #{key_pair_file} hadoop@#{hostname} #{get_field(:cmd, "")}"
644
+ exec "ssh #{get_ssh_opts} -i #{key_pair_file} hadoop@#{hostname} #{get_field(:cmd, "")}"
622
645
  end
623
646
  end
624
647
 
@@ -626,9 +649,9 @@ module Commands
626
649
  def enact(client)
627
650
  super(client)
628
651
  if get_field(:dest) then
629
- exec "scp -i #{key_pair_file} #{@arg} hadoop@#{hostname}:#{get_field(:dest)}"
652
+ exec "scp #{self.get_scp_opts} -i #{key_pair_file} #{@arg} hadoop@#{hostname}:#{get_field(:dest)}"
630
653
  else
631
- exec "scp -i #{key_pair_file} #{@arg} hadoop@#{hostname}:#{File.basename(@arg)}"
654
+ exec "scp #{self.get_scp_opts} -i #{key_pair_file} #{@arg} hadoop@#{hostname}:#{File.basename(@arg)}"
632
655
  end
633
656
  end
634
657
  end
@@ -637,9 +660,9 @@ module Commands
637
660
  def enact(client)
638
661
  super(client)
639
662
  if get_field(:dest) then
640
- exec "scp -i #{key_pair_file} hadoop@#{hostname}:#{@arg} #{get_field(:dest)}"
663
+ exec "scp #{self.get_scp_opts} -i #{key_pair_file} hadoop@#{hostname}:#{@arg} #{get_field(:dest)}"
641
664
  else
642
- exec "scp -i #{key_pair_file} hadoop@#{hostname}:#{@arg} #{File.basename(@arg)}"
665
+ exec "scp #{self.get_scp_opts} -i #{key_pair_file} hadoop@#{hostname}:#{@arg} #{File.basename(@arg)}"
643
666
  end
644
667
  end
645
668
  end
@@ -757,15 +780,21 @@ module Commands
757
780
 
758
781
  class CreateJobFlowCommand < StepProcessingCommand
759
782
  attr_accessor :jobflow_name, :alive, :with_termination_protection, :instance_count, :slave_instance_type,
760
- :master_instance_type, :key_pair, :key_pair_file, :log_uri, :az, :ainfo,
783
+ :master_instance_type, :key_pair, :key_pair_file, :log_uri, :az, :ainfo, :ami_version, :with_supported_products,
761
784
  :hadoop_version, :plain_output, :instance_type,
762
- :instance_group_commands, :bootstrap_commands
785
+ :instance_group_commands, :bootstrap_commands, :subnet_id
763
786
 
764
787
 
765
788
  OLD_OPTIONS = [:instance_count, :slave_instance_type, :master_instance_type]
766
789
  # FIXME: add code to setup collapse instance group commands
767
790
 
768
- DEFAULT_HADOOP_VERSION = "0.20"
791
+ def default_hadoop_version
792
+ if get_field(:ami_version) == "1.0" then
793
+ "0.20"
794
+ else
795
+ "0.20.205"
796
+ end
797
+ end
769
798
 
770
799
  def initialize(*args)
771
800
  super(*args)
@@ -796,9 +825,6 @@ module Commands
796
825
  cmd.validate
797
826
  end
798
827
 
799
- if ! have(:hadoop_version) then
800
- @hadoop_version = DEFAULT_HADOOP_VERSION
801
- end
802
828
  end
803
829
 
804
830
  def enact(client)
@@ -809,6 +835,10 @@ module Commands
809
835
  apply_jobflow_option(:hadoop_version, "Instances", "HadoopVersion")
810
836
  apply_jobflow_option(:az, "Instances", "Placement", "AvailabilityZone")
811
837
  apply_jobflow_option(:log_uri, "LogUri")
838
+ apply_jobflow_option(:ami_version, "AmiVersion")
839
+ apply_jobflow_option(:subnet_id, "Instances", "Ec2SubnetId")
840
+
841
+ @jobflow["AmiVersion"] ||= "latest"
812
842
 
813
843
  self.step_commands = reorder_steps(@jobflow, self.step_commands)
814
844
  @jobflow["Steps"] = step_commands.map { |x| x.steps }.flatten
@@ -836,7 +866,7 @@ module Commands
836
866
 
837
867
  def apply_jobflow_option(field_symbol, *keys)
838
868
  value = get_field(field_symbol)
839
- if value != nil then
869
+ if value != nil then
840
870
  map = @jobflow
841
871
  for key in keys[0..-2] do
842
872
  nmap = map[key]
@@ -899,6 +929,12 @@ module Commands
899
929
  "Steps" => [],
900
930
  "BootstrapActions" => []
901
931
  }
932
+ products_string = get_field(:with_supported_products)
933
+ if products_string then
934
+ products = products_string.split(/,/).map { |s| s.strip }
935
+ @jobflow["SupportedProducts"] = products
936
+ end
937
+ @jobflow
902
938
  end
903
939
 
904
940
  def default_job_flow_name
@@ -931,7 +967,7 @@ module Commands
931
967
  end
932
968
 
933
969
  class AbstractListCommand < Command
934
- attr_accessor :state, :max_results, :active, :all, :no_steps
970
+ attr_accessor :state, :max_results, :active, :all, :no_steps, :created_after, :created_before
935
971
 
936
972
  def enact(client)
937
973
  options = {}
@@ -942,15 +978,17 @@ module Commands
942
978
  if get_field(:active) then
943
979
  states = %w(RUNNING SHUTTING_DOWN STARTING WAITING BOOTSTRAPPING)
944
980
  end
945
- if get_field(:states) then
946
- states += get_field(states)
981
+ if get_field(:state) then
982
+ states << get_field(:state)
947
983
  end
948
- if get_field(:active) || get_field(:states) then
949
- options = { 'JobFlowStates' => states }
950
- elsif get_field(:all) then
951
- options = { }
984
+
985
+ if get_field(:all) then
986
+ options = { 'CreatedAfter' => (Time.now - (58 * 24 * 3600)).xmlschema }
952
987
  else
953
- options = { 'CreatedAfter' => (Time.now - (2 * 24 * 3600)).xmlschema }
988
+ options = {}
989
+ options['CreatedAfter'] = get_field(:created_after) if get_field(:created_after)
990
+ options['CreatedBefore'] = get_field(:created_before) if get_field(:created_before)
991
+ options['JobFlowStates'] = states if states.size > 0
954
992
  end
955
993
  end
956
994
  result = client.describe_jobflow(options)
@@ -1318,6 +1356,19 @@ module Commands
1318
1356
  end
1319
1357
  end
1320
1358
 
1359
+ def region_from_az(az)
1360
+ md = az.match(/((\w+-)+\d+)\w+/)
1361
+ if md then
1362
+ md[1]
1363
+ else
1364
+ raise "Unable to convert Availability Zone '#{az}' to region"
1365
+ end
1366
+ end
1367
+
1368
+ def ec2_endpoint_from_az(az)
1369
+ return "https://ec2.#{region_from_az(az)}.amazonaws.com"
1370
+ end
1371
+
1321
1372
  def enact(client)
1322
1373
  self.jobflow_id = require_single_jobflow
1323
1374
  self.jobflow_detail = client.describe_jobflow_with_id(self.jobflow_id)
@@ -1330,21 +1381,9 @@ module Commands
1330
1381
  exit(-1)
1331
1382
  end
1332
1383
 
1333
- ec2_endpoint = "https://ec2.amazonaws.com"
1334
1384
  az = self.jobflow_detail['Instances']['Placement']['AvailabilityZone']
1335
- reg_length = "us-east-1".length
1336
- if az[0, reg_length] == "us-east-1" then
1337
- ec2_endpoint = "https://ec2.us-east-1.amazonaws.com"
1338
- elsif az[0, reg_length] == "us-west-1" then
1339
- ec2_endpoint = "https://ec2.us-west-1.amazonaws.com"
1340
- elsif az[0, reg_length] == "eu-west-1" then
1341
- ec2_endpoint = "https://ec2.eu-west-1.amazonaws.com"
1342
- elsif az[0, reg_length] == "ap-southeast-1" then
1343
- ec2_endpoint = "https://ec2.ap-southeast-1.amazonaws.com"
1344
- elsif az[0, reg_length] == "ap-northeast-1" then
1345
- ec2_endpoint = "https://ec2.ap-northeast-1.amazonaws.com"
1346
- end
1347
- commands.global_options[:ec2_endpoint] = ec2_endpoint
1385
+
1386
+ commands.global_options[:ec2_endpoint] = ec2_endpoint_from_az(az)
1348
1387
 
1349
1388
  self.key_pair_file = require(:key_pair_file, "Missing required option --key-pair-file for #{name}")
1350
1389
  eip = get_field(:arg)
@@ -1394,14 +1433,17 @@ module Commands
1394
1433
  [ OptionWithArg, "--name NAME", "The name of the job flow being created", :jobflow_name ],
1395
1434
  [ FlagOption, "--alive", "Create a job flow that stays running even though it has executed all its steps", :alive ],
1396
1435
  [ OptionWithArg, "--with-termination-protection", "Create a job with termination protection (default is no termination protection)", :with_termination_protection ],
1436
+ [ OptionWithArg, "--with-supported-products PRODUCTS", "Add supported products", :with_supported_products ],
1397
1437
  [ OptionWithArg, "--num-instances NUM", "Number of instances in the job flow", :instance_count ],
1398
1438
  [ OptionWithArg, "--slave-instance-type TYPE", "The type of the slave instances to launch", :slave_instance_type ],
1399
1439
  [ OptionWithArg, "--master-instance-type TYPE", "The type of the master instance to launch", :master_instance_type ],
1440
+ [ OptionWithArg, "--ami-version VERSION", "The version of ami to launch the job flow with", :ami_version ],
1400
1441
  [ OptionWithArg, "--key-pair KEY_PAIR", "The name of your Amazon EC2 Keypair", :key_pair ],
1401
1442
  [ OptionWithArg, "--availability-zone A_Z", "Specify the Availability Zone in which to launch the job flow", :az ],
1402
1443
  [ OptionWithArg, "--info INFO", "Specify additional info to job flow creation", :ainfo ],
1403
1444
  [ OptionWithArg, "--hadoop-version INFO", "Specify the Hadoop Version to install", :hadoop_version ],
1404
1445
  [ FlagOption, "--plain-output", "Return the job flow id from create step as simple text", :plain_output ],
1446
+ [ OptionWithArg, "--subnet EC2-SUBNET_ID", "Specify the VPC subnet that you want to run in", :subnet_id ],
1405
1447
  ])
1406
1448
  commands.parse_command(CreateInstanceGroupCommand, "--instance-group ROLE", "Specify an instance group while creating a jobflow")
1407
1449
  commands.parse_options(["--instance-group", "--add-instance-group"], [
@@ -1441,6 +1483,7 @@ module Commands
1441
1483
  commands.parse_command(HiveSiteCommand, "--hive-site HIVE_SITE", "Override Hive configuration with configuration from HIVE_SITE")
1442
1484
  commands.parse_options(["--hive-script", "--hive-interactive", "--hive-site"], [
1443
1485
  [ OptionWithArg, "--hive-versions VERSIONS", "A comma separated list of Hive version", :hive_versions],
1486
+ [ OptionWithArg, "--step-action STEP_ACTION", "Action to take when step finishes. One of CANCEL_AND_WAIT, TERMINATE_JOB_FLOW or CONTINUE", :step_action ],
1444
1487
  ])
1445
1488
 
1446
1489
  opts.separator "\n Adding Jar Steps to Job Flows\n"
@@ -1519,7 +1562,9 @@ module Commands
1519
1562
  commands.parse_options(["--list", "--describe"], [
1520
1563
  [ OptionWithArg, "--state NAME", "Set the name of the bootstrap action", :state ],
1521
1564
  [ FlagOption, "--active", "List running, starting or shutting down job flows", :active ],
1522
- [ FlagOption, "--all", "List all job flows in the last 2 months", :all ],
1565
+ [ FlagOption, "--all", "List all job flows in the last 2 weeks", :all ],
1566
+ [ OptionWithArg, "--created-after=DATETIME", "List all jobflows created after DATETIME (xml date time format)", :created_after],
1567
+ [ OptionWithArg, "--created-before=DATETIME", "List all jobflows created before DATETIME (xml date time format)", :created_before],
1523
1568
  [ FlagOption, "--no-steps", "Do not list steps when listing jobs", :no_steps ],
1524
1569
  ])
1525
1570
 
@@ -1697,4 +1742,3 @@ module Commands
1697
1742
  end
1698
1743
  end
1699
1744
  end
1700
-