/* * RHQ Management Platform * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.plugins.postgres.test; import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.rhq.core.clientapi.server.discovery.InventoryReport; import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.measurement.MeasurementData; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementReport; import org.rhq.core.domain.measurement.MeasurementScheduleRequest; import org.rhq.core.domain.resource.Resource; import org.rhq.core.pc.PluginContainer; import org.rhq.core.pc.PluginContainerConfiguration; import org.rhq.core.pc.plugin.FileSystemPluginFinder; import org.rhq.core.pc.plugin.PluginEnvironment; import org.rhq.core.pc.plugin.PluginManager; import org.rhq.core.pc.util.InventoryPrinter; import org.rhq.core.pluginapi.inventory.ResourceComponent; import org.rhq.core.pluginapi.measurement.MeasurementFacet; /** * @author Greg Hinkle */ @Test(groups = "postgres.plugin") public class PostgresPluginTest { private Log log = LogFactory.getLog(PostgresPluginTest.class); private static final String PLUGIN_NAME = "Postgres"; @BeforeSuite public void start() { try { File pluginDir = new File("target/itest/plugins"); PluginContainerConfiguration pcConfig = new PluginContainerConfiguration(); pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir)); pcConfig.setPluginDirectory(pluginDir); pcConfig.setInsideAgent(false); PluginContainer.getInstance().setConfiguration(pcConfig); PluginContainer.getInstance().initialize(); } catch (Exception e) { e.printStackTrace(); } } @AfterSuite public void stop() { PluginContainer.getInstance().shutdown(); } @Test public void testPluginLoad() { PluginManager pluginManager = PluginContainer.getInstance().getPluginManager(); PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME); assert (pluginEnvironment != null) : "Null environment, plugin not loaded"; assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME)); } @Test(dependsOnMethods = "testPluginLoad") public void testServerDiscovery() throws Exception { InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately(); assert report != null; System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms"); Set<Resource> pgServers = getDiscoveredServers(); //assert pgSer vers.size() > 0; System.out.println("Found " + pgServers.size() + " postgres servers"); } @Test(dependsOnMethods = "testServerDiscovery", enabled = false) public void testServerMeasurement() throws Exception { for (Resource server : getDiscoveredServers()) { testResourceMeasurement(server); } } private Set<Resource> getDiscoveredServers() { Set<Resource> found = new HashSet<Resource>(); Resource platform = PluginContainer.getInstance().getInventoryManager().getPlatform(); for (Resource resource : platform.getChildResources()) { if (resource.getResourceType().getName().equals("Postgres Server")) { found.add(resource); } } return found; } @Test(enabled = false) // TODO GH: Disable until we fix the natives integration for sigar private void testResourceMeasurement(Resource resource) throws Exception { ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent( resource); if (resourceComponent instanceof MeasurementFacet) { for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions()) { Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>(); metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType())); MeasurementReport report = new MeasurementReport(); ((MeasurementFacet) resourceComponent).getValues(report, metricList); assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource; MeasurementData data = report.getNumericData().iterator().next(); assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource; System.out.println("Measurement: " + def.getName() + "=" + data.getValue()); } } } @Test(dependsOnMethods = "testServerDiscovery") public void testServiceDiscovery() throws Exception { try { InventoryReport report = PluginContainer.getInstance().getInventoryManager() .executeServiceScanImmediately(); } catch (Exception e) { log.error("Failure to run discovery", e); throw e; } InventoryPrinter.outputInventory(new PrintWriter(System.out), false); } @Test(dependsOnMethods = "testServiceDiscovery") public void testDatabaseMeasurement() throws Exception { Resource platform = PluginContainer.getInstance().getInventoryManager().getPlatform(); for (Resource server : platform.getChildResources()) { List<Resource> services = new ArrayList<Resource>(server.getChildResources()); Collections.sort(services); for (Resource service : services) { ResourceComponent serviceComponent = PluginContainer.getInstance().getInventoryManager() .getResourceComponent(service); if (serviceComponent instanceof MeasurementFacet) { Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>(); metricList.add(new MeasurementScheduleRequest(1, "numbackends", 1000, true, DataType.MEASUREMENT)); MeasurementReport report = new MeasurementReport(); ((MeasurementFacet) serviceComponent).getValues(report, metricList); for (MeasurementData value : report.getNumericData()) { System.out.println(value.getValue() + ":" + service.getName()); } } } } } }