/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.systemservices.impl.logsvc;
import javax.ws.rs.core.MediaType;
import java.net.URI;
import java.util.*;
import com.emc.storageos.svcs.errorhandling.resources.APIException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.systemservices.impl.client.SysClientFactory;
import com.emc.storageos.systemservices.impl.resource.util.ClusterNodesUtil;
import com.emc.storageos.systemservices.impl.resource.util.NodeInfo;
import com.emc.vipr.model.sys.logging.LogLevelRequest;
import com.emc.vipr.model.sys.logging.LogLevels;
import com.emc.vipr.model.sys.logging.LogSeverity;
/**
* Class for handling a log request by setting and updating the log levels on
* all nodes based on the parameters of a specific log request.
*/
public class LogLevelManager extends BaseLogManager {
// Logger reference.
private static final Logger _log = LoggerFactory.getLogger(LogLevelManager.class);
/**
* Constructor.
*
* @param propertiesLoader A reference to the configurable properties loader.
* @throws APIException When a null parameter is passed.
*/
public LogLevelManager(LogLevelRequest logReqInfo, MediaType mediaType,
LogSvcPropertiesLoader propertiesLoader) {
super(logReqInfo, mediaType, propertiesLoader);
}
/**
*
* @throws APIException When an error occurs satisfying the log request.
*/
public LogLevels process() {
List<NodeInfo> nodeInfo;
int expirInMin;
// Getting all nodes information
if (_logReqInfo.getNodeIds().isEmpty()) {
_log.debug("No nodes specified, assuming all nodes");
nodeInfo = ClusterNodesUtil.getClusterNodeInfo();
} else {
nodeInfo = getClusterNodesWithIds(_logReqInfo.getNodeIds());
}
if (nodeInfo.isEmpty()) {
throw APIException.internalServerErrors.noNodeAvailableError("update log levels");
}
LogLevelRequest logLevelReq = (LogLevelRequest) _logReqInfo;
if (logLevelReq.getExpirInMin() == null) {
_log.debug("No expiration specified, asuming default value");
expirInMin = _propertiesLoader.getLogLevelExpiration();
} else {
expirInMin = logLevelReq.getExpirInMin();
}
// we will handle the empty logNames list inside the internal log level API.
return propagate(nodeInfo, _logReqInfo.getLogNames(), _logReqInfo.getSeverity(),
expirInMin, logLevelReq.getScope());
}
// Building the internal log URI for each node and calling using client
// Collecting streams from all nodes - if any node does not send response,
// logging error.
private LogLevels propagate(List<NodeInfo> nodeInfos,
List<String> logNames, LogSeverity severity, int expirInMin, String scope) {
LogLevels nodeLogLevels = new LogLevels();
for (final NodeInfo node : nodeInfos) {
String baseNodeURL = String.format(BASE_URL_FORMAT, node.getIpAddress(),
node.getPort());
_log.debug("processing node: " + baseNodeURL);
SysClientFactory.SysClient sysClient = SysClientFactory.getSysClient(
URI.create(baseNodeURL),
_propertiesLoader.getNodeLogCollectorTimeout() * 1000,
_propertiesLoader.getNodeLogConnectionTimeout() * 1000);
try {
LogLevelRequest nodeLogReqInfo = new LogLevelRequest(new ArrayList<String>() {
{
add(node.getId());
}
}, logNames, severity, expirInMin, scope);
LogLevels nodeResp = sysClient.post(SysClientFactory.URI_LOG_LEVELS,
LogLevels.class, nodeLogReqInfo);
nodeLogLevels.getLogLevels().addAll(nodeResp.getLogLevels());
} catch (Exception e) {
_log.error("Exception accessing node {}:", baseNodeURL, e);
}
}
return nodeLogLevels;
}
}