mortar 0.15.27 → 0.15.28

Sign up to get free protection for your applications and to get access to all the features.
@@ -208,9 +208,8 @@ class Mortar::Command::Jobs < Mortar::Command::Base
208
208
  error("Usage: mortar jobs:status JOB_ID\nMust specify JOB_ID.")
209
209
  end
210
210
  validate_arguments!
211
-
212
- # Inner function to display the hash table when the job is complte
213
- def display_job_status(job_status)
211
+
212
+ def pig_job_display_entries(job_status)
214
213
  job_display_entries = {
215
214
  "status" => job_status["status_description"],
216
215
  "cluster_id" => job_status["cluster_id"],
@@ -220,18 +219,35 @@ class Mortar::Command::Jobs < Mortar::Command::Base
220
219
  "job running for" => job_status["duration"],
221
220
  "job run with parameters" => job_status["parameters"],
222
221
  }
222
+ end
223
223
 
224
-
225
- unless job_status["error"].nil? || job_status["error"]["message"].nil?
226
- error_context = get_error_message_context(job_status["error"]["message"])
227
- unless error_context == ""
228
- job_status["error"]["help"] = error_context
229
- end
230
- job_status["error"].each_pair do |key, value|
231
- job_display_entries["error - #{key}"] = value
232
- end
224
+ def luigi_job_display_entries(job_status)
225
+ status = job_status['status_description']
226
+ if !job_status['status_detail_description'].nil?
227
+ status += " - #{job_status['status_detail_description']}"
233
228
  end
234
-
229
+
230
+ job_display_entries = {
231
+ "status" => status,
232
+ "job submitted at" => job_status["start_timestamp"],
233
+ "job began running at" => job_status["running_timestamp"],
234
+ "job finished at" => job_status["stop_timestamp"],
235
+ "job running for" => job_status["duration"],
236
+ "job run with parameters" => job_status["parameters"],
237
+ }
238
+ end
239
+
240
+ def add_pig_job_fields(job_status, job_display_entries)
241
+ if job_status["outputs"] && job_status["outputs"].length > 0
242
+ job_display_entries["outputs"] = Hash.new { |h,k| h[k] = [] }
243
+ job_status["outputs"].select{|o| o["alias"]}.collect{ |output|
244
+ output_hash = {}
245
+ output_hash["location"] = output["location"] if output["location"]
246
+ output_hash["records"] = output["records"] if output["records"]
247
+ [output['alias'], output_hash]
248
+ }.each{ |k,v| job_display_entries["outputs"][k] << v }
249
+ end
250
+
235
251
  if job_status["num_hadoop_jobs"] && job_status["num_hadoop_jobs_succeeded"]
236
252
  job_display_entries["progress"] = "#{job_status["progress"]}%"
237
253
  job_display_entries["hadoop jobs complete"] =
@@ -241,24 +257,28 @@ class Mortar::Command::Jobs < Mortar::Command::Base
241
257
  else
242
258
  job_display_entries["progress"] = "#{job_status["progress"]}%"
243
259
  end
244
-
245
- if job_status["outputs"] && job_status["outputs"].length > 0
246
- job_display_entries["outputs"] = Hash.new { |h,k| h[k] = [] }
247
- job_status["outputs"].select{|o| o["alias"]}.collect{ |output|
248
- output_hash = {}
249
- output_hash["location"] = output["location"] if output["location"]
250
- output_hash["records"] = output["records"] if output["records"]
251
- [output['alias'], output_hash]
252
- }.each{ |k,v| job_display_entries["outputs"][k] << v }
260
+ end
261
+
262
+ # Inner function to display the hash table when the job is complte
263
+ def display_job_status(job_status)
264
+ if (job_status['job_type'] == Mortar::API::Jobs::JOB_TYPE_LUIGI)
265
+ job_display_entries = luigi_job_display_entries(job_status)
266
+ else
267
+ job_display_entries = pig_job_display_entries(job_status)
268
+ add_pig_job_fields(job_status, job_display_entries)
253
269
  end
254
270
 
255
- if job_status["controlscript_name"]
256
- script_name = job_status["controlscript_name"]
257
- else
258
- script_name = job_status["pigscript_name"]
271
+ unless job_status["error"].nil? || job_status["error"]["message"].nil?
272
+ error_context = get_error_message_context(job_status["error"]["message"])
273
+ unless error_context == ""
274
+ job_status["error"]["help"] = error_context
275
+ end
276
+ job_status["error"].each_pair do |key, value|
277
+ job_display_entries["error - #{key}"] = value
278
+ end
259
279
  end
260
280
 
261
- styled_header("#{job_status["project_name"]}: #{script_name} (job_id: #{job_status["job_id"]})")
281
+ styled_header("#{job_status["display_name"]} (job_id: #{job_status["job_id"]})")
262
282
  styled_hash(job_display_entries)
263
283
  end
264
284
 
@@ -274,8 +294,8 @@ class Mortar::Command::Jobs < Mortar::Command::Base
274
294
  break
275
295
  end
276
296
 
277
- # If the job is running show the progress bar
278
- if job_status["status_code"] == Mortar::API::Jobs::STATUS_RUNNING && job_status["num_hadoop_jobs"]
297
+ # If not a Luigi job and job is running show the progress bar
298
+ if job_status['job_type'] != Mortar::API::Jobs::JOB_TYPE_LUIGI and job_status["status_code"] == Mortar::API::Jobs::STATUS_RUNNING && job_status["num_hadoop_jobs"]
279
299
  progressbar = "=" + ("=" * (job_status["progress"].to_i / 5)) + ">"
280
300
 
281
301
  if job_status["num_hadoop_jobs"] && job_status["num_hadoop_jobs_succeeded"]
@@ -285,7 +305,7 @@ class Mortar::Command::Jobs < Mortar::Command::Base
285
305
 
286
306
  printf("\r[#{spinner(ticks)}] Status: [%-22s] %s%% Complete (%s MapReduce jobs finished)", progressbar, job_status["progress"], hadoop_jobs_ratio_complete)
287
307
 
288
- elsif job_status["status_code"] == Mortar::API::Jobs::STATUS_RUNNING
308
+ elsif job_status['job_type'] != Mortar::API::Jobs::JOB_TYPE_LUIGI and job_status["status_code"] == Mortar::API::Jobs::STATUS_RUNNING
289
309
  jobs_complete = '%0.2f' % job_status["num_hadoop_jobs_succeeded"]
290
310
  printf("\r[#{spinner(ticks)}] #{jobs_complete} MapReduce Jobs complete.")
291
311
 
@@ -295,6 +315,9 @@ class Mortar::Command::Jobs < Mortar::Command::Base
295
315
  if !job_status['status_details'].nil?
296
316
  job_display_status += " - #{job_status['status_details']}"
297
317
  end
318
+ if !job_status['status_detail_description'].nil?
319
+ job_display_status += " - #{job_status['status_detail_description']}"
320
+ end
298
321
  redisplay("[#{spinner(ticks)}] Status: #{job_display_status}")
299
322
  end
300
323
  end
@@ -20,11 +20,11 @@ from mortar.luigi import mortartask
20
20
  https://help.mortardata.com/technologies/luigi
21
21
 
22
22
  To Run:
23
- mortar luigi luigiscripts/<%= project_name_alias %>_luigi.py \
24
- --output-base-path "s3://mortar-example-output-data/<your_username_here>/<%= project_name_alias %>"
23
+ mortar luigi luigiscripts/<%= project_name %>_luigi.py \
24
+ --output-base-path "s3://mortar-example-output-data/<your_username_here>/<%= project_name %>"
25
25
  """
26
26
 
27
- MORTAR_PROJECT = '<%= project_name_alias %>'
27
+ MORTAR_PROJECT = '<%= project_name %>'
28
28
 
29
29
  # helper function
30
30
  def create_full_path(base_path, sub_path):
@@ -97,7 +97,7 @@ class RunMyExamplePigScript(mortartask.MortarProjectPigscriptTask):
97
97
  """
98
98
  Name of Pig script to run.
99
99
  """
100
- return '<%= project_name_alias %>'
100
+ return '<%= project_name %>'
101
101
 
102
102
 
103
103
  class ShutdownClusters(mortartask.MortarClusterShutdownTask):
@@ -131,4 +131,4 @@ if __name__ == "__main__":
131
131
  need to be run should be called in the main method. In this case ShutdownClusters
132
132
  is being called.
133
133
  """
134
- luigi.run(main_task_cls= ShutdownClusters)
134
+ luigi.run(main_task_cls= ShutdownClusters)
@@ -16,5 +16,5 @@
16
16
 
17
17
  module Mortar
18
18
  # see http://semver.org/
19
- VERSION = "0.15.27"
19
+ VERSION = "0.15.28"
20
20
  end
@@ -568,6 +568,7 @@ STDERR
568
568
  mock(Mortar::Auth.api).get_job(job_id) {Excon::Response.new(:body => {"job_id" => job_id,
569
569
  "pigscript_name" => pigscript_name,
570
570
  "project_name" => project_name,
571
+ "display_name" => "#{project_name}: #{pigscript_name}",
571
572
  "status_code" => status_code,
572
573
  "status_description" => "Success",
573
574
  "progress" => progress,
@@ -621,6 +622,7 @@ STDOUT
621
622
  mock(Mortar::Auth.api).get_job(job_id) {Excon::Response.new(:body => {"job_id" => job_id,
622
623
  "pigscript_name" => pigscript_name,
623
624
  "project_name" => project_name,
625
+ "display_name" => "#{project_name}: #{pigscript_name}",
624
626
  "status_code" => status_code,
625
627
  "status_description" => "Running",
626
628
  "progress" => progress,
@@ -668,6 +670,7 @@ STDOUT
668
670
  mock(Mortar::Auth.api).get_job(job_id) {Excon::Response.new(:body => {"job_id" => job_id,
669
671
  "pigscript_name" => pigscript_name,
670
672
  "project_name" => project_name,
673
+ "display_name" => "#{project_name}: #{pigscript_name}",
671
674
  "status_code" => status_code,
672
675
  "status_description" => "Execution error",
673
676
  "progress" => progress,
@@ -719,6 +722,7 @@ STDOUT
719
722
  mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
720
723
  "controlscript_name" => controlscript_name,
721
724
  "project_name" => project_name,
725
+ "display_name" => "#{project_name}: #{controlscript_name}",
722
726
  "status_code" => status_code,
723
727
  "status_description" => "Execution error",
724
728
  "progress" => progress,
@@ -744,6 +748,7 @@ STDOUT
744
748
  mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
745
749
  "controlscript_name" => controlscript_name,
746
750
  "project_name" => project_name,
751
+ "display_name" => "#{project_name}: #{controlscript_name}",
747
752
  "status_code" => status_code,
748
753
  "status_description" => "Success",
749
754
  "progress" => progress,
@@ -798,6 +803,7 @@ STDOUT
798
803
  mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
799
804
  "pigscript_name" => pigscript_name,
800
805
  "project_name" => project_name,
806
+ "display_name" => "#{project_name}: #{pigscript_name}",
801
807
  "status_code" => status_code,
802
808
  "status_description" => "Execution error",
803
809
  "progress" => progress,
@@ -824,6 +830,7 @@ STDOUT
824
830
  mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
825
831
  "pigscript_name" => pigscript_name,
826
832
  "project_name" => project_name,
833
+ "display_name" => "#{project_name}: #{pigscript_name}",
827
834
  "status_code" => status_code,
828
835
  "status_description" => "Success",
829
836
  "progress" => progress,
@@ -862,28 +869,97 @@ STDOUT
862
869
  end
863
870
  end
864
871
 
865
- context("stop") do
866
- it "Stops a running job with default message" do
867
- job_id = "1234abcd"
868
- mock(Mortar::Auth.api).stop_job(job_id) {Excon::Response.new(:body => {"success" => true})}
872
+ it "gets status for a running pipeline job using polling" do
873
+ #{"project_name"=>"jkarn-mortar-recsys", "status_code"=>"finished", "status_detail_description"=>"Success", "status_detail"=>"success", "duration"=>"< 1 min", "status_description"=>"Finished", "script_variables"=>[], "start_timestamp"=>"2014-10-03T12:34:40.994000+00:00", "display_name"=>"jkarn-mortar-recsys: simple-retail-generate-signals", "job_id"=>"542e97cea40a865ab7000dfe", "request_timestamp"=>"2014-10-03T12:34:22.439000+00:00", "luigiscript_name"=>"simple-retail-generate-signals", "job_type"=>"luigi", "error"=>nil, "git_ref"=>"015690ad2c951c67366e36847be59646d441c5b1", "stop_timestamp"=>"2014-10-03T12:35:20.241000+00:00"}
874
+ with_git_initialized_project do |p|
875
+ job_id = "c571a8c7f76a4fd4a67c103d753e2dd5"
876
+ luigiscript_name = "my_luigi_script"
877
+ project_name = "myproject"
878
+ display_name = "#{project_name}: #{luigiscript_name}"
879
+ status_code = Mortar::API::Jobs::LUIGI_JOB_STATUS__STARTING
880
+ status_description = "#{status_code} description"
881
+ status_detail = nil
882
+ status_detail_description = "#{status_detail} description"
883
+ start_timestamp = "2012-02-28T03:35:42.831000+00:00"
884
+ stop_timestamp = "2012-02-28T03:44:52.613000+00:00"
885
+ running_timestamp = "2012-02-28T03:41:52.613000+00:00"
886
+ duration = "< 1 min"
869
887
 
870
- stderr, stdout = execute("jobs:stop #{job_id}")
871
- stdout.should == <<-STDOUT
872
- Stopping job #{job_id}.
888
+ mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
889
+ "project_name"=>project_name,
890
+ "status_code"=>status_code,
891
+ "status_detail_description"=>status_detail_description,
892
+ "status_detail"=>status_detail,
893
+ "duration"=>duration,
894
+ "status_description"=>status_description,
895
+ "script_variables"=>[],
896
+ "start_timestamp"=>start_timestamp,
897
+ "display_name"=>display_name,
898
+ "job_id"=>job_id,
899
+ "request_timestamp"=>running_timestamp,
900
+ "luigiscript_name"=>luigiscript_name,
901
+ "job_type"=>Mortar::API::Jobs::JOB_TYPE_LUIGI,
902
+ "error"=>nil,
903
+ "git_ref"=>"015690ad2c951c67366e36847be59646d441c5b1",
904
+ "stop_timestamp"=>stop_timestamp
905
+ }))
906
+
907
+ status_code = Mortar::API::Jobs::LUIGI_JOB_STATUS__FINISHED
908
+ status_detail = "success"
909
+
910
+ status_description = "#{status_code} description"
911
+ status_detail_description = "#{status_detail} description"
912
+
913
+ mock(Mortar::Auth.api).get_job(job_id).returns(Excon::Response.new(:body => {"job_id" => job_id,
914
+ "project_name"=>project_name,
915
+ "status_code"=>status_code,
916
+ "status_detail_description"=>"#{status_detail} description",
917
+ "status_detail"=>status_detail,
918
+ "duration"=>duration,
919
+ "status_description"=>"#{status_code} description",
920
+ "script_variables"=>[],
921
+ "start_timestamp"=>start_timestamp,
922
+ "display_name"=>display_name,
923
+ "job_id"=>job_id,
924
+ "request_timestamp"=>running_timestamp,
925
+ "luigiscript_name"=>luigiscript_name,
926
+ "job_type"=>Mortar::API::Jobs::JOB_TYPE_LUIGI,
927
+ "error"=>nil,
928
+ "git_ref"=>"015690ad2c951c67366e36847be59646d441c5b1",
929
+ "stop_timestamp"=>stop_timestamp
930
+ }))
931
+ stderr, stdout = execute("jobs:status c571a8c7f76a4fd4a67c103d753e2dd5 -p --polling_interval 0.05", p, @git)
932
+ stdout.should == <<-STDOUT
933
+ \r\e[0K[/] Status: starting description - description\r\e[0K=== #{display_name} (job_id: #{job_id})
934
+ job finished at: #{stop_timestamp}
935
+ job running for: #{duration}
936
+ job submitted at: #{start_timestamp}
937
+ status: #{status_description} - #{status_detail_description}
873
938
  STDOUT
874
939
  end
940
+ end
941
+ end
875
942
 
876
- it "Stops a running job with server message" do
877
- job_id = "1234abcd"
878
- message = "some awesome message"
879
- mock(Mortar::Auth.api).stop_job(job_id) {Excon::Response.new(:body => {"success" => true, "message" => message})}
943
+ context("stop") do
944
+ it "Stops a running job with default message" do
945
+ job_id = "1234abcd"
946
+ mock(Mortar::Auth.api).stop_job(job_id) {Excon::Response.new(:body => {"success" => true})}
880
947
 
881
- stderr, stdout = execute("jobs:stop #{job_id}")
882
- stdout.should == "#{message}\n"
883
- end
948
+ stderr, stdout = execute("jobs:stop #{job_id}")
949
+ stdout.should == <<-STDOUT
950
+ Stopping job #{job_id}.
951
+ STDOUT
952
+ end
884
953
 
954
+ it "Stops a running job with server message" do
955
+ job_id = "1234abcd"
956
+ message = "some awesome message"
957
+ mock(Mortar::Auth.api).stop_job(job_id) {Excon::Response.new(:body => {"success" => true, "message" => message})}
885
958
 
959
+ stderr, stdout = execute("jobs:stop #{job_id}")
960
+ stdout.should == "#{message}\n"
886
961
  end
962
+
887
963
  end
888
964
  end
889
965
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mortar
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 15
9
- - 27
10
- version: 0.15.27
9
+ - 28
10
+ version: 0.15.28
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mortar Data
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2014-10-06 00:00:00 Z
18
+ date: 2014-10-07 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rdoc
@@ -41,12 +41,12 @@ dependencies:
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- hash: 47
44
+ hash: 45
45
45
  segments:
46
46
  - 0
47
47
  - 8
48
- - 8
49
- version: 0.8.8
48
+ - 9
49
+ version: 0.8.9
50
50
  type: :runtime
51
51
  version_requirements: *id002
52
52
  - !ruby/object:Gem::Dependency