/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.service.vipr.block;
import static com.emc.sa.service.ServiceParams.HOST;
import static com.emc.sa.service.ServiceParams.VOLUMES;
import java.net.URI;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.emc.sa.engine.ExecutionUtils;
import com.emc.sa.engine.bind.Param;
import com.emc.sa.engine.service.Service;
import com.emc.sa.service.vipr.ViPRService;
import com.emc.storageos.db.client.model.ExportGroup.ExportGroupType;
import com.emc.storageos.db.client.model.Host;
import com.emc.storageos.model.block.BlockObjectRestRep;
import com.emc.storageos.model.block.export.ExportGroupRestRep;
import com.emc.vipr.client.core.util.ResourceUtils;
import com.google.common.collect.Sets;
@Service("UnexportHost")
public class UnexportHostService extends ViPRService {
@Param(HOST)
protected URI hostId;
@Param(VOLUMES)
protected List<String> volumeIds;
protected Host host;
protected List<? extends BlockObjectRestRep> volumes;
protected List<ExportGroupRestRep> exports;
@Override
public void precheck() {
host = BlockStorageUtils.getHost(hostId);
String hostName = host.getLabel();
exports = BlockStorageUtils.findExportsContainingHost(hostId, null, null);
if (exports.isEmpty()) {
ExecutionUtils.fail("failTask.UnexportHostService.export", args(), args(hostName));
}
volumes = BlockStorageUtils.getBlockResources(uris(volumeIds));
if (volumes.isEmpty()) {
ExecutionUtils.fail("failTask.UnexportHostService.volumes", args(), args());
}
if (volumes.size() < volumeIds.size()) {
logWarn("unexport.host.service.not.found", volumeIds.size(), volumes.size());
}
for (ExportGroupRestRep export : exports) {
for (BlockObjectRestRep volume : volumes) {
URI volumeId = ResourceUtils.id(volume);
if (BlockStorageUtils.isVolumeInExportGroup(export, volumeId)
&& StringUtils.equalsIgnoreCase(export.getType(), ExportGroupType.Cluster.name())) {
ExecutionUtils.fail("failTask.UnexportHostService.clusterExport", args(), args(export.getName()));
}
}
}
checkForBootVolumes(volumeIds);
}
@Override
public void execute() throws Exception {
for (ExportGroupRestRep export : exports) {
URI exportId = ResourceUtils.id(export);
String exportName = ResourceUtils.name(export);
// Check each volume to see if it is in this export
Set<URI> exportedVolumeIds = Sets.newHashSet();
for (BlockObjectRestRep volume : volumes) {
URI volumeId = ResourceUtils.id(volume);
String volumeName = ResourceUtils.name(volume);
if (BlockStorageUtils.isVolumeInExportGroup(export, volumeId)) {
logInfo("unexport.host.service.volume.in.export", volumeName, exportName);
exportedVolumeIds.add(volumeId);
}
}
if (!exportedVolumeIds.isEmpty()) {
logInfo("unexport.host.service.volume.remove", exportedVolumeIds.size(), exportName);
BlockStorageUtils.removeBlockResourcesFromExport(exportedVolumeIds, exportId);
} else {
logDebug("unexport.host.service.volume.skip", exportName);
}
String hostOrClusterId = BlockStorageUtils.getHostOrClusterId(hostId);
if (hostOrClusterId != null) {
ExecutionUtils.addAffectedResource(hostOrClusterId.toString());
}
}
}
}