File Coverage

blib/lib/WWW/Hetzner/Cloud/API/SSHKeys.pm
Criterion Covered Total %
statement 57 59 96.6
branch 14 26 53.8
condition 1 2 50.0
subroutine 13 13 100.0
pod 7 7 100.0
total 92 107 85.9


line stmt bran cond sub pod time code
1             package WWW::Hetzner::Cloud::API::SSHKeys;
2             # ABSTRACT: Hetzner Cloud SSH Keys API
3              
4             our $VERSION = '0.100';
5              
6 25     25   192 use Moo;
  25         59  
  25         158  
7 25     25   9724 use Carp qw(croak);
  25         55  
  25         1673  
8 25     25   13046 use WWW::Hetzner::Cloud::SSHKey;
  25         84  
  25         1059  
9 25     25   172 use namespace::clean;
  25         51  
  25         181  
10              
11              
12             has client => (
13             is => 'ro',
14             required => 1,
15             weak_ref => 1,
16             );
17              
18             sub _wrap {
19 7     7   19 my ($self, $data) = @_;
20 7         259 return WWW::Hetzner::Cloud::SSHKey->new(
21             client => $self->client,
22             %$data,
23             );
24             }
25              
26             sub _wrap_list {
27 4     4   12 my ($self, $list) = @_;
28 4         14 return [ map { $self->_wrap($_) } @$list ];
  3         10  
29             }
30              
31              
32             sub list {
33 4     4 1 961 my ($self, %params) = @_;
34              
35 4         35 my $result = $self->client->get('/ssh_keys', params => \%params);
36 4   50     24 return $self->_wrap_list($result->{ssh_keys} // []);
37             }
38              
39              
40             sub get {
41 1     1 1 36 my ($self, $id) = @_;
42 1 50       6 croak "SSH Key ID required" unless $id;
43              
44 1         11 my $result = $self->client->get("/ssh_keys/$id");
45 1         6 return $self->_wrap($result->{ssh_key});
46             }
47              
48              
49             sub get_by_name {
50 3     3 1 43 my ($self, $name) = @_;
51 3 50       39 croak "Name required" unless $name;
52              
53 3         15 my $keys = $self->list(name => $name);
54 3         64 return $keys->[0];
55             }
56              
57              
58             sub create {
59 2     2 1 47 my ($self, %params) = @_;
60              
61 2 50       9 croak "name required" unless $params{name};
62 2 50       10 croak "public_key required" unless $params{public_key};
63              
64             my $body = {
65             name => $params{name},
66             public_key => $params{public_key},
67 2         8 };
68              
69 2 50       10 $body->{labels} = $params{labels} if $params{labels};
70              
71 2         15 my $result = $self->client->post('/ssh_keys', $body);
72 2         11 return $self->_wrap($result->{ssh_key});
73             }
74              
75              
76             sub update {
77 1     1 1 33 my ($self, $id, %params) = @_;
78 1 50       8 croak "SSH Key ID required" unless $id;
79              
80 1         2 my $body = {};
81 1 50       5 $body->{name} = $params{name} if exists $params{name};
82 1 50       4 $body->{labels} = $params{labels} if exists $params{labels};
83              
84 1         11 my $result = $self->client->put("/ssh_keys/$id", $body);
85 1         7 return $self->_wrap($result->{ssh_key});
86             }
87              
88              
89             sub delete {
90 1     1 1 37 my ($self, $id) = @_;
91 1 50       6 croak "SSH Key ID required" unless $id;
92              
93 1         11 return $self->client->delete("/ssh_keys/$id");
94             }
95              
96              
97             sub ensure {
98 2     2 1 71 my ($self, $name, $public_key) = @_;
99 2 50       10 croak "name required" unless $name;
100 2 50       7 croak "public_key required" unless $public_key;
101              
102             # Check if exists
103 2         9 my $existing = $self->get_by_name($name);
104              
105 2 100       9 if ($existing) {
106             # Check if key matches
107 1         5 my $existing_key = $existing->public_key;
108 1         7 $existing_key =~ s/\s+$//;
109 1         3 my $new_key = $public_key;
110 1         4 $new_key =~ s/\s+$//;
111              
112 1 50       4 if ($existing_key ne $new_key) {
113             # Delete and recreate
114 0         0 $self->delete($existing->id);
115 0         0 return $self->create(name => $name, public_key => $public_key);
116             }
117 1         5 return $existing;
118             }
119              
120 1         4 return $self->create(name => $name, public_key => $public_key);
121             }
122              
123              
124             1;
125              
126             __END__