【Hinemos 5.0】特定のジョブの実行結果をコマンドで取得する(その2・後編)
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
前回に引き続き、ジョブ自体の終了値等をコマンドで取得する方法の研究です。WebサービスAPIのgetJobDetailList
メソッドで取得したジョブ詳細情報のオブジェクトを上から下に探索していき、目的のジョブの終了状態と終了値を取得する、というロジックを、例によってPerlで実装してみます。
まず、リファレンス構造の骨格部分と、その特徴を再掲します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ children => { children => [ { data => { ... }, detail => { ... } }, { data => { ... }, detail => { ... } } ], data => { ... }, detail => { ... } } } |
- 最上層に”children”というキーのみを持つHashRefである。
- “children”は、直下のジョブ等を表す子要素のキーである。
- “children”の子要素が複数ある場合、値は配列のリファレンスとなる。
- “data”は、そのジョブのマスタ情報(のHashRef)を内包するキーである。
- ジョブIDは、”data”配下のハッシュキー”id”に格納されている。
- “detail”は、そのジョブの実行結果等(のHashRef)を内包するキーである。
- ジョブの終了状態は、”detail”配下のハッシュキー”endStatus”に格納されている。
- ジョブの終了値は、”detail”配下のハッシュキー”endValue”に格納されている。
ということで、目的を達成するためには、プログラマーの大好きな 再帰 をロジックに組み込む必要があります。サンプルコードは以下のとおりです(例によって、エラー処理はほとんど入れておりませんので、あらかじめご了承ください)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#!/usr/bin/env perl # usage: get_jobresults.pl -s|--sessionid SESSION_ID -j|--jobid JOB_ID use strict; use warnings; use YAML::XS; use SOAP::Lite; use Getopt::Long; use List::MoreUtils 'none'; my $session_id = "not_specified"; my $job_id = "not_specified"; GetOptions( "sessionid=s" => \$session_id, "jobid=s" => \$job_id, ); my $conf = Load(do{ local $/; }); my $client = setup_client($conf); my $som = $client->call($conf->{method} => create_args($session_id)); die $som->fault->{faultstring}."\n" if $som->fault; my ($end_status, $end_value) = get_jobresults($job_id, $som->paramsall); if (defined $end_status and defined $end_value) { print "endStatus=$end_status, endValue=$end_value\n"; } else { die "endStatus and/or endValue not found.\n"; } sub get_jobresults { my ($job_id, $target) = @_; my ($end_status, $end_value); if (ref($target) eq 'ARRAY') { for my $subtarget (@$target) { ($end_status, $end_value) = get_jobresults($job_id, $subtarget); last if defined $end_status and defined $end_value; } } elsif (ref($target) eq 'HASH') { if (exists $target->{children}) { ($end_status, $end_value) = get_jobresults($job_id, $target->{children}); } if (exists $target->{data} and exists $target->{detail}) { if ($target->{data}->{id} eq $job_id) { $end_status = $target->{detail}->{endStatus}; $end_value = $target->{detail}->{endValue}; } } if (none {exists $target->{$_}} qw/data detail children/) { die "Unexpected data structure."; } } return ($end_status, $end_value); } sub setup_client { my $conf = shift; my $client = SOAP::Lite->new( proxy => sprintf $conf->{uri}, @{$conf}{qw/userid passwd host/}, ); $client->ns(@{$conf}{qw/target prefix/}); return $client; } sub create_args { SOAP::Data->name("arg0" => shift); } __END__ --- host: 127.0.0.1:8080 realm: Hinemos Web Service userid: hinemos passwd: hinemos target: http://jobmanagement.ws.clustercontrol.com prefix: tns uri: http://%s:%s@%s/HinemosWS/JobEndpoint method: getJobDetailList |
それでは、もう少し階層の深いジョブ定義を作成し、実行結果を取得してみましょう。まず、ジョブの実行結果は以下のとおりです。
また、サンプルコードの実行結果は以下のとおりです。なお、最後の3つは、オプションにわざとおかしな文字列を渡して、どういう出力が返るかを確認するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@nodexxx ~]# SESSION_ID=20161216191621-000 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JU_TEST endStatus=1, endValue=1 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JB_TEST endStatus=2, endValue=-1 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JB_TEST2 endStatus=0, endValue=0 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JN_TEST endStatus=1, endValue=1 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JN_TEST2 endStatus=1, endValue=1 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JB_TEST3 endStatus=1, endValue=1 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j JB_TEST4 endStatus=0, endValue=0 [root@nodexxx ~]# ./get_jobresults.pl -s $SESSION_ID -j dummy_job endStatus and/or endValue not found. [root@nodexxx ~]# ./get_jobresults.pl -s dummy_session -j JU_TEST JobSessionEntity.findByPrimaryKey, sessionId = dummy_session [root@nodexxx ~]# ./get_jobresults.pl JobSessionEntity.findByPrimaryKey, sessionId = not_specified ※終了状態(endStatus)は、0=正常、1=警告、2=異常を表します。 |
ご覧のとおり、サンプルコードの実行結果は、ジョブの実行結果(の画像)と一致していますので、無事、必要な値が取得できることが確認できました。あとは、このコードを必要に応じて改変し、ジョブに組み込めば、先行ジョブの終了値等に応じてジョブの動作を変えることができるようになります(詳しい方法はこちらと同じですので、今回は割愛します)。
以上、4回に分けて、特定のジョブの実行結果をコマンドで取得する方法についてご紹介しました。今後も、関連する話題があればご紹介したいと思います。