File Coverage

lib/Webservice/OVH/Cloud/Project/Network/Private/Subnet.pm
Criterion Covered Total %
statement 12 84 14.2
branch 0 38 0.0
condition 0 6 0.0
subroutine 4 15 26.6
pod 7 8 87.5
total 23 151 15.2


line stmt bran cond sub pod time code
1             package Webservice::OVH::Cloud::Project::Network::Private::Subnet;
2              
3             =encoding utf-8
4              
5             =head1 NAME
6              
7             Webservice::OVH::Cloud::Project::Network::Private::Subnet
8              
9             =head1 SYNOPSIS
10              
11             use Webservice::OVH;
12            
13             my $ovh = Webservice::OVH->new_from_json("credentials.json");
14            
15             my $projects = $ovh->cloud->projects;
16             my $example_project = $projects->[0];
17            
18             my $networks = $example_project->network->privates;
19            
20             foreach my $network (@$networks) {
21            
22             my $subnets = $network->subnets;
23            
24             foreach my $subnet (@$subnets) {
25            
26             print $subnet->name;
27             }
28             }
29              
30             =head1 DESCRIPTION
31              
32             Gives access to subnet methods.
33              
34             =head1 METHODS
35              
36             =cut
37              
38 36     36   272 use strict;
  36         88  
  36         1110  
39 36     36   195 use warnings;
  36         85  
  36         983  
40 36     36   193 use Carp qw{ carp croak };
  36         89  
  36         1757  
41 36     36   219 use JSON;
  36         83  
  36         271  
42              
43             our $VERSION = 0.46;
44              
45             =head2 _new_existing
46              
47             Internal Method to create the Subnet object.
48             This method is not ment to be called directly.
49              
50             =over
51              
52             =item * Parameter: %params - key => value
53              
54             =item * Return: L<Webservice::OVH::Cloud::Project::Network::Private::Subnet>
55              
56             =item * Synopsis: Webservice::OVH::Cloud::Project::Network::Private::Subnet->_new(wrapper => $ovh_api_wrapper, project => $project, module => $module, id => $id );
57              
58             =back
59              
60             =cut
61              
62             sub _new_existing {
63              
64 0     0     my ( $class, %params ) = @_;
65              
66 0 0         die "Missing id" unless $params{id};
67 0 0         die "Missing project" unless $params{project};
68 0 0         die "Missing wrapper" unless $params{wrapper};
69 0 0         die "Missing module" unless $params{module};
70              
71             # Special Case, because subnet properties can't be called individually
72 0           my $project_id = $params{project}->id;
73 0           my $properties = $params{properties};
74 0           my $api = $params{wrapper};
75 0           my $module = $params{module};
76 0           my $subnet_id = $properties->{id};
77 0           my $private = $params{private};
78              
79             # No api check possible, because single subnets can't be checked
80 0           my $self = bless { _module => $module, _valid => 1, _api_wrapper => $api, _id => $subnet_id, _properties => $properties, _project => $params{project}, _network => $private }, $class;
81              
82 0           return $self;
83             }
84              
85             =head2 _new_existing
86              
87             Internal Method to create the Subnet object.
88             This method is not ment to be called directly.
89              
90             =over
91              
92             =item * Parameter: %params - key => value
93              
94             =item * Return: L<Webservice::OVH::Cloud::Project::Network::Private::Subnet>
95              
96             =item * Synopsis: Webservice::OVH::Cloud::Project::Network::Private::Subnet->_new(wrapper => $ovh_api_wrapper, project => $project, module => $module );
97              
98             =back
99              
100             =cut
101              
102             sub _new {
103              
104 0     0     my ( $class, %params ) = @_;
105              
106 0 0         die "Missing id" unless $params{project};
107 0 0         die "Missing project" unless $params{wrapper};
108 0 0         die "Missing wrapper" unless $params{module};
109 0 0         die "Missing module" unless $params{private};
110              
111 0 0 0       my $dhcp = $params{dhcp} && ( $params{dhcp} eq 'true' || $params{dhcp} eq '1' || $params{dhcp} eq 'yes' ) ? JSON::true : JSON::false;
112 0 0 0       my $no_gateway = $params{noGateway} && ( $params{no_gateway} eq 'true' || $params{no_gateway} eq '1' || $params{no_gateway} eq 'yes' ) ? JSON::true : JSON::false;
113              
114 0           my $project_id = $params{project}->id;
115 0           my $api = $params{wrapper};
116 0           my $module = $params{module};
117 0           my $private = $params{private};
118              
119 0           my @keys_needed = qw{ network end region start };
120 0 0         if ( my @missing_parameters = grep { not $params{$_} } @keys_needed ) {
  0            
121              
122 0           croak "Missing parameter: @missing_parameters";
123             }
124              
125 0           my $network_id = $private->id;
126              
127 0           my $body = {};
128 0           $body->{dhcp} = $dhcp;
129 0           $body->{end} = $params{end};
130 0           $body->{network} = $params{network};
131 0           $body->{noGateway} = $no_gateway;
132 0           $body->{region} = $params{region};
133 0           $body->{start} = $params{start};
134              
135 0           my $response = $api->rawCall( method => 'post', path => "/cloud/project/$project_id/network/private/$network_id/subnet", body => $body, noSignature => 0 );
136 0 0         die $response->error if $response->error;
137              
138 0           my $subnet_id = $response->content->{id};
139 0           my $properties = $response->content;
140              
141 0           my $self = bless { _network => $private, _module => $module, _valid => 1, _api_wrapper => $api, _id => $subnet_id, _properties => $properties, _project => $params{project} }, $class;
142              
143 0           return $self;
144             }
145              
146             =head2 project
147              
148             Root Project.
149              
150             =over
151              
152             =item * Return: L<Webservice::OVH::Cloud::Project>
153              
154             =item * Synopsis: my $project = $subnet->project;
155              
156             =back
157              
158             =cut
159              
160             sub project {
161              
162 0     0 1   my ($self) = @_;
163              
164 0           return $self->{_project};
165             }
166              
167             =head2 project
168              
169             Root Network.
170              
171             =over
172              
173             =item * Return: L<Webservice::OVH::Cloud::Project::Network::Private>
174              
175             =item * Synopsis: my $project = $subnet->project;
176              
177             =back
178              
179             =cut
180              
181             sub network {
182              
183 0     0 0   my ($self) = @_;
184              
185 0           return $self->{_network};
186             }
187              
188             =head2 is_valid
189              
190             When this object is deleted on the api side, this method returns 0.
191              
192             =over
193              
194             =item * Return: VALUE
195              
196             =item * Synopsis: print "Valid" if $subnet->is_valid;
197              
198             =back
199              
200             =cut
201              
202             sub is_valid {
203              
204 0     0 1   my ($self) = @_;
205              
206 0           return $self->{_valid};
207             }
208              
209             =head2 _is_valid
210              
211             Intern method to check validity.
212             Difference is that this method carps an error.
213              
214             =over
215              
216             =item * Return: VALUE
217              
218             =item * Synopsis: $subnet->_is_valid;
219              
220             =back
221              
222             =cut
223              
224             sub _is_valid {
225              
226 0     0     my ($self) = @_;
227              
228 0 0         carp "Subnet is not valid anymore" unless $self->is_valid;
229 0           return $self->is_valid;
230             }
231              
232             =head2 id
233              
234             Returns the api id
235              
236             =over
237              
238             =item * Return: VALUE
239              
240             =item * Synopsis: my $id = $subnet->id;
241              
242             =back
243              
244             =cut
245              
246             sub id {
247              
248 0     0 1   my ($self) = @_;
249              
250 0 0         return unless $self->_is_valid;
251              
252 0           return $self->{_id};
253             }
254              
255             =head2 gateway_ip
256              
257             Exposed property value.
258              
259             =over
260              
261             =item * Return: VALUE
262              
263             =item * Synopsis: my $gateway_ip = $subnet->gateway_ip;
264              
265             =back
266              
267             =cut
268              
269             sub gateway_ip {
270              
271 0     0 1   my ($self) = @_;
272              
273 0 0         return unless $self->_is_valid;
274              
275 0           return $self->{_properties}->{gatewayIp};
276             }
277              
278             =head2 cidr
279              
280             Exposed property value.
281              
282             =over
283              
284             =item * Return: VALUE
285              
286             =item * Synopsis: my $cidr = $subnet->cidr;
287              
288             =back
289              
290             =cut
291              
292             sub cidr {
293              
294 0     0 1   my ($self) = @_;
295              
296 0 0         return unless $self->_is_valid;
297              
298 0           return $self->{_properties}->{cidr};
299             }
300              
301             =head2 ip_pools
302              
303             Exposed property value.
304              
305             =over
306              
307             =item * Return: ARRAY
308              
309             =item * Synopsis: my $ip_pools = $subnet->ip_pools;
310              
311             =back
312              
313             =cut
314              
315             sub ip_pools {
316              
317 0     0 1   my ($self) = @_;
318              
319 0 0         return unless $self->_is_valid;
320              
321 0           return $self->{_properties}->{ipPools};
322             }
323              
324             =head2 delete
325              
326             Deletes the object api sided and sets it invalid.
327              
328             =over
329              
330             =item * Synopsis: $subnet->delete;
331              
332             =back
333              
334             =cut
335              
336             sub delete {
337              
338 0     0 1   my ($self) = @_;
339              
340 0 0         return unless $self->_is_valid;
341              
342 0           my $api = $self->{_api_wrapper};
343 0           my $project_id = $self->project->id;
344 0           my $network_id = $self->network->id;
345 0           my $subnet_id = $self->id;
346 0           my $response = $api->rawCall( method => 'delete', path => "/cloud/project/$project_id/network/private/$network_id/subnet/$subnet_id", noSignature => 0 );
347 0 0         croak $response->error if $response->error;
348              
349 0           $self->{_valid} = 0;
350             }
351              
352             1;