/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.upgrade.callbacks;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
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.CifsShareACL;
import com.emc.storageos.db.client.model.FileShare;
import com.emc.storageos.db.client.model.SMBFileShare;
import com.emc.storageos.db.client.model.SMBShareMap;
import com.emc.storageos.db.client.model.Snapshot;
import com.emc.storageos.db.client.upgrade.BaseCustomMigrationCallback;
import com.emc.storageos.svcs.errorhandling.resources.MigrationCallbackException;
public class CifsShareACLMigration extends BaseCustomMigrationCallback {
private static final Logger logger = LoggerFactory
.getLogger(CifsShareACLMigration.class);
private static final String USER_EVERYONE = "Everyone";
private static final String PERMISSION_TYPE_ALLOW = "allow";
private static final String PERMISSION_READ = "Read";
private static final String PERMISSION_CHANGE = "Change";
private static final String PERMISSION_FULLCONTROL = "FullControl";
@Override
public void process() throws MigrationCallbackException {
logger.info("Migration started");
DbClient dbClient = getDbClient();
try {
List<URI> fileSystemURIList = dbClient.queryByType(FileShare.class,
true);
Iterator<FileShare> fileSystemList = dbClient
.queryIterativeObjects(FileShare.class, fileSystemURIList,
true);
while (fileSystemList.hasNext()) {
FileShare fs = fileSystemList.next();
SMBShareMap smbShareMap = fs.getSMBFileShares();
Collection<SMBFileShare> smbShares = new ArrayList<SMBFileShare>();
if (smbShareMap != null) {
smbShares = smbShareMap.values();
for (SMBFileShare smbShare : smbShares) {
if (smbShare.getPermissionType().equalsIgnoreCase(
PERMISSION_TYPE_ALLOW)) {
CifsShareACL acl = new CifsShareACL();
acl.setId(URIUtil.createId(CifsShareACL.class));
acl.setShareName(smbShare.getName());
acl.setPermission(smbShare.getPermission());
acl.setUser(USER_EVERYONE);
acl.setFileSystemId(fs.getId());
logger.debug("Persisting new ACE into DB: {}", acl);
dbClient.createObject(acl);
}
}
}
}
// File snapshots
List<URI> fileSnapshotURIList = dbClient.queryByType(
Snapshot.class, true);
Iterator<Snapshot> fileSnapshotList = dbClient
.queryIterativeObjects(Snapshot.class, fileSnapshotURIList,
true);
while (fileSnapshotList.hasNext()) {
Snapshot snapshot = fileSnapshotList.next();
SMBShareMap smbShareMap = snapshot.getSMBFileShares();
Collection<SMBFileShare> smbShares = new ArrayList<SMBFileShare>();
if (smbShareMap != null) {
smbShares = smbShareMap.values();
for (SMBFileShare smbShare : smbShares) {
if (smbShare.getPermissionType().equalsIgnoreCase(
PERMISSION_TYPE_ALLOW)) {
CifsShareACL acl = new CifsShareACL();
acl.setId(URIUtil.createId(CifsShareACL.class));
acl.setShareName(smbShare.getName());
acl.setPermission(getFormattedPermissionText(smbShare
.getPermission()));
acl.setUser(USER_EVERYONE);
acl.setSnapshotId(snapshot.getId());
logger.debug("Persisting new ACE into DB: {}", acl);
dbClient.createObject(acl);
}
}
}
}
logger.info("Migration completed successfully");
} catch (Exception e) {
logger.error("Exception occured while migrating cifs share access control settings");
logger.error(e.getMessage(), e);
}
}
private String getFormattedPermissionText(String permission) {
String permissionText = null;
switch (permission) {
case "read":
permissionText = PERMISSION_READ;
break;
case "change":
permissionText = PERMISSION_CHANGE;
break;
case "full":
permissionText = PERMISSION_FULLCONTROL;
break;
}
logger.debug("Formatted permission text: {}", permissionText);
return permissionText;
}
}