8a643788b64f15ac743732deb8e9c41ea497d748
[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(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_API_HOST>
37 environment variable, or C<arvados>
38
39 =item apiProtocolScheme
40
41 Protocol scheme. Default: C<ARVADOS_API_PROTOCOL_SCHEME> environment
42 variable, or C<https>
43
44 =item apiToken
45
46 Authorization token. Default: C<ARVADOS_API_TOKEN> environment variable
47
48 =item apiService
49
50 Default C<arvados>
51
52 =item apiVersion
53
54 Default C<v1>
55
56 =back
57
58 =cut
59
60 package Arvados;
61 use JSON;
62 use Data::Dumper;
63 use IO::Socket::SSL;
64 use Carp;
65 use Arvados::ResourceAccessor;
66 use Arvados::ResourceMethod;
67 use Arvados::ResourceProxy;
68 use Arvados::ResourceProxyList;
69 use Arvados::Request;
70
71 $Arvados::VERSION = 0.1;
72
73 sub new
74 {
75     my $class = shift;
76     my %self = @_;
77     my $self = \%self;
78     bless ($self, $class);
79     return $self->build(@_);
80 }
81
82 sub build
83 {
84     my $self = shift;
85     $self->{'authToken'} ||= $ENV{'ARVADOS_API_TOKEN'};
86     $self->{'apiHost'} ||= $ENV{'ARVADOS_API_HOST'};
87     $self->{'apiProtocolScheme'} ||= $ENV{'ARVADOS_API_PROTOCOL_SCHEME'};
88
89     $self->{'ua'} = new Arvados::Request;
90
91     my $host = $self->{'apiHost'} || 'arvados';
92     my $service = $self->{'apiService'} || 'arvados';
93     my $version = $self->{'apiVersion'} || 'v1';
94     my $scheme = $self->{'apiProtocolScheme'} || 'https';
95     my $uri = "$scheme://$host/discovery/v1/apis/$service/$version/rest";
96     my $r = $self->new_request;
97     $r->set_uri($uri);
98     $r->set_method("GET");
99     $r->process_request();
100     my $data, $headers;
101     my ($status_number, $status_phrase) = $r->get_status();
102     $data = $r->get_body() if $status_number == 200;
103     $headers = $r->get_headers();
104     if ($data) {
105         my $doc = $self->{'discoveryDocument'} = JSON::decode_json($data);
106         print STDERR Dumper $doc if $ENV{'DEBUG_ARVADOS_API_DISCOVERY'};
107         my $k, $v;
108         while (($k, $v) = each %{$doc->{'resources'}}) {
109             $self->{$k} = Arvados::ResourceAccessor->new($self, $k);
110         }
111     } else {
112         croak "No discovery doc at $uri - $status_number $status_phrase";
113     }
114     $self;
115 }
116
117 sub new_request
118 {
119     my $self = shift;
120     local $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'};
121     if ($opts{'noVerifyHostname'} || ($host =~ /\.local$/)) {
122         $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
123     }
124     Arvados::Request->new();
125 }
126
127 1;