3030import com .cloud .storage .SnapshotPolicyVO ;
3131import com .cloud .storage .SnapshotVO ;
3232import com .cloud .storage .VolumeVO ;
33+ import com .cloud .server .TaggedResourceService ;
3334import com .cloud .storage .dao .SnapshotDao ;
3435import com .cloud .storage .dao .SnapshotPolicyDao ;
3536import com .cloud .storage .dao .SnapshotZoneDao ;
4445
4546import com .cloud .utils .db .SearchBuilder ;
4647import com .cloud .utils .db .SearchCriteria ;
48+ import org .apache .cloudstack .api .command .user .snapshot .DeleteSnapshotPoliciesCmd ;
4749import org .apache .cloudstack .api .command .user .snapshot .ListSnapshotPoliciesCmd ;
4850import org .apache .cloudstack .context .CallContext ;
4951import org .apache .cloudstack .engine .subsystem .api .storage .CreateCmdResult ;
@@ -100,6 +102,10 @@ public class SnapshotManagerImplTest {
100102 VolumeDao volumeDao ;
101103 @ Mock
102104 SnapshotPolicyDao snapshotPolicyDao ;
105+ @ Mock
106+ SnapshotScheduler snapshotScheduler ;
107+ @ Mock
108+ TaggedResourceService taggedResourceService ;
103109 @ InjectMocks
104110 SnapshotManagerImpl snapshotManager = new SnapshotManagerImpl ();
105111
@@ -108,6 +114,8 @@ public void setUp() {
108114 snapshotManager ._snapshotPolicyDao = snapshotPolicyDao ;
109115 snapshotManager ._volsDao = volumeDao ;
110116 snapshotManager ._accountMgr = accountManager ;
117+ snapshotManager ._snapSchedMgr = snapshotScheduler ;
118+ snapshotManager .taggedResourceService = taggedResourceService ;
111119 }
112120
113121 @ After
@@ -520,4 +528,88 @@ public void testListSnapshotPolicies_RootAdmin() {
520528 Assert .assertEquals (1 , result .first ().size ());
521529 Assert .assertEquals (Integer .valueOf (1 ), result .second ());
522530 }
531+
532+ @ Test
533+ public void testDeleteSnapshotPoliciesForRemovedVolume () {
534+ Long policyId = 1L ;
535+ Long volumeId = 10L ;
536+ Long accountId = 2L ;
537+
538+ DeleteSnapshotPoliciesCmd cmd = Mockito .mock (DeleteSnapshotPoliciesCmd .class );
539+ Mockito .when (cmd .getId ()).thenReturn (policyId );
540+ Mockito .when (cmd .getIds ()).thenReturn (null );
541+
542+ Account caller = Mockito .mock (Account .class );
543+ Mockito .when (caller .getId ()).thenReturn (accountId );
544+ CallContext .register (Mockito .mock (User .class ), caller );
545+
546+ SnapshotPolicyVO policyVO = Mockito .mock (SnapshotPolicyVO .class );
547+ Mockito .when (policyVO .getId ()).thenReturn (policyId );
548+ Mockito .when (policyVO .getVolumeId ()).thenReturn (volumeId );
549+ Mockito .when (policyVO .getUuid ()).thenReturn ("policy-uuid" );
550+ Mockito .when (snapshotPolicyDao .findById (policyId )).thenReturn (policyVO );
551+
552+ // Volume is removed (expunged) but findByIdIncludingRemoved should still return it
553+ VolumeVO volumeVO = Mockito .mock (VolumeVO .class );
554+ Mockito .when (volumeDao .findByIdIncludingRemoved (volumeId )).thenReturn (volumeVO );
555+
556+ Mockito .when (snapshotPolicyDao .remove (policyId )).thenReturn (true );
557+
558+ boolean result = snapshotManager .deleteSnapshotPolicies (cmd );
559+
560+ Assert .assertTrue (result );
561+ Mockito .verify (volumeDao ).findByIdIncludingRemoved (volumeId );
562+ Mockito .verify (snapshotScheduler ).removeSchedule (volumeId , policyId );
563+ Mockito .verify (snapshotPolicyDao ).remove (policyId );
564+ }
565+
566+ @ Test (expected = InvalidParameterValueException .class )
567+ public void testDeleteSnapshotPoliciesNoPolicyId () {
568+ DeleteSnapshotPoliciesCmd cmd = Mockito .mock (DeleteSnapshotPoliciesCmd .class );
569+ Mockito .when (cmd .getId ()).thenReturn (null );
570+ Mockito .when (cmd .getIds ()).thenReturn (null );
571+
572+ snapshotManager .deleteSnapshotPolicies (cmd );
573+ }
574+
575+ @ Test (expected = InvalidParameterValueException .class )
576+ public void testDeleteSnapshotPoliciesPolicyNotFound () {
577+ Long policyId = 1L ;
578+
579+ DeleteSnapshotPoliciesCmd cmd = Mockito .mock (DeleteSnapshotPoliciesCmd .class );
580+ Mockito .when (cmd .getId ()).thenReturn (policyId );
581+ Mockito .when (cmd .getIds ()).thenReturn (null );
582+
583+ Mockito .when (snapshotPolicyDao .findById (policyId )).thenReturn (null );
584+
585+ snapshotManager .deleteSnapshotPolicies (cmd );
586+ }
587+
588+ @ Test (expected = InvalidParameterValueException .class )
589+ public void testDeleteSnapshotPoliciesVolumeNotFound () {
590+ Long policyId = 1L ;
591+ Long volumeId = 10L ;
592+
593+ DeleteSnapshotPoliciesCmd cmd = Mockito .mock (DeleteSnapshotPoliciesCmd .class );
594+ Mockito .when (cmd .getId ()).thenReturn (policyId );
595+ Mockito .when (cmd .getIds ()).thenReturn (null );
596+
597+ SnapshotPolicyVO policyVO = Mockito .mock (SnapshotPolicyVO .class );
598+ Mockito .when (policyVO .getVolumeId ()).thenReturn (volumeId );
599+ Mockito .when (snapshotPolicyDao .findById (policyId )).thenReturn (policyVO );
600+
601+ // Volume doesn't exist at all (even when including removed)
602+ Mockito .when (volumeDao .findByIdIncludingRemoved (volumeId )).thenReturn (null );
603+
604+ snapshotManager .deleteSnapshotPolicies (cmd );
605+ }
606+
607+ @ Test (expected = InvalidParameterValueException .class )
608+ public void testDeleteSnapshotPoliciesManualPolicyId () {
609+ DeleteSnapshotPoliciesCmd cmd = Mockito .mock (DeleteSnapshotPoliciesCmd .class );
610+ Mockito .when (cmd .getId ()).thenReturn (Snapshot .MANUAL_POLICY_ID );
611+ Mockito .when (cmd .getIds ()).thenReturn (null );
612+
613+ snapshotManager .deleteSnapshotPolicies (cmd );
614+ }
523615}
0 commit comments