use of com.emc.storageos.db.client.model.StorageHADomain in project coprhd-controller by CoprHD.
the class VNXFileCommApi method getParentMoverName.
private String getParentMoverName(URI parentMoverId) {
String parentMoverName = null;
_log.info("getParentMoverName {} ", parentMoverId);
StorageHADomain matchingMover = _dbClient.queryObject(StorageHADomain.class, parentMoverId);
if (matchingMover != null) {
parentMoverName = matchingMover.getAdapterName();
}
return parentMoverName;
}
use of com.emc.storageos.db.client.model.StorageHADomain in project coprhd-controller by CoprHD.
the class VNXFileCommApi method deleteFileSystem.
public XMLApiResult deleteFileSystem(final StorageSystem system, final String fileId, final String fileSys, final boolean isForceDelete, FileShare fs) throws VNXException {
_log.info("Delete VNX File System: fs id {}, Force Delete {}", fileId, isForceDelete);
XMLApiResult result = new XMLApiResult();
if (null == fileId || null == fileSys || fileId.trim().equals("") || fileSys.trim().equals("")) {
result.setCommandFailed();
result.setMessage("Invalid Input Parameters.");
return result;
}
Map<String, Object> reqAttributeMap = new ConcurrentHashMap<String, Object>();
try {
updateAttributes(reqAttributeMap, system);
reqAttributeMap.put(VNXFileConstants.FILESYSTEM_NAME, fileSys);
reqAttributeMap.put(VNXFileConstants.FILESYSTEM_ID, fileId);
_provExecutor.setKeyMap(reqAttributeMap);
// Before deleting check whether it is available or not on the array - This need to be done as part of
// deleting un-managed FS.
_provExecutor.setKeyMap(reqAttributeMap);
_provExecutor.execute((Namespace) _provNamespaces.getNsList().get(PROV_FSIDQUERY_FILE_DELETE));
boolean isFsAvailable = false;
_log.debug("Listing VNX File File Systems");
String cmdResult = (String) _provExecutor.getKeyMap().get(VNXFileConstants.CMD_RESULT);
if (null != cmdResult && cmdResult.equals(VNXFileConstants.CMD_SUCCESS)) {
isFsAvailable = (Boolean) _provExecutor.getKeyMap().get(VNXFileConstants.IS_FILESYSTEM_AVAILABLE_ON_ARRAY);
}
if (!isFsAvailable) {
_log.debug("File System **Not found on array which requested to delete.");
result.setCommandSuccess();
// No need to set Inactive and persist here as this will be done in upper layer(FileDeviceController)
}
if (isForceDelete) {
// handle snapshots
_provExecutor.execute((Namespace) _provNamespaces.getNsList().get(PROV_FS_FORCE_DEL_FILE));
cmdResult = (String) _provExecutor.getKeyMap().get(VNXFileConstants.CMD_RESULT);
StorageHADomain dataMover = getDataMover(fs);
if (cmdResult.equals(VNXFileConstants.CMD_SUCCESS)) {
List<Checkpoint> snaps = (List<Checkpoint>) _provExecutor.getKeyMap().get(VNXFileConstants.SNAPSHOTS_LIST);
int numSnapshots = (snaps != null) ? snaps.size() : 0;
_log.info("Number of Snapshots found {} for a file system {}", numSnapshots, fileId);
if (snaps != null && !snaps.isEmpty()) {
for (Checkpoint checkpoint : snaps) {
_log.info("Deleting Snapshot having name {} - and id {}", checkpoint.getName(), checkpoint.getCheckpoint());
String nativeGuid = NativeGUIDGenerator.getNativeGuidforSnapshot(system, system.getSerialNumber(), checkpoint.getCheckpoint());
_log.info("NativeGuid {} built for snapshot {}", nativeGuid, checkpoint.getCheckpoint());
Snapshot snapshot = null;
List<URI> snapShotUris = _dbClient.queryByConstraint(AlternateIdConstraint.Factory.getSnapshotNativeGuidConstraint(nativeGuid));
_log.info("{} Snapshots found with native guid : {} ", snapShotUris.size(), nativeGuid);
if (!snapShotUris.isEmpty()) {
_log.info("Retriving Snapshot using URI : {} ", snapShotUris.get(0));
snapshot = _dbClient.queryObject(Snapshot.class, snapShotUris.get(0));
}
if (snapshot != null) {
result = deleteAllExportsAndShares(system, dataMover, fs, snapshot);
XMLApiResult status = doDeleteSnapshot(system, checkpoint.getCheckpoint(), checkpoint.getName(), false);
if (!status.isCommandSuccess()) {
String errMsg = (String) _provExecutor.getKeyMap().get(VNXFileConstants.FAULT_DESC);
result.setCommandFailed();
result.setMessage(errMsg);
return result;
}
}
}
}
// Delete All Quota directories of FileShare.
result = deleteAllQuotaDirs(system, dataMover, fs);
// Delete Exports/SMB Shares of FileShare
result = deleteAllExportsAndShares(system, dataMover, fs, null);
} else {
String errMsg = (String) _provExecutor.getKeyMap().get(VNXFileConstants.FAULT_DESC);
result.setCommandFailed();
result.setMessage(errMsg);
return result;
}
}
if (isFsAvailable) {
_log.debug("File System found on array which requested to delete. Now, deleting on Array.");
// First unmount it
StorageHADomain dataMover = getDataMover(fs);
if (dataMover != null) {
Map<String, String> existingMounts = sshApi.getFsMountpathMap(dataMover.getAdapterName());
// is FS mount still exists?
if (existingMounts.get(fs.getName()) != null) {
// The File system is mounted and we need to unmount it before deleting it
String unMountCmd = sshApi.formatUnMountCmd(dataMover.getAdapterName(), fs.getMountPath(), "NFS");
_log.info("Unmount FS {}", unMountCmd);
sshApi.setConnParams(system.getIpAddress(), system.getUsername(), system.getPassword());
result = sshApi.executeSshRetry(VNXFileSshApi.SERVER_UNMOUNT_CMD, unMountCmd);
}
} else {
_log.info("No need to Unmount FS {} since there is no mount info", fs.getMountPath());
}
_provExecutor.setKeyMap(reqAttributeMap);
_provExecutor.execute((Namespace) _provNamespaces.getNsList().get(PROV_FSDEL_FILE));
cmdResult = (String) _provExecutor.getKeyMap().get(VNXFileConstants.CMD_RESULT);
if (null != cmdResult && cmdResult.equals(VNXFileConstants.CMD_SUCCESS)) {
result.setCommandSuccess();
} else {
String errMsg = (String) _provExecutor.getKeyMap().get(VNXFileConstants.FAULT_DESC);
result.setCommandFailed();
result.setMessage(errMsg);
}
}
} catch (Exception e) {
throw new VNXException("File system delete exception: ", e);
}
return result;
}
use of com.emc.storageos.db.client.model.StorageHADomain in project coprhd-controller by CoprHD.
the class UnManagedFilesystemService method ingestFileSystems.
/**
* UnManaged file systems are file systems, which are present within ViPR
* storage systems,but have not been ingested by ViPR which moves the unmanaged file systems under ViPR management.
*
* File system ingest provides flexibility in bringing unmanaged
* file systems under ViPR management.
* An unmanaged file system must be associated with a virtual pool, project,
* and virtual array before it can be managed by ViPR.
* List of supported virtual pools for each unmanaged file system is exposed using /vdc/unmanaged/filesystems/bulk.
* Using an unsupported virtual pool results in an error
*
* Size of unmanaged file systems which can be ingested via a single API Call
* is limited to 4000.
*
* @param param
* parameters required for unmanaged filesystem ingestion
*
* @prereq none
* @brief Ingest unmanaged file systems
* @throws InternalException
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Path("/ingest")
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN })
public NamedFileSystemList ingestFileSystems(FileSystemIngest param) throws InternalException {
if ((null == param.getUnManagedFileSystems()) || (param.getUnManagedFileSystems().toString().length() == 0) || (param.getUnManagedFileSystems().isEmpty()) || (param.getUnManagedFileSystems().get(0).toString().isEmpty())) {
throw APIException.badRequests.invalidParameterUnManagedFsListEmpty();
}
if (null == param.getProject() || (param.getProject().toString().length() == 0)) {
throw APIException.badRequests.invalidParameterProjectEmpty();
}
if (null == param.getVarray() || (param.getVarray().toString().length() == 0)) {
throw APIException.badRequests.invalidParameterVirtualArrayEmpty();
}
if (null == param.getVpool() || (param.getVpool().toString().length() == 0)) {
throw APIException.badRequests.invalidParameterVirtualPoolEmpty();
}
if (param.getUnManagedFileSystems().size() > getMaxBulkSize()) {
throw APIException.badRequests.exceedingLimit("unmanaged filesystems", getMaxBulkSize());
}
_logger.info("Ingest called with Virtual Array {}", param.getVarray());
_logger.info("Ingest called with Virtual Pool {}", param.getVpool());
_logger.info("Ingest called with Project {}", param.getProject());
_logger.info("Ingest called with UnManagedFileSystems {}", param.getUnManagedFileSystems());
NamedFileSystemList filesystemList = new NamedFileSystemList();
List<UnManagedFileSystem> unManagedFileSystems = new ArrayList<UnManagedFileSystem>();
try {
// Get and validate the project.
Project project = _permissionsHelper.getObjectById(param.getProject(), Project.class);
ArgValidator.checkUri(param.getProject());
ArgValidator.checkEntity(project, param.getProject(), false);
VirtualArray neighborhood = FileSystemIngestionUtil.getVirtualArrayForFileSystemCreateRequest(project, param.getVarray(), _permissionsHelper, _dbClient);
// Get and validate the VirtualPool.
VirtualPool cos = FileSystemIngestionUtil.getVirtualPoolForFileSystemCreateRequest(project, param.getVpool(), _permissionsHelper, _dbClient);
if (null != cos.getVirtualArrays() && !cos.getVirtualArrays().isEmpty() && !cos.getVirtualArrays().contains(param.getVarray().toString())) {
throw APIException.internalServerErrors.virtualPoolNotMatchingVArray(param.getVarray());
}
// check for Quotas
long unManagedFileSystemsCapacity = FileSystemIngestionUtil.getTotalUnManagedFileSystemCapacity(_dbClient, param.getUnManagedFileSystems());
_logger.info("Requested UnManagedFile System Capacity {}", unManagedFileSystemsCapacity);
TenantOrg tenant = _dbClient.queryObject(TenantOrg.class, project.getTenantOrg().getURI());
CapacityUtils.validateQuotasForProvisioning(_dbClient, cos, project, tenant, unManagedFileSystemsCapacity, "filesystem");
FileSystemIngestionUtil.isIngestionRequestValidForUnManagedFileSystems(param.getUnManagedFileSystems(), cos, _dbClient);
List<FileShare> filesystems = new ArrayList<FileShare>();
Map<URI, FileShare> unManagedFSURIToFSMap = new HashMap<>();
List<FileExportRule> fsExportRules = new ArrayList<FileExportRule>();
List<CifsShareACL> fsCifsShareAcls = new ArrayList<CifsShareACL>();
List<NFSShareACL> fsNfsShareAcls = new ArrayList<NFSShareACL>();
List<UnManagedFileExportRule> inActiveUnManagedExportRules = new ArrayList<UnManagedFileExportRule>();
List<UnManagedCifsShareACL> inActiveUnManagedShareCifs = new ArrayList<UnManagedCifsShareACL>();
List<UnManagedNFSShareACL> inActiveUnManagedShareNfs = new ArrayList<UnManagedNFSShareACL>();
// cifs share acl's
List<CifsShareACL> cifsShareACLList = new ArrayList<CifsShareACL>();
List<URI> full_pools = new ArrayList<URI>();
List<URI> full_systems = new ArrayList<URI>();
Calendar timeNow = Calendar.getInstance();
for (URI unManagedFileSystemUri : param.getUnManagedFileSystems()) {
long softLimit = 0;
int softGrace = 0;
long notificationLimit = 0;
UnManagedFileSystem unManagedFileSystem = _dbClient.queryObject(UnManagedFileSystem.class, unManagedFileSystemUri);
if (null == unManagedFileSystem || null == unManagedFileSystem.getFileSystemCharacterstics() || null == unManagedFileSystem.getFileSystemInformation()) {
_logger.warn("UnManaged FileSystem {} partially discovered, hence not enough information available to validate neither virtualPool nor other criterias.Skipping Ingestion..", unManagedFileSystemUri);
continue;
}
if (unManagedFileSystem.getInactive()) {
_logger.warn("UnManaged FileSystem {} is inactive.Skipping Ingestion..", unManagedFileSystemUri);
continue;
}
if (!FileSystemIngestionUtil.checkVirtualPoolValidForUnManagedFileSystem(_dbClient, cos, unManagedFileSystemUri)) {
continue;
}
StringSetMap unManagedFileSystemInformation = unManagedFileSystem.getFileSystemInformation();
String fsNativeGuid = unManagedFileSystem.getNativeGuid().replace(FileSystemIngestionUtil.UNMANAGEDFILESYSTEM, FileSystemIngestionUtil.FILESYSTEM);
String deviceLabel = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.DEVICE_LABEL.toString(), unManagedFileSystemInformation);
String fsName = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.NAME.toString(), unManagedFileSystemInformation);
URI storagePoolUri = unManagedFileSystem.getStoragePoolUri();
String storagePortUri = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.STORAGE_PORT.toString(), unManagedFileSystemInformation);
String capacity = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.PROVISIONED_CAPACITY.toString(), unManagedFileSystemInformation);
String usedCapacity = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.ALLOCATED_CAPACITY.toString(), unManagedFileSystemInformation);
String nasUri = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.NAS.toString(), unManagedFileSystemInformation);
String path = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.PATH.toString(), unManagedFileSystemInformation);
String mountPath = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.MOUNT_PATH.toString(), unManagedFileSystemInformation);
String nativeId = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.NATIVE_ID.toString(), unManagedFileSystemInformation);
String systemType = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.SYSTEM_TYPE.toString(), unManagedFileSystemInformation);
String softLt = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.SOFT_LIMIT.toString(), unManagedFileSystemInformation);
String softGr = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.SOFT_GRACE.toString(), unManagedFileSystemInformation);
String notificationLt = PropertySetterUtil.extractValueFromStringSet(SupportedFileSystemInformation.NOTIFICATION_LIMIT.toString(), unManagedFileSystemInformation);
if (null != softLt && !softLt.isEmpty()) {
softLimit = Long.valueOf(softLt);
}
if (null != softGr && !softGr.isEmpty()) {
softGrace = Integer.valueOf(softGr);
}
if (null != notificationLt && !notificationLt.isEmpty()) {
notificationLimit = Long.valueOf(notificationLt);
}
Long lcapcity = Long.valueOf(capacity);
Long lusedCapacity = Long.valueOf(usedCapacity);
// pool uri cannot be null
StoragePool pool = _dbClient.queryObject(StoragePool.class, storagePoolUri);
StoragePort port = null;
if (storagePortUri != null) {
port = _dbClient.queryObject(StoragePort.class, URI.create(storagePortUri));
}
StorageHADomain dataMover = null;
if (port != null && port.getStorageHADomain() != null) {
dataMover = _dbClient.queryObject(StorageHADomain.class, port.getStorageHADomain());
}
if (dataMover != null) {
_logger.info("Data Mover to Use {} {} {}", new Object[] { dataMover.getAdapterName(), dataMover.getName(), dataMover.getLabel() });
}
// Check for same name File Share in this project
if (FileSystemIngestionUtil.checkForDuplicateFSName(_dbClient, project.getId(), deviceLabel, filesystems)) {
_logger.info("File System with name: {} already exists in the given project: {} so, ignoring it..", deviceLabel, project.getLabel());
continue;
}
// check ingestion is valid for given project
if (!isIngestUmfsValidForProject(project, _dbClient, nasUri)) {
_logger.info("UnManaged FileSystem path {} is mounted on vNAS URI {} which is invalid for project.", path, nasUri);
continue;
}
// Check for same named File Share in this project
if (FileSystemIngestionUtil.checkForDuplicateFSName(_dbClient, project.getId(), deviceLabel, filesystems)) {
_logger.info("File System with name: {} already exists in given project: {} so, ignoring it..", deviceLabel, project.getLabel());
continue;
}
// if not don't ingest
if (null != pool) {
StringSet taggedVirtualArrays = pool.getTaggedVirtualArrays();
if ((null == taggedVirtualArrays) || (!taggedVirtualArrays.contains(neighborhood.getId().toString()))) {
_logger.warn("UnManaged FileSystem {} storagepool doesn't related to the Virtual Array {}. Skipping Ingestion..", unManagedFileSystemUri, neighborhood.getId().toString());
continue;
}
} else {
_logger.warn("UnManaged FileSystem {} doesn't contain a storagepool. Skipping Ingestiong", unManagedFileSystemUri);
continue;
}
if (full_pools.contains(storagePoolUri)) {
// skip this fileshare
continue;
}
if (pool.getIsResourceLimitSet()) {
if (pool.getMaxResources() <= StoragePoolService.getNumResources(pool, _dbClient)) {
// reached limit for this pool
full_pools.add(storagePoolUri);
continue;
}
}
FileShare filesystem = new FileShare();
filesystem.setId(URIUtil.createId(FileShare.class));
filesystem.setNativeGuid(fsNativeGuid);
filesystem.setCapacity(lcapcity);
filesystem.setUsedCapacity(lusedCapacity);
filesystem.setPath(path);
filesystem.setMountPath(mountPath);
filesystem.setVirtualPool(param.getVpool());
filesystem.setVirtualArray(param.getVarray());
filesystem.setSoftLimit(softLimit);
filesystem.setSoftGracePeriod(softGrace);
filesystem.setNotificationLimit(notificationLimit);
if (nasUri != null) {
filesystem.setVirtualNAS(URI.create(nasUri));
if (!doesNASServerSupportVPoolProtocols(nasUri, cos.getProtocols())) {
_logger.warn("UnManaged FileSystem NAS server {} doesn't support vpool protocols. Skipping Ingestion...", nasUri);
continue;
}
}
if (nativeId != null) {
filesystem.setNativeId(nativeId);
}
URI storageSystemUri = unManagedFileSystem.getStorageSystemUri();
StorageSystem system = _dbClient.queryObject(StorageSystem.class, storageSystemUri);
if (full_systems.contains(storageSystemUri)) {
// skip this fileshare
continue;
}
if (system.getIsResourceLimitSet()) {
if (system.getMaxResources() <= StorageSystemService.getNumResources(system, _dbClient)) {
// reached limit for this system
full_systems.add(storageSystemUri);
continue;
}
}
filesystem.setStorageDevice(storageSystemUri);
filesystem.setCreationTime(timeNow);
filesystem.setPool(storagePoolUri);
filesystem.setProtocol(new StringSet());
StringSet fsSupportedProtocols = new StringSet();
for (StorageProtocol.File fileProtocol : StorageProtocol.File.values()) {
fsSupportedProtocols.add(fileProtocol.name());
}
// fs support protocol which is present in StoragePool and VirtualPool both
fsSupportedProtocols.retainAll(pool.getProtocols());
fsSupportedProtocols.retainAll(cos.getProtocols());
filesystem.getProtocol().addAll(fsSupportedProtocols);
filesystem.setLabel(null == deviceLabel ? "" : deviceLabel);
filesystem.setName(null == fsName ? "" : fsName);
filesystem.setTenant(new NamedURI(project.getTenantOrg().getURI(), filesystem.getLabel()));
filesystem.setProject(new NamedURI(param.getProject(), filesystem.getLabel()));
_logger.info("Un Managed File System {} has exports? : {}", unManagedFileSystem.getId(), unManagedFileSystem.getHasExports());
StoragePort sPort = null;
if (port != null && neighborhood != null) {
if (StorageSystem.Type.isilon.toString().equals(system.getSystemType())) {
sPort = getIsilonStoragePort(port, nasUri, neighborhood.getId());
} else {
sPort = compareAndSelectPortURIForUMFS(system, port, neighborhood);
}
}
/*
* If UMFS storage port is not part of the vArray then skip ingestion
*/
if (sPort == null) {
_logger.warn("Storage port of UMFS {} doesn't belong to a matching NetWork. So skipping ingestion", unManagedFileSystemUri);
continue;
}
_logger.info("Storage Port Found {}", sPort);
filesystem.setPortName(sPort.getPortName());
filesystem.setStoragePort(sPort.getId());
if (unManagedFileSystem.getHasExports()) {
filesystem.setFsExports(PropertySetterUtil.convertUnManagedExportMapToManaged(unManagedFileSystem.getFsUnManagedExportMap(), sPort, dataMover));
_logger.info("Export map for {} = {}", fsName, filesystem.getFsExports());
// Process Exports
// Step 1 : Query them and Retrive associated Exports
List<UnManagedFileExportRule> exports = queryDBFSExports(unManagedFileSystem);
_logger.info("Number of Exports Found : {} for UnManaged Fs path : {}", exports.size(), unManagedFileSystem.getMountPath());
if (exports != null && !exports.isEmpty()) {
for (UnManagedFileExportRule rule : exports) {
// Step 2 : Convert them to File Export Rule
// Step 3 : Keep them as a list to store in db, down the line at a shot
// Important to relate the exports to a
rule.setFileSystemId(filesystem.getId());
// FileSystem.
createRule(rule, fsExportRules);
// Step 4: Update the UnManaged Exports : Set Inactive as true
rule.setInactive(true);
// Step 5 : Keep this list as updated.
inActiveUnManagedExportRules.add(rule);
}
}
}
if (unManagedFileSystem.getHasShares()) {
filesystem.setSMBFileShares(PropertySetterUtil.convertUnManagedSMBMapToManaged(unManagedFileSystem.getUnManagedSmbShareMap(), sPort, dataMover));
_logger.info("Share map for {} = {}", fsName, filesystem.getSMBFileShares());
// Process Exports
// Step 1 : Query them and Retrive associated Exports
List<UnManagedCifsShareACL> cifsACLs = queryDBCifsShares(unManagedFileSystem);
_logger.info("Number of Cifs ACL Found : {} for UnManaged Fs path : {}", cifsACLs.size(), unManagedFileSystem.getMountPath());
if (cifsACLs != null && !cifsACLs.isEmpty()) {
for (UnManagedCifsShareACL umCifsAcl : cifsACLs) {
// Step 2 : Convert them to Cifs Share ACL
// Step 3 : Keep them as a list to store in db, down the line at a shot
// Important to relate the shares to a
umCifsAcl.setFileSystemId(filesystem.getId());
// FileSystem.
createACL(umCifsAcl, fsCifsShareAcls, filesystem);
// Step 4: Update the UnManaged Share ACL : Set Inactive as true
umCifsAcl.setInactive(true);
// Step 5 : Keep this list as updated.
inActiveUnManagedShareCifs.add(umCifsAcl);
}
}
}
if (unManagedFileSystem.getHasNFSAcl()) {
List<UnManagedNFSShareACL> nfsACLs = queryDBNfsShares(unManagedFileSystem);
if (nfsACLs != null && !nfsACLs.isEmpty()) {
for (UnManagedNFSShareACL umNfsAcl : nfsACLs) {
// Step 2 : Convert them to nfs Share ACL
// Step 3 : Keep them as a list to store in db, down the line at a shot
// Important to relate the shares to a
umNfsAcl.setFileSystemId(filesystem.getId());
// FileSystem.
if (umNfsAcl.getPermissions().isEmpty()) {
continue;
}
createNFSACL(umNfsAcl, fsNfsShareAcls, filesystem);
// Step 4: Update the UnManaged Share ACL : Set Inactive as true
umNfsAcl.setInactive(true);
// Step 5 : Keep this list as updated.
inActiveUnManagedShareNfs.add(umNfsAcl);
}
}
}
// Set quota
if (null != unManagedFileSystem.getExtensions() && null != unManagedFileSystem.getExtensions().get(QUOTA)) {
if (null == filesystem.getExtensions()) {
filesystem.setExtensions(new StringMap());
}
filesystem.getExtensions().put(QUOTA, unManagedFileSystem.getExtensions().get(QUOTA));
}
filesystems.add(PropertySetterUtil.addFileSystemDetails(unManagedFileSystemInformation, filesystem));
// Process Export Rules for the validated FS.
filesystemList.getFilesystems().add(toNamedRelatedResource(ResourceTypeEnum.FILE, filesystem.getId(), filesystem.getNativeGuid()));
unManagedFileSystem.setInactive(true);
unManagedFileSystems.add(unManagedFileSystem);
unManagedFSURIToFSMap.put(unManagedFileSystemUri, filesystem);
}
int i = 0;
// Test
for (FileShare fs : filesystems) {
++i;
_logger.info("{} --> Saving FS to DB {}", i, fs);
_logger.info(" --> Fs Storage Pool {} and Virtual Pool {}", fs.getPool(), fs.getVirtualPool());
}
_dbClient.createObject(filesystems);
for (URI unManagedFSURI : param.getUnManagedFileSystems()) {
FileShare fs = unManagedFSURIToFSMap.get(unManagedFSURI);
if (fs != null) {
_logger.debug("ingesting quota directories for filesystem {}", fs.getId());
ingestFileQuotaDirectories(fs);
}
}
i = 0;
// Test
for (FileExportRule rule : fsExportRules) {
++i;
_logger.info("{} --> Saving Export rule to DB {}", i, rule);
}
// Step 6.1 : Update the same in DB & Add new export rules
_dbClient.createObject(fsExportRules);
// Step 6.2 : Update Cifs Acls in DB & Add new ACLs
i = 0;
for (CifsShareACL acl : fsCifsShareAcls) {
++i;
_logger.info("{} --> Saving New Cifs ACL to DB {}", i, acl);
}
if (fsCifsShareAcls != null && !fsCifsShareAcls.isEmpty()) {
_dbClient.createObject(fsCifsShareAcls);
}
// Step 7.1 : Update the same in DB & clean ingested UnManagedCifsACLs
i = 0;
for (UnManagedCifsShareACL acl : inActiveUnManagedShareCifs) {
++i;
_logger.info("{} Updating UnManagedACL DB as InActive TRUE {}", acl);
}
_dbClient.updateObject(inActiveUnManagedShareCifs);
// Step 7.2 : Update the same in DB & clean Unmanaged ExportRule
i = 0;
for (UnManagedFileExportRule rule : inActiveUnManagedExportRules) {
++i;
_logger.info("{} Updating DB as InActive TRUE {}", rule);
}
_dbClient.updateObject(inActiveUnManagedExportRules);
_dbClient.updateObject(unManagedFileSystems);
// Step 8.1 : Update NFS Acls in DB & Add new ACLs
if (fsNfsShareAcls != null && !fsNfsShareAcls.isEmpty()) {
_logger.info("Saving {} NFS ACLs to DB", fsNfsShareAcls.size());
_dbClient.createObject(fsNfsShareAcls);
}
// UnManagedNFSShareACLs
if (inActiveUnManagedShareNfs != null && !inActiveUnManagedShareNfs.isEmpty()) {
_logger.info("Saving {} UnManagedNFS ACLs to DB", inActiveUnManagedShareNfs.size());
_dbClient.updateObject(inActiveUnManagedShareNfs);
}
// record the events after they have been created
for (FileShare filesystem : filesystems) {
recordFileSystemOperation(_dbClient, OperationTypeEnum.INGEST_FILE_SYSTEM, Status.ready, filesystem.getId());
}
} catch (InternalException e) {
throw e;
} catch (Exception e) {
_logger.error("Unexpected exception:", e);
throw APIException.internalServerErrors.genericApisvcError(e.getMessage(), e);
}
return filesystemList;
}
use of com.emc.storageos.db.client.model.StorageHADomain in project coprhd-controller by CoprHD.
the class StorageSystemService method createStoragePort.
/**
* Creates the storage port.
* It is only applicable to cinder storage systems for users to manually create it on ViPR.
* Currently there is no API available to get these information from Cinder.
*
* @param id the storage system id
* @param param the StoragePortRequestParam
* @brief Define a storage port (for Cinder only)
* @return A StoragePortRestRep reference specifying the data for the
* created port.
* @throws ControllerException the controller exception
*/
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@CheckPermission(roles = { Role.SYSTEM_ADMIN, Role.RESTRICTED_SYSTEM_ADMIN })
@Path("/{id}/storage-ports")
public StoragePortRestRep createStoragePort(@PathParam("id") URI id, StoragePortRequestParam param) throws ControllerException {
ArgValidator.checkFieldUriType(id, StorageSystem.class, "id");
StorageSystem system = queryResource(id);
// Creating storage ports is supported only for openstack system
if (!Type.openstack.name().equalsIgnoreCase(system.getSystemType())) {
throw APIException.badRequests.cannotCreatePortForSystem(system.getSystemType());
}
ArgValidator.checkFieldNotEmpty(param.getName(), "name");
String portName = param.getName();
// validate transport type
ArgValidator.checkFieldNotEmpty(param.getTransportType(), "transport_type");
ArgValidator.checkFieldValueFromEnum(param.getTransportType(), "transport_type", EnumSet.of(TransportType.FC, TransportType.IP));
String transportType = param.getTransportType();
// validate port network id
String portNetworkId = param.getPortNetworkId();
ArgValidator.checkFieldNotEmpty(param.getPortNetworkId(), "port_network_id");
StoragePortService.checkValidPortNetworkId(transportType, portNetworkId);
// check for duplicate port name on the same system
checkForDuplicatePortName(portName, id);
// check for duplicate port network id within the system
StoragePortService.checkForDuplicatePortNetworkIdWithinSystem(_dbClient, portNetworkId, id);
StorageHADomain adapter = CinderUtils.getStorageAdapter(system, _dbClient);
StoragePort port = new StoragePort();
port.setId(URIUtil.createId(StoragePort.class));
port.setStorageDevice(id);
String nativeGuid = NativeGUIDGenerator.generateNativeGuid(system, portName, NativeGUIDGenerator.PORT);
port.setNativeGuid(nativeGuid);
port.setPortNetworkId(portNetworkId);
port.setRegistrationStatus(DiscoveredDataObject.RegistrationStatus.REGISTERED.toString());
// always treat it as a frontend port
port.setPortType(PortType.frontend.name());
port.setOperationalStatus(OperationalStatus.OK.toString());
port.setTransportType(transportType);
port.setLabel(portName);
port.setPortName(portName);
port.setStorageHADomain(adapter.getId());
port.setPortGroup(CinderConstants.CINDER_PORT_GROUP);
port.setCompatibilityStatus(CompatibilityStatus.COMPATIBLE.name());
_dbClient.createObject(port);
// runs pool matcher as well
StoragePortAssociationHelper.runUpdatePortAssociationsProcess(Collections.singleton(port), null, _dbClient, _coordinator, null);
// Create an audit log entry
auditOp(OperationTypeEnum.CREATE_STORAGE_PORT, true, null, port.getLabel(), port.getId().toString());
return MapStoragePort.getInstance(_dbClient).toStoragePortRestRep(port);
}
use of com.emc.storageos.db.client.model.StorageHADomain in project coprhd-controller by CoprHD.
the class StoragePortsAllocator method selectStoragePorts.
/**
* This code is only called in the kernel code path, not in the testing code
* path.
*
* @param dbClient
* -- The Cassandra client.
* @param spList
* -- A list of StoragePorts in this Transport Zone
* @param net
* The Network itself.
* @param varrayURI
* The URI of a virtual array to which the network is assigned.
* @param numPorts
* The number of ports requested to be allocated.
* @param allowFewerPorts
* If set, allow fewer ports to be allocated than numPorts requested.
* @param switchToMaxPortNumber
* The map of switch name to storage port numbers to be allocated for the network
* @return
* @throws PlacementException if not enough ports are allocated
*/
public List<StoragePort> selectStoragePorts(DbClient dbClient, Map<StoragePort, Long> sportMap, NetworkLite net, URI varrayURI, Integer numPorts, Set<StoragePort> previouslyAllocatedPorts, boolean allowFewerPorts, Map<String, Integer> switchToMaxPortNumber) throws PlacementException {
if (numPorts == null || numPorts <= 0) {
// Default value if too low
numPorts = 2;
}
// Determine if we should check connectivity from the Network's varray.auto_san_zoning
boolean checkConnectivity = false;
VirtualArray varray = dbClient.queryObject(VirtualArray.class, varrayURI);
if (varray != null && NetworkScheduler.isZoningRequired(dbClient, varray) && !net.getTransportType().equals(StorageProtocol.Transport.IP.name())) {
checkConnectivity = true;
}
// Find all the StoragePorts in the StorageArray
StoragePortsAllocator allocator = new StoragePortsAllocator();
PortAllocationContext ctx = null;
for (StoragePort sp : sportMap.keySet()) {
StorageHADomain haDomain = null;
if (sp.getStorageHADomain() != null) {
haDomain = dbClient.queryObject(StorageHADomain.class, sp.getStorageHADomain());
}
StorageSystem storageSystem = dbClient.queryObject(StorageSystem.class, sp.getStorageDevice());
String switchName = PlacementUtils.getSwitchName(sp, dbClient);
if (ctx == null) {
// Initialize context with Network, StorageSystem name, previous context.
ctx = new PortAllocationContext(net, storageSystem.getNativeGuid(), context);
}
Long usage = sportMap.get(sp);
ctx.addPort(sp, haDomain, StorageSystem.Type.valueOf(storageSystem.getSystemType()), switchName, usage);
}
List<StoragePort> portUris = allocator.allocatePortsForNetwork(numPorts, ctx, checkConnectivity, previouslyAllocatedPorts, allowFewerPorts, switchToMaxPortNumber);
// save context for next TZ
context = ctx;
return portUris;
}
Aggregations