Skip to content

Commit 07a4953

Browse files
authored
Fix shared ports (#2031)
fix: allow open and close exposed ports to shared user close #2030
1 parent 1f5a90e commit 07a4953

File tree

6 files changed

+89
-49
lines changed

6 files changed

+89
-49
lines changed

lib/Ravada.pm

+12-2
Original file line numberDiff line numberDiff line change
@@ -5614,7 +5614,8 @@ sub _cmd_refresh_machine_ports($self, $request) {
56145614
my $domain = Ravada::Domain->open($id_domain) or confess "Error: domain $id_domain not found";
56155615

56165616
die "USER $uid not authorized to refresh machine ports for domain ".$domain->name
5617-
unless $domain->_data('id_owner') == $user->id || $user->is_operator;
5617+
unless $domain->_data('id_owner') == $user->id || $user->is_operator
5618+
|| $user->can_start_machine($domain->id);
56185619

56195620
return if !$domain->is_active;
56205621

@@ -6762,6 +6763,14 @@ sub _cmd_open_exposed_ports($self, $request) {
67626763
my $domain = Ravada::Domain->open($request->id_domain) or return;
67636764
return if !$domain->list_ports();
67646765

6766+
my $uid = $request->args('uid');
6767+
my $user = Ravada::Auth::SQL->search_by_id( $uid )
6768+
or die "Error: user $uid not found";
6769+
6770+
die "Error: user ".$user->name." not authorized to open ports"
6771+
unless $user->is_admin || $domain->_data('id_owner') == $uid
6772+
|| $user->can_start_machine($domain);
6773+
67656774
my $remote_ip = $request->defined_arg('remote_ip');
67666775

67676776
$domain->open_exposed_ports($remote_ip);
@@ -6783,7 +6792,8 @@ sub _cmd_close_exposed_ports($self, $request) {
67836792
return if !$domain;
67846793

67856794
die "Error: user ".$user->name." not authorized to delete iptables rule"
6786-
unless $user->is_admin || $domain->_data('id_owner') == $uid;
6795+
unless $user->is_admin || $domain->_data('id_owner') == $uid
6796+
|| $user->can_start_machine($domain);
67876797

67886798
my $port = $request->defined_arg('port');
67896799

lib/Ravada/Request.pm

+1-1
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ our %COMMAND = (
252252
limit => 50
253253
,priority => 4
254254
,commands => ['shutdown','shutdown_now', 'enforce_limits', 'set_time'
255-
,'remove_domain','refresh_machine_ports'
255+
,'remove_domain', 'remove', 'refresh_machine_ports'
256256
]
257257
}
258258

t/device/10_templates.t

-9
Original file line numberDiff line numberDiff line change
@@ -938,24 +938,15 @@ for my $vm_name ( vm_names()) {
938938

939939
test_frontend_list($vm);
940940

941-
warn 1;
942-
943941
test_templates_gone_usb_2($vm);
944942

945-
warn 2;
946-
947943
test_templates_gone_usb($vm);
948-
warn 3;
949944
test_templates_changed_usb($vm);
950945

951-
warn 4;
952946
test_templates_start_nohd($vm);
953-
warn 5;
954947
test_templates_change_filter($vm);
955948

956-
warn 6;
957949
test_templates($vm);
958-
warn 7;
959950
test_templates_change_devices($vm);
960951

961952
}

t/lib/Test/Ravada.pm

+7-4
Original file line numberDiff line numberDiff line change
@@ -1542,18 +1542,21 @@ sub remove_void_networks($vm=undef) {
15421542
}
15431543

15441544
sub remove_networks_req() {
1545-
my $sth = connector()->dbh->prepare("SELECT id,id_vm,name FROM virtual_networks "
1546-
." WHERE name like ? "
1545+
my $sth = connector()->dbh->prepare(
1546+
"SELECT vn.id,id_vm,vn.name,v.name "
1547+
." FROM virtual_networks vn, vms v"
1548+
." WHERE vn.name like ? "
1549+
." AND vn.id_vm=v.id"
15471550
);
15481551
$sth->execute(base_domain_name."%");
1549-
while (my ($id, $id_vm, $name) = $sth->fetchrow) {
1552+
while (my ($id, $id_vm, $name, $node) = $sth->fetchrow) {
15501553
my $req = Ravada::Request->remove_network(
15511554
uid => user_admin()->id
15521555
,id => $id
15531556
,id_vm => $id_vm
15541557
);
15551558
}
1556-
wait_request();
1559+
wait_request(debug => 1);
15571560
}
15581561

15591562
sub remove_qemu_networks($vm=undef) {

t/mojo/70_volatile.t

+52-31
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,6 @@ sub _set_base_vms($vm_name, $id_base, $network) {
142142
while ( my ($id_vm) = $sth->fetchrow) {
143143
$t->post_ok("/node/enable/$id_vm.json");
144144

145-
my $req = Ravada::Request->create_network(
146-
uid => user_admin->id
147-
,id_vm => $id_vm
148-
,data => $network
149-
);
150-
wait_request(check_error => 0);
151-
152145
my $id_req = mojo_request($t,"set_base_vm", { id_vm => $id_vm, id_domain => $id_base, value => 1 }, 0);
153146
mojo_request($t,"clone", { id_domain => $id_base , after_request => $id_req, name => new_domain_name()
154147
,options => { network => $network->{name} }
@@ -176,38 +169,63 @@ sub _count_nodes($vm_name) {
176169
return ($count or 1);
177170
}
178171

179-
sub _new_network($id_vm) {
172+
sub _new_network($vm_name,$id_vm) {
180173

181-
my $req_new = Ravada::Request->new_network(
182-
uid => user_admin->id
183-
,id_vm => $id_vm
184-
,name => base_domain_name()
185-
);
186-
wait_request(debug => 0);
187-
like($req_new->output , qr/\d+/) or exit;
174+
my ($req,$net);
188175

189-
my $net = decode_json($req_new->output);
190-
my $name = $net->{name};
176+
for my $cont ( 140 .. 150 ) {
177+
my $req_new = Ravada::Request->new_network(
178+
uid => user_admin->id
179+
,id_vm => $id_vm
180+
,name => base_domain_name()
181+
);
182+
wait_request(debug => 0);
183+
like($req_new->output , qr/\d+/) or exit;
191184

192-
my $user = create_user();
193-
my $req = Ravada::Request->create_network(
194-
uid => user_admin->id
195-
,id_vm => $id_vm
196-
,data => $net
197-
);
198-
wait_request(check_error => 0);
185+
$net = decode_json($req_new->output);
186+
$net->{ip_address} =~ s/(\d+\.\d+\.)\d+(.*)/$1$cont$2/;
187+
my $name = $net->{name};
199188

189+
my $user = create_user();
190+
$req = Ravada::Request->create_network(
191+
uid => user_admin->id
192+
,id_vm => $id_vm
193+
,data => $net
194+
);
195+
wait_request(check_error => 0);
196+
197+
last if !$req->error;
198+
}
200199
die $req->error if $req->error;
201200

201+
_create_network_nodes($vm_name, $net);
202+
202203
return $net;
203204
}
204205

206+
sub _create_network_nodes($vm_name, $net) {
207+
my $sth = connector->dbh->prepare(
208+
"SELECT id FROM vms WHERE vm_type=?"
209+
." AND is_active=1 AND enabled=1"
210+
);
211+
$sth->execute($vm_name);
212+
while ( my ($id_vm) = $sth->fetchrow ) {
213+
$net->{id_vm} = $id_vm;
214+
Ravada::Request->create_network(
215+
uid => user_admin->id
216+
,id_vm => $id_vm
217+
,data => $net
218+
);
219+
220+
}
221+
}
222+
205223
sub test_clone($vm_name, $n=10) {
206224
my $id_vm = _id_vm($vm_name);
207225

208226
my @bases = bases($vm_name);
209227

210-
my $network = _new_network($id_vm);
228+
my $network = _new_network($vm_name, $id_vm);
211229
my $network_name = $network->{name};
212230

213231
for my $base ( @bases ) {
@@ -257,8 +275,10 @@ sub test_clone($vm_name, $n=10) {
257275
);
258276
delete_request('set_time','force_shutdown');
259277
next if $vm_name eq 'Void';
260-
wait_request(debug => 1);
261-
_wait_ip($name,$seconds++);
278+
if (_slightly_loaded() ) {
279+
wait_request(debug => 1);
280+
_wait_ip($name,$seconds++);
281+
}
262282
last if _too_loaded();
263283
}
264284
}
@@ -292,22 +312,23 @@ sub _search_domain_by_name($name) {
292312
return $id;
293313
}
294314

295-
sub _too_loaded($msg) {
315+
sub _slightly_loaded($msg="") {
296316
open my $in,"<","/proc/loadavg" or die $!;
297317
my ($load) = <$in>;
298318
close $in;
299319
chomp $load;
300320
$load =~ s/\s.*//;
301-
return $load>$MAX_LOAD;
321+
return $load>$MAX_LOAD/3;
302322
}
303323

304-
sub _too_loaded() {
324+
325+
sub _too_loaded($msg="") {
305326
open my $in,"<","/proc/loadavg" or die $!;
306327
my ($load) = <$in>;
307328
close $in;
308329
chomp $load;
309330
$load =~ s/\s.*//;
310-
diag("$load / $MAX_LOAD");
331+
diag("$msg $load / $MAX_LOAD");
311332
return $load>$MAX_LOAD;
312333
}
313334

t/user/35_share.t

+17-2
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,30 @@ sub test_requests_shared($user, $clone) {
100100
wait_request();
101101
is($req3->status,'done');
102102
is($req3->error,'');
103-
104-
my $req4 = Ravada::Request->list_cpu_models(
103+
my @args = (
105104
uid => $user->id
106105
,id_domain => $clone->id
107106
);
107+
my $req4 = Ravada::Request->list_cpu_models(@args);
108108
wait_request();
109109
is($req4->status,'done');
110110
is($req4->error,'');
111111

112+
my $req5 = Ravada::Request->open_exposed_ports(@args);
113+
wait_request();
114+
is($req5->status,'done');
115+
is($req5->error,'');
116+
117+
$req5 = Ravada::Request->refresh_machine_ports(@args);
118+
wait_request();
119+
is($req5->status,'done');
120+
is($req5->error,'');
121+
122+
$req5 = Ravada::Request->close_exposed_ports(@args);
123+
wait_request();
124+
is($req5->status,'done');
125+
is($req5->error,'');
126+
112127
}
113128

114129
sub test_machine_info_shared($user, $clone) {

0 commit comments

Comments
 (0)