@Override
  protected void executeCommand() {
    if (getVmTemplate().isBaseTemplate()) {
      shiftBaseTemplateToSuccessor();
    }
    final List<CinderDisk> cinderDisks =
        ImagesHandler.filterDisksBasedOnCinder(
            DbFacade.getInstance().getDiskDao().getAllForVm(getVmTemplateId()));
    // Set VM to lock status immediately, for reducing race condition.
    VmTemplateHandler.lockVmTemplateInTransaction(getVmTemplateId(), getCompensationContext());

    if (!imageTemplates.isEmpty() || !cinderDisks.isEmpty()) {
      TransactionSupport.executeInNewTransaction(
          new TransactionMethod<Void>() {

            @Override
            public Void runInTransaction() {
              if (!imageTemplates.isEmpty() && removeVmTemplateImages()) {
                VmHandler.removeVmInitFromDB(getVmTemplate());
                setSucceeded(true);
              }
              if (!cinderDisks.isEmpty()) {
                removeCinderDisks(cinderDisks);
                setSucceeded(true);
              }
              return null;
            }
          });
    } else {
      // if for some reason template doesn't have images, remove it now and not in end action
      handleEndAction();
    }
  }
 private void fetchImageTemplates() {
   if (imageTemplates == null) {
     List<Disk> allImages = DbFacade.getInstance().getDiskDao().getAllForVm(getVmTemplateId());
     imageTemplates = ImagesHandler.filterImageDisks(allImages, false, false, true);
     imageTemplates.addAll(ImagesHandler.filterDisksBasedOnCinder(allImages, true));
   }
 }
 public static List<DiskImage> getCinderLeafImages(List<Disk> disks, boolean onlyPluggedDisks) {
   List<DiskImage> leafCinderDisks = new ArrayList<>();
   List<CinderDisk> cinderDisks = ImagesHandler.filterDisksBasedOnCinder(disks, onlyPluggedDisks);
   for (CinderDisk cinder : cinderDisks) {
     leafCinderDisks.add(ImagesHandler.getSnapshotLeaf(cinder.getId()));
   }
   return leafCinderDisks;
 }