package org.rhq.enterprise.server.resource.metadata; import static java.util.Arrays.asList; import java.util.List; import org.testng.annotations.Test; import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.measurement.DisplayType; import org.rhq.core.domain.measurement.MeasurementCategory; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementUnits; import org.rhq.core.domain.measurement.NumericType; import org.rhq.test.AssertUtils; public class MeasurementMetadataManagerBeanTest extends MetadataBeanTest { @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }) void registerMetricsPlugin() throws Exception { createPlugin("metric-test-plugin", "1.0", "plugin_v1.xml"); } @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }, dependsOnMethods = { "registerMetricsPlugin" }) public void persistNewMetrics() throws Exception { assertResourceTypeAssociationEquals("MetricServer1", "MeasurementMetadataManagerBeanTestPlugin", "metricDefinitions", asList("metric1", "metric2", "metric3", "rhq.availability")); } @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }, dependsOnMethods = { "persistNewMetrics" }) public void persistNewTraitDefinitionProperties() { MeasurementDefinition traitDef = loadMeasurementDef("metric1", "MetricServer1"); MeasurementDefinition expected = new MeasurementDefinition("metric1", MeasurementCategory.AVAILABILITY, MeasurementUnits.MILLISECONDS, DataType.TRAIT, NumericType.DYNAMIC, true, 30000, DisplayType.SUMMARY); expected.setDescription("Metric 1"); expected.setDisplayName("metric1"); expected.setDisplayOrder(1); AssertUtils.assertPropertiesMatch("Failed to persist properties for a trait metric definition", expected, traitDef, asList("id", "resourceType", "schedules", "alertCondition")); } @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }, dependsOnMethods = { "persistNewMetrics" }) public void persistNewNumericMeasurementDef() { MeasurementDefinition measurementDef = loadMeasurementDef("metric2", "MetricServer1"); MeasurementDefinition expected = new MeasurementDefinition("metric2", MeasurementCategory.PERFORMANCE, MeasurementUnits.MEGABYTES, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL); expected.setRawNumericType(null); expected.setDescription("Metric 2"); expected.setDisplayName("metric2"); expected.setDisplayOrder(2); AssertUtils.assertPropertiesMatch("Failed to persist properties for numeric metric definition", expected, measurementDef, asList("id", "resourceType", "schedules", "alertCondition")); MeasurementDefinition perMinuteDef = loadMeasurementDef("metric2", "MetricServer1", "metric2 per Minute"); expected = new MeasurementDefinition(measurementDef); expected.setDisplayName("metric2 per Minute"); expected.setDisplayOrder(3); expected.setDefaultOn(true); expected.setNumericType(NumericType.DYNAMIC); expected.setRawNumericType(measurementDef.getNumericType()); AssertUtils.assertPropertiesMatch( "Failed to create and persist per minute metric definition for numeric metric definition", expected, perMinuteDef, asList("id", "resourceType", "schedules", "alertCondition")); } @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }, dependsOnMethods = { "persistNewMetrics" }) public void persistNewCallTimeDef() { MeasurementDefinition calltimeDef = loadMeasurementDef("metric3", "MetricServer1"); MeasurementDefinition expected = new MeasurementDefinition("metric3", MeasurementCategory.THROUGHPUT, MeasurementUnits.MILLISECONDS, DataType.CALLTIME, true, 30000, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDestinationType("myMethod"); expected.setDescription("Metric 3"); expected.setDisplayName("metric3"); expected.setDisplayOrder(4); AssertUtils.assertPropertiesMatch("Failed to create calltime metric definition", expected, calltimeDef, asList("id", "resourceType", "schedules", "alertCondition")); } @Test(groups = { "plugin.metadata", "Metrics.NewPlugin" }, dependsOnMethods = { "persistNewMetrics" }) public void availabilityDefaultTest() { MeasurementDefinition serverAvailDef = loadMeasurementDef("rhq.availability", "MetricServer1", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); MeasurementDefinition expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, true, MeasurementDefinition.AVAILABILITY_DEFAULT_PERIOD_SERVER, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serverAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "alertCondition", "schedules")); MeasurementDefinition serviceAvailDef = loadMeasurementDef("rhq.availability", "MetricService1", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, false, 120000, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serviceAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "schedules", "alertCondition")); serviceAvailDef = loadMeasurementDef("rhq.availability", "MetricService2", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, true, MeasurementDefinition.AVAILABILITY_DEFAULT_PERIOD_SERVICE, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serviceAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "schedules", "alertCondition")); } @Test(groups = { "plugin.metadata", "Metrics.UpgradePlugin" }, dependsOnGroups = { "Metrics.NewPlugin" }) public void upgradeMetricsPlugin() throws Exception { createPlugin("metric-test-plugin", "2.0", "plugin_v2.xml"); } @Test(groups = { "plugin.metadata", "Metrics.UpradePlugin" }, dependsOnMethods = { "upgradeMetricsPlugin" }) public void addNewMetricDef() throws Exception { assertResourceTypeAssociationEquals("MetricServer2", "MeasurementMetadataManagerBeanTestPlugin", "metricDefinitions", asList("metric1", "rhq.availability")); } @Test(groups = { "plugin.metadata", "Metrics.UpradePlugin" }, dependsOnMethods = { "upgradeMetricsPlugin" }) public void changeTraitDefToMeasurementDef() { MeasurementDefinition measurementDef = loadMeasurementDef("metric1", "MetricServer3"); MeasurementDefinition expected = new MeasurementDefinition("metric1", MeasurementCategory.PERFORMANCE, MeasurementUnits.MILLISECONDS, DataType.MEASUREMENT, NumericType.TRENDSUP, false, 30000, DisplayType.DETAIL); expected.setRawNumericType(null); expected.setDefaultInterval(30000); expected.setDescription("Metric One"); expected.setDisplayName("metric1"); expected.setDisplayOrder(1); AssertUtils.assertPropertiesMatch("Failed to change trait definition to a measurement defintion", expected, measurementDef, asList("id", "resourceType", "schedules", "alertCondition")); MeasurementDefinition perMinuteDef = loadMeasurementDef("metric1", "MetricServer3", "metric1 per Minute"); expected.setDisplayName("metric1 per Minute"); expected.setDisplayOrder(2); expected.setDefaultInterval(60000); expected.setDefaultOn(false); expected.setNumericType(NumericType.DYNAMIC); expected.setRawNumericType(measurementDef.getNumericType()); AssertUtils.assertPropertiesMatch( "Failed to create and persist per minute metric definition for updated metric definition", expected, perMinuteDef, asList("id", "resourceType", "schedules", "alertCondition")); } @Test(groups = { "plugin.metadata", "Metrics.UpradePlugin" }, dependsOnMethods = { "upgradeMetricsPlugin" }) public void deleteMetricDefThatHasBeenRemovedFromResourceType() throws Exception { assertResourceTypeAssociationEquals("MetricServer4", "MeasurementMetadataManagerBeanTestPlugin", "metricDefinitions", asList("rhq.availability")); } @Test(groups = { "plugin.metadata", "Metrics.UpradePlugin" }, dependsOnMethods = { "upgradeMetricsPlugin" }) public void deleteMetricDefsForResourceTypeThatIsRemoved() { List metricDefs = getEntityManager() .createQuery("from MeasurementDefinition m where m.name = :metric1Name or name = :metric2Name") .setParameter("metric1Name", "MetricServer5.metric1").setParameter("metric2Name", "MetricServer5.metric3") .getResultList(); assertEquals("Failed to delete metric definitions", 0, metricDefs.size()); } @Test(groups = { "plugin.metadata", "Metrics.UpradePlugin" }, dependsOnMethods = { "upgradeMetricsPlugin" }) public void availabilityOverrideTest() { MeasurementDefinition serverAvailDef = loadMeasurementDef("rhq.availability", "MetricServer1", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); MeasurementDefinition expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, true, 120000, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serverAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "schedules", "alertCondition")); MeasurementDefinition serviceAvailDef = loadMeasurementDef("rhq.availability", "MetricService1", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); // interval can not be changed by new plugin version if not at the category default expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, true, 120000, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serviceAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "schedules", "alertCondition")); serviceAvailDef = loadMeasurementDef("rhq.availability", "MetricService2", MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected = new MeasurementDefinition("rhq.availability", MeasurementCategory.AVAILABILITY, MeasurementUnits.NONE, DataType.AVAILABILITY, true, 480000, DisplayType.DETAIL); expected.setNumericType(NumericType.DYNAMIC); expected.setDisplayName(MeasurementDefinition.AVAILABILITY_DISPLAY_NAME); expected.setDescription(MeasurementDefinition.AVAILABILITY_DESCRIPTION); AssertUtils.assertPropertiesMatch("Failed to create avail metric definition", expected, serviceAvailDef, asList("id", "resourceType", "destinationType", "displayOrder", "schedules", "alertCondition")); } // this needs to be the last test executed in the class, it does cleanup @Test(priority = 10, alwaysRun = true, dependsOnGroups = { "Metrics.UpradePlugin" }) public void afterClassWorkTest() throws Exception { afterClassWork(); } MeasurementDefinition loadMeasurementDef(String name, String resourceType) { return loadMeasurementDef(name, resourceType, name); } MeasurementDefinition loadMeasurementDef(String name, String resourceType, String displayName) { return (MeasurementDefinition) getEntityManager() .createQuery( "from MeasurementDefinition m " + "where m.name = :name and " + "m.displayName = :displayName and " + "m.resourceType.name = :resourceType").setParameter("name", name) .setParameter("displayName", displayName).setParameter("resourceType", resourceType).getSingleResult(); } }