Merge branch '1943-client-sdk-config-files'
[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
86     $config = load_config_file("$ENV{HOME}/.config/arvados/settings.conf");
87
88     $self->{'authToken'} ||= 
89         $ENV{ARVADOS_API_TOKEN} || $config->{ARVADOS_API_TOKEN};
90
91     $self->{'apiHost'} ||=
92         $ENV{ARVADOS_API_HOST} || $config->{ARVADOS_API_HOST};
93
94     $self->{'apiProtocolScheme'} ||=
95         $ENV{ARVADOS_API_PROTOCOL_SCHEME} ||
96         $config->{ARVADOS_API_PROTOCOL_SCHEME};
97
98     $self->{'ua'} = new Arvados::Request;
99
100     my $host = $self->{'apiHost'} || 'arvados';
101     my $service = $self->{'apiService'} || 'arvados';
102     my $version = $self->{'apiVersion'} || 'v1';
103     my $scheme = $self->{'apiProtocolScheme'} || 'https';
104     my $uri = "$scheme://$host/discovery/v1/apis/$service/$version/rest";
105     my $r = $self->new_request;
106     $r->set_uri($uri);
107     $r->set_method("GET");
108     $r->process_request();
109     my $data, $headers;
110     my ($status_number, $status_phrase) = $r->get_status();
111     $data = $r->get_body() if $status_number == 200;
112     $headers = $r->get_headers();
113     if ($data) {
114         my $doc = $self->{'discoveryDocument'} = JSON::decode_json($data);
115         print STDERR Dumper $doc if $ENV{'DEBUG_ARVADOS_API_DISCOVERY'};
116         my $k, $v;
117         while (($k, $v) = each %{$doc->{'resources'}}) {
118             $self->{$k} = Arvados::ResourceAccessor->new($self, $k);
119         }
120     } else {
121         croak "No discovery doc at $uri - $status_number $status_phrase";
122     }
123     $self;
124 }
125
126 sub new_request
127 {
128     my $self = shift;
129     local $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'};
130     if ($opts{'noVerifyHostname'} || ($host =~ /\.local$/)) {
131         $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
132     }
133     Arvados::Request->new();
134 }
135
136 sub load_config_file ($)
137 {
138     my $config_file = shift;
139     my %config;
140
141     if (open (CONF, $config_file)) {
142         while (<CONF>) {
143             next if /^\s*#/ || /^\s*$/;  # skip comments and blank lines
144             chomp;
145             my ($key, $val) = split /\s*=\s*/, $_, 2;
146             $config{$key} = $val;
147         }
148     }
149     close CONF;
150     return \%config;
151 }
152
153 1;