Active IQ Unified Manager Discussions

perl webservices client

kleemola
7,698 Views

Has anybody written any code to use perl to connect to WFA webservices?  Can it be done?  The only example provided in the webservices guide uses a MS-specific auth method.  I'm trying to write some perl, but I'm stuck at the auth piece.  I'm a bit of a webservices newbie here.

1 ACCEPTED SOLUTION

arndt
5,554 Views

Here are some more examples of using Perl to interact with WFA via SOAP...along with comments that give some hints about where I had struggles.  I'm not sure if my struggles were due to the immaturity of the SOAP::Lite module or my own lack of SOAP experience, but I suspect it's a combination of both .

wfa_get_all_workflows.pl

------------------------------------

#!/usr/bin/perl -w

use strict;

# Use 'trace' if you need to debug the XML interactions.

#use SOAP::Lite 'trace';

use SOAP::Lite;

# We have to use the RPC interface for SOAP calls that don't have

# any arguments.  Google xsi:nil true soap::lite if you want the gory

# details about how SOAP::Lite is broken.  Thankfully, WFA supports

# both doc and rpc interfaces.

my $soapurl   = 'http://WFA_IP/wfa-ws/WorkflowService_rpc?wsdl';

my $namespace = 'http://ws.wfa.netapp.com/';

my $user      = "admin";

my $pass      = "admin";

sub SOAP::Transport::HTTP::Client::get_basic_credentials {

        return $user => $pass;

}

my $service = new SOAP::Lite

        uri   => $namespace,

        proxy => $soapurl,

;

$service->ns($namespace);

# Setting autotype is not really necessary, but I like it when debugging.

$service->autotype('0');

# The use_prefix setting is deprecated, but I think it makes debbuing easier

# if you have tracing enabled.

#$service->use_prefix('0');

my $som    = $service->getAllWorkflows();

my $result = $som->result;

my $items  = $result->{'item'};

for my $item (@$items) {

        print "Workflow ID:          $item->{'id'}\n";

        print "Workflow Category:    $item->{'category'}\n";

        print "Workflow Name:        $item->{'name'}\n";

        print "Workflow Description: $item->{'description'}\n";

        print "Workflow Input: \n";

        my $inputs = $item->{'userInput'};

        for my $input (sort @$inputs) {

                print "  $input->{'name'} ($input->{'type'})\n";

        }

        print "\n";

}

------------------------------------

wfa_run_workflow.pl

----------------------------

#!/usr/bin/perl -w

use strict;

# Use 'trace' if you need to debug the XML interactions.

#use SOAP::Lite 'trace';

use SOAP::Lite;

# Oddly, the doc interface works and the rpc interface does not work when

# making a SOAP call with arguments.  The opposite is true when making

# SOAP calls with no arguments.  Good thing WFA supports both.  SOAP is fun.

my $soapurl   = 'http://WFA_IP/wfa-ws/WorkflowService_doc?wsdl';

my $namespace = 'http://ws.wfa.netapp.com/';

my $user      = "admin";

my $pass      = "admin";

sub SOAP::Transport::HTTP::Client::get_basic_credentials {

        return $user => $pass;

}

my $service = new SOAP::Lite

        uri   => $namespace,

        proxy => $soapurl,

;

$service->ns($namespace);

# Setting autotype is not really necessary, but I like it when debugging.

$service->autotype('0');

# The use_prefix setting is deprecated, but I think it makes debbuing easier

# if you have tracing enabled.

#$service->use_prefix('0');

my $wfid      = 31;

my $wfidparam = SOAP::Data->name('workflowId')->value($wfid);

my $wfparams  = SOAP::Data->name('userInputsEqualsValues')->value

([

        'controllerName=demo3020a.demo.ntapmn.com',

        'vfilerName=dmvfiler1',

        'volName_1=arndt_test',

        'qtreeName_1=wfasoapqt4',

        'qtreeStyle_1=unix',

        'create_Share_1=no',

        'create_Export_1=yes',

        'rootHosts=10.26.69.212:10.26.69.213',

]);

# I had to set even the optional arguments to make this work.

my $wftime   = SOAP::Data->name('executionDateAndTime')->value('');

my $wfcom    = SOAP::Data->name('comment')->value('');

my $som = $service->runWorkflow($wfidparam,$wfparams,$wftime,$wfcom);

if ($som->faultcode) {

        print "Fault Code:", $som->faultcode, "\n";

        print "Fault String:", $som->faultstring, "\n";

} else {

        my $result   = $som->result;

        print "Job $result has been submitted.\n";

}

----------------------------

wfa_get_job_status.pl

-------------------------------

#!/usr/bin/perl -w

use strict;

# Use 'trace' if you need to debug the XML interactions.

#use SOAP::Lite 'trace';

use SOAP::Lite;

# Oddly, the doc interface works and the rpc interface does not work when

# making a SOAP call with arguments.  The opposite is true when making

# SOAP calls with no arguments.  Good thing WFA supports both.  SOAP is fun.

my $soapurl   = 'http://WFA_IP/wfa-ws/WorkflowService_doc?wsdl';

my $namespace = 'http://ws.wfa.netapp.com/';

my $user      = "admin";

my $pass      = "admin";

sub SOAP::Transport::HTTP::Client::get_basic_credentials {

        return $user => $pass;

}

my $service = new SOAP::Lite

        uri   => $namespace,

        proxy => $soapurl,

;

$service->ns($namespace);

# Setting autotype is not really necessary, but I like it when debugging.

$service->autotype('0');

# The use_prefix setting is deprecated, but I think it makes debbuing easier

# if you have tracing enabled.

#$service->use_prefix('0');

my $jobid      = 392;

my $jobidparam = SOAP::Data->name('jobId')->value($jobid);

my $som = $service->getJobStatus($jobidparam);

if ($som->faultcode) {

        print "Fault Code:", $som->faultcode, "\n";

        print "Fault String:", $som->faultstring, "\n";

} else {

        my $result   = $som->result;

        print "Job start time: $result->{'startTime'}\n";

        print "Job end time:   $result->{'endTime'}\n" if ($result->{'endTime'});

        print "Job status:     $result->{'jobStatus'}\n";

        print "Job messages:   $result->{'errorMessage'}\n" if ($result->{'errorMessage'});

}

-------------------------------

View solution in original post

10 REPLIES 10
Public