/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.service.hpux; import static com.emc.sa.service.vipr.ViPRExecutionUtils.addAffectedResource; import java.util.Collection; import java.util.List; import com.emc.hpux.HpuxSystem; import com.emc.hpux.model.MountPoint; import com.emc.hpux.model.RDisk; import com.emc.sa.engine.ExecutionUtils; import com.emc.sa.machinetags.KnownMachineTags; import com.emc.sa.service.hpux.tasks.CheckForPowerPath; import com.emc.sa.service.hpux.tasks.CreateDirectory; import com.emc.sa.service.hpux.tasks.DeleteDirectory; import com.emc.sa.service.hpux.tasks.FileSystemCheck; import com.emc.sa.service.hpux.tasks.FindDevicePathForVolume; import com.emc.sa.service.hpux.tasks.FindMountPoint; import com.emc.sa.service.hpux.tasks.FindMountPointsForVolumes; import com.emc.sa.service.hpux.tasks.FindRDiskForVolume; import com.emc.sa.service.hpux.tasks.GetDirectoryContents; import com.emc.sa.service.hpux.tasks.HpuxExecutionTask; import com.emc.sa.service.hpux.tasks.ListMountPoints; import com.emc.sa.service.hpux.tasks.MakeFilesystem; import com.emc.sa.service.hpux.tasks.MountPath; import com.emc.sa.service.hpux.tasks.Rescan; import com.emc.sa.service.hpux.tasks.UnmountPath; import com.emc.sa.service.hpux.tasks.UpdatePowerPathEntries; import com.emc.sa.service.hpux.tasks.VerifyMountPoint; import com.emc.sa.service.vipr.ViPRExecutionUtils; import com.emc.sa.service.vipr.block.BlockStorageUtils; import com.emc.sa.service.vipr.block.tasks.RemoveBlockVolumeMachineTag; import com.emc.sa.service.vipr.block.tasks.SetBlockVolumeMachineTag; import com.emc.storageos.model.block.BlockObjectRestRep; import com.emc.storageos.model.block.VolumeRestRep; public class HpuxSupport { private final HpuxSystem targetSystem; public HpuxSupport(HpuxSystem targetSystem) { this.targetSystem = targetSystem; } public String getHostName() { return targetSystem.getHost(); } public HpuxSystem getTargetSystem() { return this.targetSystem; } protected void logDebug(String message, Object... args) { ExecutionUtils.currentContext().logDebug(message, args); } protected void logInfo(String message, Object... args) { ExecutionUtils.currentContext().logInfo(message, args); } protected void logWarn(String message, Object... args) { ExecutionUtils.currentContext().logWarn(message, args); } protected void logError(String message, Object... args) { ExecutionUtils.currentContext().logError(message, args); } protected void logError(Throwable cause, String message, Object... args) { ExecutionUtils.currentContext().logError(message, args); } public void setVolumeMountPointTag(BlockObjectRestRep volume, String mountPoint) { ExecutionUtils.execute(new SetBlockVolumeMachineTag(volume.getId(), getMountPointTagName(), mountPoint)); ExecutionUtils.addRollback(new RemoveBlockVolumeMachineTag(volume.getId(), getMountPointTagName())); addAffectedResource(volume.getId()); } public void removeVolumesMountPointTag(Collection<? extends VolumeRestRep> volumes) { for (VolumeRestRep volume : volumes) { removeVolumeMountPointTag(volume); } } public void removeVolumeMountPointTag(BlockObjectRestRep volume) { ExecutionUtils.execute(new RemoveBlockVolumeMachineTag(volume.getId(), getMountPointTagName())); addAffectedResource(volume.getId()); } private String getMountPointTagName() { return KnownMachineTags.getHostMountPointTagName(targetSystem.getHostId()); } public void updatePowerPathEntries() { execute(new UpdatePowerPathEntries()); } public void deleteDirectory(String path) { execute(new DeleteDirectory(path)); } public void createDirectory(String path) { execute(new CreateDirectory(path)); addRollback(new DeleteDirectory(path)); } public boolean isDirectoryEmpty(String path) { return execute(new GetDirectoryContents(path)).isEmpty(); } public void verifyMountPoint(String path) { execute(new VerifyMountPoint(path)); } public void findMountPoints(List<VolumeSpec> volumes) { execute(new FindMountPointsForVolumes(targetSystem.getHostId(), volumes)); } public MountPoint findMountPoint(BlockObjectRestRep volume) { return execute(new FindMountPoint(targetSystem.getHostId(), volume)); } public void resizeVolume(BlockObjectRestRep volume, Double newSizeInGB) { BlockStorageUtils.expandVolume(volume.getId(), newSizeInGB); } public List<MountPoint> getMountPoints() { return execute(new ListMountPoints()); } protected <T> T execute(HpuxExecutionTask<T> task) { task.setTargetSystem(targetSystem); return ViPRExecutionUtils.execute(task); } public boolean checkForPowerPath() { return execute(new CheckForPowerPath()); } public void makeFilesystem(String disk) { execute(new MakeFilesystem(disk)); } public void mount(String source, String mountPoint) { execute(new MountPath(source, mountPoint)); addRollback(new UnmountPath(mountPoint)); } public void unmount(String mountPoint) { execute(new UnmountPath(mountPoint)); } public void checkFilesystem(String rDisk) { execute(new FileSystemCheck(rDisk)); } public void rescan() { execute(new Rescan()); } public RDisk findRDisk(BlockObjectRestRep volume, boolean usePowerPath) { RDisk rdisk = execute(new FindRDiskForVolume(volume, usePowerPath)); if (rdisk == null) { throw new IllegalStateException(String.format( "Could not find hdisk for Volume %s: - PowerPath/MPIO or SAN connectivity may need attention from an administrator. ", volume.getWwn().toLowerCase())); } return rdisk; } public String findDevicePath(BlockObjectRestRep volume, boolean usePowerPath) { String rhdiskDevice = execute(new FindDevicePathForVolume(volume, usePowerPath)); if (rhdiskDevice == null) { throw new IllegalStateException(String.format( "Could not find hdisk for Volume %s: - PowerPath/MPIO or SAN connectivity may need attention from an administrator. ", volume.getWwn().toLowerCase())); } logInfo("hpux.support.found.rdisk", rhdiskDevice, volume.getWwn()); return rhdiskDevice.replaceAll("rhdisk", "hdisk"); } protected <T extends BlockObjectRestRep> void getDeviceFailed(T volume, String errorMessage, IllegalStateException exception) { ExecutionUtils.fail("failTask.getDeviceName", volume.getWwn(), errorMessage, exception.getMessage()); } public void addRollback(HpuxExecutionTask<?> rollbackTask) { rollbackTask.setTargetSystem(targetSystem); ExecutionUtils.addRollback(rollbackTask); } }