/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.vnxe.requests;
import java.util.List;
import javax.ws.rs.core.MultivaluedMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.vnxe.VNXeConstants;
import com.emc.storageos.vnxe.VNXeException;
import com.emc.storageos.vnxe.VNXeUtils;
import com.emc.storageos.vnxe.models.FileSystemSnapCreateParam;
import com.emc.storageos.vnxe.models.VNXeCommandJob;
import com.emc.storageos.vnxe.models.VNXeCommandResult;
import com.emc.storageos.vnxe.models.VNXeFileSystemSnap;
import com.emc.storageos.vnxe.models.VNXeSnapRestoreParam;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class FileSystemSnapRequests extends KHRequests<VNXeFileSystemSnap> {
private static final Logger _logger = LoggerFactory.getLogger(FileSystemSnapRequests.class);
private static final String URL = "/api/types/filesystemSnap/instances";
private static final String URL_INSTANCE = "/api/instances/filesystemSnap/";
private static final String URL_RESTORE = "/action/restore";
private static final String URL_V31 = "/api/types/snap/instances";
private static final String URL_INSTANCE_V31 = "/api/instances/snap/";
public FileSystemSnapRequests(KHClient client, String softwareVersion) {
super(client);
if (!VNXeUtils.isHigherVersion(softwareVersion, VNXeConstants.VNXE_BASE_SOFT_VER)) {
_url = URL;
} else {
_url = URL_V31;
}
}
public FileSystemSnapRequests(KHClient client) {
super(client);
_url = URL;
}
/**
* create file system snap in async mode
*
* @param param: FileSystemSnapCreateParam
* @return VNXeCommandJob
* @throws VNXeException
*/
public VNXeCommandJob createFileSystemSnap(FileSystemSnapCreateParam param) throws VNXeException {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(VNXeConstants.TIMEOUT, "0");
setQueryParameters(queryParams);
return postRequestAsync(param);
}
/**
* Get snapshot details by its name
*
* @param name
* @return
*/
public VNXeFileSystemSnap getByName(String name) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(VNXeConstants.FILTER, VNXeConstants.NAME_FILTER + "\"" + name + "\"");
setQueryParameters(queryParams);
VNXeFileSystemSnap result = null;
List<VNXeFileSystemSnap> snapList = getDataForObjects(VNXeFileSystemSnap.class);
// it should just return 1
if (snapList != null && !snapList.isEmpty()) {
result = snapList.get(0);
_logger.info("file system snapshot found using the name: " + name);
} else {
_logger.info("No file system snapshot found using the name: " + name);
}
return result;
}
/**
* Delete file system snap
*
* @param snapId
* @return
* @throws VNXeException
*/
public VNXeCommandJob deleteFileSystemSnap(String snapId, String softwareVersion) throws VNXeException {
if (!VNXeUtils.isHigherVersion(softwareVersion, VNXeConstants.VNXE_BASE_SOFT_VER)) {
_url = URL_INSTANCE + snapId;
} else {
_url = URL_INSTANCE_V31 + snapId;
}
setQueryParameters(null);
if (getDataForOneObject(VNXeFileSystemSnap.class) != null) {
unsetQueryParameters();
return deleteRequestAsync(null);
} else {
throw VNXeException.exceptions.vnxeCommandFailed(String.format("No filesystem snap %s found",
snapId));
}
}
public VNXeCommandResult deleteFileSystemSnapSync(String snapId, String softwareVersion) throws VNXeException {
if (!VNXeUtils.isHigherVersion(softwareVersion, VNXeConstants.VNXE_BASE_SOFT_VER)) {
_url = URL_INSTANCE + snapId;
} else {
_url = URL_INSTANCE_V31 + snapId;
}
VNXeCommandResult result = new VNXeCommandResult();
setQueryParameters(null);
if (getDataForOneObject(VNXeFileSystemSnap.class) != null) {
unsetQueryParameters();
deleteRequest(null);
result.setSuccess(true);
return result;
} else {
throw VNXeException.exceptions.vnxeCommandFailed(String.format("No filesystem snap %s found",
snapId));
}
}
/**
* Get the specific file system snap's details
*
* @return
*/
public VNXeFileSystemSnap getFileSystemSnap(String snapId, String softwareVersion) throws VNXeException {
if (!VNXeUtils.isHigherVersion(softwareVersion, VNXeConstants.VNXE_BASE_SOFT_VER)) {
_url = URL_INSTANCE + snapId;
} else {
_url = URL_INSTANCE_V31 + snapId;
}
setQueryParameters(null);
return getDataForOneObject(VNXeFileSystemSnap.class);
}
/**
* Restore FS snapshot
*
* @param snapId snapshot VNXe Id
* @param restoreParam
* @return VNXeCommandJob
* @throws VNXeException
*/
public VNXeCommandJob restoreFileSystemSnap(String snapId, VNXeSnapRestoreParam restoreParam, String softwareVersion)
throws VNXeException {
StringBuilder urlBuilder;
if (!VNXeUtils.isHigherVersion(softwareVersion, VNXeConstants.VNXE_BASE_SOFT_VER)) {
urlBuilder = new StringBuilder(URL_INSTANCE);
} else {
urlBuilder = new StringBuilder(URL_INSTANCE_V31);
}
urlBuilder.append(snapId);
urlBuilder.append(URL_RESTORE);
_url = urlBuilder.toString();
return postRequestAsync(restoreParam);
}
/**
* Get a file system's snaps by its storageResource id.
*
* @param fsId file system Id
* @return list of VNXeFileSystemSnap
*/
public List<VNXeFileSystemSnap> getFileSystemSnaps(String resourceId) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add(VNXeConstants.FILTER, VNXeConstants.STORAGE_RESOURCE_FILTER + "\"" + resourceId + "\"");
setQueryParameters(queryParams);
return getDataForObjects(VNXeFileSystemSnap.class);
}
}