/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.upgrade.callbacks; import java.net.URI; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.model.FSExportMap; import com.emc.storageos.db.client.model.FileExport; import com.emc.storageos.db.client.model.FileExportRule; import com.emc.storageos.db.client.model.FileShare; import com.emc.storageos.db.client.model.Snapshot; import com.emc.storageos.db.client.model.StringSet; import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback; import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException; /** * Migration of FS export map in FileShare CF to FileExportRule CF * * @author herlea * */ public class FileSystemExportToFileSystemExportRuleMigration extends BaseCustomMigrationCallback { private static final Logger log = LoggerFactory .getLogger(FileSystemExportToFileSystemExportRuleMigration.class); @Override public void process() throws MigrationCallbackException { log.info("FileSystemExport to FileSystem export rule migration: start"); DbClient dbClient = getDbClient(); try { List<URI> fileExpRuleURIList = dbClient.queryByType( FileExportRule.class, true); int exisitingExportRuleCount = 0; for (Iterator<URI> iterator = fileExpRuleURIList.iterator(); iterator .hasNext();) { URI uri = (URI) iterator.next(); log.debug("Existing export rule URI: {}", uri); exisitingExportRuleCount++; } if (exisitingExportRuleCount > 0) { log.info("There are exisiting export rule(s). Skipping migration."); return; } // FileSystems List<URI> fileSystemURIList = dbClient.queryByType(FileShare.class, true); Iterator<FileShare> fileShareListIterator = dbClient .queryIterativeObjects(FileShare.class, fileSystemURIList); while (fileShareListIterator.hasNext()) { FileShare fileShare = fileShareListIterator.next(); // Create FS Export Rule for export Map List<FileExportRule> fsExpRules = createFSExportRules(fileShare); if (null != fsExpRules && !fsExpRules.isEmpty()) { log.debug("Persisting new File Export rule(s): {}", fsExpRules); dbClient.createObject(fsExpRules); } } // Snapshots List<URI> snapshotURIList = dbClient.queryByType(Snapshot.class, true); Iterator<Snapshot> snapshotListIterator = dbClient .queryIterativeObjects(Snapshot.class, snapshotURIList); while (snapshotListIterator.hasNext()) { Snapshot snapshot = snapshotListIterator.next(); // Create FS Export Rule for export Map List<FileExportRule> snapshotExpRules = createSnapshotExportRules(snapshot); if (null != snapshotExpRules && !snapshotExpRules.isEmpty()) { log.debug("Persisting new Snapshot Export rule(s): {}", snapshotExpRules); dbClient.createObject(snapshotExpRules); } } log.info("FileSystemExport to FileSystem export rule migration: end"); } catch (Exception e) { log.error("Exception occured while migrating FileShare/Snapshot Export Map CF to FileExportRule CF"); log.error(e.getMessage(), e); } } private List<FileExportRule> createSnapshotExportRules(Snapshot snapshot) { List<FileExportRule> fsExpRuleList = new ArrayList<FileExportRule>(); FSExportMap fsExportMap = snapshot.getFsExports(); if (fsExportMap != null) { for (String exportKey : fsExportMap.keySet()) { FileExport fsExport = fsExportMap.get(exportKey); FileExportRule expRule = new FileExportRule(); expRule.setId(URIUtil.createId(FileExportRule.class)); copyFileExportData(fsExport, expRule); // Set snapshotId in the end as setSnapshotId() calculates // snapshotExportIndex with exportPath and security flavor expRule.setSnapshotId(snapshot.getId()); fsExpRuleList.add(expRule); } } return fsExpRuleList; } private List<FileExportRule> createFSExportRules(FileShare fileShare) { List<FileExportRule> fsExpRuleList = new ArrayList<FileExportRule>(); FSExportMap fsExportMap = fileShare.getFsExports(); if (fsExportMap != null) { for (String exportKey : fsExportMap.keySet()) { FileExport fsExport = fsExportMap.get(exportKey); FileExportRule expRule = new FileExportRule(); expRule.setId(URIUtil.createId(FileExportRule.class)); copyFileExportData(fsExport, expRule); // Set fileSystemId in the end as setFileSystemId() calculates // fsExportIndex with exportPath and security flavor expRule.setFileSystemId(fileShare.getId()); fsExpRuleList.add(expRule); } } return fsExpRuleList; } private void copyFileExportData(FileExport source, FileExportRule dest) { dest.setExportPath(source.getMountPath()); dest.setMountPoint(source.getMountPoint()); dest.setSecFlavor(source.getSecurityType()); dest.setAnon(source.getRootUserMapping()); if (null != source.getIsilonId()) { dest.setDeviceExportId(source.getIsilonId()); } List<String> sourceClients = source.getClients(); if (null != sourceClients) { if ("rw".equals(source.getPermissions())) { dest.setReadWriteHosts(new StringSet(sourceClients)); } if ("ro".equals(source.getPermissions())) { dest.setReadOnlyHosts(new StringSet(sourceClients)); } if ("root".equals(source.getPermissions())) { dest.setRootHosts(new StringSet(sourceClients)); } } } }