File Coverage

blib/lib/WWW/Hetzner/Cloud.pm
Criterion Covered Total %
statement 68 69 98.5
branch 1 2 50.0
condition n/a
subroutine 33 33 100.0
pod n/a
total 102 104 98.0


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud;
2              
3             # ABSTRACT: Perl client for Hetzner Cloud API
4              
5 25     25   487886 use Moo;
  25         8256  
  25         200  
6 25     25   27837 use WWW::Hetzner::Cloud::API::Servers;
  25         100  
  25         1063  
7 25     25   14704 use WWW::Hetzner::Cloud::API::ServerTypes;
  25         228  
  25         1011  
8 25     25   13604 use WWW::Hetzner::Cloud::API::Images;
  25         102  
  25         1006  
9 25     25   15286 use WWW::Hetzner::Cloud::API::SSHKeys;
  25         92  
  25         1063  
10 25     25   13567 use WWW::Hetzner::Cloud::API::Locations;
  25         106  
  25         1175  
11 25     25   13941 use WWW::Hetzner::Cloud::API::Datacenters;
  25         108  
  25         1018  
12 25     25   15706 use WWW::Hetzner::Cloud::API::Zones;
  25         120  
  25         1078  
13 25     25   15071 use WWW::Hetzner::Cloud::API::Volumes;
  25         168  
  25         1272  
14 25     25   15089 use WWW::Hetzner::Cloud::API::Networks;
  25         131  
  25         1042  
15 25     25   15378 use WWW::Hetzner::Cloud::API::Firewalls;
  25         102  
  25         971  
16 25     25   16067 use WWW::Hetzner::Cloud::API::FloatingIPs;
  25         110  
  25         1104  
17 25     25   15770 use WWW::Hetzner::Cloud::API::PrimaryIPs;
  25         183  
  25         1067  
18 25     25   17352 use WWW::Hetzner::Cloud::API::LoadBalancers;
  25         136  
  25         1037  
19 25     25   17439 use WWW::Hetzner::Cloud::API::Certificates;
  25         113  
  25         1186  
20 25     25   16301 use WWW::Hetzner::Cloud::API::PlacementGroups;
  25         137  
  25         1098  
21 25     25   187 use namespace::clean;
  25         49  
  25         136  
22              
23             our $VERSION = '0.100';
24              
25              
26             has token => (
27             is => 'ro',
28             default => sub { $ENV{HETZNER_API_TOKEN} },
29             );
30              
31              
32             sub _check_auth {
33 126     126   306 my ($self) = @_;
34 126 50       690 unless ($self->token) {
35 0         0 die "No Cloud API token configured.\n\n" .
36             "Set token via:\n" .
37             " Environment: HETZNER_API_TOKEN\n" .
38             " Option: --token\n\n" .
39             "Get token at: https://console.hetzner.cloud/ -> Select project -> Security -> API tokens\n";
40             }
41             }
42              
43             has base_url => (
44             is => 'ro',
45             default => 'https://api.hetzner.cloud/v1',
46             );
47              
48              
49             with 'WWW::Hetzner::Role::HTTP';
50              
51             around _request => sub {
52             my ($orig, $self, @args) = @_;
53             $self->_check_auth;
54             return $self->$orig(@args);
55             };
56              
57             # Resource accessors
58             has servers => (
59             is => 'lazy',
60 19     19   1007589 builder => sub { WWW::Hetzner::Cloud::API::Servers->new(client => shift) },
61             );
62              
63              
64             has server_types => (
65             is => 'lazy',
66 4     4   485148 builder => sub { WWW::Hetzner::Cloud::API::ServerTypes->new(client => shift) },
67             );
68              
69              
70             has images => (
71             is => 'lazy',
72 4     4   369178 builder => sub { WWW::Hetzner::Cloud::API::Images->new(client => shift) },
73             );
74              
75              
76             has ssh_keys => (
77             is => 'lazy',
78 8     8   514896 builder => sub { WWW::Hetzner::Cloud::API::SSHKeys->new(client => shift) },
79             );
80              
81              
82             has locations => (
83             is => 'lazy',
84 3     3   635201 builder => sub { WWW::Hetzner::Cloud::API::Locations->new(client => shift) },
85             );
86              
87              
88             has datacenters => (
89             is => 'lazy',
90 4     4   510227 builder => sub { WWW::Hetzner::Cloud::API::Datacenters->new(client => shift) },
91             );
92              
93              
94             has zones => (
95             is => 'lazy',
96 46     46   889664 builder => sub { WWW::Hetzner::Cloud::API::Zones->new(client => shift) },
97             );
98              
99              
100             has volumes => (
101             is => 'lazy',
102 9     9   547384 builder => sub { WWW::Hetzner::Cloud::API::Volumes->new(client => shift) },
103             );
104              
105              
106             has networks => (
107             is => 'lazy',
108 10     10   388238 builder => sub { WWW::Hetzner::Cloud::API::Networks->new(client => shift) },
109             );
110              
111              
112             has firewalls => (
113             is => 'lazy',
114 9     9   359067 builder => sub { WWW::Hetzner::Cloud::API::Firewalls->new(client => shift) },
115             );
116              
117              
118             has floating_ips => (
119             is => 'lazy',
120 9     9   384857 builder => sub { WWW::Hetzner::Cloud::API::FloatingIPs->new(client => shift) },
121             );
122              
123              
124             has primary_ips => (
125             is => 'lazy',
126 8     8   330209 builder => sub { WWW::Hetzner::Cloud::API::PrimaryIPs->new(client => shift) },
127             );
128              
129              
130             has load_balancers => (
131             is => 'lazy',
132 7     7   354225 builder => sub { WWW::Hetzner::Cloud::API::LoadBalancers->new(client => shift) },
133             );
134              
135              
136             has certificates => (
137             is => 'lazy',
138 4     4   344279 builder => sub { WWW::Hetzner::Cloud::API::Certificates->new(client => shift) },
139             );
140              
141              
142             has placement_groups => (
143             is => 'lazy',
144 4     4   376003 builder => sub { WWW::Hetzner::Cloud::API::PlacementGroups->new(client => shift) },
145             );
146              
147              
148              
149             1;
150              
151             __END__