AMBARI-7540 - Alerts: Stack Alerts Should Not Be Merged Into the DB (jonathanhurley)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a42b7272 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a42b7272 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a42b7272 Branch: refs/heads/trunk Commit: a42b727260fde066429347f640c4cb1958f712e3 Parents: f923fd8 Author: Jonathan Hurley <jhur...@hortonworks.com> Authored: Mon Sep 29 11:06:22 2014 -0400 Committer: Jonathan Hurley <jhur...@hortonworks.com> Committed: Mon Sep 29 12:17:53 2014 -0400 ---------------------------------------------------------------------- .../ambari_agent/dummy_files/definitions.json | 2 +- .../server/api/services/AmbariMetaInfo.java | 17 ++++++-- .../stacks/HDP/2.0.6/services/HDFS/alerts.json | 6 +++ .../server/api/services/AmbariMetaInfoTest.java | 42 ++++++++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a42b7272/ambari-agent/src/test/python/ambari_agent/dummy_files/definitions.json ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/ambari_agent/dummy_files/definitions.json b/ambari-agent/src/test/python/ambari_agent/dummy_files/definitions.json index 8e01833..6e80dea 100644 --- a/ambari-agent/src/test/python/ambari_agent/dummy_files/definitions.json +++ b/ambari-agent/src/test/python/ambari_agent/dummy_files/definitions.json @@ -15,7 +15,7 @@ "component": "NAMENODE", "label": "NameNode process", "interval": 6, - "scope": "host", + "scope": "HOST", "uuid": "3f82ae27-fa6a-465b-b77d-67963ac55d2f", "enabled": true, "source": { http://git-wip-us.apache.org/repos/asf/ambari/blob/a42b7272/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java index c15f73b..28dd397 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java @@ -197,6 +197,7 @@ public class AmbariMetaInfo { alertDefinitionFactory = injector.getInstance(AlertDefinitionFactory.class); alertDefinitionDao = injector.getInstance(AlertDefinitionDAO.class); + eventPublisher = injector.getInstance(AmbariEventPublisher.class); } /** @@ -1275,12 +1276,20 @@ public class AmbariMetaInfo { continue; } - // if the definition exists in the stack and the database and they are - // not deeply equal, then merge the stack definition into the database + // definitions from the stack that are altered will not be overwritten; + // use the REST APIs to modify them instead AlertDefinition databaseDefinition = alertDefinitionFactory.coerce(entity); if (!stackDefinition.deeplyEquals(databaseDefinition)) { - entity = alertDefinitionFactory.merge(stackDefinition, entity); - persist.add(entity); + // this is the code that would normally merge the stack definition + // into the database; this is not the behavior we want today + + // entity = alertDefinitionFactory.merge(stackDefinition, entity); + // persist.add(entity); + + LOG.debug( + "The alert named {} has been modified from the stack definition and will not be merged", + stackDefinition.getName()); + continue; } } http://git-wip-us.apache.org/repos/asf/ambari/blob/a42b7272/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/alerts.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/alerts.json b/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/alerts.json index 620c89f..d81170a 100644 --- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/alerts.json +++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/alerts.json @@ -5,6 +5,7 @@ "label": "Percent DataNodes Live", "interval": 1, "scope": "SERVICE", + "enabled": true, "source": { "type": "AGGREGATE", "alert_name": "datanode_process", @@ -30,6 +31,7 @@ "label": "NameNode Process", "interval": 1, "scope": "ANY", + "enabled": true, "source": { "type": "PORT", "uri": "{{hdfs-site/dfs.namenode.http-address}}", @@ -49,6 +51,7 @@ "label": "NameNode host CPU utilization", "interval": 2, "scope": "ANY", + "enabled": true, "source": { "type": "METRIC", "uri": "{{hdfs-site/dfs.namenode.http-address}}", @@ -81,6 +84,7 @@ "label": "Secondary NameNode Process", "interval": 1, "scope": "any", + "enabled": true, "source": { "type": "PORT", "uri": "{{hdfs-site/dfs.namenode.secondary.http-address}}", @@ -102,6 +106,7 @@ "label": "JournalNode Process", "interval": 1, "scope": "host", + "enabled": true, "source": { "type": "PORT", "uri": "{{hdfs-site/dfs.journalnode.http-address}}", @@ -123,6 +128,7 @@ "label": "DateNode Process", "interval": 1, "scope": "host", + "enabled": true, "source": { "type": "PORT", "uri": "{{hdfs-site/dfs.datanode.http.address}}", http://git-wip-us.apache.org/repos/asf/ambari/blob/a42b7272/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java index 4c59a36..613b950 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java @@ -47,7 +47,12 @@ import org.apache.ambari.server.api.util.StackExtensionHelper; import org.apache.ambari.server.metadata.ActionMetadata; import org.apache.ambari.server.orm.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.orm.OrmTestHelper; +import org.apache.ambari.server.orm.dao.AlertDefinitionDAO; +import org.apache.ambari.server.orm.entities.AlertDefinitionEntity; import org.apache.ambari.server.state.AutoDeployInfo; +import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ComponentInfo; import org.apache.ambari.server.state.CustomCommandDefinition; import org.apache.ambari.server.state.DependencyInfo; @@ -56,6 +61,7 @@ import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.RepositoryInfo; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.Stack; +import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.alert.AlertDefinition; import org.apache.ambari.server.state.alert.PortSource; @@ -1617,6 +1623,42 @@ public class AmbariMetaInfoTest { assertNotNull(reporting.getWarning().getValue()); } + /** + * Tests merging stack-based with existing definitions works + * + * @throws Exception + */ + @Test + public void testAlertDefinitionMerging() throws Exception { + injector.getInstance(OrmTestHelper.class).createCluster(); + Clusters clusters = injector.getInstance(Clusters.class); + Cluster cluster = clusters.getClusterById(1); + cluster.setDesiredStackVersion( + new StackId(STACK_NAME_HDP, "2.0.6")); + + cluster.addService("HDFS"); + + metaInfo.reconcileAlertDefinitions(clusters); + + AlertDefinitionDAO dao = injector.getInstance(AlertDefinitionDAO.class); + List<AlertDefinitionEntity> definitions = dao.findAll(); + assertEquals(4, definitions.size()); + + for (AlertDefinitionEntity definition : definitions) { + definition.setScheduleInterval(28); + dao.merge(definition); + } + + metaInfo.reconcileAlertDefinitions(clusters); + + definitions = dao.findAll(); + assertEquals(4, definitions.size()); + + for (AlertDefinitionEntity definition : definitions) { + assertEquals(28, definition.getScheduleInterval().intValue()); + } + } + private AmbariMetaInfo setupTempAmbariMetaInfo(String buildDir) throws Exception { File stackRootTmp = new File(buildDir + "/ambari-metaInfo");