/* * Copyright (c) 2017 EMC Corporation * All Rights Reserved */ package com.emc.storageos.computecontroller.impl; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.eclipse.jetty.util.log.Log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.aix.AixSystem; import com.emc.hpux.HpuxSystem; import com.emc.storageos.computecontroller.HostRescanController; import com.emc.storageos.computesystemcontroller.impl.adapter.EsxHostDiscoveryAdapter; import com.emc.storageos.computesystemcontroller.impl.adapter.VcenterDiscoveryAdapter; import com.emc.storageos.computesystemcontroller.impl.adapter.WindowsHostDiscoveryAdapter; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.AuthnProvider; import com.emc.storageos.db.client.model.Host; import com.emc.storageos.db.client.model.Host.HostType; import com.emc.storageos.db.client.model.Vcenter; import com.emc.storageos.db.client.model.VcenterDataCenter; import com.emc.storageos.exceptions.DeviceControllerException; import com.emc.storageos.util.KerberosUtil; import com.emc.storageos.workflow.Workflow; import com.emc.storageos.workflow.Workflow.Method; import com.emc.storageos.workflow.WorkflowStepCompleter; import com.iwave.ext.command.HostRescanAdapter; import com.iwave.ext.linux.LinuxSystemCLI; import com.iwave.ext.vmware.HostStorageAPI; import com.iwave.ext.vmware.VCenterAPI; import com.vmware.vim25.mo.HostSystem; public class HostRescanDeviceController implements HostRescanController { private DbClient dbClient; private static final Logger log = LoggerFactory.getLogger(HostRescanDeviceController.class); public Method rescanHostStorageMethod(URI hostId) { return new Method("rescanHostStorage", hostId); } @Override public void rescanHostStorage(URI hostId, String taskId) { try { // Set Workflow Step as Executing WorkflowStepCompleter.stepExecuting(taskId); Host host = dbClient.queryObject(Host.class, hostId); if (host == null || host.getInactive()) { throw DeviceControllerException.exceptions.objectNotFound(hostId); } log.info(String.format("Initiating rescan on host %s (%s) type %s", host.getHostName(), host.getId(), host.getType())); HostRescanAdapter adapter = getRescanAdapter(host); if (adapter == null) { throw DeviceControllerException.exceptions.hostRescanUnsuccessful(host.getHostName(), "Could not get adapter to connect to Host"); } log.info(String.format("Rescanning Host %s", host.getHostName())); adapter.rescan(); WorkflowStepCompleter.stepSucceeded(taskId, String.format("Rescan complete host %s", host.getHostName())); } catch (DeviceControllerException ex) { log.error(String.format("Exception trying to rescan host %s : %s", hostId, ex.getMessage())); WorkflowStepCompleter.stepFailed(taskId, ex); } catch (Exception ex) { log.error(String.format("Exception trying to rescan host %s : %s", hostId, ex.getMessage(), ex)); WorkflowStepCompleter.stepFailed(taskId, DeviceControllerException.exceptions.hostRescanUnsuccessful(hostId.toString(), "Unanticipated exception")); } } private HostRescanAdapter getRescanAdapter(Host host) { if (HostType.Linux.name().equalsIgnoreCase(host.getType())) { return new LinuxSystemCLI(host.getHostName(), host.getPortNumber(), host.getUsername(), host.getPassword()); } else if (HostType.AIX.name().equalsIgnoreCase(host.getType())) { return new AixSystem(host.getHostName(), host.getPortNumber(), host.getUsername(), host.getPassword()); } else if (HostType.HPUX.name().equalsIgnoreCase(host.getType())) { return new HpuxSystem(host.getHostName(), host.getPortNumber(), host.getUsername(), host.getPassword()); } else if (HostType.Windows.name().equalsIgnoreCase(host.getType())) { List<AuthnProvider> authProviders = new ArrayList<AuthnProvider>(); for (URI authProviderId : getDbClient().queryByType(AuthnProvider.class, true)) { AuthnProvider authProvider = getDbClient().queryObject(AuthnProvider.class, authProviderId); authProviders.add(authProvider); } KerberosUtil.initializeKerberos(authProviders); return WindowsHostDiscoveryAdapter.createWindowsSystem(host); } else if (HostType.Esx.name().equalsIgnoreCase(host.getType())) { if (host.getUsername() != null && host.getPassword() != null) { VCenterAPI vcenterAPI = EsxHostDiscoveryAdapter.createVCenterAPI(host); List<HostSystem> hostSystems = vcenterAPI.listAllHostSystems(); if (hostSystems != null && !hostSystems.isEmpty()) { return new HostStorageAPI(hostSystems.get(0)); } else { return null; } } else if (host.getVcenterDataCenter() != null){ // Lookup the vcenter datacenter and vcenter to retreive the HostSystem VcenterDataCenter dataCenter = dbClient.queryObject(VcenterDataCenter.class, host.getVcenterDataCenter()); if (dataCenter == null || dataCenter.getInactive()) { throw DeviceControllerException.exceptions.objectNotFound(host.getVcenterDataCenter()); } Vcenter vcenter = dbClient.queryObject(Vcenter.class, dataCenter.getVcenter()); if (vcenter == null || vcenter.getInactive()) { throw DeviceControllerException.exceptions.objectNotFound(dataCenter.getVcenter()); } VCenterAPI vCenterAPI = VcenterDiscoveryAdapter.createVCenterAPI(vcenter); String datacenterName = dataCenter.getLabel(); HostSystem hostSystem = vCenterAPI.findHostSystem(datacenterName, host.getHostName()); if (hostSystem != null) { return new HostStorageAPI(hostSystem); } else { return null; } } } else { // Unanticipated host type return null; } return null; } public Workflow.Method nullWorkflowStepMethod() { return new Method("nullWorkflowStep"); } public void nullWorkflowStep(String taskId) { WorkflowStepCompleter.stepSucceded(taskId); } public DbClient getDbClient() { return dbClient; } public void setDbClient(DbClient dbClient) { this.dbClient = dbClient; } }