Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Projets publics
Ravada-Mirror
Commits
6de5a0f0
Commit
6de5a0f0
authored
Dec 19, 2016
by
Francesc Guasch
Browse files
[#41] rename works in backend and tested
parent
af56ecbf
Changes
10
Hide whitespace changes
Inline
Side-by-side
lib/Ravada.pm
View file @
6de5a0f0
...
...
@@ -630,7 +630,7 @@ sub _execute {
$self
->
_disconnect_vm
();
if
(
$dont_fork
||
!
$CAN_FORK
)
{
# TODO check if that can be done with _do_execute_command like when forking
$self
->
_connect_vm
();
eval
{
$sub
->
(
$self
,
$request
)
};
...
...
@@ -643,22 +643,37 @@ sub _execute {
$self
->
_wait_children
(
$request
)
if
$FAT_COMMAND
{
$request
->
command
};
my
$pid
=
fork
();
die
"
I can't fork
"
if
!
defined
$pid
;
if
(
$pid
==
0
)
{
eval
{
$self
->
_connect_vm
();
$sub
->
(
$self
,
$request
);
$self
->
_disconnect_vm
();
};
my
$err
=
(
$@
or
'');
$request
->
error
(
$err
);
$request
->
status
('
done
')
if
$request
->
status
()
ne
'
done
';
exit
;
}
$self
->
_do_execute_command
(
$sub
,
$request
)
if
$pid
==
0
;
$self
->
_add_pid
(
$pid
,
$request
->
id
);
# $self->_connect_vm_kvm();
return
'';
}
sub
_do_execute_command
{
my
$self
=
shift
;
my
(
$sub
,
$request
)
=
@_
;
# if ($DEBUG ) {
# mkdir 'log' if ! -e 'log';
# open my $f_out ,'>', "log/fork_$$.out";
# open my $f_err ,'>', "log/fork_$$.err";
# $| = 1;
# local *STDOUT = $f_out;
# local *STDERR = $f_err;
# }
eval
{
$self
->
_connect_vm
();
$sub
->
(
$self
,
$request
);
$self
->
_disconnect_vm
();
};
my
$err
=
(
$@
or
'');
$request
->
error
(
$err
);
$request
->
status
('
done
')
if
$request
->
status
()
ne
'
done
';
exit
;
}
sub
_cmd_domdisplay
{
my
$self
=
shift
;
my
$request
=
shift
;
...
...
lib/Ravada/Domain.pm
View file @
6de5a0f0
...
...
@@ -949,6 +949,7 @@ sub _pre_rename {
my
$user
=
$args
{
user
};
$self
->
_check_duplicate_domain_name
(
@
_
);
$self
->
shutdown
(
user
=>
$user
)
if
$self
->
is_active
;
}
...
...
lib/Ravada/Domain/KVM.pm
View file @
6de5a0f0
...
...
@@ -5,6 +5,7 @@ use strict;
use
Carp
qw(cluck confess croak)
;
use
Data::
Dumper
;
use
File::
Copy
;
use
Hash::
Util
qw(lock_keys)
;
use
IPC::
Run3
qw(run3)
;
use
Moose
;
...
...
@@ -123,11 +124,12 @@ sub remove_disks {
$removed
++
;
}
$self
->
_vm
->
disconnect
();
warn
"
WARNING: No disk files removed for
"
.
$self
->
domain
->
get_name
.
"
\n
"
if
!
$removed
;
.
Dumper
([
$self
->
list_disks
])
if
!
$removed
&&
$
0
!~
/\.t$/
;
$self
->
_vm
->
disconnect
();
}
sub
_vol_remove
{
...
...
@@ -222,6 +224,28 @@ sub _disk_device {
}
sub
_disk_devices_xml
{
my
$self
=
shift
;
my
$doc
=
XML::
LibXML
->
load_xml
(
string
=>
$self
->
domain
->
get_xml_description
)
or
die
"
ERROR: $!
\n
";
my
@devices
;
for
my
$disk
(
$doc
->
findnodes
('
/domain/devices/disk
'))
{
next
if
$disk
->
getAttribute
('
device
')
ne
'
disk
';
my
$is_disk
=
0
;
for
my
$child
(
$disk
->
childNodes
)
{
$is_disk
++
if
$child
->
nodeName
eq
'
source
';
}
push
@devices
,(
$disk
)
if
$is_disk
;
}
return
@devices
;
}
=head2 disk_device
Returns the file name of the disk of the domain.
...
...
@@ -752,8 +776,30 @@ Argument: the new name of the volumes.
sub
rename_volumes
{
my
$self
=
shift
;
for
my
$volume
(
$self
->
list_volumes
)
{
warn
"
Rename volume
"
.
Dumper
(
$volume
);
my
$new_dom_name
=
shift
;
for
my
$disk
(
$self
->
_disk_devices_xml
)
{
my
(
$source
)
=
$disk
->
findnodes
('
source
');
next
if
!
$source
;
my
$volume
=
$source
->
getAttribute
('
file
')
or
next
;
my
$cont
=
0
;
my
$new_volume
;
my
$new_name
=
$new_dom_name
;
for
(;;)
{
$new_volume
=
$volume
;
$new_volume
=~
s{(.*)/.*\.(.*)}{$1/$new_name.$2}
;
last
if
!-
e
$new_volume
;
$cont
++
;
$new_name
=
"
$new_dom_name
.
$cont
";
}
copy
(
$volume
,
$new_volume
)
or
die
"
$!
$volume
->
$new_volume
";
$source
->
setAttribute
(
file
=>
$new_volume
);
unlink
$volume
or
warn
"
$! removing
$volume
";
$self
->
storage
->
refresh
();
}
}
...
...
lib/Ravada/Domain/Void.pm
View file @
6de5a0f0
...
...
@@ -31,14 +31,15 @@ sub BUILD {
mkdir
$DIR_TMP
or
die
"
$! when mkdir
$DIR_TMP
"
if
!
-
e
$DIR_TMP
;
return
if
$args
->
{
id_base
};
return
if
$args
->
{
id_base
}
||
$args
->
{
is_readonly
};
my
$file_img
=
"
$DIR_TMP
/
"
.
$self
->
name
.
"
.img
"
;
return
if
-
e
$file_img
;
my
(
$file_img
)
=
$self
->
disk_device
;
return
if
$file_img
&&
-
e
$file_img
;
$self
->
add_volume
(
name
=>
'
void-diska
'
,
size
=>
$args
->
{
disk
}
,
path
=>
$file_img
)
if
!
$args
->
{
is_readonly
}
;
$self
->
add_volume
(
name
=>
'
void-diska
'
,
size
=>
(
$args
->
{
disk
}
or
1
)
,
path
=>
$file_img
,
type
=>
'
file
')
;
$self
->
_set_default_info
();
$self
->
set_memory
(
$args
->
{
memory
})
if
$args
->
{
memory
};
...
...
@@ -191,9 +192,10 @@ sub add_volume {
confess
"
Volume path must be absolute , it is '
$args
{path}'
"
if
$args
{
path
}
!~
m{^/}
;
return
if
-
e
$args
{
path
};
my
%valid_arg
=
map
{
$_
=>
1
}
(
qw( name size path vm)
);
my
%valid_arg
=
map
{
$_
=>
1
}
(
qw( name size path vm
type
)
);
for
my
$arg_name
(
keys
%args
)
{
confess
"
Unknown arg
$arg_name
"
...
...
@@ -203,6 +205,9 @@ sub add_volume {
# TODO
# confess "Missing size " if !$args{size};
$args
{
type
}
=
'
file
'
if
!
$args
{
type
};
delete
$args
{
vm
}
if
defined
$args
{
vm
};
my
$data
=
{
};
$data
=
LoadFile
(
$self
->
_config_file
)
if
-
e
$self
->
_config_file
;
...
...
@@ -256,7 +261,9 @@ sub list_volumes {
return
()
if
!
exists
$data
->
{
device
};
my
@vol
;
for
my
$dev
(
keys
%
{
$data
->
{
device
}})
{
push
@vol
,(
$data
->
{
device
}
->
{
$dev
}
->
{
path
});
push
@vol
,(
$data
->
{
device
}
->
{
$dev
}
->
{
path
})
if
!
exists
$data
->
{
device
}
->
{
$dev
}
->
{
type
}
||
$data
->
{
device
}
->
{
$dev
}
->
{
type
}
ne
'
base
';
}
return
@vol
;
}
...
...
lib/Ravada/VM/Void.pm
View file @
6de5a0f0
...
...
@@ -52,7 +52,9 @@ sub create_domain {
for
my
$file_base
(
$domain_base
->
list_files_base
)
{
my
(
$dir
,
$vol_name
,
$ext
)
=
$file_base
=~
m{(.*)/(.*?)(\..*)}
;
my
$new_name
=
"
$vol_name
-
$args
{name}
$ext
";
$domain
->
add_volume
(
name
=>
$new_name
,
path
=>
"
$dir
/
$new_name
");
$domain
->
add_volume
(
name
=>
$new_name
,
path
=>
"
$dir
/
$new_name
"
,
type
=>
'
file
');
}
}
# $domain->start();
...
...
@@ -81,7 +83,7 @@ sub list_domains {
sub
search_domain
{
my
$self
=
shift
;
my
$name
=
shift
;
my
$name
=
shift
or
confess
"
ERROR: Missing name
"
;
for
my
$name_vm
(
$self
->
list_domains
)
{
next
if
$name_vm
ne
$name
;
...
...
t/35_request_start.t
View file @
6de5a0f0
...
...
@@ -132,7 +132,8 @@ sub test_start {
wait_request
(
$req3
);
ok
(
$req3
->
status
eq
'
done
',"
[
$vm_name
] expecting request done , got
"
.
$req3
->
status
);
ok
(
!
$req3
->
error
,"
Error shutting down domain
$name
, expecting ''. Got '
"
.
$req3
->
error
);
ok
(
!
$req3
->
error
,"
Error shutting down domain
$name
, expecting ''
. Got '
"
.
(
$req3
->
error
or
''));
my
$vm
=
$RAVADA
->
search_vm
(
$vm_name
);
my
$domain3
=
$vm
->
search_domain
(
$name
);
...
...
t/lib/Test/Ravada.pm
View file @
6de5a0f0
...
...
@@ -42,7 +42,6 @@ sub rvd_back {
my
(
$connector
,
$config
)
=
@_
;
init
(
$connector
,
$config
)
if
$connector
;
my
$rvd_back
;
return
Ravada
->
new
(
connector
=>
$CONNECTOR
,
config
=>
(
$CONFIG
or
$DEFAULT_CONFIG
)
...
...
@@ -50,7 +49,6 @@ sub rvd_back {
}
sub
rvd_front
{
my
$rvd_front
;
return
Ravada::
Front
->
new
(
connector
=>
$CONNECTOR
...
...
@@ -80,6 +78,7 @@ sub _remove_old_domains_vm {
return
if
!
$rvd_back
;
$vm
=
$rvd_back
->
search_vm
(
$vm_name
);
};
diag
(
$@
)
if
$@
;
return
if
!
$vm
;
...
...
@@ -132,9 +131,12 @@ sub _remove_old_domains_kvm {
my
$vm
;
eval
{
$vm
=
rvd_back
()
->
search_vm
('
KVM
');
my
$rvd_back
=
rvd_back
();
$vm
=
$rvd_back
->
search_vm
('
KVM
');
};
diag
(
$@
)
if
$@
;
return
if
!
$vm
;
my
$base_name
=
base_domain_name
();
for
my
$domain
(
$vm
->
vm
->
list_defined_domains
)
{
next
if
$domain
->
get_name
!~
/^$base_name/
;
...
...
@@ -160,7 +162,7 @@ sub _remove_old_disks_kvm {
my
$name
=
base_domain_name
();
confess
"
Unknown base domain name
"
if
!
$name
;
my
$rvd_back
=
rvd_back
();
#
my $rvd_back= rvd_back();
my
$vm
=
rvd_back
()
->
search_vm
('
kvm
');
if
(
!
$vm
)
{
return
;
...
...
@@ -205,7 +207,6 @@ sub _remove_old_disks_void {
sub
remove_old_disks
{
_remove_old_disks_void
();
_remove_old_disks_kvm
();
}
sub
create_user
{
...
...
@@ -223,9 +224,10 @@ sub create_user {
sub
wait_request
{
my
$req
=
shift
;
for
(
1
..
10
)
{
for
my
$cnt
(
0
..
10
)
{
diag
("
Request
"
.
$req
->
id
.
"
"
.
$req
->
command
.
"
"
.
$req
->
status
.
"
"
.
localtime
(
time
))
if
$cnt
>
2
;
last
if
$req
->
status
eq
'
done
';
diag
("
Request
"
.
$req
->
id
.
"
"
.
$req
->
command
.
"
"
.
$req
->
status
.
"
"
.
localtime
(
time
));
sleep
2
;
}
...
...
t/request/40_base.t
View file @
6de5a0f0
...
...
@@ -208,7 +208,8 @@ sub test_req_create_from_base {
ok
(
$req
->
status
eq
'
done
'
,"
Status of request is
"
.
$req
->
status
.
"
it should be done
");
ok
(
!
$req
->
error
,"
Error
"
.
$req
->
error
.
"
creating domain
"
.
$clone_name
);
ok
(
!
$req
->
error
,"
Expecting error '' , got '
"
.
(
$req
->
error
or
'')
.
"
' creating domain
"
.
$clone_name
);
}
my
$domain
=
rvd_front
()
->
search_domain
(
$clone_name
);
...
...
@@ -239,7 +240,8 @@ sub test_volumes {
my
%volumes2
=
map
{
$_
=>
1
}
@volumes2
;
ok
(
scalar
keys
%volumes1
==
scalar
keys
%volumes2
,"
[
$vm_name
] Expecting
"
.
scalar
(
keys
%volumes1
)
.
"
, got
"
.
scalar
(
keys
%volumes2
)
,"
[
$vm_name
] Domain
$domain2_name
Expecting
"
.
scalar
(
keys
%volumes1
)
.
"
, got
"
.
scalar
(
keys
%volumes2
)
.
"
"
.
Dumper
(
\
%volumes1
,
\
%volumes2
))
or
exit
;
}
...
...
t/vm/40_volumes.t
View file @
6de5a0f0
...
...
@@ -115,8 +115,13 @@ sub test_clone {
my
@volumes_clone
=
$domain_clone
->
list_volumes
();
ok
(
scalar
@volumes_clone
==
scalar
@volumes
,"
[
$vm_name
] Expecting
"
.
scalar
@volumes
.
"
volumes, got
"
.
scalar
(
@volumes
));
ok
(
scalar
@volumes
==
scalar
@volumes_clone
,"
[
$vm_name
]
"
.
$domain
->
name
.
"
clone to
$name_clone
, expecting
"
.
scalar
@volumes
.
"
volumes, got
"
.
scalar
(
@volumes_clone
)
)
or
do
{
diag
(
Dumper
(
\
@volumes
,
\
@volumes_clone
));
exit
;
};
my
%volumes_clone
=
map
{
$_
=>
1
}
@volumes_clone
;
...
...
t/vm/55_rename.t
View file @
6de5a0f0
...
...
@@ -6,13 +6,13 @@ use JSON::XS;
use
Test::
More
;
use
Test::SQL::
Data
;
use
Ravada
;
use
lib
'
t/lib
';
use
Test::
Ravada
;
my
$test
=
Test::SQL::
Data
->
new
(
config
=>
'
t/etc/sql.conf
');
use_ok
('
Ravada
');
my
$FILE_CONFIG
=
'
t/etc/ravada.conf
';
my
@ARG_RVD
=
(
config
=>
$FILE_CONFIG
,
connector
=>
$test
->
connector
);
...
...
@@ -26,24 +26,24 @@ init($test->connector, $FILE_CONFIG);
my
$USER
=
create_user
("
foo
","
bar
");
#######################################################################
sub
test_create_domain
{
my
$vm_name
=
shift
;
my
$name
=
(
shift
or
new_domain_name
());
my
$ravada
=
Ravada
->
new
(
@ARG_RVD
);
my
$ravada
=
rvd_back
(
);
my
$vm
=
$ravada
->
search_vm
(
$vm_name
);
ok
(
$vm
,"
Expecting VM
$vm_name
")
or
return
;
if
(
!
$ARG_CREATE_DOM
{
$vm_name
})
{
diag
("
VM
$vm_name
should be defined at
\
%ARG_CREATE_DOM
");
return
;
}
my
@arg_create
=
@
{
$ARG_CREATE_DOM
{
$vm_name
}};
diag
("
[
$vm_name
] creating domain
$name
");
#
diag("[$vm_name] creating domain $name");
my
$domain
;
eval
{
$domain
=
$vm
->
create_domain
(
name
=>
$name
,
id_owner
=>
$USER
->
id
...
...
@@ -57,25 +57,30 @@ sub test_create_domain {
.
"
for VM
$vm_name
"
);
return
$domain
->
name
;
return
$name
;
}
sub
test_rename_domain
{
my
(
$vm_name
,
$domain_name
)
=
@_
;
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
my
$domain
=
$vm
->
search_domain
(
$domain_name
);
ok
(
$domain
,"
[
$vm_name
] Expecting found
$domain_name
")
or
return
;
my
$new_domain_name
=
new_domain_name
();
$domain
->
rename
(
name
=>
$new_domain_name
,
user
=>
$USER
);
{
my
$rvd_back
=
rvd_back
();
my
$vm
=
$rvd_back
->
search_vm
(
$vm_name
);
my
$domain
=
$vm
->
search_domain
(
$domain_name
);
ok
(
$domain
,"
[
$vm_name
] Expecting found
$domain_name
")
or
return
;
$domain
->
rename
(
name
=>
$new_domain_name
,
user
=>
$USER
);
}
my
$vm
=
rvd_front
->
search_vm
(
$vm_name
);
my
$domain0
=
$vm
->
search_domain
(
$domain_name
);
ok
(
!
$domain0
,"
[
$vm_name
] Expecting not found
$domain_name
");
my
$domain1
=
$vm
->
search_domain
(
$new_domain_name
);
ok
(
$domain1
,"
[
$vm_name
] Expecting renamed domain
$new_domain_name
")
or
return
;
ok
(
$domain1
,"
[
$vm_name
] Expecting renamed domain
$new_domain_name
")
or
return
;
}
...
...
@@ -84,34 +89,85 @@ sub test_req_rename_domain {
my
$domain_id
;
{
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
my
$rvd_back
=
rvd_back
();
my
$vm
=
$rvd_back
->
search_vm
(
$vm_name
);
my
$domain
=
$vm
->
search_domain
(
$domain_name
);
ok
(
$domain
,"
[
$vm_name
-req] Expecting found
$domain_name
")
or
return
;
$domain_id
=
$domain
->
id
;
$domain
->
shutdown_now
(
$USER
);
}
my
$new_domain_name
=
new_domain_name
();
my
$req
=
Ravada::
Request
->
rename_domain
(
{
my
$req
=
Ravada::
Request
->
rename_domain
(
uid
=>
$USER
->
id
,
name
=>
$new_domain_name
,
id_domain
=>
$domain_id
,
);
ok
(
$req
);
rvd_back
()
->
process_requests
();
wait_request
(
$req
);
ok
(
$req
->
status
eq
'
done
'
,"
Status of request is
"
.
$req
->
status
.
"
it should be done
");
ok
(
!
$req
->
error
,"
Error
"
.
$req
->
error
.
"
creating domain
"
.
$domain_name
)
or
return
;
);
ok
(
$req
);
my
$rvd_back
=
rvd_back
();
$rvd_back
->
process_requests
();
for
(
1
..
5
)
{
wait_request
(
$req
)
if
$req
->
status
ne
'
done
';
}
ok
(
$req
->
status
eq
'
done
'
,"
Status of request is
"
.
$req
->
status
.
"
it should be done
")
or
exit
;
ok
(
!
$req
->
error
,"
Error
"
.
(
$req
->
error
or
'')
.
"
renaming domain
"
.
$domain_name
)
or
return
;
}
{
my
$vm
=
rvd_front
->
search_vm
(
$vm_name
);
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
my
$domain0
=
$vm
->
search_domain
(
$domain_name
);
ok
(
!
$domain0
,"
[
$vm_name
-req] Expecting not found
$domain_name
");
my
$domain0
=
$vm
->
search_domain
(
$domain_name
);
ok
(
!
$domain0
,"
[
$vm_name
-req] Expecting not found
$domain_name
");
my
$domain1
=
$vm
->
search_domain
(
$new_domain_name
);
ok
(
$domain1
,"
[
$vm_name
-req] Expecting renamed domain
"
.
"
$new_domain_name
")
or
return
;
}
}
my
$domain1
=
$vm
->
search_domain
(
$new_domain_name
);
ok
(
$domain1
,"
[
$vm_name
-req] Expecting renamed domain
$new_domain_name
")
or
return
;
sub
test_clone_domain
{
my
$vm_name
=
shift
;
my
$domain_name
=
shift
;
my
$clone_name
=
new_domain_name
;
my
$rvd_back
=
rvd_back
();
my
$vm
=
$rvd_back
->
search_vm
(
$vm_name
);
my
$domain
=
$vm
->
search_domain
(
$domain_name
);
ok
(
$domain
,"
[
$vm_name
] Expecting domain
$domain_name
")
or
exit
;
$domain
->
shutdown_now
(
$USER
);
my
$clone
=
$domain
->
clone
(
name
=>
$clone_name
,
user
=>
$USER
);
ok
(
$clone
)
or
return
;
return
$clone_name
;
}
sub
test_rename_clone
{
my
$vm_name
=
shift
;
my
$domain_name
=
test_create_domain
(
$vm_name
);
my
$clone1_name
=
test_clone_domain
(
$vm_name
,
$domain_name
);
test_rename_domain
(
$vm_name
,
$clone1_name
)
if
$clone1_name
;
}
sub
test_req_rename_clone
{
# TODO : this makes the test loose STDOUT or STDERR and ends with
# t/vm/55_rename.t (Wstat: 13 Tests: 71 Failed: 0)
# Non-zero wait status: 13
return
;
my
$vm_name
=
shift
;
my
$domain_name
=
test_create_domain
(
$vm_name
);
my
$clone2_name
=
test_clone_domain
(
$vm_name
,
$domain_name
);
test_req_rename_domain
(
$vm_name
,
$clone2_name
)
if
$clone2_name
;
}
#######################################################################
...
...
@@ -120,38 +176,34 @@ remove_old_disks();
for
my
$vm_name
(
qw( Void KVM )
)
{
my
$CLASS
=
"
Ravada::VM::
$vm_name
";
use_ok
(
$CLASS
)
or
next
;
my
$ravada
;
eval
{
$ravada
=
Ravada
->
new
(
@ARG_RVD
)
};
my
$vm_ok
;
eval
{
my
$vm
=
$ravada
->
search_vm
(
$vm_name
);
eval
{
my
$vm
=
rvd_front
()
->
search_vm
(
$vm_name
);
$vm_ok
=
1
if
$vm
;
}
if
$ravada
;
};
diag
(
$@
)
if
$@
;
SKIP:
{
my
$msg
=
"
SKIPPED test: No
$vm_name
VM found
";
diag
(
$msg
)
if
!
$vm_ok
;
skip
$msg
,
10
if
!
$vm_ok
;
diag
("
Testing rename domains with
$vm_name
");
my
$domain_name
=
test_create_domain
(
$vm_name
);
test_rename_domain
(
$vm_name
,
$domain_name
);
test_create_domain
(
$vm_name
,
$domain_name
);
$domain_name
=
test_create_domain
(
$vm_name
);
test_req_rename_domain
(
$vm_name
,
$domain_name
)
or
next
;
test_create_domain
(
$vm_name
,
$domain_name
);
test_rename_clone
(
$vm_name
);
test_req_rename_clone
(
$vm_name
);
};
}
remove_old_domains
();
remove_old_disks
();
done_testing
();
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment