@@ -1654,8 +1654,13 @@ post '/machine/set' => sub($c) {
1654
1654
my $value_text = (delete $arg -> {value_text } or $value );
1655
1655
1656
1656
machine_set_value($c , $id , $field , $value , $value_text );
1657
+
1658
+ return $c -> render(json => { $field => $value_text });
1657
1659
} else {
1658
- # TODO parse options and set them when necessary
1660
+ machine_change_hardware($c , $id , $options );
1661
+ machine_set_options($c , $id , $options );
1662
+
1663
+ return $c -> render(json => $options );
1659
1664
}
1660
1665
};
1661
1666
@@ -4661,13 +4666,107 @@ sub resume_machine {
4661
4666
return $c -> render(json => { req => $req -> id });
4662
4667
}
4663
4668
4664
- sub machine_set_value ($c , $id , $field , $value , $value_text =$value ) {
4669
+ sub machine_change_hardware ($c , $id , $options ) {
4670
+
4671
+ my $domain = Ravada::Front::Domain-> open ($id ) or die " Unkown domain $id " ;
4672
+
4673
+
4674
+ my $max_mem = delete $options -> {max_mem };
4675
+ my $memory = delete $options -> {memory };
4676
+
4677
+ my $info = $domain -> get_info();
4678
+ my %change_mem ;
4679
+ if (int ($info -> {max_mem }/1024) != $max_mem && $USER -> is_admin) {
4680
+ $change_mem {max_mem } = $max_mem *1024;
4681
+ }
4682
+
4683
+ if (int ($info -> {memory }/1024) != $memory ) {
4684
+ $change_mem {memory } = $memory *1024;
4685
+ }
4686
+ Ravada::Request-> change_hardware(
4687
+ uid => $USER -> id
4688
+ ,id_domain => $id
4689
+ ,hardware => ' memory'
4690
+ ,data => \%change_mem
4691
+ ) if keys %change_mem ;
4692
+
4693
+ my $max_virt_cpu = delete $options -> {max_virt_cpu };
4694
+ my $n_virt_cpu = delete $options -> {n_virt_cpu };
4695
+
4696
+ my %change_cpu ;
4697
+
4698
+ if ($info -> {max_virt_cpu } != $max_virt_cpu && $USER -> is_admin) {
4699
+ $change_cpu {max_virt_cpu } = $max_virt_cpu ;
4700
+ }
4701
+
4702
+ if ($info -> {n_virt_cpu } != $n_virt_cpu ) {
4703
+ $change_cpu {n_virt_cpu } = $n_virt_cpu ;
4704
+ }
4705
+ Ravada::Request-> change_hardware(
4706
+ uid => $USER -> id
4707
+ ,id_domain => $id
4708
+ ,hardware => ' vcpus'
4709
+ ,data => \%change_cpu
4710
+ ) if keys %change_cpu ;
4711
+
4712
+
4713
+ }
4665
4714
4715
+ sub machine_set_options ($c , $id , $options ) {
4716
+ return access_denied($c ) if !$USER -> can_manage_machine($id );
4717
+
4718
+ my $domain = Ravada::Front::Domain-> open ($id ) or die " Unkown domain $id " ;
4719
+
4720
+ my $owner = delete $options -> {owner };
4721
+ $options -> {id_owner } = $owner -> {id } if $owner ;
4722
+
4723
+ my %field_minutes = map { $_ => 1 } (' run_timeout' ,' shutdown_timeout' );
4724
+
4725
+ my $change ;
4726
+ for my $key (keys %$options ) {
4727
+ next if _privileged_machine_field($key ) && !$USER -> is_admin;
4728
+
4729
+ next if !defined $options -> {$key } && !defined $domain -> _data($key );
4730
+ next if !$options -> {$key } && !$domain -> _data($key );
4731
+
4732
+ next unless defined $options -> {$key } && !defined $domain -> _data($key )
4733
+ || !defined $options -> {$key } && defined $domain -> _data($key )
4734
+ || $options -> {$key } ne $domain -> _data($key );
4735
+
4736
+ $change -> {$key } = $options -> {$key };
4737
+ my $value_text = $options -> {$key };
4738
+
4739
+ if ( exists $options -> {$key } && defined $options -> {$key }
4740
+ && $field_minutes {$key }) {
4741
+ $options -> {$key } = $options -> {$key }*60;
4742
+
4743
+ if ($value_text =~ / ^\d +$ / ) {
4744
+ if ( $value_text >1 ) {
4745
+ $value_text .= " minutes" ;
4746
+ } elsif ($value_text == 1 ) {
4747
+ $value_text .=" minute" ;
4748
+ } else {
4749
+ $value_text = " none" ;
4750
+ }
4751
+ }
4752
+ }
4753
+
4754
+ machine_set_value($c , $id , $key => $options -> {$key }, $value_text );
4755
+ }
4756
+
4757
+ return $c -> render(json => $change );
4758
+ }
4759
+
4760
+ sub _privileged_machine_field ($field ) {
4666
4761
4667
4762
my %privileged = map { $_ => 1 } qw( timeout id_owner shutdown_disconnected shutdown_timeout autostart balance_policy) ;
4763
+ return $privileged {$field };
4764
+ }
4765
+
4766
+ sub machine_set_value ($c , $id , $field , $value , $value_text =$value ) {
4668
4767
4669
4768
return access_denied($c ) if !$USER -> can_manage_machine($id );
4670
- return access_denied($c ) if $privileged { $ field} && !$USER -> is_admin;
4769
+ return access_denied($c ) if _privileged_machine_field( $ field) && !$USER -> is_admin;
4671
4770
4672
4771
my $domain = Ravada::Front::Domain-> open ($id ) or die " Unkown domain $id " ;
4673
4772
my $field_text = $field ;
@@ -4678,7 +4777,6 @@ sub machine_set_value($c, $id, $field, $value, $value_text=$value) {
4678
4777
&& $value eq $domain -> _data($field );
4679
4778
4680
4779
$value_text = 0 if !defined $value_text ;
4681
- $value_text = int ($value_text /60) if $field =~ / shutdown_disconnected|shutdown_timeout|run_timeout/ ;
4682
4780
4683
4781
if ($field eq ' id_owner' ) {
4684
4782
$field_text = ' owner' ;
@@ -4697,7 +4795,8 @@ sub machine_set_value($c, $id, $field, $value, $value_text=$value) {
4697
4795
$USER -> send_message(" Setting $field_text to $value_text in "
4698
4796
.$domain -> name)
4699
4797
if !defined $domain -> _data($field ) || $domain -> _data($field ) ne $value ;
4700
- return $c -> render(json => { $field => $domain -> _data($field , $value )});
4798
+
4799
+ $domain -> _data($field , $value );
4701
4800
4702
4801
}
4703
4802
0 commit comments