Net-OpenNebula
view release on metacpan or search on metacpan
lib/Net/OpenNebula/RPC.pm view on Meta::CPAN
# reset $merge to integer value; undef implies merge = 0
if ($merge) {
$merge = 1;
} else {
$merge = 0;
}
$self->has_id("update") || return;
return $self->_onerpc("update",
[ int => $self->id ],
[ string => $tpl ],
[ int => $merge ]
);
}
sub _lookup
{
my ($self, $type, $id, $one) = @_;
$id = -1 if ! defined($id);
my $err;
if ($id !~ m/^-?\d+$/) {
my $msg = "Non-integer ${type}name $id";
if ($one) {
my $method = "get_${type}s";
$self->debug(1, "$msg, looking up id using $method");
my @found = $one->$method($id);
if (@found) {
if (scalar @found > 1) {
$self->warn("$msg and more than one $type found: ".join(", ", @found));
}
$id = $found[0]->id();
$self->debug(1, "$msg resolved to id $id");
} else {
$err = "$msg and no matching ${type}s found.";
}
} else {
$err = "$msg and no ONE instance provided";
}
}
if ($err) {
$self->error($err);
return;
} else {
return $id;
}
}
# Chown
# options
# uid : uid to use
# gid : gid to use
# one : Net::OpenNebula instance to use for user/groupname lookup
# (i.e. when uid/gid is not a integer)
# It wil use $one->get_users and/or $one->get_groups methods.
sub chown
{
my ($self, %opts) = @_;
$self->has_id("chown") || return;
my $uid = $self->_lookup('user', $opts{uid}, $opts{one});
return if ! defined($uid);
my $gid = $self->_lookup('group', $opts{gid}, $opts{one});
return if ! defined($gid);
return $self->_onerpc("chown",
[ int => $self->id ],
[ int => $uid ],
[ int => $gid ]
);
}
# Mode can be
# an integer, typical in octal mode 0664, but can be decimal or whatever
sub chmod
{
my ($self, $mode) = @_;
$self->has_id("chmod") || return;
my @bits;
if ($mode =~ m/^\d+/) {
my $bin = sprintf("%b", $mode & oct("777"));
@bits = split('', $bin);
} else {
$self->error("chown cannot handle mode $mode");
return;
};
if((scalar @bits) == 9) {
my @allargs = qw(chmod);
push(@allargs, [ int => $self->id ], map {[ int => $_ ]} @bits);
return $self->_onerpc(@allargs);
} else {
$self->error("9 permissions bits required, got ".join(",", @bits));
return;
}
}
# When C<nameregex> is defined, only instances with name matching
# the regular expression are returned (if any).
# C<nameregex> is a compiled regular expression (e.g. qr{^somename$}).
sub _get_instances {
my ($self, $nameregex, @args) = @_;
my $class = ref $self;
my $pool = $class->ONERPC . "pool";
my $key = $class->ONEPOOLKEY || uc($class->ONERPC);
my @ret = ();
my $info = "info";
# Change VM info by new infoextended if version >= 5.8.x
if (($self->{rpc}->version() >= version->new('5.8.0')) and ($pool eq "vmpool")) {
$info = 'infoextended';
push(@args, [ string => "" ]);
};
my $reply = $self->{rpc}->_rpc("one.$pool.$info", @args);
foreach my $data (@{ $reply->{$key} }) {
# This is data from pool.info, so it is as complete as individual info
# so we can set it as extended_data
my $inst = $self->new(rpc => $self->{rpc}, data => $data, extended_data => $data);
if (! defined($nameregex) || ($inst->name && $inst->name =~ $nameregex) ) {
push(@ret, $inst);
}
}
return @ret;
}
# Given state, wait until the state is reached.
# Between each check, sleep number of seconds;
# and there's a maximum number of iterations to try.
# Return 1 if the state is reached, 0 otherwise.
# state: the state (in text) to wait for
# opts:
# sleep: sleep per interval
# max_iter: maximum iterations (if 0, no sleep)
sub wait_for_state {
my ($self, $state, %opts) = @_;
my $sleep = 5; # in seconds
my $max_iter = 200; # approx 15 minutes with default sleep
( run in 1.499 second using v1.01-cache-2.11-cpan-71847e10f99 )