File Coverage

blib/lib/WWW/Hetzner/Cloud/API/LoadBalancers.pm
Criterion Covered Total %
statement 48 73 65.7
branch 18 54 33.3
condition 1 2 50.0
subroutine 12 17 70.5
pod 11 11 100.0
total 90 157 57.3


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud::API::LoadBalancers;
2             # ABSTRACT: Hetzner Cloud Load Balancers API
3              
4             our $VERSION = '0.100';
5              
6 25     25   193 use Moo;
  25         59  
  25         173  
7 25     25   10455 use Carp qw(croak);
  25         62  
  25         1856  
8 25     25   15216 use WWW::Hetzner::Cloud::LoadBalancer;
  25         106  
  25         1333  
9 25     25   209 use namespace::clean;
  25         55  
  25         149  
10              
11              
12             has client => (
13             is => 'ro',
14             required => 1,
15             weak_ref => 1,
16             );
17              
18             sub _wrap {
19 3     3   7 my ($self, $data) = @_;
20 3         56 return WWW::Hetzner::Cloud::LoadBalancer->new(
21             client => $self->client,
22             %$data,
23             );
24             }
25              
26             sub _wrap_list {
27 1     1   3 my ($self, $list) = @_;
28 1         2 return [ map { $self->_wrap($_) } @$list ];
  1         3  
29             }
30              
31              
32             sub list {
33 1     1 1 962 my ($self, %params) = @_;
34              
35 1         10 my $result = $self->client->get('/load_balancers', params => \%params);
36 1   50     7 return $self->_wrap_list($result->{load_balancers} // []);
37             }
38              
39              
40             sub get {
41 1     1 1 35 my ($self, $id) = @_;
42 1 50       5 croak "Load Balancer ID required" unless $id;
43              
44 1         13 my $result = $self->client->get("/load_balancers/$id");
45 1         4 return $self->_wrap($result->{load_balancer});
46             }
47              
48              
49             sub create {
50 4     4 1 1561 my ($self, %params) = @_;
51              
52 4 100       208 croak "name required" unless $params{name};
53 3 100       191 croak "load_balancer_type required" unless $params{load_balancer_type};
54 2 100       175 croak "location required" unless $params{location};
55              
56             my $body = {
57             name => $params{name},
58             load_balancer_type => $params{load_balancer_type},
59             location => $params{location},
60 1         4 };
61              
62 1 50       3 $body->{algorithm} = $params{algorithm} if $params{algorithm};
63 1 50       3 $body->{labels} = $params{labels} if $params{labels};
64 1 50       4 $body->{network} = $params{network} if $params{network};
65 1 50       3 $body->{network_zone}= $params{network_zone}if $params{network_zone};
66 1 50       3 $body->{public_interface} = $params{public_interface} if exists $params{public_interface};
67 1 50       4 $body->{services} = $params{services} if $params{services};
68 1 50       4 $body->{targets} = $params{targets} if $params{targets};
69              
70 1         8 my $result = $self->client->post('/load_balancers', $body);
71 1         5 return $self->_wrap($result->{load_balancer});
72             }
73              
74              
75             sub update {
76 0     0 1 0 my ($self, $id, %params) = @_;
77 0 0       0 croak "Load Balancer ID required" unless $id;
78              
79 0         0 my $body = {};
80 0 0       0 $body->{name} = $params{name} if exists $params{name};
81 0 0       0 $body->{labels} = $params{labels} if exists $params{labels};
82              
83 0         0 my $result = $self->client->put("/load_balancers/$id", $body);
84 0         0 return $self->_wrap($result->{load_balancer});
85             }
86              
87              
88             sub delete {
89 1     1 1 30 my ($self, $id) = @_;
90 1 50       5 croak "Load Balancer ID required" unless $id;
91              
92 1         10 return $self->client->delete("/load_balancers/$id");
93             }
94              
95              
96             sub add_target {
97 1     1 1 23 my ($self, $id, %opts) = @_;
98 1 50       4 croak "Load Balancer ID required" unless $id;
99 1 50       3 croak "type required" unless $opts{type};
100              
101 1         29 return $self->client->post("/load_balancers/$id/actions/add_target", \%opts);
102             }
103              
104              
105             sub remove_target {
106 0     0 1 0 my ($self, $id, %opts) = @_;
107 0 0       0 croak "Load Balancer ID required" unless $id;
108 0 0       0 croak "type required" unless $opts{type};
109              
110 0         0 return $self->client->post("/load_balancers/$id/actions/remove_target", \%opts);
111             }
112              
113              
114             sub add_service {
115 1     1 1 23 my ($self, $id, %opts) = @_;
116 1 50       3 croak "Load Balancer ID required" unless $id;
117              
118 1         8 return $self->client->post("/load_balancers/$id/actions/add_service", \%opts);
119             }
120              
121              
122             sub delete_service {
123 0     0 1   my ($self, $id, $listen_port) = @_;
124 0 0         croak "Load Balancer ID required" unless $id;
125 0 0         croak "listen_port required" unless $listen_port;
126              
127 0           return $self->client->post("/load_balancers/$id/actions/delete_service", {
128             listen_port => $listen_port,
129             });
130             }
131              
132              
133             sub attach_to_network {
134 0     0 1   my ($self, $id, $network_id, %opts) = @_;
135 0 0         croak "Load Balancer ID required" unless $id;
136 0 0         croak "network required" unless $network_id;
137              
138 0           my $body = { network => $network_id };
139 0 0         $body->{ip} = $opts{ip} if $opts{ip};
140              
141 0           return $self->client->post("/load_balancers/$id/actions/attach_to_network", $body);
142             }
143              
144              
145             sub detach_from_network {
146 0     0 1   my ($self, $id, $network_id) = @_;
147 0 0         croak "Load Balancer ID required" unless $id;
148 0 0         croak "network required" unless $network_id;
149              
150 0           return $self->client->post("/load_balancers/$id/actions/detach_from_network", {
151             network => $network_id,
152             });
153             }
154              
155              
156             1;
157              
158             __END__