my $portal = $scfg->{portal};
my ($server, $port) = split(':', $portal);
- my $cmd = ['/usr/sbin/collie', $class, $op, '-a', $server];
+ my $cmd = ['/usr/sbin/dog', $class, $op, '-a', $server];
push @$cmd, '-p', $port if $port;
push @$cmd, @options if scalar(@options);
if ($line =~ /(=|c) ((vm|base)-(\d+)-\S+)\s+(\d+)\s+(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\S+)\s(\d+)/) {
my $image = $2;
my $owner = $4;
- my $size = $5;
+ my $size = $6;
my $idvdi = $10;
my $parentid = $relationship->{$idvdi}->{parent} if $relationship->{$idvdi}->{parent};
my $parent = $relationship->{$parentid}->{name} if $parentid;
return ('images', $4, $7, $2, $3, $5);
}
- die "unable to parse rbd volume name '$volname'\n";
+ die "unable to parse sheepdog volume name '$volname'\n";
}
sub path {
- my ($class, $scfg, $volname, $storeid) = @_;
+ my ($class, $scfg, $volname, $storeid, $snapname) = @_;
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
my $portal = $scfg->{portal};
my ($server, $port) = split(':', $portal);
$port = 7000 if !$port;
+ $name .= ':'.$snapname if $snapname;
my $path = "sheepdog:$server:$port:$name";
my ($storeid, $scfg, $vmid) = @_;
my $sheepdog = sheepdog_ls($scfg, $storeid);
- my $dat = $sheepdog->{sheepdog};
+ my $dat = $sheepdog->{$storeid};
my $disk_ids = {};
foreach my $image (keys %$dat) {
die "create_base not possible with base image\n" if $isBase;
my $sheepdog = sheepdog_ls($scfg, $storeid);
- die "sheepdog volume info on '$name' failed\n" if !($sheepdog->{sheepdog}->{$name});
- my $parent = $sheepdog->{sheepdog}->{$name}->{parent};
+ die "sheepdog volume info on '$name' failed\n" if !($sheepdog->{$storeid}->{$name});
+ my $parent = $sheepdog->{$storeid}->{$name}->{parent};
die "volname '$volname' contains wrong information about parent $parent $basename\n"
if $basename && (!$parent || $parent ne $basename);
}
sub clone_image {
- my ($class, $scfg, $storeid, $volname, $vmid) = @_;
+ my ($class, $scfg, $storeid, $volname, $vmid, $snap) = @_;
- my $snap = '__base__';
+ $snap ||= '__base__';
my ($vtype, $basename, $basevmid, undef, undef, $isBase) =
$class->parse_volname($volname);
die "illegal name '$name' - sould be 'vm-$vmid-*'\n"
if $name && $name !~ m/^vm-$vmid-/;
- $name = &$find_free_diskname($storeid, $scfg, $vmid);
+ $name = &$find_free_diskname($storeid, $scfg, $vmid) if !$name;
- my $cmd = &$collie_cmd($scfg, 'vdi', 'create', $name , "${size}KB");
+ my $cmd = &$collie_cmd($scfg, 'vdi', 'create', $name , "${size}k");
run_command($cmd, errmsg => "sheepdog create $name' error");
sub volume_resize {
my ($class, $scfg, $storeid, $volname, $size, $running) = @_;
- my $cmd = &$collie_cmd($scfg, 'vdi', 'resize' , $volname, $size);
- run_command($cmd, errmsg => "sheepdog resize $volname' error");
+ my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+ $class->parse_volname($volname);
+
+ my $cmd = &$collie_cmd($scfg, 'vdi', 'resize' , $name, $size);
+ run_command($cmd, errmsg => "sheepdog resize $name' error");
return undef;
}
sub volume_snapshot {
- my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
+ my ($class, $scfg, $storeid, $volname, $snap) = @_;
- return 1 if $running;
+ my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+ $class->parse_volname($volname);
- my $cmd = &$collie_cmd($scfg, 'vdi', 'snapshot', '-s', $snap, $volname);
+ my $cmd = &$collie_cmd($scfg, 'vdi', 'snapshot', '-s', $snap, $name);
run_command($cmd, errmsg => "sheepdog snapshot $volname' error");
return undef;
sub volume_snapshot_rollback {
my ($class, $scfg, $storeid, $volname, $snap) = @_;
- my $cmd = &$collie_cmd($scfg, 'vdi', 'rollback', '-s', $snap, $volname);
- run_command($cmd, errmsg => "sheepdog snapshot $volname' error");
+ my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+ $class->parse_volname($volname);
+
+ my $cmd = &$collie_cmd($scfg, 'vdi', 'rollback', '-f', '-s', $snap, $name);
+ run_command($cmd, errmsg => "sheepdog snapshot $name' error");
}
return 1 if $running;
- my $cmd = &$collie_cmd($scfg, 'vdi', 'delete', '-s', $snap, $volname);
- run_command($cmd, errmsg => "sheepdog snapshot $volname' error");
+ my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+ $class->parse_volname($volname);
+
+ my $cmd = &$collie_cmd($scfg, 'vdi', 'delete', '-s', $snap, $name);
+ run_command($cmd, errmsg => "sheepdog snapshot $name' error");
return undef;
}
sub volume_has_feature {
my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_;
- my $features = {
+ my $features = {
snapshot => { current => 1, snap => 1},
- clone => { snap => 1},
+ clone => { base => 1},
+ template => { current => 1},
+ copy => { base => 1, current => 1, snap => 1},
};
- my $snap = $snapname ? 'snap' : 'current';
- return 1 if $features->{$feature}->{$snap};
+ my ($vtype, $name, $vmid, $basename, $basevmid, $isBase) =
+ $class->parse_volname($volname);
+
+ my $key = undef;
+ if($snapname){
+ $key = 'snap';
+ }else{
+ $key = $isBase ? 'base' : 'current';
+ }
+ return 1 if $features->{$feature}->{$key};
return undef;
}