/* * RHQ Management Platform * Copyright (C) 2005-2008 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.resource.metadata.test; import java.util.List; import java.util.Random; import java.util.Set; import javax.persistence.NoResultException; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.event.EventDefinition; import org.rhq.core.domain.measurement.DisplayType; import org.rhq.core.domain.measurement.MeasurementBaseline; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementSchedule; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.server.util.LookupUtil; public class UpdateMeasurementSubsystemTest extends UpdatePluginMetadataTestBase { static final boolean ENABLED = true; @Override protected String getSubsystemDirectory() { return "measurement"; } /** * Simple test for the update of a plugin where a server has some metrics that get in the second version of the * plugin added / changed / removed * * @throws Exception */ @Test(enabled = ENABLED) public void testUpdateMeasurementDefinitions() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. registerPlugin("update-v1_0.xml"); ResourceType server1 = getResourceType("testServer1"); Set<MeasurementDefinition> definitions1 = server1.getMetricDefinitions(); // for metric counts, add one for the built in AvailabilityType metric assert definitions1.size() == 5 : "There should be 5 metrics for v1"; for (MeasurementDefinition def : definitions1) { if (def.getDisplayName().equals("Three")) { assert def.getDisplayType() == DisplayType.DETAIL : "DisplayType for Three should be Detail in v1"; } if (def.getDisplayName().equals("Five")) { // this is a trick(y) one, as we do not want to honor updates // of the default interval when a plugin was already deployed once and // we do a redeploy assert def.getDefaultInterval() == 30000L : "DefaultInterval should be 30000 for Five in v1"; } } // now hot deploy a new version of that plugin registerPlugin("update-v2_0.xml"); ResourceType server2 = getResourceType("testServer1"); Set<MeasurementDefinition> definitions2 = server2.getMetricDefinitions(); // for metric counts, add one for the built in AvailabilityType metric assert definitions2.size() == 5 : "There should be 5 metrics in v2"; boolean foundFour = false; for (MeasurementDefinition def : definitions2) { assert !(def.getDisplayName().equals("One")) : "One should be gone in v2"; if (def.getDisplayName().equals("Three")) { assert def.getDisplayType() == DisplayType.SUMMARY : "DisplayType for Three should be Summary in v2"; } if (def.getDisplayName().equals("Four")) { foundFour = true; } if (def.getDisplayName().equals("Five")) { // this is a trick(y) one, as we do not want to honor updates // of the default interval when a plugin was already deployed once and // we do a redeploy assert def.getDefaultInterval() == 30000L : "DefaultInterval should still be 30000 for Five in v2"; } } assert foundFour == true : "Four should be there in v2, but wasn't"; // Now try the other way round registerPlugin("update-v1_0.xml", "3.0"); ResourceType server3 = getResourceType("testServer1"); Set<MeasurementDefinition> definitions3 = server3.getMetricDefinitions(); // for metric counts, add one for the built in AvailabilityType metric assert definitions3.size() == 5 : "There should be 5 metrics for v3"; for (MeasurementDefinition def : definitions3) { if (def.getDisplayName().equals("Three")) { assert def.getDisplayType() == DisplayType.DETAIL : "DisplayType for Three should be Detail in v3"; } if (def.getDisplayName().equals("Five")) { // this is a trick(y) one, as we do not want to honor updates // of the default interval when a plugin was already deployed once and // we do a redeploy assert def.getDefaultInterval() == 30000L : "DefaultInterval should be 30000 for Five in v3"; } } } /** * Test if the full deletion of MeasurementDefinitions works JBNADM-1639 * * @throws Exception */ @Test(enabled = ENABLED) public void testDeleteMeasurementDefinition() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. // for metric counts, add one for the built in AvailabilityType metric { // extra block for variable scoping purposes registerPlugin("measurementDeletion-v1_0.xml"); ResourceType server = getResourceType("testServer1"); Set<MeasurementDefinition> def = server.getMetricDefinitions(); assertEquals(5, def.size()); } { // extra block for variable scoping purposes registerPlugin("measurementDeletion-v2_0.xml", "2.0"); ResourceType server = getResourceType("testServer1"); Set<MeasurementDefinition> def = server.getMetricDefinitions(); assertEquals(1, def.size()); } { // extra block for variable scoping purposes registerPlugin("measurementDeletion-v1_0.xml", "3.0"); ResourceType server = getResourceType("testServer1"); Set<MeasurementDefinition> def = server.getMetricDefinitions(); assertEquals(5, def.size()); } } /** * I am renaming (= removing + adding ) a server with metrics on it. * Make sure all stuff hanging on the server gets deleted. So we need * to add some relations like MeasurementSchedules * @throws Exception */ @Test(enabled = ENABLED) public void testRenameServer() throws Exception { Resource testResource = null; MeasurementSchedule sched = null; MeasurementBaseline baseline = null; EventDefinition eDef = null; // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. Still, some work can be performed transactionally, as done below. try { registerPlugin("update6-1.xml"); ResourceType server = getResourceType("testServer1"); getTransactionManager().begin(); getPluginId(); Set<MeasurementDefinition> definitions1 = server.getMetricDefinitions(); // for metric counts, add one for the built in AvailabilityType metric assert definitions1.size() == 2; /* * Create a Fake Resource and a MeasurementSchedule */ testResource = new Resource("-test-", "-test resource-", server); testResource.setUuid("" + new Random().nextInt()); em.persist(testResource); sched = new MeasurementSchedule(definitions1.iterator().next(), testResource); em.persist(sched); em.flush(); baseline = new MeasurementBaseline(); baseline.setSchedule(sched); baseline.setUserEntered(true); em.persist(baseline); eDef = new EventDefinition(server, "-test event definition-"); em.persist(eDef); setUpAgent(testResource); getTransactionManager().commit(); } catch (Exception e) { getTransactionManager().rollback(); fail("Setup of v1 failed: " + e); } // Set up done, now replace the plugin with a new one. System.out.println("Done with v1"); registerPlugin("update6-2.xml"); ResourceType server; try { server = getResourceType("testServer1"); assert server == null : "testServer1 found, but should not"; } catch (NoResultException nre) { ; // no issue } server = getResourceType("testServer2"); assert server != null : "testServer2 not found"; } /** * We define a plugin with a metric. Later we upgrade the plugin to add another metric. * The Metadatamamanger neeeds to add another {@link MeasurementSchedule} to it. * @throws Exception */ @Test(enabled = ENABLED) public void testAddScheduleOnExistingResources() throws Exception { // Note, plugins are registered in new transactions. for tests, this means // you can't do everything in a trans and roll back at the end. You must clean up // manually. Still, some work can be performed transactionally, as done below. try { registerPlugin("update7-1.xml"); ResourceType platform = getResourceType("myPlatform7"); getTransactionManager().begin(); getPluginId(); Set<MeasurementDefinition> definitions1 = platform.getMetricDefinitions(); assert definitions1.size() == 1; /* * Create a Fake Resource and a MeasurementSchedule */ Resource testResource = new Resource("-test-", "-test resource", platform); testResource.setUuid("" + new Random().nextInt()); em.persist(testResource); setUpAgent(testResource); getTransactionManager().commit(); } catch (Exception e) { getTransactionManager().rollback(); fail("Setup of v1 failed: " + e); } // Set up done, now replace the plugin with a new one. System.out.println("Done with v1"); try { registerPlugin("update7-2.xml"); } catch (Throwable t) { System.err.println(t); } ResourceType platform = getResourceType("myPlatform7"); Set<MeasurementDefinition> definitions2 = platform.getMetricDefinitions(); assert definitions2.size() == 2; Subject overlord = LookupUtil.getSubjectManager().getOverlord(); ResourceCriteria c = new ResourceCriteria(); c.addFilterResourceTypeId(platform.getId()); c.addFilterInventoryStatus(InventoryStatus.NEW); c.fetchSchedules(true); List<Resource> resources = LookupUtil.getResourceManager().findResourcesByCriteria(overlord, c); assert resources != null; assertEquals(1, resources.size()); Resource res = resources.get(0); Set<MeasurementSchedule> schedules = res.getSchedules(); assert schedules != null; /* * We only expect one schedule for the freshly created metric, as the resource we * created earlier has no schedule attached yet (in the test). * In the "real world" it would get its schedules on inventory sync time. */ assert schedules.size() == 1 : "Did not find the expected 1 new schedule, but: " + schedules.size(); } }