/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource.utils; import java.net.URI; import com.emc.storageos.model.file.FileShareRestRep; import com.emc.storageos.model.file.FileSystemDeleteParam; import com.emc.storageos.model.file.FileSystemExportList; import com.emc.storageos.model.file.FileSystemExportParam; import com.emc.storageos.model.file.FileSystemParam; import com.emc.storageos.model.file.FileExportUpdateParam; import com.emc.storageos.security.authentication.StorageOSUser; import com.emc.storageos.security.helpers.BaseServiceClient; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; import com.emc.storageos.model.TaskResourceRep; /** * This class provides access to the file services API for the data nodes and control operations * such as create, delete, unexport and export */ public class InternalFileServiceClient extends BaseServiceClient { private static final String INTERNAL_FILE_CREATE = "/internal/file/filesystems"; private static final String INTERNAL_FILE_ROOT = INTERNAL_FILE_CREATE + "/"; private static final String EXPORTS = "/exports"; private static final String MODIFYEXPORTS = "/internal/file/filesystems/%s/exports/%s,%s,%s,%s"; private static final String UNEXPORTS = "/internal/file/filesystems/%s/exports/%s,%s,%s,%s"; private static final String DEACTIVATE = "/deactivate"; private static final String RELEASE = "/release"; private static final String RELEASE_UNDO = RELEASE + "/undo"; private static final String TASK = "/tasks/"; private static final String SUB_DIRECTORY_QUERY_KEY = "subDirectory"; private static final String TASK_QUERY_KEY = "task"; final private Logger _log = LoggerFactory .getLogger(InternalFileServiceClient.class); /** * Client without target hosts */ public InternalFileServiceClient() { } /** * Client with specific host * * @param server */ public InternalFileServiceClient(String server) { setServer(server); } /** * Make client associated with this api server host (IP) * * @param server IP */ @Override public void setServer(String server) { setServiceURI(URI.create("https://" + server + ":8443")); } /** * Create file system * * @param fileSystemParam * @param token user authentication token * @return */ public TaskResourceRep createFileSystem( FileSystemParam fileSystemParam, String token) { WebResource rRoot = createRequest(INTERNAL_FILE_CREATE); WebResource.Builder requestBuilder = addSignature(rRoot); TaskResourceRep resp = addToken(requestBuilder, token) .post(TaskResourceRep.class, fileSystemParam); return resp; } /** * Export a file share * * @param fsId * @param exportParam * @return */ public TaskResourceRep exportFileSystem(URI fsId, FileSystemExportParam exportParam) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + EXPORTS); TaskResourceRep resp = addSignature(rRoot) .post(TaskResourceRep.class, exportParam); return resp; } /** * Modify existing export for a file share * * @param fsId fileshare id * @param protocol protocol for the existing export * @param securityType security type for the existing export * @param permissions permissios for the existing export * @param rootUserMapping usermapping for the existing export * @param updateParam export update param, which contains a list of end points which needs to be added/removed for * this export * @return Task in */ public TaskResourceRep modifyExports(URI fsId, String protocol, String securityType, String permissions, String rootUserMapping, FileExportUpdateParam updateParam) { String modifyExportPath = String.format(MODIFYEXPORTS, fsId, protocol, securityType, permissions, rootUserMapping); WebResource rRoot = createRequest(modifyExportPath); TaskResourceRep resp = null; try { resp = addSignature(rRoot) .put(TaskResourceRep.class, updateParam); } catch (UniformInterfaceException e) { _log.warn("could not modify exports", e); } return resp; } /** * Unexport a file share * * @param fsId * @param protocol * @param securityType * @param permissions * @param rootUserMapping * @param subDirectory * @return */ public TaskResourceRep unexportFileSystem(URI fsId, String protocol, String securityType, String permissions, String rootUserMapping, String subDirectory) { String unexportPath = String.format(UNEXPORTS, fsId, protocol, securityType, permissions, rootUserMapping); WebResource rRoot = createRequest(unexportPath); // add query params before signing the request if (StringUtils.isNotEmpty(subDirectory)) { rRoot = rRoot.queryParam(SUB_DIRECTORY_QUERY_KEY, subDirectory); } TaskResourceRep resp = null; try { resp = addSignature(rRoot) .delete(TaskResourceRep.class); } catch (UniformInterfaceException e) { _log.warn("could not unexport", e); } return resp; } /** * Delete file system (must be unexported first) * * @param fsId file system ID * @param token user authentication token * @param fileSystemDeleteParam parameter for file system deletion * @return */ public TaskResourceRep deactivateFileSystem(URI fsId, String token, FileSystemDeleteParam fileSystemDeleteParam) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + DEACTIVATE); WebResource.Builder requestBuilder = addSignature(rRoot); TaskResourceRep resp = addToken(requestBuilder, token) .post(TaskResourceRep.class, fileSystemDeleteParam); return resp; } /** * Get list of exports for this file system * * @param fsId file share ID * @return */ public FileSystemExportList getFileSystemExportList(URI fsId) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + EXPORTS); FileSystemExportList resp = addSignature(rRoot) .get(FileSystemExportList.class); return resp; } /** * Get the status of a file system task * * @param fsId file share ID * @param task task ID * @return */ public TaskResourceRep getTaskStatus(URI fsId, String task) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + TASK + task); TaskResourceRep resp = addSignature(rRoot) .get(TaskResourceRep.class); return resp; } /** * Release a ViPR file system for use by Object * * @param fileSystemParam * @param token user authentication token * @return a response object containing the previously set tenant and project */ public FileShareRestRep releaseFileSystem(URI fsId, StorageOSUser user) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + RELEASE); WebResource.Builder requestBuilder = addSignature(rRoot); FileShareRestRep resp = addTokens(requestBuilder, user.getToken(), user.getProxyToken()) .post(FileShareRestRep.class); return resp; } /** * Release a ViPR file system for use by Object * * @param fileSystemParam * @return * @throws Exception * @throws ClientHandlerException * @throws UniformInterfaceException */ public FileShareRestRep undoReleaseFileSystem(URI fsId) { WebResource rRoot = createRequest(INTERNAL_FILE_ROOT + fsId + RELEASE_UNDO); FileShareRestRep resp = addSignature(rRoot).post(FileShareRestRep.class); return resp; } }