@Override
  public StorageOperationResponse<PostProcessTakeSnapshotResponse> postProcessTakeSnapshot(
      PostProcessTakeSnapshotRequest request) {

    PostProcessTakeSnapshotResponse payload = new PostProcessTakeSnapshotResponse();
    StorageOperationResponse<PostProcessTakeSnapshotResponse> response =
        new StorageOperationResponse<PostProcessTakeSnapshotResponse>(payload);
    response.setContext(request.takeSnapshotResult);
    StorageOperationId id = new StorageOperationId();
    id.id = OpenstackAdapterUtil.generateOperationId();
    id.type = "snapshot";
    response.setId(id);
    response.setPercentCompleted(0);
    response.setStatus(StorageOperationStatus.EXECUTING);
    return response;
  }
  @Override
  public StorageOperationResponse<TakeSnapshotResponse> takeSnapshot(TakeSnapshotRequest request) {

    logger.log(
        IJavaEeLog.SEVERITY_DEBUG, this.getClass().getName(), "takeSnapshot: " + request, null);
    ArrayList<StorageSnapshotVolume> storageVolumeSnapshotList =
        new ArrayList<StorageSnapshotVolume>();
    StorageOperationResponse<TakeSnapshotResponse> response = null;

    PrepareTakeSnapshotRequest prepareRequest =
        (PrepareTakeSnapshotRequest) request.prepareTakeSnapshotResult;
    OpenstackBlockSnapshotVolumesContext context = new OpenstackBlockSnapshotVolumesContext();
    context.snapshotIds = new ArrayList<String>();
    for (StorageVolume volume : prepareRequest.storageVolumesToBeSnapshot) {
      VolumeSnapshot snapshot = null;
      try {

        StorageSnapshotVolume storageVolumeSnapshot =
            OpenstackAdapterUtil.toStorageSnapshot(snapshot, volume.storageSystemId);
        storageVolumeSnapshotList.add(storageVolumeSnapshot);
        context.snapshotIds.add(storageVolumeSnapshot.storageVolumeId);

      } catch (Exception e) {
        logger.traceThrowable(
            IJavaEeLog.SEVERITY_DEBUG,
            this.getClass().getName(),
            "takeSnapshot:" + e.getMessage(),
            null,
            e);
        cancelSnapshots(storageVolumeSnapshotList);
        return StorageAdapterImplHelper.createFailedResponse(
            e.getMessage(), TakeSnapshotResponse.class);
      }
      context.snapshots = storageVolumeSnapshotList;
    }
    TakeSnapshotResponse payload = new TakeSnapshotResponse();
    context.volumes = prepareRequest.storageVolumesToBeSnapshot;

    payload.takeSnapshotResult = context;
    response = new StorageOperationResponse<TakeSnapshotResponse>(payload);
    response.setContext(context);
    response.setPercentCompleted(100);
    response.setStatus(StorageOperationStatus.COMPLETED);
    return response;
  }
  @Override
  public StorageOperationResponse<CloneVolumesResponse> cloneVolumes(CloneVolumesRequest request) {

    String msg = "";
    PrepareCloneVolumesRequest prepareRequest =
        (PrepareCloneVolumesRequest) request.prepareCloneVolumesResult;
    List<VolumeToBeCloned> volumesToBeCloned = prepareRequest.volumesToBeCloned;
    ArrayList<StorageLogMessage> logMessages = new ArrayList<StorageLogMessage>();

    logger.log(
        IJavaEeLog.SEVERITY_DEBUG,
        this.getClass().getName(),
        "cloneVolumes: request:" + prepareRequest,
        null);
    msg = "CloneVolumes operation started";
    logMessages.add(
        new StorageLogMessage(IJavaEeLog.SEVERITY_INFO, "OSFile", System.currentTimeMillis(), msg));
    String operationId = OpenstackAdapterUtil.generateOperationId();
    ArrayList<String> snapshots = new ArrayList<String>();

    OpenstackFileCloneVolumesContext context = new OpenstackFileCloneVolumesContext();
    context.volumeStatus = new ArrayList<OpenstackFileCloneVolumeStatus>();
    OpenstackFileCloneVolumeStatus status;
    for (VolumeToBeCloned inputVolume : volumesToBeCloned) {
      status = new OpenstackFileCloneVolumeStatus();
      status.volumeToBeCloned = inputVolume;
      status.customCloningProperties = prepareRequest.customCloningProperties;
      context.volumeStatus.add(status);
      try {
        if (inputVolume.isSourceVolumeSnapshot) {
          if (openstackClient.getSnapshot(inputVolume.sourceVolumeId) != null) {
            status.sourceSnapshotComplete = true;
            status.sourceSnapshotId = inputVolume.sourceVolumeId;
            if (isRemoteClone(status.volumeToBeCloned)) {
              createTargetSnapshot(status.sourceSnapshotId, status, operationId);
              snapshots.add(status.targetSnapshotId);
              msg = "Target snapshot" + status.targetSnapshotId + " created";
              logMessages.add(
                  new StorageLogMessage(
                      IJavaEeLog.SEVERITY_INFO, "LVM", System.currentTimeMillis(), msg));
            }

          } else {
            msg = "Snapshot not found: " + inputVolume.sourceVolumeId;
            logMessages.add(
                new StorageLogMessage(
                    IJavaEeLog.SEVERITY_ERROR, "OSFile", System.currentTimeMillis(), msg));
            return StorageAdapterImplHelper.createFailedResponse(
                logMessages, CloneVolumesResponse.class);
          }
        } else {
          ShareSnapshot snapshot = null;
          try {
            String snapshotName = "Snapshot of share " + inputVolume.sourceVolumeId;
            String snapshotDescription =
                "LVM Snapshot to clone share " + inputVolume.sourceVolumeId;
            snapshot =
                openstackClient.createShareSnapshot(
                    inputVolume.sourceVolumeId, snapshotName, snapshotDescription);
          } catch (CloudClientException e) {

            throw e;
          }
          snapshots.add(snapshot.getId());
          status.sourceSnapshotId = snapshot.getId();
        }
      } catch (CloudClientException e) {
        logger.traceThrowable(
            IJavaEeLog.SEVERITY_DEBUG,
            this.getClass().getName(),
            "cloneVolumes:" + e.getMessage(),
            null,
            e);
        logMessages.add(
            0,
            new StorageLogMessage(
                IJavaEeLog.SEVERITY_ERROR, "OSFile", System.currentTimeMillis(), e.getMessage()));
        return StorageAdapterImplHelper.createFailedResponse(
            logMessages, CloneVolumesResponse.class);
      }
    }
    msg = "CloneVolumes operation ended";
    logMessages.add(
        new StorageLogMessage(IJavaEeLog.SEVERITY_INFO, "OSFile", System.currentTimeMillis(), msg));

    CloneVolumesResponse payload = new CloneVolumesResponse();
    context.operationId = operationId;
    context.customCloningProperties = prepareRequest.customCloningProperties;
    payload.cloneVolumeResult = context;
    StorageOperationResponse<CloneVolumesResponse> response =
        new StorageOperationResponse<CloneVolumesResponse>(payload);
    response.setLogMessages(logMessages);
    response.setPercentCompleted(100);
    response.setStatus(StorageOperationStatus.COMPLETED);
    response.setContext(context);
    return response;
  }