@Test
  public void testIscsiLunDiskWithNoPortCantBeAdded() {
    LunDisk disk = createISCSILunDisk();
    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(disk);
    initializeCommand(Guid.newGuid(), parameters);
    disk.getLun().getLunConnections().get(0).setPort(null);
    assertFalse(
        "checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a null port",
        command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
    assertTrue(
        "checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response",
        verifyCanDoActionMessagesContainMessage(
            EngineMessage.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS));

    clearCanDoActionMessages();

    disk.getLun().getLunConnections().get(0).setPort("");
    assertFalse(
        "checkIfLunDiskCanBeAdded() succeded for ISCSI lun which LUNs has storage_server_connection with a empty port",
        command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
    assertTrue(
        "checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response",
        verifyCanDoActionMessagesContainMessage(
            EngineMessage.ACTION_TYPE_FAILED_DISK_LUN_ISCSI_MISSING_CONNECTION_PARAMS));
  }
 @Test
 public void canDoActionFailsOnNullDiskInterface() throws Exception {
   Guid storageId = Guid.newGuid();
   DiskImage image = new DiskImage();
   image.setvolumeFormat(VolumeFormat.COW);
   image.setVolumeType(VolumeType.Preallocated);
   AddDiskParameters params = new AddDiskParameters(Guid.newGuid(), image);
   initializeCommand(storageId, params);
   assertFalse(command.validateInputs());
   assertTrue(
       command
           .getReturnValue()
           .getCanDoActionMessages()
           .contains("VALIDATION_DISK_INTERFACE_NOT_NULL"));
 }
  /** Mock a VM. */
  private VM mockVm() {
    VM vm = new VM();
    vm.setStatus(VMStatus.Down);
    vm.setStoragePoolId(Guid.newGuid());
    when(vmDao.get(command.getParameters().getVmId())).thenReturn(vm);

    return vm;
  }
  @Test
  public void canDoActionSpaceValidationFails() {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, VolumeType.Sparse);

    mockVm();
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();
    doReturn(mockStorageDomainValidatorWithoutSpace()).when(command).createStorageDomainValidator();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(
                EngineMessage.ACTION_TYPE_FAILED_DISK_SPACE_LOW_ON_STORAGE_DOMAIN.toString()));
  }
  /** CanDoAction should fail when the requested disk space is larger than 'MaxBlockDiskSize' */
  @Test
  public void canDoActionMaxBlockDiskSizeCheckFails() {
    Guid storageId = Guid.newGuid();
    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(createDiskImage(MAX_BLOCK_SIZE * 2));
    initializeCommand(storageId, parameters);

    mockVm();
    mockStorageDomain(storageId, StorageType.ISCSI);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.ACTION_TYPE_FAILED_DISK_MAX_SIZE_EXCEEDED.toString()));
  }
  @Test
  public void canDoActionSpaceValidationSucceeds() {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, VolumeType.Preallocated);

    mockVm();
    mockEntities(storageId);
    doReturn(mockStorageDomainValidatorWithSpace()).when(command).createStorageDomainValidator();

    assertTrue(command.canDoAction());
  }
 @Test
 public void testIscsiLunCanBeAdded() {
   LunDisk disk = createISCSILunDisk();
   AddDiskParameters parameters = createParameters();
   parameters.setDiskInfo(disk);
   initializeCommand(Guid.newGuid(), parameters);
   when(diskLunMapDao.getDiskIdByLunId(disk.getLun().getLUNId())).thenReturn(null);
   assertTrue(
       "checkIfLunDiskCanBeAdded() failed for valid iscsi lun",
       command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
 }
  @Test
  public void testGetLunDiskFails() {
    VDS vds = mockVds();
    LunDisk disk = createISCSILunDisk();
    List<LUNs> luns = Collections.emptyList();
    initializeCommand(Guid.newGuid());

    doReturn(luns)
        .when(command)
        .executeGetDeviceList(any(Guid.class), any(StorageType.class), any(String.class));
    assertNull(command.getLunDisk(disk.getLun(), vds));
  }
 @Test
 public void testIscsiLunCannotBeAddedIfAddingFloatingDisk() {
   LunDisk disk = createISCSILunDisk(ScsiGenericIO.UNFILTERED, true, DiskInterface.IDE);
   AddDiskParameters parameters = createParameters();
   parameters.setDiskInfo(disk);
   initializeCommand(Guid.newGuid(), parameters);
   assertFalse(
       "Floating disk with SCSI reservation set successfully added",
       command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
   verifyCanDoActionMessagesContainMessage(
       EngineMessage.ACTION_TYPE_FAILED_SCSI_RESERVATION_NOT_VALID_FOR_FLOATING_DISK);
 }
 @Test
 public void testIscsiLunCanBeAddedIfScsiPassthroughEnabledAndScsiReservationEnabled() {
   LunDisk disk = createISCSILunDisk(ScsiGenericIO.UNFILTERED, true, DiskInterface.IDE);
   AddDiskParameters parameters = createParameters();
   parameters.setDiskInfo(disk);
   initializeCommand(Guid.newGuid(), parameters);
   mockVm();
   mockInterfaceList();
   assertTrue(
       "Failed to add Lun disk when scsi passthrough and scsi reservation are enabled",
       command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
 }
 @Test
 public void testIscsiLunCannotBeAddedIfSgioIsFilteredAndScsiReservationEnabled() {
   LunDisk disk = createISCSILunDisk(ScsiGenericIO.FILTERED, true, DiskInterface.IDE);
   AddDiskParameters parameters = createParameters();
   parameters.setDiskInfo(disk);
   initializeCommand(Guid.newGuid(), parameters);
   mockVm();
   mockInterfaceList();
   assertFalse(
       "Lun disk added successfully WHILE sgio is filtered and scsi reservation is enabled",
       command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
   verifyCanDoActionMessagesContainMessage(EngineMessage.ACTION_TYPE_FAILED_SGIO_IS_FILTERED);
 }
  /** CanDoAction should fail when creating a Shareable Disk with COW volume format */
  @Test
  public void canDoActionShareableDiskVolumeFormatFails() {
    DiskImage image = createShareableDiskImage();
    image.setvolumeFormat(VolumeFormat.COW);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(image);
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, parameters);

    mockVm();
    mockStorageDomain(storageId, Version.v3_1);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.SHAREABLE_DISK_IS_NOT_SUPPORTED_BY_VOLUME_FORMAT.toString()));
  }
  @Test
  public void canDoActionFailWithUnsupportedDiskInterface() throws Exception {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId);

    mockVm();
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();
    when(diskValidator.isReadOnlyPropertyCompatibleWithInterface())
        .thenReturn(ValidationResult.VALID);
    when(diskValidator.isDiskInterfaceSupported(any(VM.class)))
        .thenReturn(new ValidationResult(EngineMessage.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED));
    when(diskValidator.isVirtIoScsiValid(any(VM.class))).thenReturn(ValidationResult.VALID);
    when(command.getDiskValidator(any(Disk.class))).thenReturn(diskValidator);

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(EngineMessage.ACTION_TYPE_DISK_INTERFACE_UNSUPPORTED.toString()));
  }
  @Test
  public void canDoActionSucceedsOnDiskDomainCheckWhenStorageGuidInParamsMismatches()
      throws Exception {
    Guid storageId = Guid.newGuid();
    initializeCommand(storageId);

    mockVmWithDisk(Guid.newGuid());
    mockStorageDomain(storageId);
    mockStoragePoolIsoMap();
    mockInterfaceList();
    mockMaxPciSlots();

    assertTrue(command.canDoAction());
  }
 @Test
 public void testUnknownTypeLunCantBeAdded() {
   LunDisk disk = createISCSILunDisk();
   AddDiskParameters parameters = createParameters();
   parameters.setDiskInfo(disk);
   initializeCommand(Guid.newGuid(), parameters);
   disk.getLun().setLunType(StorageType.UNKNOWN);
   assertFalse(
       "checkIfLunDiskCanBeAdded() succeded for LUN with UNKNOWN type",
       command.checkIfLunDiskCanBeAdded(spyDiskValidator(disk)));
   assertTrue(
       "checkIfLunDiskCanBeAdded() failed but correct can do action hasn't been added to the return response",
       verifyCanDoActionMessagesContainMessage(
           EngineMessage.ACTION_TYPE_FAILED_DISK_LUN_HAS_NO_VALID_TYPE));
 }
  @Test
  public void canDoActionShareableDiskOnGlusterFails() {
    DiskImage image = createShareableDiskImage();
    image.setvolumeFormat(VolumeFormat.RAW);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(image);

    Guid storageId = Guid.newGuid();
    initializeCommand(storageId, parameters);
    mockVm();
    mockStorageDomain(storageId, StorageType.GLUSTERFS, Version.v3_1);
    mockStoragePoolIsoMap();
    mockMaxPciSlots();

    assertFalse(command.canDoAction());
    assertTrue(
        command
            .getReturnValue()
            .getCanDoActionMessages()
            .contains(
                EngineMessage.ACTION_TYPE_FAILED_SHAREABLE_DISKS_NOT_SUPPORTED_ON_GLUSTER_DOMAIN
                    .toString()));
  }
  @Test
  public void testLunDiskValid() {
    VDS vds = mockVds();
    LunDisk disk = createISCSILunDisk();
    disk.setDiskInterface(DiskInterface.VirtIO);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(disk);
    parameters.setVdsId(vds.getId());
    initializeCommand(Guid.newGuid(), parameters);
    command.setVds(vds);

    mockVm();
    mockMaxPciSlots();
    mockInterfaceList();

    List<LUNs> luns = Collections.singletonList(disk.getLun());
    doReturn(luns)
        .when(command)
        .executeGetDeviceList(any(Guid.class), any(StorageType.class), (any(String.class)));
    CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command);
  }
  @Test
  public void testLunDiskInvalid() {
    VDS vds = mockVds();
    LunDisk disk = createISCSILunDisk();
    disk.setDiskInterface(DiskInterface.VirtIO);

    AddDiskParameters parameters = createParameters();
    parameters.setDiskInfo(disk);
    parameters.setVdsId(vds.getId());
    initializeCommand(Guid.newGuid(), parameters);
    command.setVds(vds);

    mockVm();
    mockMaxPciSlots();
    mockInterfaceList();

    List<LUNs> luns = Collections.emptyList();
    doReturn(luns)
        .when(command)
        .executeGetDeviceList(any(Guid.class), any(StorageType.class), any(String.class));
    CanDoActionTestUtils.runAndAssertCanDoActionFailure(
        command, EngineMessage.ACTION_TYPE_FAILED_DISK_LUN_INVALID);
  }
 private boolean verifyCanDoActionMessagesContainMessage(EngineMessage message) {
   return command.getReturnValue().getCanDoActionMessages().contains(message.toString());
 }
 /** Run the canDoAction and assert that it succeeds */
 private void runAndAssertCanDoActionSuccess() {
   boolean canDoAction = command.canDoAction();
   log.info("{}", command.getReturnValue().getCanDoActionMessages());
   assertTrue(canDoAction);
 }
 private void clearCanDoActionMessages() {
   command.getReturnValue().getCanDoActionMessages().clear();
 }