|
40 | 40 | import java.util.UUID; |
41 | 41 | import java.util.concurrent.ExecutionException; |
42 | 42 |
|
43 | | -import com.cloud.event.EventTypes; |
44 | | -import com.cloud.event.UsageEventUtils; |
45 | | -import com.cloud.host.HostVO; |
46 | | -import com.cloud.resourcelimit.CheckedReservation; |
47 | | -import com.cloud.service.ServiceOfferingVO; |
48 | | -import com.cloud.service.dao.ServiceOfferingDao; |
49 | | -import com.cloud.vm.snapshot.VMSnapshot; |
50 | | -import com.cloud.vm.snapshot.VMSnapshotDetailsVO; |
51 | | -import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao; |
52 | 43 | import org.apache.cloudstack.acl.ControlledEntity; |
53 | 44 | import org.apache.cloudstack.acl.SecurityChecker.AccessType; |
54 | 45 | import org.apache.cloudstack.api.command.user.volume.CheckAndRepairVolumeCmd; |
|
102 | 93 | import com.cloud.configuration.ConfigurationManager; |
103 | 94 | import com.cloud.configuration.Resource.ResourceType; |
104 | 95 | import com.cloud.dc.ClusterVO; |
| 96 | +import com.cloud.dc.DataCenter; |
105 | 97 | import com.cloud.dc.DataCenterVO; |
106 | 98 | import com.cloud.dc.HostPodVO; |
107 | 99 | import com.cloud.dc.dao.ClusterDao; |
108 | 100 | import com.cloud.dc.dao.DataCenterDao; |
109 | 101 | import com.cloud.dc.dao.HostPodDao; |
| 102 | +import com.cloud.event.EventTypes; |
| 103 | +import com.cloud.event.UsageEventUtils; |
110 | 104 | import com.cloud.exception.InvalidParameterValueException; |
111 | 105 | import com.cloud.exception.PermissionDeniedException; |
112 | 106 | import com.cloud.exception.ResourceAllocationException; |
| 107 | +import com.cloud.host.HostVO; |
113 | 108 | import com.cloud.host.dao.HostDao; |
114 | 109 | import com.cloud.hypervisor.Hypervisor.HypervisorType; |
| 110 | +import com.cloud.offering.DiskOffering; |
115 | 111 | import com.cloud.org.Grouping; |
116 | 112 | import com.cloud.projects.Project; |
117 | 113 | import com.cloud.projects.ProjectManager; |
| 114 | +import com.cloud.resourcelimit.CheckedReservation; |
118 | 115 | import com.cloud.serializer.GsonHelper; |
119 | 116 | import com.cloud.server.ManagementService; |
120 | 117 | import com.cloud.server.TaggedResourceService; |
| 118 | +import com.cloud.service.ServiceOfferingVO; |
| 119 | +import com.cloud.service.dao.ServiceOfferingDao; |
121 | 120 | import com.cloud.storage.Storage.ProvisioningType; |
122 | 121 | import com.cloud.storage.Volume.Type; |
123 | 122 | import com.cloud.storage.dao.DiskOfferingDao; |
|
145 | 144 | import com.cloud.vm.VirtualMachineManager; |
146 | 145 | import com.cloud.vm.dao.UserVmDao; |
147 | 146 | import com.cloud.vm.dao.VMInstanceDao; |
| 147 | +import com.cloud.vm.snapshot.VMSnapshot; |
| 148 | +import com.cloud.vm.snapshot.VMSnapshotDetailsVO; |
148 | 149 | import com.cloud.vm.snapshot.VMSnapshotVO; |
149 | 150 | import com.cloud.vm.snapshot.dao.VMSnapshotDao; |
| 151 | +import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao; |
150 | 152 |
|
151 | 153 | @RunWith(MockitoJUnitRunner.class) |
152 | 154 | public class VolumeApiServiceImplTest { |
@@ -467,6 +469,111 @@ public void setup() throws InterruptedException, ExecutionException { |
467 | 469 | when(_jobMgr.submitAsyncJob(any(AsyncJobVO.class), any(String.class), any(Long.class))).thenReturn(1L); |
468 | 470 | } |
469 | 471 |
|
| 472 | + @Test |
| 473 | + public void getCustomDiskOfferingIdForVolumeUploadReturnsDefaultOfferingWhenAccessibleAndEncryptionNotRequired() { |
| 474 | + Account owner = Mockito.mock(Account.class); |
| 475 | + DataCenter zone = Mockito.mock(DataCenter.class); |
| 476 | + DiskOfferingVO defaultOffering = Mockito.mock(DiskOfferingVO.class); |
| 477 | + |
| 478 | + Mockito.when(defaultOffering.getState()).thenReturn(DiskOffering.State.Active); |
| 479 | + Mockito.when(defaultOffering.getId()).thenReturn(11L); |
| 480 | + Mockito.when(_diskOfferingDao.findByUniqueName(anyString())).thenReturn(defaultOffering); |
| 481 | + |
| 482 | + Long result = volumeApiServiceImpl.getCustomDiskOfferingIdForVolumeUpload(owner, zone, false); |
| 483 | + |
| 484 | + Assert.assertEquals(Long.valueOf(11L), result); |
| 485 | + Mockito.verify(_diskOfferingDao, Mockito.never()).listCustomDiskOfferings(); |
| 486 | + } |
| 487 | + |
| 488 | + @Test |
| 489 | + public void getCustomDiskOfferingIdForVolumeUploadReturnsDefaultOfferingWhenEncryptedOnlyAndDefaultOfferingIsEncrypted() { |
| 490 | + Account owner = Mockito.mock(Account.class); |
| 491 | + DataCenter zone = Mockito.mock(DataCenter.class); |
| 492 | + DiskOfferingVO defaultOffering = Mockito.mock(DiskOfferingVO.class); |
| 493 | + |
| 494 | + Mockito.when(defaultOffering.getState()).thenReturn(DiskOffering.State.Active); |
| 495 | + Mockito.when(defaultOffering.getId()).thenReturn(12L); |
| 496 | + Mockito.when(_diskOfferingDao.findByUniqueName(anyString())).thenReturn(defaultOffering); |
| 497 | + Mockito.when(_diskOfferingDao.findById(12L)).thenReturn(defaultOffering); |
| 498 | + Mockito.when(defaultOffering.getEncrypt()).thenReturn(true); |
| 499 | + |
| 500 | + Long result = volumeApiServiceImpl.getCustomDiskOfferingIdForVolumeUpload(owner, zone, true); |
| 501 | + |
| 502 | + Assert.assertEquals(Long.valueOf(12L), result); |
| 503 | + Mockito.verify(_diskOfferingDao, Mockito.never()).listCustomDiskOfferings(); |
| 504 | + } |
| 505 | + |
| 506 | + @Test |
| 507 | + public void getCustomDiskOfferingIdForVolumeUploadFallsBackToEncryptedCustomOfferingWhenDefaultOfferingNotEncrypted() { |
| 508 | + Account owner = Mockito.mock(Account.class); |
| 509 | + DataCenter zone = Mockito.mock(DataCenter.class); |
| 510 | + DiskOfferingVO defaultOffering = Mockito.mock(DiskOfferingVO.class); |
| 511 | + DiskOfferingVO nonEncryptedOffering = Mockito.mock(DiskOfferingVO.class); |
| 512 | + DiskOfferingVO encryptedOffering = Mockito.mock(DiskOfferingVO.class); |
| 513 | + |
| 514 | + Mockito.when(defaultOffering.getState()).thenReturn(DiskOffering.State.Active); |
| 515 | + Mockito.when(defaultOffering.getId()).thenReturn(13L); |
| 516 | + Mockito.when(_diskOfferingDao.findByUniqueName(anyString())).thenReturn(defaultOffering); |
| 517 | + Mockito.when(_diskOfferingDao.findById(13L)).thenReturn(defaultOffering); |
| 518 | + Mockito.when(defaultOffering.getEncrypt()).thenReturn(false); |
| 519 | + |
| 520 | + Mockito.when(nonEncryptedOffering.getEncrypt()).thenReturn(false); |
| 521 | + Mockito.when(encryptedOffering.getEncrypt()).thenReturn(true); |
| 522 | + Mockito.when(encryptedOffering.getId()).thenReturn(23L); |
| 523 | + Mockito.when(_diskOfferingDao.listCustomDiskOfferings()).thenReturn(List.of(nonEncryptedOffering, encryptedOffering)); |
| 524 | + |
| 525 | + Long result = volumeApiServiceImpl.getCustomDiskOfferingIdForVolumeUpload(owner, zone, true); |
| 526 | + |
| 527 | + Assert.assertEquals(Long.valueOf(23L), result); |
| 528 | + Mockito.verify(_configMgr).checkDiskOfferingAccess(owner, encryptedOffering, zone); |
| 529 | + Mockito.verify(_configMgr, Mockito.never()).checkDiskOfferingAccess(owner, nonEncryptedOffering, zone); |
| 530 | + } |
| 531 | + |
| 532 | + @Test |
| 533 | + public void getCustomDiskOfferingIdForVolumeUploadFallsBackWhenDefaultOfferingIsNotAccessible() { |
| 534 | + Account owner = Mockito.mock(Account.class); |
| 535 | + DataCenter zone = Mockito.mock(DataCenter.class); |
| 536 | + DiskOfferingVO defaultOffering = Mockito.mock(DiskOfferingVO.class); |
| 537 | + DiskOfferingVO deniedOffering = Mockito.mock(DiskOfferingVO.class); |
| 538 | + DiskOfferingVO allowedOffering = Mockito.mock(DiskOfferingVO.class); |
| 539 | + |
| 540 | + Mockito.when(defaultOffering.getState()).thenReturn(DiskOffering.State.Active); |
| 541 | + Mockito.when(_diskOfferingDao.findByUniqueName(anyString())).thenReturn(defaultOffering); |
| 542 | + Mockito.doThrow(new PermissionDeniedException("default denied")).when(_configMgr).checkDiskOfferingAccess(owner, defaultOffering, zone); |
| 543 | + |
| 544 | + Mockito.when(allowedOffering.getId()).thenReturn(24L); |
| 545 | + Mockito.when(_diskOfferingDao.listCustomDiskOfferings()).thenReturn(List.of(deniedOffering, allowedOffering)); |
| 546 | + Mockito.doThrow(new PermissionDeniedException("denied")).when(_configMgr).checkDiskOfferingAccess(owner, deniedOffering, zone); |
| 547 | + |
| 548 | + Long result = volumeApiServiceImpl.getCustomDiskOfferingIdForVolumeUpload(owner, zone, false); |
| 549 | + |
| 550 | + Assert.assertEquals(Long.valueOf(24L), result); |
| 551 | + Mockito.verify(_configMgr).checkDiskOfferingAccess(owner, deniedOffering, zone); |
| 552 | + Mockito.verify(_configMgr).checkDiskOfferingAccess(owner, allowedOffering, zone); |
| 553 | + } |
| 554 | + |
| 555 | + @Test |
| 556 | + public void getCustomDiskOfferingIdForVolumeUploadReturnsNullWhenNoAccessibleEligibleCustomOfferingExists() { |
| 557 | + Account owner = Mockito.mock(Account.class); |
| 558 | + DataCenter zone = Mockito.mock(DataCenter.class); |
| 559 | + DiskOfferingVO defaultOffering = Mockito.mock(DiskOfferingVO.class); |
| 560 | + DiskOfferingVO firstEncrypted = Mockito.mock(DiskOfferingVO.class); |
| 561 | + DiskOfferingVO secondEncrypted = Mockito.mock(DiskOfferingVO.class); |
| 562 | + |
| 563 | + Mockito.when(defaultOffering.getState()).thenReturn(DiskOffering.State.Inactive); |
| 564 | + Mockito.when(_diskOfferingDao.findByUniqueName(anyString())).thenReturn(defaultOffering); |
| 565 | + |
| 566 | + Mockito.when(firstEncrypted.getEncrypt()).thenReturn(true); |
| 567 | + Mockito.when(secondEncrypted.getEncrypt()).thenReturn(true); |
| 568 | + Mockito.when(_diskOfferingDao.listCustomDiskOfferings()).thenReturn(List.of(firstEncrypted, secondEncrypted)); |
| 569 | + Mockito.doThrow(new PermissionDeniedException("denied")).when(_configMgr).checkDiskOfferingAccess(owner, firstEncrypted, zone); |
| 570 | + Mockito.doThrow(new PermissionDeniedException("denied")).when(_configMgr).checkDiskOfferingAccess(owner, secondEncrypted, zone); |
| 571 | + |
| 572 | + Long result = volumeApiServiceImpl.getCustomDiskOfferingIdForVolumeUpload(owner, zone, true); |
| 573 | + |
| 574 | + Assert.assertNull(result); |
| 575 | + } |
| 576 | + |
470 | 577 | /** |
471 | 578 | * TESTS FOR DETACH ROOT VOLUME, COUNT=4 |
472 | 579 | */ |
@@ -2189,7 +2296,7 @@ public void testCreateVolumeOnSecondaryForAttachIfNeeded_NoSuitablePool_ThrowsEx |
2189 | 2296 | } |
2190 | 2297 |
|
2191 | 2298 | @Test |
2192 | | - public void testCreateVolumeOnSecondaryForAttachIfNeeded_NoSuitablePool_ReturnSameVolumeInfo() { |
| 2299 | + public void testCreateVolumeOnSecondaryForAttachIfNeeded_NoSuitablePool_ReturnsSameVolumeInfo() { |
2193 | 2300 | VolumeInfo volumeToAttach = Mockito.mock(VolumeInfo.class); |
2194 | 2301 | Mockito.when(volumeToAttach.getState()).thenReturn(Volume.State.Allocated); |
2195 | 2302 | UserVmVO vm = Mockito.mock(UserVmVO.class); |
|
0 commit comments