File Coverage

blib/lib/WWW/Hetzner/Cloud/Server.pm
Criterion Covered Total %
statement 11 57 19.3
branch 0 20 0.0
condition 0 2 0.0
subroutine 5 20 25.0
pod 17 17 100.0
total 33 116 28.4


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud::Server;
2             # ABSTRACT: Hetzner Cloud Server object
3              
4             our $VERSION = '0.100';
5              
6 25     25   172 use Moo;
  25         45  
  25         164  
7 25     25   10092 use Carp qw(croak);
  25         73  
  25         1708  
8 25     25   13405 use namespace::clean;
  25         426661  
  25         166  
9              
10              
11             has _client => (
12             is => 'ro',
13             required => 1,
14             weak_ref => 1,
15             init_arg => 'client',
16             );
17              
18             has id => ( is => 'ro' );
19              
20              
21             has name => ( is => 'rw' );
22              
23              
24             has status => ( is => 'rwp' );
25              
26              
27             has locked => ( is => 'ro' );
28              
29              
30             has created => ( is => 'ro' );
31              
32              
33             has labels => ( is => 'rw', default => sub { {} } );
34              
35              
36             # Nested data stored as-is
37             has public_net => ( is => 'ro', default => sub { {} } );
38             has private_net => ( is => 'ro', default => sub { [] } );
39             has server_type_data => ( is => 'ro', init_arg => 'server_type', default => sub { {} } );
40             has datacenter_data => ( is => 'ro', init_arg => 'datacenter', default => sub { {} } );
41             has image_data => ( is => 'ro', init_arg => 'image', default => sub { {} } );
42              
43             # Convenience accessors
44              
45 1     1 1 6517 sub ipv4 { shift->public_net->{ipv4}{ip} }
46              
47              
48 0     0 1 0 sub ipv6 { shift->public_net->{ipv6}{ip} }
49              
50              
51 0     0 1 0 sub server_type { shift->server_type_data->{name} }
52              
53              
54 0     0 1 0 sub datacenter { shift->datacenter_data->{name} }
55              
56              
57 0     0 1 0 sub location { shift->datacenter_data->{location}{name} }
58              
59              
60 0 0   0 1 0 sub image { my $i = shift->image_data; $i ? $i->{name} : undef }
  0         0  
61              
62              
63 3     3 1 6170 sub is_running { shift->status eq 'running' }
64              
65              
66 0     0 1   sub is_off { shift->status eq 'off' }
67              
68              
69             # Actions
70              
71             sub update {
72 0     0 1   my ($self) = @_;
73 0 0         croak "Cannot update server without ID" unless $self->id;
74              
75 0           my $result = $self->_client->put("/servers/" . $self->id, {
76             name => $self->name,
77             labels => $self->labels,
78             });
79 0           return $self;
80             }
81              
82              
83             sub delete {
84 0     0 1   my ($self) = @_;
85 0 0         croak "Cannot delete server without ID" unless $self->id;
86              
87 0           $self->_client->delete("/servers/" . $self->id);
88 0           return 1;
89             }
90              
91              
92             sub power_on {
93 0     0 1   my ($self) = @_;
94 0 0         croak "Cannot power on server without ID" unless $self->id;
95              
96 0           $self->_client->post("/servers/" . $self->id . "/actions/poweron", {});
97 0           return $self;
98             }
99              
100              
101             sub power_off {
102 0     0 1   my ($self) = @_;
103 0 0         croak "Cannot power off server without ID" unless $self->id;
104              
105 0           $self->_client->post("/servers/" . $self->id . "/actions/poweroff", {});
106 0           return $self;
107             }
108              
109              
110             sub reboot {
111 0     0 1   my ($self) = @_;
112 0 0         croak "Cannot reboot server without ID" unless $self->id;
113              
114 0           $self->_client->post("/servers/" . $self->id . "/actions/reboot", {});
115 0           return $self;
116             }
117              
118              
119             sub shutdown {
120 0     0 1   my ($self) = @_;
121 0 0         croak "Cannot shutdown server without ID" unless $self->id;
122              
123 0           $self->_client->post("/servers/" . $self->id . "/actions/shutdown", {});
124 0           return $self;
125             }
126              
127              
128             sub rebuild {
129 0     0 1   my ($self, $image) = @_;
130 0 0         croak "Cannot rebuild server without ID" unless $self->id;
131 0 0         croak "Image required" unless $image;
132              
133 0           $self->_client->post("/servers/" . $self->id . "/actions/rebuild", { image => $image });
134 0           return $self;
135             }
136              
137              
138             sub refresh {
139 0     0 1   my ($self) = @_;
140 0 0         croak "Cannot refresh server without ID" unless $self->id;
141              
142 0           my $result = $self->_client->get("/servers/" . $self->id);
143 0           my $data = $result->{server};
144              
145 0           $self->_set_status($data->{status});
146 0           $self->name($data->{name});
147 0   0       $self->labels($data->{labels} // {});
148              
149 0           return $self;
150             }
151              
152              
153             sub data {
154 0     0 1   my ($self) = @_;
155             return {
156 0           id => $self->id,
157             name => $self->name,
158             status => $self->status,
159             locked => $self->locked,
160             created => $self->created,
161             labels => $self->labels,
162             public_net => $self->public_net,
163             private_net => $self->private_net,
164             server_type => $self->server_type_data,
165             datacenter => $self->datacenter_data,
166             image => $self->image_data,
167             };
168             }
169              
170              
171              
172             1.
173              
174             __END__