【Hinemos 5.0】特定のジョブの実行結果をコマンドで取得する(その2・前編)
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
前回は、ジョブの起動コマンドの戻り値をコマンドで取得しました。今度は、ジョブ自体の終了値等をコマンドで取得してみたいと思います。
実現方法を検討する
ジョブ自体の実行結果は、コマンドラインツールのJob_getJobDetailList.py
で取得することが可能です。実行例と出力例は以下のとおりです。
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 85 86 87 88 89 90 91 92 93 94 95 96 97 |
[root@nodexxx hinemos_command_line]# ./Job_getJobDetailList.py \ > -H http://127.0.0.1:8080/HinemosWS/ -U hinemos -w hinemos \ > -S 20161129102740-000 (jobTreeItem){ children[] = (jobTreeItem){ children[] = (jobTreeItem){ data = (jobInfo){ abnormalPriority = 0 beginPriority = 0 description = None id = "JB_TEST" jobunitId = "JU_TEST" name = "JB_TEST" normalPriority = 0 ownerRoleId = None propertyFull = False type = 2 waitRule = (jobWaitRuleInfo){ (長いため省略) } warnPriority = 0 } detail = (jobDetailInfo){ endDate = "2016/11/29 10:27:41.729" endStatus = 2 ★1 endValue = -1 ★2 facilityId = "REGISTERED" scope = "スコープ>登録ノードすべて>" startDate = "2016/11/29 10:27:40.466" status = 300 } }, (jobTreeItem){ data = (jobInfo){ abnormalPriority = 0 beginPriority = 0 description = None id = "JB_TEST2" jobunitId = "JU_TEST" name = "JB_TEST2" normalPriority = 0 ownerRoleId = None propertyFull = False type = 2 waitRule = (jobWaitRuleInfo){ (長いため省略) } warnPriority = 0 } detail = (jobDetailInfo){ endDate = "2016/11/29 10:27:43.066" endStatus = 0 ★1 endValue = 0 ★2 facilityId = "REGISTERED" scope = "スコープ>登録ノードすべて>" startDate = "2016/11/29 10:27:41.734" status = 300 } }, data = (jobInfo){ abnormalPriority = 0 beginPriority = 0 description = None id = "JU_TEST" jobunitId = "JU_TEST" name = "JU_TEST" normalPriority = 0 ownerRoleId = None propertyFull = False type = 0 waitRule = (jobWaitRuleInfo){ (長いため省略) } warnPriority = 0 } detail = (jobDetailInfo){ endDate = "2016/11/29 10:27:43.071" endStatus = 0 ★1 endValue = 0 ★2 startDate = "2016/11/29 10:27:40.455" status = 300 } }, } http://127.0.0.1:8080/HinemosWS/, getJobDetailList succeeded. |
上記のうち、★1がジョブの終了状態、★2がジョブの終了値を現します。上の2ヶ所はジョブユニット配下の2つのジョブの情報で、最後の1か所はジョブユニット自身の情報となります。ジョブユニット配下のジョブが増えれば、出力される情報も増えていきます。さすがに今回は、正規表現で目的の値を取得するのは無理そうなので、他の方法を検討してみます。
出力形式がxmlやyaml、あるいはjsonなら、そのままパーサーに渡して簡単にオブジェクト化することができますが、上記の形式だと、さすがに解析は難しいですね…ということで、今回もHinemos WebサービスAPIとPerlのお世話になろうと思います。
PerlでWebサービスAPIを利用する
今回は、こちらの記事でご紹介したスクリプトを少し改造して使用します。まずは、WebサービスAPIのgetJobDetailList
メソッドで取得したジョブ詳細情報のオブジェクトの中身を、Data::Dumper::Conciseを使用してダンプしてみます。サンプルコードは以下のとおりです。
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 |
#!/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 Data::Dumper::Concise; 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; print Dumper $som->paramsall; 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 |
実行結果は以下のとおりです。
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 |
[root@nodexxx ~]# ./get_jobresults.pl -s 20161129102740-000 { children => { children => [ { data => { abnormalPriority => 0, beginPriority => 0, description => "", id => "JB_TEST", jobunitId => "JU_TEST", name => "JB_TEST", normalPriority => 0, ownerRoleId => "", propertyFull => "false", type => 2, waitRule => { (省略) }, warnPriority => 0 }, detail => { endDate => "1480382861729", endStatus => 2, endValue => -1, facilityId => "REGISTERED", scope => "(省略)", startDate => "1480382860466", status => 300 } }, { data => { abnormalPriority => 0, beginPriority => 0, description => "", id => "JB_TEST2", jobunitId => "JU_TEST", name => "JB_TEST2", normalPriority => 0, ownerRoleId => "", propertyFull => "false", type => 2, waitRule => { (省略) }, warnPriority => 0 }, detail => { endDate => "1480382863066", endStatus => 0, endValue => 0, facilityId => "REGISTERED", scope => "(省略)", startDate => "1480382861734", status => 300 } } ], data => { abnormalPriority => 0, beginPriority => 0, description => "", id => "JU_TEST", jobunitId => "JU_TEST", name => "JU_TEST", normalPriority => 0, ownerRoleId => "", propertyFull => "false", type => 0, waitRule => { (省略) }, warnPriority => 0 }, detail => { endDate => "1480382863071", endStatus => 0, endValue => 0, startDate => "1480382860455", status => 300 } } } |
コマンドラインツールで取得したものと比べて、日時がUnix時間になっていたり、オブジェクトの型の名前がない等の軽微な違いはありますが、基本的には同じ内容になっています。既に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”に格納されている。
上記を踏まえると、リファレンス構造を上から下に向かって探索していき、目的のジョブのendStatus(終了状態)とendValue(終了値)を取り出す処理を実装すれば良さそうです。
少々長くなってしまったため、今回はここまでです。次回(後編)、上記処理の実装例と実行例をご紹介したいと思います。