【Hinemos 5.0】特定のジョブの実行結果をコマンドで取得する(その1の補足の補足)

せっかく、WebサービスAPIを使って実装できたので、こちらの記事で紹介した方法についても、同様にWebサービスAPIを使って実装してみましょう。

いきなりですが、サンプルコードは以下のとおりです。なお、WebサービスAPIはgetNodeDetailListを使います。

#!/usr/bin/env perl
# usage: get_commandresults.pl args
# args : -s|--sessionid SESSION_ID -u|--unitid JOBUNIT_ID
#        -j|--jobid JOB_ID -f|--facilityid FACILITY_ID

use strict;
use warnings;
use YAML::XS;
use SOAP::Lite;
use Getopt::Long;

my ($sid, $uid, $jid, $fid) = ("not_specified") x 4;
GetOptions(
    "sessionid=s"  => \$sid,
    "unitid=s"     => \$uid,
    "jobid=s"      => \$jid,
    "facilityid=s" => \$fid,
);

my $conf   = Load(do{ local $/; <DATA> });
my $client = setup_client($conf);
my $som    = $client->call($conf->{method} => create_args($sid, $uid, $jid));
die $som->fault->{faultstring}."\n" if $som->fault;

my $val = get_results($fid, [$som->paramsall]);
if (defined $val) {
    print "$val";
}
else {
    die "endValue not found.\n";
}

sub get_results {
    my ($fid, $target) = @_;
    my $val;

    for my $subtarget (@$target) {
        next unless ref($subtarget) eq 'HASH';
        if ($subtarget->{facilityId} eq $fid) {
            $val = $subtarget->{endValue};
            last;
        }
    }

    return $val;
}

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 {
    my ($sid, $uid, $jid) = @_;
    return
        SOAP::Data->name("arg0" => $sid),
        SOAP::Data->name("arg1" => $uid),
        SOAP::Data->name("arg2" => $jid),
    ;
}

__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: getNodeDetailList

ポイントとしては、getNodeDetailListで取得されるオブジェクトの構造が、

{
    endDate = ...
    endValue = ...
    facilityId = ...
    message = ...
      :
},
{
    endDate = ...
    endValue = ...
    facilityId = ...
    message = ...
      :
},

のように、単純なHashRefのリストになっているということです。そのため、再帰の実装も不要で、リストを先頭から順に総なめするだけで、目的のノードの情報を簡単に取得することができます。

サンプルコードの実行結果(の例)は以下のとおりです。なお、セッションIDやその他のジョブ実行履歴には、こちらの記事で紹介したものを使用しています。

[root@nodexxx ~]# ./get_commandresults.pl -s 20161129161443-000 -u JU_TEST -j JB_TEST -f nodexxx
12(改行なし)
[root@nodexxx ~]# ./get_commandresults.pl -s 20161129161443-000 -u JU_TEST -j JB_TEST -f nodexxxalt
12(改行なし)
[root@nodexxx ~]# ./get_commandresults.pl -s 20161129161443-000 -u JU_TEST -j JB_TEST2 -f nodexxx
0(改行なし)
[root@nodexxx ~]# ./get_commandresults.pl -s 20161129161443-000 -u JU_TEST -j J_TEST2 -f nodexxxalt
0(改行なし)

問題なく、ジョブの起動コマンドの戻り値を取得することができました。なお、今回は起動コマンドの戻り値でしたが、コードをほんの少し改造するだけで、そのノードの実行状態やメッセージ等を出力することももちろん可能です。

以上、簡単ですがその1の補足の補足でした。WebサービスAPIの他のメソッドについても、機会があればご紹介したいと思います。

Leave a Reply

You must be logged in to post a comment.