/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.imageservercontroller.impl; import static com.emc.storageos.imageservercontroller.ImageServerConstants.HTTP_FAILURE_DIR; import static com.emc.storageos.imageservercontroller.ImageServerConstants.HTTP_SUCCESS_DIR; import java.net.URI; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.ComputeImageServer; import com.emc.storageos.networkcontroller.SSHSession; public class OsInstallStatusPoller implements Runnable { private static final Logger log = LoggerFactory.getLogger(OsInstallStatusPoller.class); private boolean beingPolled = false; private static final Long POLLING_INTERVAL = 60000L; private Map<String, OsInstallStatus> sessionStatusMap = Collections .synchronizedMap(new HashMap<String, OsInstallStatus>()); private DbClient dbClient; public static enum OsInstallStatus { SUCCESS, FAILURE } public void setDbClient(DbClient dbClient){ this.dbClient = dbClient; } /** * Getting session status from cached map. * * @param sessionId * @return */ public OsInstallStatus getOsInstallStatus(String sessionId) { OsInstallStatus status = sessionStatusMap.remove(sessionId); if (status == null) { beingPolled = true; } log.info("polling session {}, returning status {}", sessionId, status); return status; } /** * Start polling thread. */ public void startPolling() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(this); } private void pollImageServer() { log.debug("pollImageServer"); List<URI> ids = dbClient.queryByType(ComputeImageServer.class, true); for (URI imageServerId : ids){ ComputeImageServer imageServer = dbClient.queryObject(ComputeImageServer.class,imageServerId); ImageServerDialog d = null; String[] successes = null; String[] failures = null; try { SSHSession session = new SSHSession(); session.connect(imageServer.getImageServerIp(), imageServer.getSshPort(), imageServer.getImageServerUser(), imageServer.getImageServerPassword()); d = new ImageServerDialog(session, imageServer.getSshTimeoutMs()); d.init(); successes = d.lsDir(imageServer.getTftpBootDir() + HTTP_SUCCESS_DIR); failures = d.lsDir(imageServer.getTftpBootDir() + HTTP_FAILURE_DIR); log.info("successes: {}; failures: {}", Arrays.asList(successes), Arrays.asList(failures)); if (successes != null) { for (String sessionId : successes) { sessionStatusMap.put(sessionId, OsInstallStatus.SUCCESS); } } if (failures != null) { for (String sessionId : failures) { sessionStatusMap.put(sessionId, OsInstallStatus.FAILURE); } } } catch (Exception e) { log.error("Unexpected exception when polling image server: " + e.getMessage(), e); } finally { try { if (d != null && d.isConnected()) { d.close(); } } catch (Exception e) { log.error("failed to close image server dialog", e); } } } } @Override public void run() { while (true) { if (beingPolled) { pollImageServer(); beingPolled = false; } try { log.debug("sleep for {} ms", POLLING_INTERVAL); Thread.sleep(POLLING_INTERVAL); } catch (InterruptedException e) { log.error(e.getMessage(), e); } } } }