/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.service.windows;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.emc.sa.engine.ExecutionUtils;
import com.emc.sa.engine.bind.BindingUtils;
import com.emc.storageos.model.block.BlockObjectRestRep;
import com.google.common.collect.Lists;
import com.iwave.ext.windows.WindowsSystemWinRM;
import com.iwave.ext.windows.model.Disk;
import com.iwave.ext.windows.model.Volume;
import com.iwave.ext.windows.model.wmi.DiskDrive;
public class UnmountBlockVolumeHelper {
private final WindowsSupport windows;
/** The volumes to unmount. */
private Collection<? extends BlockObjectRestRep> volumes;
/** Mapping of volume to disk. */
private Map<? extends BlockObjectRestRep, DiskDrive> volume2disk;
public static List<UnmountBlockVolumeHelper> createHelpers(List<WindowsSystemWinRM> windowsSystems) {
List<UnmountBlockVolumeHelper> helpers = Lists.newArrayList();
for (WindowsSystemWinRM windowsSystem : windowsSystems) {
WindowsSupport windowsSupport = new WindowsSupport(windowsSystem);
UnmountBlockVolumeHelper unmountBlockVolumeHelper = new UnmountBlockVolumeHelper(windowsSupport);
BindingUtils.bind(unmountBlockVolumeHelper, ExecutionUtils.currentContext().getParameters());
helpers.add(unmountBlockVolumeHelper);
}
return helpers;
}
private UnmountBlockVolumeHelper(WindowsSupport windowsSupport) {
this.windows = windowsSupport;
}
public void setVolumes(Collection<? extends BlockObjectRestRep> volumes) {
this.volumes = volumes;
}
public void precheck() {
windows.verifyWinRM();
windows.verifyVolumesMounted(volumes);
volume2disk = windows.findDisks(volumes);
}
public void removeVolumesFromCluster() {
Map<String, String> diskToResourceMap = windows.getDiskToResourceMap();
for (BlockObjectRestRep volume : volumes) {
DiskDrive diskDrive = volume2disk.get(volume);
Disk diskDetail = windows.getDiskDetail(diskDrive);
String resourceName = "";
if (windows.isGuid(diskDetail.getDiskId())) {
resourceName = diskToResourceMap.get(diskDetail.getDiskId());
} else {
resourceName = diskToResourceMap.get(diskDrive.getSignature());
}
windows.offlineClusterResource(resourceName);
windows.deleteClusterResource(resourceName);
}
}
public void unmountVolumes() {
for (BlockObjectRestRep volume : volumes) {
DiskDrive disk = volume2disk.get(volume);
Disk diskDetail = windows.getDiskDetail(disk);
if (diskDetail.getVolumes() != null) {
for (Volume diskVolume : diskDetail.getVolumes()) {
windows.unmountVolume(diskVolume.getNumber(), diskVolume.getMountPoint());
boolean isDriveLetterOnly = WindowsUtils.isMountPointDriveLetterOnly(diskVolume.getMountPoint());
if (!isDriveLetterOnly && windows.isDirectoryEmpty(diskVolume.getMountPoint())) {
windows.deleteDirectory(diskVolume.getMountPoint());
}
}
}
windows.offlineDisk(disk);
windows.removeVolumeMountPoint(volume);
}
}
}