File Coverage

blib/lib/API/PureStorage.pm
Criterion Covered Total %
statement 18 73 24.6
branch 0 28 0.0
condition n/a
subroutine 6 13 46.1
pod 3 4 75.0
total 27 118 22.8


line stmt bran cond sub pod time code
1             package API::PureStorage;
2              
3 1     1   9663 use Data::Dumper;
  1         6086  
  1         45  
4 1     1   401 use REST::Client;
  1         30300  
  1         25  
5 1     1   535 use JSON;
  1         7709  
  1         3  
6 1     1   547 use Net::SSL;
  1         20683  
  1         14  
7              
8 1     1   347 use warnings;
  1         1  
  1         22  
9 1     1   4 use strict;
  1         1  
  1         542  
10              
11             $API::PureStorage::VERSION = '0.02';
12              
13             our %ENV;
14             $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
15              
16             my $debug = 0;
17              
18             sub new {
19 0     0 0   my $class = shift @_;
20 0           my $self = {
21             cookie_file => '/tmp/cookies.txt',
22             host => $_[0],
23             token => $_[1]
24             };
25 0           bless $self, $class;
26              
27 0           my $client = REST::Client->new( follow => 1 );
28 0           $client->setHost('https://'.$self->{host});
29              
30 0           $client->addHeader('Content-Type', 'application/json');
31              
32 0           $client->getUseragent()->cookie_jar({ file => $self->{cookie_file} });
33 0           $client->getUseragent()->ssl_opts(verify_hostname => 0);
34              
35 0           $self->{client} = $client;
36              
37             # Check API compatibility
38              
39 0           my @versions = $self->version();
40              
41 0           my %api_versions;
42 0           for my $version (@versions) {
43 0           $api_versions{$version}++;
44             }
45              
46             my $api_version = $api_versions{'1.4'} ? '1.4' :
47             $api_versions{'1.3'} ? '1.3' :
48             $api_versions{'1.1'} ? '1.1' :
49 0 0         $api_versions{'1.0'} ? '1.0' :
    0          
    0          
    0          
50             undef;
51              
52 0 0         unless ( $api_version ) {
53 0           die "API version 1.3 or 1.4 is not supported by host: $self->{host}\n";
54             }
55              
56 0           $self->{api_version} = $api_version;
57              
58             ### Set the Session Cookie
59              
60 0           my $ret = $self->_api_post("/api/$api_version/auth/session", { api_token => $self->{token} });
61              
62 0           return $self;
63             }
64              
65             sub DESTROY {
66 0     0     my $self = shift @_;
67 0           my $ret = $self->{client}->DELETE("/api/$self->{api_version}/auth/session");
68 0           unlink $self->{cookie_file};
69             }
70              
71             ### Methods
72              
73             sub array_info {
74 0     0 1   my $self = shift @_;
75 0           my $ref = $self->_api_get("/api/$self->{api_version}/array?space=true");
76 0 0         return wantarray ? @$ref : $ref;
77             }
78              
79             sub volume_info {
80 0     0 1   my $self = shift @_;
81 0           my $ref = $self->_api_get("/api/$self->{api_version}/volume?space=true");
82 0 0         return wantarray ? @$ref : $ref;
83             }
84              
85             sub version {
86 0     0 1   my $self = shift @_;
87 0           my $ref = $self->_api_get('/api/api_version');
88 0 0         return wantarray ? @{$ref->{version}} : $ref->{version};
  0            
89             }
90              
91             ### Subs
92              
93             sub _api_get {
94 0     0     my $self = shift @_;
95 0           my $url = shift @_;
96 0           my $ret = $self->{client}->GET($url);
97 0           my $num = $ret->responseCode();
98 0           my $con = $ret->responseContent();
99 0 0         if ( $num == 500 ) {
100 0           die "API returned error 500 for '$url' - $con\n";
101             }
102 0 0         if ( $num != 200 ) {
103 0           die "API returned code $num for URL '$url'\n";
104             }
105 0 0         print 'DEBUG: GET ', $url, ' -> ', $num, ":\n", Dumper(from_json($con)), "\n" if $debug;
106 0           return from_json($con);
107             }
108              
109             sub _api_post {
110 0     0     my $self = shift @_;
111 0           my $url = shift @_;
112 0           my $data = shift @_;
113 0           my $ret = $self->{client}->POST($url, to_json($data));
114 0           my $num = $ret->responseCode();
115 0           my $con = $ret->responseContent();
116 0 0         if ( $num == 500 ) {
117 0           die "API returned error 500 for '$url' - $con\n";
118             }
119 0 0         if ( $num != 200 ) {
120 0           die "API returned code $num for URL '$url'\n";
121             }
122 0 0         print 'DEBUG: POST ', $url, ' -> ', $num, ":\n", Dumper(from_json($con)), "\n" if $debug;
123 0           return from_json($con);
124             }
125              
126             1;
127             __END__