/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.emc.sa.service.windows.tasks; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.text.StrBuilder; import com.emc.storageos.model.block.BlockObjectRestRep; import com.google.common.collect.Maps; import com.iwave.ext.linux.util.VolumeWWNUtils; import com.iwave.ext.windows.model.wmi.DiskDrive; import com.iwave.ext.windows.winrm.WinRMException; public class FindDisksForVolumes extends WindowsExecutionTask<Map<BlockObjectRestRep, DiskDrive>> { private final Collection<? extends BlockObjectRestRep> volumes; public FindDisksForVolumes(Collection<? extends BlockObjectRestRep> volumes) { this.volumes = volumes; provideDetailArgs(getVolumesDisplay(volumes)); } private String getVolumesDisplay(Collection<? extends BlockObjectRestRep> volumes) { StringBuilder sb = new StringBuilder(); Iterator<? extends BlockObjectRestRep> v = volumes.iterator(); while (v.hasNext()) { sb.append(v.next().getId()); if (v.hasNext()) { sb.append(", "); } } return sb.toString(); } @Override public Map<BlockObjectRestRep, DiskDrive> executeTask() throws Exception { Map<BlockObjectRestRep, DiskDrive> results = findDisksForVolumes(); failIfMissingVolumes(results); return results; } protected Map<BlockObjectRestRep, DiskDrive> findDisksForVolumes() throws WinRMException { Map<BlockObjectRestRep, DiskDrive> results = Maps.newHashMap(); List<DiskDrive> disks = getTargetSystem().listDiskDrives(); for (DiskDrive disk : disks) { String wwid = getTargetSystem().getWwid(disk); logDebug("find.disks.volumes.wwid", wwid, disk.getDeviceId()); for (BlockObjectRestRep volume : volumes) { if (VolumeWWNUtils.wwnMatches(wwid, volume.getWwn())) { logInfo("find.disks.volumes.wwid", wwid, disk.getSerialNumber()); results.put(volume, disk); break; } } } return results; } protected boolean isMissingVolumes(Map<BlockObjectRestRep, DiskDrive> results) { return (results == null) || (results.size() < volumes.size()); } protected void failIfMissingVolumes(Map<BlockObjectRestRep, DiskDrive> results) { if (isMissingVolumes(results)) { // Build error message StrBuilder wwids = new StrBuilder(); int missingCount = 0; for (BlockObjectRestRep volume : volumes) { DiskDrive disk = results.get(volume); if (disk == null) { wwids.appendSeparator(", "); wwids.append(volume.getWwn()); missingCount++; } } if (missingCount > 1) { throw stateException("illegalState.FindDisksForVolumes.noVolumes", wwids); } else { throw stateException("illegalState.FindDisksForVolumes.noVolume", wwids); } } } }