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
50fed357
Commit
50fed357
authored
Jan 17, 2020
by
Fernando Verdugo
Browse files
fix(renewMAC): renew MAC all nics
- testing 2 nics Issue #1201
parent
d390bf21
Changes
2
Hide whitespace changes
Inline
Side-by-side
lib/Ravada/VM/KVM.pm
View file @
50fed357
...
...
@@ -1608,10 +1608,10 @@ sub _xml_modify_memory {
sub
_xml_modify_network
{
my
$self
=
shift
;
my
$doc
=
shift
;
my
$doc
=
shift
;
my
$network
=
shift
;
warn
$network
;
my
(
$type
,
$source
);
my
(
$type
,
$source
);
if
(
ref
(
$network
)
=~
/^Ravada/
)
{
(
$type
,
$source
)
=
(
$network
->
type
,
$network
->
source
);
}
else
{
...
...
@@ -1993,53 +1993,52 @@ sub _new_uuid {
}
sub
_xml_modify_mac
{
my
$self
=
shift
;
my
$self
=
shift
;
my
$doc
=
shift
or
confess
"
Missing XML doc
";
my
@old_macs
;
my
(
$if_mac
)
=
$doc
->
findnodes
('
/domain/devices/interface/mac
')
or
exit
;
my
$mac
=
$if_mac
->
getAttribute
('
address
');
my
@macparts0
=
split
/:/
,
$mac
;
my
@old_macs
;
for
my
$dom
(
$self
->
vm
->
list_all_domains
)
{
my
$doc
=
$XML
->
load_xml
(
string
=>
$dom
->
get_xml_description
())
or
die
"
ERROR: $!
\n
";
for
my
$dom
(
$self
->
vm
->
list_all_domains
)
{
my
$doc
=
$XML
->
load_xml
(
string
=>
$dom
->
get_xml_description
())
or
die
"
ERROR: $!
\n
";
for
my
$nic
(
$doc
->
findnodes
('
/domain/devices/interface/mac
'))
{
for
my
$nic
(
$doc
->
findnodes
('
/domain/devices/interface/mac
'))
{
my
$nic_mac
=
$nic
->
getAttribute
('
address
');
push
@old_macs
,(
$nic_mac
);
}
}
warn
$if_mac
;
my
$new_mac
;
my
@tried
;
for
(
1
..
1000
)
{
for
my
$cont
(
1
..
1000
)
{
my
@macparts
=
@macparts0
;
my
$pos
=
int
(
rand
(
scalar
(
@macparts
)
-
3
))
+
3
;
my
$num
=
sprintf
"
%02X
",
rand
(
0xff
);
die
"
Missing num
"
if
!
defined
$num
;
$macparts
[
$pos
]
=
$num
;
$new_mac
=
lc
(
join
("
:
",
@macparts
));
warn
$new_mac
;
push
@tried
,(
$new_mac
);
last
if
!
grep
/^$new_mac$/i
,
@old_macs
&&
$self
->
_unique_mac
(
$new_mac
);
push
@old_macs
,(
$new_mac
);
}
if
(
$self
->
_unique_mac
(
$new_mac
)
)
{
$if_mac
->
setAttribute
(
address
=>
$new_mac
);
return
;
}
}
die
"
I can't find a new unique mac '
$new_mac
'
\n
"
.
Dumper
(
\
@tried
);
for
my
$if_mac
(
$doc
->
findnodes
('
/domain/devices/interface/mac
')
)
{
my
$mac
=
$if_mac
->
getAttribute
('
address
');
}
my
@macparts0
=
split
/:/
,
$mac
;
my
$new_mac
;
my
@tried
;
my
$foundit
;
for
(
1
..
1000
)
{
for
my
$cont
(
1
..
1000
)
{
my
@macparts
=
@macparts0
;
my
$pos
=
int
(
rand
(
scalar
(
@macparts
)
-
3
))
+
3
;
my
$num
=
sprintf
"
%02X
",
rand
(
0xff
);
die
"
Missing num
"
if
!
defined
$num
;
$macparts
[
$pos
]
=
$num
;
$new_mac
=
lc
(
join
("
:
",
@macparts
));
warn
$new_mac
;
push
@tried
,(
$new_mac
);
last
if
!
grep
/^$new_mac$/i
,
@old_macs
&&
$self
->
_unique_mac
(
$new_mac
);
push
@old_macs
,(
$new_mac
);
}
if
(
$self
->
_unique_mac
(
$new_mac
)
)
{
$if_mac
->
setAttribute
(
address
=>
$new_mac
);
$foundit
=
1
;
last
;
}
}
die
"
I can't find a new unique mac '
$new_mac
'
\n
"
.
Dumper
(
\
@tried
)
if
!
$foundit
;
}
}
=pod
...
...
t/kvm/72_add_nic.t
View file @
50fed357
...
...
@@ -28,20 +28,21 @@ my $BACKEND = 'KVM';
################################################################
sub
test_create_domain
{
my
$vm_name
=
shift
;
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
ok
(
$vm
,"
I can't find VM
$vm_name
")
or
return
;
my
$name
=
new_domain_name
();
my
$domain
;
eval
{
$domain
=
$vm
->
create_domain
(
name
=>
$name
$domain
=
$vm
->
create_domain
(
name
=>
$name
,
id_owner
=>
$USER
->
id
,
disk
=>
1024
*
1024
,
arg_create_dom
(
$vm_name
))
};
,
arg_create_dom
(
$vm_name
));
my
$req
=
Ravada::
Request
->
add_hardware
(
name
=>
'
network
',
id_domain
=>
$domain
->
id
,
uid
=>
user_admin
->
id
);
wait_request
();
ok
(
$domain
,"
No domain
$name
created with
"
.
ref
(
$vm
)
.
"
"
.
(
$@
or
''))
or
return
;
ok
(
$domain
,"
No domain
$name
created with
"
.
ref
(
$vm
)
.
"
"
.
(
$@
or
''))
or
return
;
ok
(
$domain
->
name
&&
$domain
->
name
eq
$name
,"
Expecting domain name '
$name
' , got
"
.
(
$domain
->
name
or
'
<UNDEF>
')
...
...
@@ -57,8 +58,8 @@ sub test_req_prepare_base{
my
$domain0
=
$RAVADA
->
search_domain
(
$name
);
ok
(
!
$domain0
->
is_base
,"
Domain
$name
should not be base
");
my
$req
=
Ravada::
Request
->
prepare_base
(
id_domain
=>
$domain0
->
id
,
uid
=>
user_admin
->
id
);
$RAVADA
->
_process_all_requests_dont_fork
();
my
$req
=
Ravada::
Request
->
prepare_base
(
id_domain
=>
$domain0
->
id
,
uid
=>
user_admin
->
id
);
wait_request
();
ok
(
$req
->
status
('
done
'),"
Request should be done, it is
"
.
$req
->
status
);
ok
(
!
$req
->
error
(),"
Request error
"
.
$req
->
error
);
...
...
@@ -76,15 +77,8 @@ sub test_add_nic {
my
$vm_name
=
shift
;
# diag("Testing add description $vm_name");
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
my
$vm
=
rvd_back
->
search_vm
(
$vm_name
);
my
$domain
=
test_create_domain
(
$vm_name
);
my
$req
=
Ravada::
Request
->
add_hardware
(
name
=>
'
network
',
,
id_domain
=>
$domain
->
id
,
uid
=>
$USER
->
id
);
wait_request
();
is
(
$req
->
error
,"");
is
(
$req
->
status
,"
done
");
#Read xml
sub
read_mac
{
...
...
@@ -94,16 +88,16 @@ sub test_add_nic {
my
(
@if_mac
)
=
$xml
->
findnodes
('
/domain/devices/interface/mac
');
for
my
$if_mac
(
@if_mac
)
{
my
$mac
=
$if_mac
->
getAttribute
('
address
');
warn
$mac
;
diag
"
\n
$mac
"
;
push
@mac
,
$mac
;
}
return
(
@mac
);
}
#Prepare base
test_req_prepare_base
(
$domain
->
name
);
test_req_prepare_base
(
$domain
->
name
);
#Clone domain
#Clone domain
my
$name
=
new_domain_name
();
my
$domain_father
=
$domain
;
diag
("
requesting create domain
$name
, cloned from
"
.
$domain_father
->
name
);
...
...
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