start Perl SDK
[arvados.git] / sdk / perl / lib / Arvados.pm
1 =head1 NAME
2
3 Arvados -- client library for Arvados services
4
5 =head1 SYNOPSIS
6
7   use Arvados;
8   $arv = Arvados->new()->build(apiHost => 'arvados.local');
9   
10   my $instances = $arv->{'pipeline_instances'}->{'list'}->execute();
11   print "UUID is ", $instances->{'items'}->[0]->{'uuid'}, "\n";
12   
13   $uuid = 'eiv0u-arx5y-2c5ovx43zw90gvh';
14   $instance = $arv->{'pipeline_instances'}->{'get'}->execute('uuid' => $uuid);
15   print "ETag is ", $instance->{'etag'}, "\n";
16   
17   $instance->{'active'} = 1;
18   $instance->{'name'} = '';
19   $instance->save();
20   print "ETag is ", $instance->{'etag'}, "\n";
21
22 =head1 METHODS
23
24 =head2 new()
25
26  my $whc = Arvados->new( %OPTIONS );
27
28 Set up a client and retrieve the schema from the server.
29
30 =head3 Options
31
32 =over
33
34 =item apiHost
35
36 Hostname of API discovery service. Default: C<arvados.local>
37
38 =item apiProtocolScheme
39
40 Protocol scheme. Default: C<ARVADOS_API_PROTOCOL_SCHEME> environment
41 variable, or C<https>
42
43 =item apiToken
44
45 Authorization token. Default: C<ARVADOS_API_TOKEN> environment variable
46
47 =item apiService
48
49 Default C<arvados>
50
51 =item apiVersion
52
53 Default C<v1>
54
55 =back
56
57 =cut
58
59 package Arvados;
60 use JSON;
61 use Data::Dumper;
62 use IO::Socket::SSL;
63 use Carp;
64 use Arvados::ResourceAccessor;
65 use Arvados::ResourceMethod;
66 use Arvados::ResourceProxy;
67 use Arvados::ResourceProxyList;
68 use Arvados::Request;
69
70 sub new
71 {
72     my $class = shift;
73     my %self = @_;
74     my $self = \%self;
75     bless ($self, $class);
76     return $self->build(@_);
77 }
78
79 sub build
80 {
81     my $self = shift;
82     $self->{'authToken'} ||= $ENV{'ARVADOS_API_TOKEN'};
83     $self->{'apiHost'} ||= $ENV{'ARVADOS_API_HOST'};
84     $self->{'apiProtocolScheme'} ||= $ENV{'ARVADOS_API_PROTOCOL_SCHEME'};
85
86     $self->{'ua'} = new Arvados::Request;
87
88     my $host = $self->{'apiHost'} || 'arvados';
89     my $service = $self->{'apiService'} || 'arvados';
90     my $version = $self->{'apiVersion'} || 'v1';
91     my $scheme = $self->{'apiProtocolScheme'} || 'https';
92     my $uri = "$scheme://$host/discovery/v1/apis/$service/$version/rest";
93     my $r = $self->new_request;
94     $r->set_uri($uri);
95     $r->set_method("GET");
96     $r->process_request();
97     my $data, $headers;
98     my ($status_number, $status_phrase) = $r->get_status();
99     $data = $r->get_body() if $status_number == 200;
100     $headers = $r->get_headers();
101     if ($data) {
102         my $doc = $self->{'discoveryDocument'} = JSON::decode_json($data);
103         print STDERR Dumper $doc if $ENV{'DEBUG_ARVADOS_API_DISCOVERY'};
104         my $k, $v;
105         while (($k, $v) = each %{$doc->{'resources'}}) {
106             $self->{$k} = Arvados::ResourceAccessor->new($self, $k);
107         }
108     } else {
109         croak "No discovery doc at $uri - $status_number $status_phrase";
110     }
111     $self;
112 }
113
114 sub new_request
115 {
116     my $self = shift;
117     local $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'};
118     if ($opts{'noVerifyHostname'} || ($host =~ /\.local$/)) {
119         $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
120     }
121     Arvados::Request->new();
122 }
123
124 1;