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.001';
4 7     7   2930987 use Moo;
  7         54851  
  7         42  
5 7     7   11338 use Carp qw( croak );
  7         17  
  7         389  
6 7     7   3354 use Log::Any qw( $log );
  7         63893  
  7         37  
7              
8 7     7   21445 use API::Docker::API::System;
  7         43  
  7         318  
9 7     7   4896 use API::Docker::API::Containers;
  7         29  
  7         301  
10 7     7   4248 use API::Docker::API::Images;
  7         67  
  7         329  
11 7     7   4581 use API::Docker::API::Networks;
  7         29  
  7         295  
12 7     7   3946 use API::Docker::API::Volumes;
  7         27  
  7         239  
13 7     7   3204 use API::Docker::API::Exec;
  7         27  
  7         3971  
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   2517 builder => sub { API::Docker::API::System->new(client => $_[0]) },
50             );
51              
52              
53             has containers => (
54             is => 'lazy',
55 4     4   2202 builder => sub { API::Docker::API::Containers->new(client => $_[0]) },
56             );
57              
58              
59             has images => (
60             is => 'lazy',
61 8     8   2329 builder => sub { API::Docker::API::Images->new(client => $_[0]) },
62             );
63              
64              
65             has networks => (
66             is => 'lazy',
67 5     5   2317 builder => sub { API::Docker::API::Networks->new(client => $_[0]) },
68             );
69              
70              
71             has volumes => (
72             is => 'lazy',
73 4     4   2505 builder => sub { API::Docker::API::Volumes->new(client => $_[0]) },
74             );
75              
76              
77             has exec => (
78             is => 'lazy',
79 1     1   2095 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__