/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2014], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
*/
package org.hyperic.plugin.openstack;
import static org.hyperic.plugin.openstack.OpenstackConstants.NEUTRON_CONTROLLER_SERVER;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_API;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_API_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CERT;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CERT_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CERT_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_COMPUTE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_COMPUTE_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_COMPUTE_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CONDUCTOR;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CONDUCTOR_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CONDUCTOR_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CONSOLE_AUTH_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_CONSOLE_AUTH_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_INSTALL_PATH;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_NETWORK_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_NETWORK_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_NOVNCPROXY;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_NOVNCPROXY_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_NOVNCPROXY_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_OBJECTSTORE_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_OBJECT_STORE_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_SCHEDULER;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_SCHEDULER_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_SCHEDULER_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_SERVER;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_XVPVNCPROXY_PTQL;
import static org.hyperic.plugin.openstack.OpenstackConstants.NOVA_XVPVNCPROXY_SERVICE;
import static org.hyperic.plugin.openstack.OpenstackConstants.PROCESS_QUERY;
import static org.hyperic.plugin.openstack.OpenstackUtil.getArgumentMatch;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaCertPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaComputePtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaConductorPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaConsoleAuthPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaNetworkPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaNoVncProxyPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaObjectStorePtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaSchedulerPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getNovaXvpvncProxyPtql;
import static org.hyperic.plugin.openstack.OpenstackUtil.getStateNamePtql;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.product.AutoServerDetector;
import org.hyperic.hq.product.PluginException;
import org.hyperic.hq.product.ServerDetector;
import org.hyperic.hq.product.ServerResource;
import org.hyperic.hq.product.ServiceResource;
import org.hyperic.util.config.ConfigResponse;
/**
* Class identifies Openstack Nova Processes to be monitored.
*/
public class OpenstackNovaServerDetector extends ServerDetector implements
AutoServerDetector {
private static Log logger = LogFactory
.getLog(OpenstackNovaServerDetector.class);
private boolean isNovaApiServiceAvailable = false;
private boolean isNovaSchedulerServiceAvailable = false;
private boolean isNovaConductorServiceAvailable = false;
private boolean isNovaConsoleAuthServiceAvailable = false;
// private boolean isNovaConsoleServiceAvailable = false;
private boolean isNovaCertServiceAvailable = false;
private boolean isNovaObjectStoreServiceAvailable = false;
private boolean isNovaComputeServiceAvailable = false;
private boolean isNovaXvpvncProxyServiceAvailable = false;
private boolean isNovaNoVncProxyServiceAvailable = false;
private boolean isNovaNetworkServiceAvailable = false;
@Override
public List getServerResources(ConfigResponse platformConfig)
throws PluginException {
List servers = new ArrayList();
String novaService = getAvailableNovaService();
logger.debug("Nova Server monitoring PTQL:" + novaService);
// Server Resources created if one of monitored process is available.
if (novaService != null) {
ServerResource server = createServerResource(NOVA_INSTALL_PATH);
// server.setName(server.getName());
String platformName = getPlatformName(server.getName());
server.setName(platformName + NOVA_SERVER);
ConfigResponse productConfig = new ConfigResponse();
productConfig.setValue(PROCESS_QUERY, novaService);
setProductConfig(server, productConfig);
setMeasurementConfig(server, new ConfigResponse());
servers.add(server);
}
return servers;
}
/**
* Function returns platform Name
*
* @param serverName
* @return
*/
private String getPlatformName(String serverName) {
String[] arr = serverName.split(" ");
if(arr != null && arr.length > 0) {
return arr[0] + " ";
}
return "";
}
/**
* Function queries a static list of PTQL to identify if Linux Platform has
* at least one of monitored Nova process running.
*
* @return String
*/
private String getAvailableNovaService() {
List<String[]> novaServicePtqls = getNovaPtql();
for (String[] novaServicePtql : novaServicePtqls) {
for (int i = 0; i < novaServicePtql.length; i++) {
long[] pids = getPids(novaServicePtql[i]);
if (pids != null && pids.length > 0) {
return novaServicePtql[i];
}
}
}
return null;
}
/**
* Function to discover Services being monitored for Server Resource
*/
@Override
protected List discoverServices(ConfigResponse serverConfig)
throws PluginException {
logger.debug("[OpenstackNovaServerDetector discoverServices] serverConfig="
+ serverConfig);
List services = new ArrayList();
String novaApiServicePtql = getStateNamePtql(NOVA_API);
if (isServiceAvailable(novaApiServicePtql, isNovaApiServiceAvailable)) {
services.add(getService(NOVA_API_SERVICE, novaApiServicePtql));
logProcess(NOVA_API_SERVICE, novaApiServicePtql);
}
String novaSchedulerServicePtql = getServicePtql(
getNovaSchedulerPtql(), NOVA_SCHEDULER_PTQL);
if (isServiceAvailable(getArgumentMatch(NOVA_SCHEDULER),
isNovaSchedulerServiceAvailable)) {
services.add(getService(NOVA_SCHEDULER_SERVICE,
novaSchedulerServicePtql));
logProcess(NOVA_SCHEDULER_SERVICE, novaSchedulerServicePtql);
}
String novaConductorServicePtql = getServicePtql(
getNovaConductorPtql(), NOVA_CONDUCTOR_PTQL);
if (isServiceAvailable(getArgumentMatch(NOVA_CONDUCTOR),
isNovaConductorServiceAvailable)) {
services.add(getService(NOVA_CONDUCTOR_SERVICE,
novaConductorServicePtql));
logProcess(NOVA_CONDUCTOR_SERVICE, novaConductorServicePtql);
}
String novaConsoleAuthServicePtql = getServicePtql(
getNovaConsoleAuthPtql(), NOVA_CONSOLE_AUTH_PTQL);
if (isServiceAvailable(NOVA_CONSOLE_AUTH_PTQL,
isNovaConsoleAuthServiceAvailable)) {
services.add(getService(NOVA_CONSOLE_AUTH_SERVICE,
novaConsoleAuthServicePtql));
logProcess(NOVA_CONSOLE_AUTH_SERVICE, novaConsoleAuthServicePtql);
}
/*
* String novaConsoleServicePtql = getServicePtql(getNovaConsolePtql(),
* NOVA_CONSOLE_PTQL); if
* (!novaConsoleServicePtql.equals(NOVA_CONSOLE_PTQL)) {
* isNovaConsoleServiceAvailable = true; } if
* (isNovaConsoleServiceAvailable) {
* services.add(getService(NOVA_CONSOLE_SERVICE,
* novaConsoleServicePtql)); logProcess(NOVA_CONSOLE_SERVICE,
* novaConsoleServicePtql); }
*/
String novaCertServicePtql = getServicePtql(getNovaCertPtql(),
NOVA_CERT_PTQL);
if (isServiceAvailable(getArgumentMatch(NOVA_CERT),
isNovaCertServiceAvailable)) {
services.add(getService(NOVA_CERT_SERVICE, novaCertServicePtql));
logProcess(NOVA_CERT_SERVICE, novaCertServicePtql);
}
String novaObjectStoreServicePtql = getServicePtql(
getNovaObjectStorePtql(), NOVA_OBJECT_STORE_PTQL);
if (isServiceAvailable(NOVA_OBJECT_STORE_PTQL,
isNovaObjectStoreServiceAvailable)) {
services.add(getService(NOVA_OBJECTSTORE_SERVICE,
novaObjectStoreServicePtql));
logProcess(NOVA_OBJECTSTORE_SERVICE, novaObjectStoreServicePtql);
}
String novaComputeServicePtql = getServicePtql(getNovaComputePtql(),
NOVA_COMPUTE_PTQL);
if (isServiceAvailable(getArgumentMatch(NOVA_COMPUTE),
isNovaComputeServiceAvailable)) {
services.add(getService(NOVA_COMPUTE_SERVICE,
novaComputeServicePtql));
logProcess(NOVA_COMPUTE_SERVICE, novaComputeServicePtql);
}
String novaXvpvncServicePtql = getServicePtql(getNovaXvpvncProxyPtql(),
NOVA_XVPVNCPROXY_PTQL);
if (isServiceAvailable(NOVA_XVPVNCPROXY_PTQL,
isNovaXvpvncProxyServiceAvailable)) {
services.add(getService(NOVA_XVPVNCPROXY_SERVICE,
novaXvpvncServicePtql));
logProcess(NOVA_XVPVNCPROXY_SERVICE, novaXvpvncServicePtql);
}
String novaNoVncServicePtql = getServicePtql(getNovaNoVncProxyPtql(),
NOVA_NOVNCPROXY_PTQL);
if (isServiceAvailable(getArgumentMatch(NOVA_NOVNCPROXY),
isNovaNoVncProxyServiceAvailable)) {
services.add(getService(NOVA_NOVNCPROXY_SERVICE,
novaNoVncServicePtql));
logProcess(NOVA_NOVNCPROXY_SERVICE, novaNoVncServicePtql);
}
String novaNetworkPtql = getServicePtql(getNovaNetworkPtql(),
NOVA_NETWORK_PTQL);
if (isServiceAvailable(NOVA_NETWORK_PTQL, isNovaNetworkServiceAvailable)) {
services.add(getService(NOVA_NETWORK_SERVICE, novaNetworkPtql));
logProcess(NOVA_NETWORK_SERVICE, novaNetworkPtql);
}
return services;
}
/**
* Function checks if service was Available previously.
*
* @param servicePtql
* @param serviceAvaiability
* @return
*/
private boolean isServiceAvailable(String servicePtql,
boolean serviceAvaiability) {
if (!serviceAvaiability) {
long[] pids = getPids(servicePtql);
if (pids != null && pids.length > 0) {
serviceAvaiability = true;
} else {
logger.debug("No Match found for:" + servicePtql);
}
}
return serviceAvaiability;
}
/**
* Function identifies PTQL for monitoring a service. Different PTQL is
* written as per environment to monitor.
*
* @param servicePtqls
* @param defaultServicePtql
* @return
*/
private String getServicePtql(String[] servicePtqls,
String defaultServicePtql) {
for (int i = 0; i < servicePtqls.length; i++) {
long[] pids = getPids(servicePtqls[i]);
if ((pids != null && pids.length > 0)
|| (i == (servicePtqls.length - 1))) {
return servicePtqls[i];
}
}
return defaultServicePtql;
}
/**
* Function creates Service Resource.
*
* @param serviceDescriptorName
* @param serviceName
* @return
*/
private ServiceResource getService(String serviceDescriptorName,
String servicePtql) {
ServiceResource service = createServiceResource(serviceDescriptorName);
service.setName(serviceDescriptorName);
ConfigResponse productConfig = new ConfigResponse();
productConfig.setValue(PROCESS_QUERY, servicePtql);
setProductConfig(service, productConfig);
setMeasurementConfig(service, new ConfigResponse());
return service;
}
/**
* Function logs monitored process with ptql statement.
*
* @param monitoringProcess
* @param processPTQL
*/
private void logProcess(String monitoringProcess, String processPTQL) {
logger.debug("Monitoring Process: " + monitoringProcess + "with ptql:"
+ processPTQL);
}
}