@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;
  }