Etcd
view release on metacpan or search on metacpan
lib/Etcd/Keys.pm view on Meta::CPAN
package Etcd::Keys;
$Etcd::Keys::VERSION = '0.004';
use namespace::autoclean;
use Etcd::Response;
use Try::Tiny;
use Scalar::Util qw(blessed);
use Carp qw(croak);
use Moo::Role;
use Types::Standard qw(Str);
requires qw(version_prefix api_exec);
has _keys_endpoint => ( is => 'lazy', isa => Str );
sub _build__keys_endpoint {
shift->version_prefix . '/keys';
}
sub set {
my ($self, $key, $value, %args) = @_;
croak 'usage: $etcd->set($key, $value, [%args])' if grep { !defined } ($key, $value);
Etcd::Response->new_from_http($self->api_exec($self->_keys_endpoint.$key, 'PUT', %args, value => $value));
}
sub get {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->get($key, [%args])' if !defined $key;
Etcd::Response->new_from_http($self->api_exec($self->_keys_endpoint.$key, 'GET', %args));
}
sub delete {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->delete($key, [%args])' if !defined $key;
Etcd::Response->new_from_http($self->api_exec($self->_keys_endpoint.$key, 'DELETE', %args));
}
sub compare_and_swap {
my ($self, $key, $value, $prev_value, %args) = @_;
croak 'usage: $etcd->compare_and_swap($key, $value, $prev_value, [%args])' if grep { !defined } ($key, $value, $prev_value);
$self->set($key, $value, %args, prevValue => $prev_value);
}
sub compare_and_delete {
my ($self, $key, $prev_value, %args) = @_;
croak 'usage: $etcd->compare_and_delete($key, $prev_value, [%args])' if grep { !defined } ($key, $prev_value);
$self->delete($key, %args, prevValue => $prev_value);
}
sub create {
my ($self, $key, $value, %args) = @_;
croak 'usage: $etcd->create($key, $value, [%args])' if grep { !defined } ($key, $value);
$self->set($key, $value, %args, prevExist => 'false');
}
sub update {
my ($self, $key, $value, %args) = @_;
croak 'usage: $etcd->update($key, $value, [%args])' if grep { !defined } ($key, $value);
$self->set($key, $value, %args, prevExist => 'true');
}
sub exists {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->exists($key, [%args])' if !defined $key;
try {
$self->get($key, %args);
1;
}
catch {
die $_ unless defined blessed $_ && $_->isa('Etcd::Error');
die $_ unless $_->error_code == 100;
"";
}
}
sub create_dir {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->create_dir($key, [%args])' if !defined $key;
Etcd::Response->new_from_http($self->api_exec($self->_keys_endpoint.$key, 'PUT', %args, dir => 'true'));
}
sub delete_dir {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->delete_dir($key, [%args])' if !defined $key;
$self->delete($key, %args, dir => 'true');
}
sub create_in_order {
my ($self, $key, $value, %args) = @_;
croak 'usage: $etcd->create_in_order($key, $value, [%args])' if grep { !defined } ($key, $value);
Etcd::Response->new_from_http($self->api_exec($self->_keys_endpoint.$key, 'POST', %args, value => $value));
}
sub watch {
my ($self, $key, %args) = @_;
croak 'usage: $etcd->watch($key, [%args])' if !defined $key;
$self->get($key, %args, wait => 'true');
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Etcd::Keys - etcd key space API
=head1 VERSION
version 0.004
=head1 SYNOPSIS
use Etcd;
my $etcd = Etcd->new;
# set value for key
$etcd->set("/message", "hello world");
# get key
my $response = $etcd->get("/message");
# delete key
$etcd->delete("/message");
# atomic compare-and-swap value for key
$etcd->compare_and_swap("/message", "new", "old");
# atomic compare-and-delete key
$etcd->compare_and_delete("/message", "old");
# create key. like set, but fails if the key exists
$etcd->create("/message", "value");
# update key. like set, but fails if the key doesn't exist
$etcd->update("/message", "value");
# check if key exists
my $exists = $etcd->exists("/message");
# create dir, a "valueless" key to hold subkeys
$etcd->create_dir("/dir");
# delete key and everything under it
$etcd->delete_dir("/dir");
# atomically create in-order key
( run in 0.617 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )