port crunch dispatcher from whjobmanager to crunch-job
[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.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 $Arvados::VERSION = 0.1;
71
72 sub new
73 {
74     my $class = shift;
75     my %self = @_;
76     my $self = \%self;
77     bless ($self, $class);
78     return $self->build(@_);
79 }
80
81 sub build
82 {
83     my $self = shift;
84     $self->{'authToken'} ||= $ENV{'ARVADOS_API_TOKEN'};
85     $self->{'apiHost'} ||= $ENV{'ARVADOS_API_HOST'};
86     $self->{'apiProtocolScheme'} ||= $ENV{'ARVADOS_API_PROTOCOL_SCHEME'};
87
88     $self->{'ua'} = new Arvados::Request;
89
90     my $host = $self->{'apiHost'} || 'arvados';
91     my $service = $self->{'apiService'} || 'arvados';
92     my $version = $self->{'apiVersion'} || 'v1';
93     my $scheme = $self->{'apiProtocolScheme'} || 'https';
94     my $uri = "$scheme://$host/discovery/v1/apis/$service/$version/rest";
95     my $r = $self->new_request;
96     $r->set_uri($uri);
97     $r->set_method("GET");
98     $r->process_request();
99     my $data, $headers;
100     my ($status_number, $status_phrase) = $r->get_status();
101     $data = $r->get_body() if $status_number == 200;
102     $headers = $r->get_headers();
103     if ($data) {
104         my $doc = $self->{'discoveryDocument'} = JSON::decode_json($data);
105         print STDERR Dumper $doc if $ENV{'DEBUG_ARVADOS_API_DISCOVERY'};
106         my $k, $v;
107         while (($k, $v) = each %{$doc->{'resources'}}) {
108             $self->{$k} = Arvados::ResourceAccessor->new($self, $k);
109         }
110     } else {
111         croak "No discovery doc at $uri - $status_number $status_phrase";
112     }
113     $self;
114 }
115
116 sub new_request
117 {
118     my $self = shift;
119     local $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'};
120     if ($opts{'noVerifyHostname'} || ($host =~ /\.local$/)) {
121         $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
122     }
123     Arvados::Request->new();
124 }
125
126 1;