@@ -397,6 +397,29 @@ fn networks_from_vm_config(
397397 }
398398}
399399
400+ fn validate_resize_request ( request : & ResizeVmRequest ) -> Result < ( ) > {
401+ if request. vcpu . is_none ( )
402+ && request. memory . is_none ( )
403+ && request. disk_size . is_none ( )
404+ && request. image . is_none ( )
405+ {
406+ bail ! ( "resize request contains no updates" ) ;
407+ }
408+ if request. vcpu == Some ( 0 ) {
409+ bail ! ( "vcpu must be greater than zero" ) ;
410+ }
411+ if request. memory == Some ( 0 ) {
412+ bail ! ( "memory must be greater than zero" ) ;
413+ }
414+ if request. disk_size == Some ( 0 ) {
415+ bail ! ( "disk_size must be greater than zero" ) ;
416+ }
417+ if request. image . as_deref ( ) == Some ( "" ) {
418+ bail ! ( "image must not be empty" ) ;
419+ }
420+ Ok ( ( ) )
421+ }
422+
400423impl RpcHandler {
401424 fn resolve_gpus ( & self , gpu_cfg : & rpc:: GpuConfig ) -> Result < GpuConfig > {
402425 resolve_gpus_with_config ( gpu_cfg, & self . app . config . cvm )
@@ -683,6 +706,7 @@ impl VmmRpc for RpcHandler {
683706 #[ tracing:: instrument( skip( self , request) , fields( id = request. id) ) ]
684707 async fn resize_vm ( self , request : ResizeVmRequest ) -> Result < ( ) > {
685708 info ! ( "Resizing VM: {:?}" , request) ;
709+ validate_resize_request ( & request) ?;
686710 let vm_work_dir = self . app . work_dir ( & request. id ) ;
687711 let mut manifest = vm_work_dir. manifest ( ) . context ( "failed to read manifest" ) ?;
688712 self . apply_resource_updates (
@@ -1005,6 +1029,30 @@ mod tests {
10051029 assert ! ( manifest. networks. is_empty( ) ) ;
10061030 }
10071031
1032+ #[ test]
1033+ fn resize_request_rejects_empty_zero_and_empty_image_updates ( ) {
1034+ let mut request = ResizeVmRequest {
1035+ id : "vm-1" . into ( ) ,
1036+ ..Default :: default ( )
1037+ } ;
1038+ assert ! ( validate_resize_request( & request) . is_err( ) ) ;
1039+
1040+ request. vcpu = Some ( 0 ) ;
1041+ assert ! ( validate_resize_request( & request) . is_err( ) ) ;
1042+ request. vcpu = Some ( 1 ) ;
1043+ assert ! ( validate_resize_request( & request) . is_ok( ) ) ;
1044+
1045+ request. vcpu = None ;
1046+ request. memory = Some ( 0 ) ;
1047+ assert ! ( validate_resize_request( & request) . is_err( ) ) ;
1048+ request. memory = None ;
1049+ request. disk_size = Some ( 0 ) ;
1050+ assert ! ( validate_resize_request( & request) . is_err( ) ) ;
1051+ request. disk_size = None ;
1052+ request. image = Some ( String :: new ( ) ) ;
1053+ assert ! ( validate_resize_request( & request) . is_err( ) ) ;
1054+ }
1055+
10081056 #[ test]
10091057 fn simulated_tee_is_selected_per_instance_and_implies_no_tee ( ) {
10101058 let mut request = test_vm_configuration ( ) ;
0 commit comments