/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package controllers; import org.apache.commons.lang3.StringUtils; import com.emc.storageos.coordinator.client.model.Constants; import com.emc.storageos.coordinator.client.model.MigrationStatus; import com.emc.storageos.coordinator.client.model.UpgradeFailureInfo; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.vipr.client.exceptions.ViPRHttpException; import com.emc.vipr.model.sys.ClusterInfo; import controllers.deadbolt.Deadbolt; import controllers.security.Security; import play.Logger; import play.mvc.Controller; import play.mvc.With; import plugin.StorageOsPlugin; import util.BourneUtil; public class Maintenance extends Controller { public static void maintenance(String targetUrl) { ClusterInfo clusterInfo = null; try { clusterInfo = getClusterState(); } catch (Exception e) { // This is not necessarily a problem. The cluster could already be down Common.handleExpiredToken(e); Logger.info(e, "Failed to get cluster state"); clusterInfo = defaultClusterInfo(clusterInfo); } render(targetUrl, clusterInfo); } public static void fail(String targetUrl) { CoordinatorClient coordinatorClient = StorageOsPlugin.getInstance().getCoordinatorClient(); UpgradeFailureInfo failureInfo = coordinatorClient.queryRuntimeState(Constants.UPGRADE_FAILURE_INFO, UpgradeFailureInfo.class); Logger.info("UpgradeFailureInfo=%s", failureInfo); render(failureInfo); } public static MigrationStatus getMigrationStatus() { CoordinatorClient coordinatorClient = StorageOsPlugin.getInstance().getCoordinatorClient(); return coordinatorClient.getMigrationStatus(); } public static void clusterState() { request.format = "json"; ClusterInfo clusterInfo = null; try { clusterInfo = getClusterState(); Logger.info("cluster status %s", clusterInfo.getCurrentState()); } catch (ViPRHttpException e) { Common.handleExpiredToken(e); Logger.error(e, "Failed to get cluster state"); error(e.getHttpCode(), e.getMessage()); } catch (Exception e) { Logger.error(e, "Failed to get cluster state"); error(e.getMessage()); } renderJSON(clusterInfo); } private static ClusterInfo getClusterState() { ClusterInfo clusterInfo = null; if (getMigrationStatus() == MigrationStatus.FAILED) { clusterInfo = getClusterStateFromCoordinator(); } else if (Security.isSystemAdmin() || Security.isSecurityAdmin() || Security.isSystemMonitor()) { clusterInfo = getClusterStateFromSysClient(); } else { clusterInfo = getClusterStateFromCoordinator(); } return defaultClusterInfo(clusterInfo); } private static ClusterInfo getClusterStateFromSysClient() { return BourneUtil.getSysClient().upgrade().getClusterInfo(); } private static ClusterInfo getClusterStateFromCoordinator() { if (StorageOsPlugin.isEnabled()) { CoordinatorClient coordinatorClient = StorageOsPlugin.getInstance().getCoordinatorClient(); ClusterInfo.ClusterState clusterState = coordinatorClient.getControlNodesState(); if (clusterState != null) { ClusterInfo clusterInfo = new ClusterInfo(); clusterInfo.setCurrentState(clusterState.toString()); return clusterInfo; } } return null; } private static ClusterInfo defaultClusterInfo(ClusterInfo clusterInfo) { if (clusterInfo == null) { clusterInfo = new ClusterInfo(); } if (StringUtils.isBlank(clusterInfo.getCurrentState())) { clusterInfo.setCurrentState(ClusterInfo.ClusterState.UNKNOWN.toString()); } return clusterInfo; } }