@Override
 public int compare(Disk o1, Disk o2) {
   Boolean boot1 = o1.isBoot();
   Boolean boot2 = o2.isBoot();
   int bootResult = boot1.compareTo(boot2);
   if (bootResult == 0 && o1.isBoot()) {
     return Boolean.compare(o2.isDiskSnapshot(), o1.isDiskSnapshot());
   }
   return bootResult;
 }
  private boolean checkCanPerformRegularUpdate() {
    boolean retValue = true;
    if (_oldDisk.getDiskInterface() != getParameters().getDiskInfo().getDiskInterface()) {
      List<VmNetworkInterface> allVmInterfaces =
          DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(getVmId());

      List<Disk> allVmDisks = getDiskDao().getAllForVm(getVmId());
      allVmDisks.removeAll(
          LinqUtils.filter(
              allVmDisks,
              new Predicate<Disk>() {
                @Override
                public boolean eval(Disk o) {
                  return o.getId().equals(_oldDisk.getId());
                }
              }));
      allVmDisks.add(getParameters().getDiskInfo());
      if (!checkPciAndIdeLimit(
          getVm().getnum_of_monitors(),
          allVmInterfaces,
          allVmDisks,
          getReturnValue().getCanDoActionMessages())) {
        retValue = false;
      }
    }

    // Validate update boot disk.
    if (retValue && getParameters().getDiskInfo().isBoot()) {
      VmHandler.updateDisksFromDb(getVm());
      for (Disk disk : getVm().getDiskMap().values()) {
        if (disk.isBoot() && !disk.getId().equals(_oldDisk.getId())) {
          retValue = false;
          addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_BOOT_IN_USE);
          getReturnValue()
              .getCanDoActionMessages()
              .add(String.format("$DiskName %1$s", disk.getDiskAlias()));
          break;
        }
      }
    }

    // Set disk alias name in the disk retrieved from the parameters.
    ImagesHandler.setDiskAlias(getParameters().getDiskInfo(), getVm());
    return retValue && validateShareableDisk();
  }