11import { cancelUploadPVC } from '@kubevirt-utils/hooks/useCDIUpload/utils' ;
22
33import { UPLOAD_PROGRESS_STATUS } from './utils/constants' ;
4+ import {
5+ getBootableVolumeUploadKey ,
6+ getVmCdromUploadKey ,
7+ getVmDiskUploadKey ,
8+ } from './utils/uploadKeys' ;
49import { useUploadProgressStore } from './uploadProgressStore' ;
510
611jest . mock ( '@kubevirt-utils/hooks/useCDIUpload/utils' , ( ) => ( {
@@ -18,6 +23,12 @@ const ERROR_CANCEL_FAILED = 'cancel failed';
1823const DV_NAME = 'upload-dv' ;
1924const NAMESPACE = 'default' ;
2025const CLUSTER = 'local-cluster' ;
26+ const VM_NAME = 'test-vm' ;
27+ const VM_DISK_NAME = 'rootdisk' ;
28+ const CDROM_NAME = 'cdrom-1' ;
29+ const OTHER_VM_NAME = 'other-vm' ;
30+ const BOOTABLE_VOLUME_NAMESPACE = 'openshift-virtualization-os-images' ;
31+ const BOOTABLE_VOLUME_NAME = 'fedora-40' ;
2132const LINK_LABEL_VIEW_DISK = 'View disk' ;
2233const LINK_URL_DISK = '/disk' ;
2334const LINK_LABEL_EXISTING = 'Existing link' ;
@@ -249,4 +260,127 @@ describe('useUploadProgressStore', () => {
249260 expect ( cancelUploadPVC ) . not . toHaveBeenCalled ( ) ;
250261 } ) ;
251262 } ) ;
263+
264+ describe ( 'cancelUploadsForVm' , ( ) => {
265+ it ( 'should cancel all vm-disk and vm-cdrom uploads for the VM' , async ( ) => {
266+ const diskUploadKey = getVmDiskUploadKey ( CLUSTER , NAMESPACE , VM_NAME , VM_DISK_NAME ) ;
267+ const cdromUploadKey = getVmCdromUploadKey ( CLUSTER , NAMESPACE , VM_NAME , CDROM_NAME ) ;
268+ const bootableVolumeUploadKey = getBootableVolumeUploadKey (
269+ BOOTABLE_VOLUME_NAMESPACE ,
270+ BOOTABLE_VOLUME_NAME ,
271+ ) ;
272+ const otherVmUploadKey = getVmDiskUploadKey ( CLUSTER , NAMESPACE , OTHER_VM_NAME , VM_DISK_NAME ) ;
273+ const diskCancelUpload = jest . fn ( async ( ) => undefined ) ;
274+ const cdromCancelUpload = jest . fn ( async ( ) => undefined ) ;
275+ const bootableCancelUpload = jest . fn ( async ( ) => undefined ) ;
276+ const otherVmCancelUpload = jest . fn ( async ( ) => undefined ) ;
277+
278+ useUploadProgressStore . getState ( ) . startUpload ( diskUploadKey , {
279+ cancelUpload : diskCancelUpload ,
280+ fileName : FILE_IMAGE_ISO ,
281+ } ) ;
282+ useUploadProgressStore . getState ( ) . startUpload ( cdromUploadKey , {
283+ cancelUpload : cdromCancelUpload ,
284+ fileName : FILE_IMAGE_ISO ,
285+ } ) ;
286+ useUploadProgressStore . getState ( ) . startUpload ( bootableVolumeUploadKey , {
287+ cancelUpload : bootableCancelUpload ,
288+ fileName : FILE_IMAGE_ISO ,
289+ } ) ;
290+ useUploadProgressStore . getState ( ) . startUpload ( otherVmUploadKey , {
291+ cancelUpload : otherVmCancelUpload ,
292+ fileName : FILE_IMAGE_ISO ,
293+ } ) ;
294+
295+ await useUploadProgressStore . getState ( ) . cancelUploadsForVm ( CLUSTER , NAMESPACE , VM_NAME ) ;
296+
297+ expect ( diskCancelUpload ) . toHaveBeenCalledTimes ( 1 ) ;
298+ expect ( cdromCancelUpload ) . toHaveBeenCalledTimes ( 1 ) ;
299+ expect ( bootableCancelUpload ) . not . toHaveBeenCalled ( ) ;
300+ expect ( otherVmCancelUpload ) . not . toHaveBeenCalled ( ) ;
301+ expect ( useUploadProgressStore . getState ( ) . getUpload ( diskUploadKey ) ) . toBeUndefined ( ) ;
302+ expect ( useUploadProgressStore . getState ( ) . getUpload ( cdromUploadKey ) ) . toBeUndefined ( ) ;
303+ expect ( useUploadProgressStore . getState ( ) . getUpload ( bootableVolumeUploadKey ) ?. status ) . toBe (
304+ UPLOAD_PROGRESS_STATUS . UPLOADING ,
305+ ) ;
306+ expect ( useUploadProgressStore . getState ( ) . getUpload ( otherVmUploadKey ) ?. status ) . toBe (
307+ UPLOAD_PROGRESS_STATUS . UPLOADING ,
308+ ) ;
309+ } ) ;
310+
311+ it ( 'should no-op when no uploads match the VM' , async ( ) => {
312+ await useUploadProgressStore . getState ( ) . cancelUploadsForVm ( CLUSTER , NAMESPACE , VM_NAME ) ;
313+
314+ expect ( cancelUploadPVC ) . not . toHaveBeenCalled ( ) ;
315+ } ) ;
316+
317+ it ( 'should not cancel completed uploads for the VM' , async ( ) => {
318+ const diskUploadKey = getVmDiskUploadKey ( CLUSTER , NAMESPACE , VM_NAME , VM_DISK_NAME ) ;
319+ const diskCancelUpload = jest . fn ( async ( ) => undefined ) ;
320+
321+ useUploadProgressStore . getState ( ) . startUpload ( diskUploadKey , {
322+ cancelUpload : diskCancelUpload ,
323+ fileName : FILE_IMAGE_ISO ,
324+ } ) ;
325+ useUploadProgressStore . getState ( ) . completeUpload ( diskUploadKey ) ;
326+
327+ await useUploadProgressStore . getState ( ) . cancelUploadsForVm ( CLUSTER , NAMESPACE , VM_NAME ) ;
328+
329+ expect ( diskCancelUpload ) . not . toHaveBeenCalled ( ) ;
330+ expect ( useUploadProgressStore . getState ( ) . getUpload ( diskUploadKey ) ?. status ) . toBe (
331+ UPLOAD_PROGRESS_STATUS . SUCCESS ,
332+ ) ;
333+ } ) ;
334+
335+ it ( 'should cancel empty-cluster uploads when deleting an ACM fleet VM' , async ( ) => {
336+ const emptyClusterUploadKey = getVmDiskUploadKey ( '' , NAMESPACE , VM_NAME , VM_DISK_NAME ) ;
337+ const cancelUpload = jest . fn ( async ( ) => undefined ) ;
338+
339+ useUploadProgressStore . getState ( ) . startUpload ( emptyClusterUploadKey , {
340+ cancelUpload,
341+ fileName : FILE_IMAGE_ISO ,
342+ } ) ;
343+
344+ await useUploadProgressStore . getState ( ) . cancelUploadsForVm ( CLUSTER , NAMESPACE , VM_NAME ) ;
345+
346+ expect ( cancelUpload ) . toHaveBeenCalledTimes ( 1 ) ;
347+ expect ( useUploadProgressStore . getState ( ) . getUpload ( emptyClusterUploadKey ) ) . toBeUndefined ( ) ;
348+ } ) ;
349+ } ) ;
350+
351+ describe ( 'cancelAllPendingUploads' , ( ) => {
352+ it ( 'should cancel and remove all in-progress uploads' , async ( ) => {
353+ const diskUploadKey = getVmDiskUploadKey ( CLUSTER , NAMESPACE , VM_NAME , VM_DISK_NAME ) ;
354+ const bootableVolumeUploadKey = getBootableVolumeUploadKey (
355+ BOOTABLE_VOLUME_NAMESPACE ,
356+ BOOTABLE_VOLUME_NAME ,
357+ ) ;
358+ const completedUploadKey = 'completed-upload-key' ;
359+ const diskCancelUpload = jest . fn ( async ( ) => undefined ) ;
360+ const bootableCancelUpload = jest . fn ( async ( ) => undefined ) ;
361+
362+ useUploadProgressStore . getState ( ) . startUpload ( diskUploadKey , {
363+ cancelUpload : diskCancelUpload ,
364+ fileName : FILE_IMAGE_ISO ,
365+ } ) ;
366+ useUploadProgressStore . getState ( ) . startUpload ( bootableVolumeUploadKey , {
367+ cancelUpload : bootableCancelUpload ,
368+ fileName : FILE_IMAGE_ISO ,
369+ } ) ;
370+ useUploadProgressStore . getState ( ) . startUpload ( completedUploadKey , {
371+ fileName : FILE_IMAGE_ISO ,
372+ } ) ;
373+ useUploadProgressStore . getState ( ) . completeUpload ( completedUploadKey ) ;
374+
375+ await useUploadProgressStore . getState ( ) . cancelAllPendingUploads ( ) ;
376+
377+ expect ( diskCancelUpload ) . toHaveBeenCalledTimes ( 1 ) ;
378+ expect ( bootableCancelUpload ) . toHaveBeenCalledTimes ( 1 ) ;
379+ expect ( useUploadProgressStore . getState ( ) . getUpload ( diskUploadKey ) ) . toBeUndefined ( ) ;
380+ expect ( useUploadProgressStore . getState ( ) . getUpload ( bootableVolumeUploadKey ) ) . toBeUndefined ( ) ;
381+ expect ( useUploadProgressStore . getState ( ) . getUpload ( completedUploadKey ) ?. status ) . toBe (
382+ UPLOAD_PROGRESS_STATUS . SUCCESS ,
383+ ) ;
384+ } ) ;
385+ } ) ;
252386} ) ;
0 commit comments