File Coverage

blib/lib/API/Docker.pm
Criterion Covered Total %
statement 33 42 78.5
branch 0 6 0.0
condition 0 3 0.0
subroutine 15 16 93.7
pod 1 1 100.0
total 49 68 72.0


line stmt bran cond sub pod time code
1             package API::Docker;
2             # ABSTRACT: Perl client for the Docker Engine API
3             our $VERSION = '0.002';
4 8     8   3034843 use Moo;
  8         57951  
  8         44  
5 8     8   11736 use Carp qw( croak );
  8         14  
  8         486  
6 8     8   3793 use Log::Any qw( $log );
  8         82063  
  8         44  
7              
8 8     8   23534 use API::Docker::API::System;
  8         48  
  8         321  
9 8     8   4953 use API::Docker::API::Containers;
  8         33  
  8         336  
10 8     8   4701 use API::Docker::API::Images;
  8         32  
  8         345  
11 8     8   6453 use API::Docker::API::Networks;
  8         31  
  8         357  
12 8     8   4779 use API::Docker::API::Volumes;
  8         34  
  8         314  
13 8     8   4640 use API::Docker::API::Exec;
  8         30  
  8         4910  
14              
15              
16             has host => (
17             is => 'ro',
18             default => sub { $ENV{DOCKER_HOST} // 'unix:///var/run/docker.sock' },
19             );
20              
21              
22             has api_version => (
23             is => 'rwp',
24             default => undef,
25             );
26              
27              
28             has tls => (
29             is => 'ro',
30             default => 0,
31             );
32              
33              
34             has cert_path => (
35             is => 'ro',
36             default => sub { $ENV{DOCKER_CERT_PATH} },
37             );
38              
39              
40             has _version_negotiated => (
41             is => 'rw',
42             default => 0,
43             );
44              
45             with 'API::Docker::Role::HTTP';
46              
47             has system => (
48             is => 'lazy',
49 7     7   1836 builder => sub { API::Docker::API::System->new(client => $_[0]) },
50             );
51              
52              
53             has containers => (
54             is => 'lazy',
55 4     4   1810 builder => sub { API::Docker::API::Containers->new(client => $_[0]) },
56             );
57              
58              
59             has images => (
60             is => 'lazy',
61 9     9   2351 builder => sub { API::Docker::API::Images->new(client => $_[0]) },
62             );
63              
64              
65             has networks => (
66             is => 'lazy',
67 5     5   1791 builder => sub { API::Docker::API::Networks->new(client => $_[0]) },
68             );
69              
70              
71             has volumes => (
72             is => 'lazy',
73 4     4   1636 builder => sub { API::Docker::API::Volumes->new(client => $_[0]) },
74             );
75              
76              
77             has exec => (
78             is => 'lazy',
79 1     1   1293 builder => sub { API::Docker::API::Exec->new(client => $_[0]) },
80             );
81              
82              
83             sub negotiate_version {
84 0     0 1   my ($self) = @_;
85 0 0         return if $self->_version_negotiated;
86 0 0         return if defined $self->api_version;
87              
88 0           $log->debug("Auto-negotiating API version");
89 0           my $version_info = $self->_request('GET', '/version');
90 0 0 0       if ($version_info && $version_info->{ApiVersion}) {
91 0           $self->_set_api_version($version_info->{ApiVersion});
92 0           $log->debugf("Negotiated API version: %s", $version_info->{ApiVersion});
93             }
94 0           $self->_version_negotiated(1);
95             }
96              
97              
98             around _request => sub {
99             my ($orig, $self, $method, $path, %opts) = @_;
100              
101             # Auto-negotiate before any versioned request, but not for /version itself
102             if ($path ne '/version' && !defined $self->api_version && !$self->_version_negotiated) {
103             $self->negotiate_version;
104             }
105              
106             return $self->$orig($method, $path, %opts);
107             };
108              
109              
110             1;
111              
112             __END__