Commit af659aad authored by Francesc Guasch's avatar Francesc Guasch
Browse files

improved create domain request

parent 3817e5a4
...@@ -443,6 +443,8 @@ sub process_requests { ...@@ -443,6 +443,8 @@ sub process_requests {
my $debug = shift; my $debug = shift;
my $dont_fork = shift; my $dont_fork = shift;
$self->_wait_pids_nohang();
my $sth = $CONNECTOR->dbh->prepare("SELECT id FROM requests WHERE status='requested'"); my $sth = $CONNECTOR->dbh->prepare("SELECT id FROM requests WHERE status='requested'");
$sth->execute; $sth->execute;
while (my ($id)= $sth->fetchrow) { while (my ($id)= $sth->fetchrow) {
...@@ -453,7 +455,9 @@ sub process_requests { ...@@ -453,7 +455,9 @@ sub process_requests {
$req->error($@); $req->error($@);
$req->status('done'); $req->status('done');
} }
warn "status: ".$req->status()." error: '".($req->error or '')."'" if $DEBUG || $debug; warn "req ".$req->id." , command: ".$req->command." , status: ".$req->status()
." , error: '".($req->error or 'NONE')."'"
if $DEBUG || $debug;
} }
$sth->finish; $sth->finish;
} }
...@@ -517,9 +521,9 @@ sub _do_cmd_create{ ...@@ -517,9 +521,9 @@ sub _do_cmd_create{
my $request = shift; my $request = shift;
$request->status('creating domain'); $request->status('creating domain');
warn "$$ creating domain"; warn "$$ creating domain" if $DEBUG;
my $domain; my $domain;
eval {$domain = $self->create_domain(%{$request->args},request => $request) }; $domain = $self->create_domain(%{$request->args},request => $request);
warn $@ if $@; warn $@ if $@;
$request->status('done'); $request->status('done');
...@@ -527,6 +531,17 @@ sub _do_cmd_create{ ...@@ -527,6 +531,17 @@ sub _do_cmd_create{
} }
sub _wait_pids_nohang {
my $self = shift;
return if !keys %{$self->{pids}};
my $kid = waitpid(-1 , WNOHANG);
return if !$kid;
warn "Kid $kid finished";
delete $self->{pids}->{$kid};
}
sub _wait_pids { sub _wait_pids {
my $self = shift; my $self = shift;
my $request = shift; my $request = shift;
......
...@@ -6,6 +6,7 @@ use warnings; ...@@ -6,6 +6,7 @@ use warnings;
use Carp qw(confess); use Carp qw(confess);
use Data::Dumper; use Data::Dumper;
use JSON::XS; use JSON::XS;
use Hash::Util;
use Ravada; use Ravada;
use Ravada::Front; use Ravada::Front;
...@@ -18,7 +19,7 @@ Request a command to the ravada backend ...@@ -18,7 +19,7 @@ Request a command to the ravada backend
=cut =cut
our %FIELD = map { $_ => 1 } qw(error); our %FIELD = map { $_ => 1 } qw(error);
our %FIELD_RO = map { $_ => 1 } qw(name); our %FIELD_RO = map { $_ => 1 } qw(id name);
our %VALID_ARG = ( our %VALID_ARG = (
create_domain => { create_domain => {
...@@ -81,7 +82,7 @@ sub open { ...@@ -81,7 +82,7 @@ sub open {
$row->{args} = $args; $row->{args} = $args;
bless ($row,$class); bless ($row, $class);
return $row; return $row;
} }
...@@ -452,7 +453,7 @@ sub AUTOLOAD { ...@@ -452,7 +453,7 @@ sub AUTOLOAD {
$name =~ tr/[a-z]/_/c; $name =~ tr/[a-z]/_/c;
confess "ERROR: Unknown field $name " confess "ERROR: Unknown field $name "
if !exists $self->{$name} || !exists $FIELD{$name}; if !exists $self->{$name} && !exists $FIELD{$name} && !exists $FIELD_RO{$name};
if (!defined $value) { if (!defined $value) {
my $sth = $$CONNECTOR->dbh->prepare("SELECT * FROM requests " my $sth = $$CONNECTOR->dbh->prepare("SELECT * FROM requests "
." WHERE id=?"); ." WHERE id=?");
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<h2>New Base</h2> <h2>New Base</h2>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<form name="new_machineForm" role="form" method="post" action="#" ng-controller="new_machine" novalidate> <form name="new_machineForm" role="form" method="post" action="/machines/new" ng-controller="new_machine" novalidate>
<div class="from-group"> <div class="from-group">
<label for="name">Name</label> <label for="name">Name</label>
<input class="form-control" ng-model="name" type="text" ng-maxlength="20" name="name" required=""><br/> <input class="form-control" ng-model="name" type="text" ng-maxlength="20" name="name" required=""><br/>
......
...@@ -151,6 +151,16 @@ get '/machine/prepare/*.html' => sub { ...@@ -151,6 +151,16 @@ get '/machine/prepare/*.html' => sub {
return prepare_machine($c); return prepare_machine($c);
}; };
##############################################
#
get '/request/*.html' => sub {
my $c = shift;
my ($id) = $c->req->url->to_abs->path =~ m{/(\d+)\.html};
return _show_request($c,$id);
};
get '/requests.json' => sub { get '/requests.json' => sub {
my $c = shift; my $c = shift;
return list_requests($c); return list_requests($c);
...@@ -293,21 +303,7 @@ sub new_machine { ...@@ -293,21 +303,7 @@ sub new_machine {
if ($c->param('submit')) { if ($c->param('submit')) {
push @error,("Name is mandatory") if !$c->param('name'); push @error,("Name is mandatory") if !$c->param('name');
if (!@error) { return _show_request($c, req_new_domain($c)) if !@error;
my $request = req_new_domain($c);
if ($request) {
if ($request->status eq 'done') {
my $domain = $RAVADA->search_domain($c->param('name'));
return show_link($c, $domain) if $domain;
return show_failure($c, $c->param('name')) if !$domain;
return _show_request($c, $request);
}
} else {
return show_failure($c, $c->param('name'));
}
}
} }
warn join("\n",@error) if @error; warn join("\n",@error) if @error;
...@@ -335,12 +331,37 @@ sub req_new_domain { ...@@ -335,12 +331,37 @@ sub req_new_domain {
sub _show_request { sub _show_request {
my $c = shift; my $c = shift;
my $request = shift; my $id_request = shift;
my $request;
if (!ref $id_request) {
warn "opening request $id_request";
eval { $request = Ravada::Request->open($id_request) };
warn $@ if $@;
return $c->render(data => "Request $id_request unknown") if !$request;
} else {
$request = $id_request;
}
return $c->render(data => "Request $id_request unknown ".Dumper($request))
if !$request->{id};
$c->render( $c->render(
template => 'bootstrap/request' template => 'bootstrap/request'
, request => $request , request => $request
); );
return if $request->status ne 'done';
return $c->render(data => "Request $id_request error ".$request->error)
if $request->error;
my $name = $request->args('name');
my $domain = $RAVADA->search_domain($name);
if (!$domain) {
return $c->render(data => "Request ".$request->status." , but I can't find domain $name");
}
return view_machine($c,$domain);
} }
sub _search_req_base_error { sub _search_req_base_error {
...@@ -453,9 +474,12 @@ sub manage_machine { ...@@ -453,9 +474,12 @@ sub manage_machine {
} }
sub view_machine { sub view_machine {
my $c = shift; my $c = shift;
my $domain = shift;
return login($c) if !_logged_in($c); return login($c) if !_logged_in($c);
return show_link($c, _search_requested_machine($c)); $domain = _search_requested_machine($c) if !$domain;
return show_link($c, $domain);
} }
sub clone_machine { sub clone_machine {
......
...@@ -90,6 +90,9 @@ sub test_req_create_domain_iso { ...@@ -90,6 +90,9 @@ sub test_req_create_domain_iso {
,"Status of request is ".$req->status." it should be done"); ,"Status of request is ".$req->status." it should be done");
ok(!$req->error,"Error ".$req->error." creating domain ".$name); ok(!$req->error,"Error ".$req->error." creating domain ".$name);
my $req2 = Ravada::Request->open($req->id);
ok($req2->{id} == $req->id,"req2->{id} = ".$req2->{id}." , expecting ".$req->id);
my $domain = $ravada->search_domain($name); my $domain = $ravada->search_domain($name);
ok($domain,"I can't find domain $name"); ok($domain,"I can't find domain $name");
......
<h1>Request</h1> <h1>Request</h1>
<a href="/request/<%= $request->{id} %>.html">refresh</a><br>
<%= Data::Dumper::Dumper($request) %> <%= Data::Dumper::Dumper($request) %>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment