/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.api.service.impl.placement.FileMirrorScheduler; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.FilePolicy; import com.emc.storageos.db.client.model.FileShare; import com.emc.storageos.db.client.model.NamedURI; import com.emc.storageos.db.client.model.Project; import com.emc.storageos.db.client.model.TenantOrg; import com.emc.storageos.db.client.model.VirtualArray; import com.emc.storageos.db.client.model.VirtualPool; import com.emc.storageos.db.client.util.NullColumnValueGetter; import com.emc.storageos.fileorchestrationcontroller.FileDescriptor; import com.emc.storageos.model.TaskList; import com.emc.storageos.model.TaskResourceRep; import com.emc.storageos.model.file.FileSystemParam; import com.emc.storageos.svcs.errorhandling.resources.APIException; import com.emc.storageos.svcs.errorhandling.resources.InternalException; import com.emc.storageos.volumecontroller.Recommendation; import com.emc.storageos.volumecontroller.impl.utils.VirtualPoolCapabilityValuesWrapper; import com.google.common.base.Strings; public class FileRemoteMirrorServiceApiImpl extends AbstractFileServiceApiImpl<FileMirrorScheduler> { private static final Logger _log = LoggerFactory.getLogger(FileRemoteMirrorServiceApiImpl.class); private FileMirrorServiceApiImpl _fileMirrorServiceApiImpl; public FileMirrorServiceApiImpl getFileMirrorServiceApiImpl() { return _fileMirrorServiceApiImpl; } public void setFileMirrorServiceApiImpl(FileMirrorServiceApiImpl _fileMirrorServiceApiImpl) { this._fileMirrorServiceApiImpl = _fileMirrorServiceApiImpl; } public FileRemoteMirrorServiceApiImpl() { super(null); } public FileRemoteMirrorServiceApiImpl(String protectionType) { super(protectionType); // TODO Auto-generated constructor stub } @Override public TaskList createFileSystems(FileSystemParam param, Project project, VirtualArray varray, VirtualPool vpool, TenantOrg tenantOrg, DataObject.Flag[] flags, List<Recommendation> recommendations, TaskList taskList, String taskId, VirtualPoolCapabilityValuesWrapper vpoolCapabilities) throws InternalException { return getFileMirrorServiceApiImpl().createFileSystems(param, project, varray, vpool, tenantOrg, flags, recommendations, taskList, taskId, vpoolCapabilities); } @Override public void deleteFileSystems(URI systemURI, List<URI> fileSystemURIs, String deletionType, boolean forceDelete, boolean deleteOnlyMirrors, String task) throws InternalException { super.deleteFileSystems(systemURI, fileSystemURIs, deletionType, forceDelete, deleteOnlyMirrors, task); } @Override public TaskResourceRep createTargetsForExistingSource(FileShare fs, Project project, VirtualPool vpool, VirtualArray varray, TaskList taskList, String task, List<Recommendation> recommendations, VirtualPoolCapabilityValuesWrapper vpoolCapabilities) throws InternalException { return getFileMirrorServiceApiImpl().createTargetsForExistingSource(fs, project, vpool, varray, taskList, task, recommendations, vpoolCapabilities); } @Override protected List<FileDescriptor> getDescriptorsOfFileShareDeleted( URI systemURI, List<URI> fileShareURIs, String deletionType, boolean forceDelete, boolean deleteOnlyMirrors) { List<FileDescriptor> fileDescriptors = new ArrayList<FileDescriptor>(); for (URI fileURI : fileShareURIs) { FileShare fileShare = _dbClient.queryObject(FileShare.class, fileURI); FileDescriptor.Type descriptorType; if (fileShare.getPersonality() == null || fileShare.getPersonality().contains("null")) { descriptorType = FileDescriptor.Type.FILE_DATA; } else if (FileShare.PersonalityTypes.TARGET == getPersonality(fileShare)) { if (isParentInactiveForTarget(fileShare)) { descriptorType = FileDescriptor.Type.FILE_DATA; } else { _log.warn("Attempted to delete an Mirror target that had an active Mirror source"); throw APIException.badRequests.cannotDeleteMirrorFileShareTargetWithActiveSource(fileURI, fileShare.getParentFileShare().getURI()); } } else { descriptorType = FileDescriptor.Type.FILE_MIRROR_SOURCE; } FileDescriptor fileDescriptor = new FileDescriptor(descriptorType, fileShare.getStorageDevice(), fileShare.getId(), fileShare.getPool(), deletionType, forceDelete, deleteOnlyMirrors); fileDescriptors.add(fileDescriptor); } return fileDescriptors; } private boolean isParentInactiveForTarget(FileShare fileShare) { NamedURI parent = fileShare.getParentFileShare(); if (NullColumnValueGetter.isNullNamedURI(parent)) { String msg = String.format("FileShare %s has no Replication parent", fileShare.getId()); throw new IllegalStateException(msg); } FileShare parentFileShare = _dbClient.queryObject(FileShare.class, parent.getURI()); return parentFileShare == null || parentFileShare.getInactive(); } private FileShare.PersonalityTypes getPersonality(FileShare fileShare) { if (Strings.isNullOrEmpty(fileShare.getPersonality())) { String msg = String.format("FileShare %s has no personality", fileShare.getId()); throw new IllegalStateException(msg); } return FileShare.PersonalityTypes.valueOf(fileShare.getPersonality()); } @Override public void assignFilePolicyToFileSystem(FileShare fs, FilePolicy filePolicy, Project project, VirtualPool vpool, VirtualArray varray, TaskList taskList, String task, List<Recommendation> recommendations, VirtualPoolCapabilityValuesWrapper vpoolCapabilities) throws InternalException { getFileMirrorServiceApiImpl().assignFilePolicyToFileSystem(fs, filePolicy, project, vpool, varray, taskList, task, recommendations, vpoolCapabilities); } }