File Coverage

blib/lib/WWW/Hetzner/Cloud/API/Networks.pm
Criterion Covered Total %
statement 59 66 89.3
branch 23 48 47.9
condition 1 2 50.0
subroutine 14 15 93.3
pod 9 9 100.0
total 106 140 75.7


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud::API::Networks;
2             # ABSTRACT: Hetzner Cloud Networks API
3              
4             our $VERSION = '0.100';
5              
6 25     25   164 use Moo;
  25         79  
  25         149  
7 25     25   9554 use Carp qw(croak);
  25         70  
  25         1737  
8 25     25   13625 use WWW::Hetzner::Cloud::Network;
  25         92  
  25         1259  
9 25     25   176 use namespace::clean;
  25         59  
  25         122  
10              
11              
12             has client => (
13             is => 'ro',
14             required => 1,
15             weak_ref => 1,
16             );
17              
18             sub _wrap {
19 4     4   13 my ($self, $data) = @_;
20 4         89 return WWW::Hetzner::Cloud::Network->new(
21             client => $self->client,
22             %$data,
23             );
24             }
25              
26             sub _wrap_list {
27 1     1   3 my ($self, $list) = @_;
28 1         3 return [ map { $self->_wrap($_) } @$list ];
  1         6  
29             }
30              
31              
32             sub list {
33 1     1 1 1214 my ($self, %params) = @_;
34              
35 1         13 my $result = $self->client->get('/networks', params => \%params);
36 1   50     9 return $self->_wrap_list($result->{networks} // []);
37             }
38              
39              
40             sub get {
41 2     2 1 90 my ($self, $id) = @_;
42 2 50       9 croak "Network ID required" unless $id;
43              
44 2         27 my $result = $self->client->get("/networks/$id");
45 2         13 return $self->_wrap($result->{network});
46             }
47              
48              
49             sub create {
50 3     3 1 800 my ($self, %params) = @_;
51              
52 3 100       266 croak "name required" unless $params{name};
53 2 100       168 croak "ip_range required" unless $params{ip_range};
54              
55             my $body = {
56             name => $params{name},
57             ip_range => $params{ip_range},
58 1         4 };
59              
60 1 50       3 $body->{labels} = $params{labels} if $params{labels};
61 1 50       3 $body->{subnets} = $params{subnets} if $params{subnets};
62 1 50       3 $body->{routes} = $params{routes} if $params{routes};
63             $body->{expose_routes_to_vswitch} = $params{expose_routes_to_vswitch}
64 1 50       3 if exists $params{expose_routes_to_vswitch};
65              
66 1         13 my $result = $self->client->post('/networks', $body);
67 1         8 return $self->_wrap($result->{network});
68             }
69              
70              
71             sub update {
72 0     0 1 0 my ($self, $id, %params) = @_;
73 0 0       0 croak "Network ID required" unless $id;
74              
75 0         0 my $body = {};
76 0 0       0 $body->{name} = $params{name} if exists $params{name};
77 0 0       0 $body->{labels} = $params{labels} if exists $params{labels};
78              
79 0         0 my $result = $self->client->put("/networks/$id", $body);
80 0         0 return $self->_wrap($result->{network});
81             }
82              
83              
84             sub delete {
85 1     1 1 32 my ($self, $id) = @_;
86 1 50       5 croak "Network ID required" unless $id;
87              
88 1         13 return $self->client->delete("/networks/$id");
89             }
90              
91              
92             sub add_subnet {
93 1     1 1 35 my ($self, $id, %opts) = @_;
94 1 50       4 croak "Network ID required" unless $id;
95 1 50       4 croak "ip_range required" unless $opts{ip_range};
96 1 50       4 croak "network_zone required" unless $opts{network_zone};
97 1 50       4 croak "type required" unless $opts{type};
98              
99             my $body = {
100             ip_range => $opts{ip_range},
101             network_zone => $opts{network_zone},
102             type => $opts{type},
103 1         4 };
104 1 50       6 $body->{vswitch_id} = $opts{vswitch_id} if $opts{vswitch_id};
105              
106 1         16 return $self->client->post("/networks/$id/actions/add_subnet", $body);
107             }
108              
109              
110             sub delete_subnet {
111 1     1 1 35 my ($self, $id, $ip_range) = @_;
112 1 50       4 croak "Network ID required" unless $id;
113 1 50       5 croak "ip_range required" unless $ip_range;
114              
115 1         15 return $self->client->post("/networks/$id/actions/delete_subnet", {
116             ip_range => $ip_range,
117             });
118             }
119              
120              
121             sub add_route {
122 1     1 1 31 my ($self, $id, %opts) = @_;
123 1 50       5 croak "Network ID required" unless $id;
124 1 50       5 croak "destination required" unless $opts{destination};
125 1 50       4 croak "gateway required" unless $opts{gateway};
126              
127             return $self->client->post("/networks/$id/actions/add_route", {
128             destination => $opts{destination},
129             gateway => $opts{gateway},
130 1         14 });
131             }
132              
133              
134             sub delete_route {
135 1     1 1 34 my ($self, $id, %opts) = @_;
136 1 50       4 croak "Network ID required" unless $id;
137 1 50       3 croak "destination required" unless $opts{destination};
138 1 50       3 croak "gateway required" unless $opts{gateway};
139              
140             return $self->client->post("/networks/$id/actions/delete_route", {
141             destination => $opts{destination},
142             gateway => $opts{gateway},
143 1         16 });
144             }
145              
146              
147             1;
148              
149             __END__