private void createTargetSnapshot(
     String snapshotId, OpenstackFileCloneVolumeStatus status, String operationId)
     throws CloudClientException {
   String[] keys = {OpenstackConstants.TARGET_VOLUME_TAG, OpenstackConstants.CLONE_OPERATION_TAG};
   String[] values = new String[2];
   values[1] = operationId;
   String targetRegion =
       status.volumeToBeCloned.targetStorageSystemId.substring(
           status.volumeToBeCloned.targetStorageSystemId.indexOf(':') + 1);
   ShareSnapshot snapshot =
       openstackClient.copy(
           snapshotId,
           targetRegion,
           "LVM Snapshot to clone Volume " + status.volumeToBeCloned.sourceVolumeId);
   // is this used??
   status.targetSnapshotId = targetRegion + ':' + snapshot.getId();
 }
  @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;
  }