Repository: ambari Updated Branches: refs/heads/trunk a44ca7735 -> fc5870779
AMBARI-17202. Upgrading Ambari Causes Alert Fields Not To Save Thresholds.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fc587077 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fc587077 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fc587077 Branch: refs/heads/trunk Commit: fc5870779dc13e4fd24c616ef8549149edf77358 Parents: a44ca77 Author: Vitaly Brodetskyi <[email protected]> Authored: Mon Jun 13 23:32:53 2016 +0300 Committer: Vitaly Brodetskyi <[email protected]> Committed: Mon Jun 13 23:32:53 2016 +0300 ---------------------------------------------------------------------- .../ambari/server/state/alert/AlertUri.java | 6 +- .../server/upgrade/AbstractUpgradeCatalog.java | 49 ++++++++- .../server/upgrade/UpgradeCatalog240.java | 1 + .../server/api/services/AmbariMetaInfoTest.java | 8 +- .../server/upgrade/UpgradeCatalog240Test.java | 101 +++++++++++++++++-- .../stacks/HDP/2.0.5/services/HDFS/alerts.json | 2 +- 6 files changed, 145 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java index c269927..dea105e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java @@ -72,7 +72,7 @@ public class AlertUri { * found. */ @SerializedName("default_port") - private int m_port = 0; + private Number m_port = 0; /** * An optional timeout value for connections. @@ -116,7 +116,7 @@ public class AlertUri { * * @return the default port if none of the http properties are found. */ - public int getDefaultPort() { + public Number getDefaultPort() { return m_port; } @@ -281,7 +281,7 @@ public class AlertUri { result = prime * result + ((m_httpsUri == null) ? 0 : m_httpsUri.hashCode()); - result = prime * result + m_port; + result = prime * result + m_port.intValue(); return result; } http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java index 215f8a0..ba4c88d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java @@ -17,6 +17,10 @@ */ package org.apache.ambari.server.upgrade; +import javax.persistence.EntityManager; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import java.io.StringReader; import java.sql.ResultSet; import java.sql.SQLException; @@ -32,18 +36,16 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; -import javax.persistence.EntityManager; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.configuration.Configuration.DatabaseType; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.orm.DBAccessor; +import org.apache.ambari.server.orm.dao.AlertDefinitionDAO; import org.apache.ambari.server.orm.dao.ArtifactDAO; import org.apache.ambari.server.orm.dao.MetainfoDAO; +import org.apache.ambari.server.orm.entities.AlertDefinitionEntity; import org.apache.ambari.server.orm.dao.PermissionDAO; import org.apache.ambari.server.orm.dao.ResourceTypeDAO; import org.apache.ambari.server.orm.dao.RoleAuthorizationDAO; @@ -59,6 +61,7 @@ import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.PropertyUpgradeBehavior; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; +import org.apache.ambari.server.state.alert.SourceType; import org.apache.ambari.server.state.kerberos.AbstractKerberosDescriptorContainer; import org.apache.ambari.server.state.kerberos.KerberosDescriptor; import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory; @@ -72,6 +75,8 @@ import org.w3c.dom.Document; import org.xml.sax.InputSource; import com.google.common.collect.Maps; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Provider; @@ -110,6 +115,8 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { public static final String PROPERTY_RANGER_HBASE_PLUGIN_ENABLED = "ranger-hbase-plugin-enabled"; public static final String PROPERTY_RANGER_KNOX_PLUGIN_ENABLED = "ranger-knox-plugin-enabled"; + public static final String ALERT_URL_PROPERTY_CONNECTION_TIMEOUT = "connection_timeout"; + private static final Logger LOG = LoggerFactory.getLogger (AbstractUpgradeCatalog.class); private static final Map<String, UpgradeCatalog> upgradeCatalogMap = @@ -260,6 +267,40 @@ public abstract class AbstractUpgradeCatalog implements UpgradeCatalog { return rows; } + /* + * This method will check all Web and Metric alerts one by one. + * Parameter connection_timeout will be added to every alert which + * doesn't contain it. + * */ + public void addConnectionTimeoutParamForWebAndMetricAlerts() { + LOG.info("Updating alert definitions."); + AmbariManagementController ambariManagementController = injector.getInstance(AmbariManagementController.class); + AlertDefinitionDAO alertDefinitionDAO = injector.getInstance(AlertDefinitionDAO.class); + Clusters clusters = ambariManagementController.getClusters(); + JsonParser jsonParser = new JsonParser(); + + for (final Cluster cluster : getCheckedClusterMap(clusters).values()) { + long clusterID = cluster.getClusterId(); + List<AlertDefinitionEntity> alertDefinitionList = alertDefinitionDAO.findAll(clusterID); + + for (AlertDefinitionEntity alertDefinitionEntity : alertDefinitionList) { + SourceType sourceType = alertDefinitionEntity.getSourceType(); + if (sourceType == SourceType.METRIC || sourceType == SourceType.WEB) { + String source = alertDefinitionEntity.getSource(); + JsonObject rootJson = jsonParser.parse(source).getAsJsonObject(); + + JsonObject uriJson = rootJson.get("uri").getAsJsonObject(); + if (!uriJson.has(ALERT_URL_PROPERTY_CONNECTION_TIMEOUT)) { + uriJson.addProperty(ALERT_URL_PROPERTY_CONNECTION_TIMEOUT, 5.0); + alertDefinitionEntity.setSource(rootJson.toString()); + alertDefinitionDAO.merge(alertDefinitionEntity); + } + } + } + } + } + + protected Provider<EntityManager> getEntityManagerProvider() { return injector.getProvider(EntityManager.class); } http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java index 78869fe..453e05a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java @@ -375,6 +375,7 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog { upgradeCapSchedulerView(); fixAuthorizationDescriptions(); removeAuthorizations(); + addConnectionTimeoutParamForWebAndMetricAlerts(); } protected void updateClusterInheritedPermissionsConfig() throws SQLException { http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/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 e5bb7ca..538fa48 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 @@ -18,6 +18,8 @@ package org.apache.ambari.server.api.services; +import javax.persistence.EntityManager; +import junit.framework.Assert; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; @@ -43,8 +45,6 @@ import java.util.Properties; import java.util.Set; import java.util.UUID; -import javax.persistence.EntityManager; - import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StackAccessException; import org.apache.ambari.server.configuration.Configuration; @@ -104,8 +104,6 @@ import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.util.Modules; -import junit.framework.Assert; - public class AmbariMetaInfoTest { private static final String STACK_NAME_HDP = "HDP"; @@ -1821,7 +1819,7 @@ public class AmbariMetaInfoTest { assertNotNull( metricSource.getUri().getHttpsPropertyValue() ); assertNotNull( metricSource.getUri().getHttpsUri() ); assertNotNull( metricSource.getUri().getHttpUri() ); - assertEquals(12345, metricSource.getUri().getDefaultPort()); + assertEquals(12345, metricSource.getUri().getDefaultPort().intValue()); // // ignore host assertTrue(ignoreHost.isHostIgnored()); http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java index d8aa62a..95ae673 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java @@ -20,14 +20,24 @@ package org.apache.ambari.server.upgrade; import javax.persistence.EntityManager; - import junit.framework.Assert; - -import static org.easymock.EasyMock.*; +import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.anyString; +import static org.easymock.EasyMock.capture; +import static org.easymock.EasyMock.createMockBuilder; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.eq; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.newCapture; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.io.File; import java.lang.reflect.Field; @@ -45,9 +55,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.inject.AbstractModule; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.actionmanager.ActionManager; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -90,6 +97,7 @@ import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; +import org.apache.ambari.server.state.alert.SourceType; import org.apache.ambari.server.state.kerberos.KerberosDescriptor; import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor; import org.apache.ambari.server.state.kerberos.KerberosKeytabDescriptor; @@ -107,15 +115,17 @@ import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.inject.AbstractModule; import com.google.inject.Binder; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Provider; -import org.junit.rules.TemporaryFolder; - public class UpgradeCatalog240Test { private static Injector injector; private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class); @@ -503,6 +513,7 @@ public class UpgradeCatalog240Test { Method updateFalconConfigs = UpgradeCatalog240.class.getDeclaredMethod("updateFalconConfigs"); Method fixAuthorizationDescriptions = UpgradeCatalog240.class.getDeclaredMethod("fixAuthorizationDescriptions"); Method removeAuthorizations = UpgradeCatalog240.class.getDeclaredMethod("removeAuthorizations"); + Method addConnectionTimeoutParamForWebAndMetricAlerts = AbstractUpgradeCatalog.class.getDeclaredMethod("addConnectionTimeoutParamForWebAndMetricAlerts"); Capture<String> capturedStatements = newCapture(CaptureType.ALL); @@ -540,6 +551,7 @@ public class UpgradeCatalog240Test { .addMockedMethod(updateFalconConfigs) .addMockedMethod(fixAuthorizationDescriptions) .addMockedMethod(removeAuthorizations) + .addMockedMethod(addConnectionTimeoutParamForWebAndMetricAlerts) .createMock(); Field field = AbstractUpgradeCatalog.class.getDeclaredField("dbAccessor"); @@ -572,6 +584,7 @@ public class UpgradeCatalog240Test { upgradeCatalog240.updateFalconConfigs(); upgradeCatalog240.fixAuthorizationDescriptions(); upgradeCatalog240.removeAuthorizations(); + upgradeCatalog240.addConnectionTimeoutParamForWebAndMetricAlerts(); replay(upgradeCatalog240, dbAccessor); @@ -1785,5 +1798,75 @@ public class UpgradeCatalog240Test { assertTrue(upgradeCatalog240.isAtLeastHdp25(new StackId("HDP-2.6"))); assertFalse(upgradeCatalog240.isAtLeastHdp25(new StackId("SOMETHINGELSE-1.4"))); } + + @Test + public void testAddConnectionTimeoutParamForWebAndMetricAlerts() { + EasyMockSupport easyMockSupport = new EasyMockSupport(); + long clusterId = 1; + + final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); + final AlertDefinitionDAO mockAlertDefinitionDAO = easyMockSupport.createNiceMock(AlertDefinitionDAO.class); + final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); + final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); + final AlertDefinitionEntity webAlert = easyMockSupport.createNiceMock(AlertDefinitionEntity.class); + final AlertDefinitionEntity webAlertWithConnectionTimeout = easyMockSupport.createNiceMock(AlertDefinitionEntity.class); + final AlertDefinitionEntity metricAlert = easyMockSupport.createNiceMock(AlertDefinitionEntity.class); + final AlertDefinitionEntity portAlert = easyMockSupport.createNiceMock(AlertDefinitionEntity.class); + + List<AlertDefinitionEntity> alertDefinitionList = new ArrayList<>(); + alertDefinitionList.add(webAlert); + alertDefinitionList.add(webAlertWithConnectionTimeout); + alertDefinitionList.add(metricAlert); + alertDefinitionList.add(portAlert); + + final Injector mockInjector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); + bind(Clusters.class).toInstance(mockClusters); + bind(EntityManager.class).toInstance(entityManager); + bind(AlertDefinitionDAO.class).toInstance(mockAlertDefinitionDAO); + bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); + bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); + } + }); + + expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); + expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ + put("normal", mockClusterExpected); + }}).atLeastOnce(); + expect(mockClusterExpected.getClusterId()).andReturn(clusterId).anyTimes(); + expect(webAlert.getSourceType()).andReturn(SourceType.WEB).once(); + expect(webAlert.getSource()).andReturn("{\"uri\": {\n" + + " \"http\": \"{{hostname}}:{{application-properties/atlas.server.http.port}}\",\n" + + " \"https\": \"{{hostname}}:{{application-properties/atlas.server.https.port}}\" } }").once(); + expect(metricAlert.getSourceType()).andReturn(SourceType.METRIC).once(); + expect(metricAlert.getSource()).andReturn("{\"uri\": {\n" + + " \"http\": \"{{hostname}}:{{application-properties/atlas.server.http.port}}\",\n" + + " \"https\": \"{{hostname}}:{{application-properties/atlas.server.https.port}}\" } }").once(); + expect(webAlertWithConnectionTimeout.getSourceType()).andReturn(SourceType.WEB).once(); + expect(webAlertWithConnectionTimeout.getSource()).andReturn("{\"uri\":{\"" + + "http\":\"{{hostname}}:{{application-properties/atlas.server.http.port}}\"," + + "\"https\":\"{{hostname}}:{{application-properties/atlas.server.https.port}}\"," + + "\"connection_timeout\":5.0}}").once(); + expect(portAlert.getSourceType()).andReturn(SourceType.PORT).anyTimes(); + expect(portAlert.getSource()).andReturn("{\"uri\": {\n" + + " \"http\": \"{{hostname}}:{{application-properties/atlas.server.http.port}}\",\n" + + " \"https\": \"{{hostname}}:{{application-properties/atlas.server.https.port}}\" } }").anyTimes(); + expect(mockAlertDefinitionDAO.findAll(clusterId)).andReturn(alertDefinitionList); + + expect(mockAlertDefinitionDAO.merge(anyObject(AlertDefinitionEntity.class))).andReturn(anyObject(AlertDefinitionEntity.class)).times(2); + + webAlert.setSource("{\"uri\":{\"http\":\"{{hostname}}:{{application-properties/atlas.server.http.port}}\",\"https\":\"{{hostname}}:{{application-properties/atlas.server.https.port}}\",\"connection_timeout\":5.0}}"); + expectLastCall().once(); + + metricAlert.setSource("{\"uri\":{\"http\":\"{{hostname}}:{{application-properties/atlas.server.http.port}}\",\"https\":\"{{hostname}}:{{application-properties/atlas.server.https.port}}\",\"connection_timeout\":5.0}}"); + expectLastCall().once(); + + easyMockSupport.replayAll(); + mockInjector.getInstance(UpgradeCatalog240.class).addConnectionTimeoutParamForWebAndMetricAlerts(); + easyMockSupport.verifyAll(); + } + } http://git-wip-us.apache.org/repos/asf/ambari/blob/fc587077/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json b/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json index 9d9f2df..2b7cd7b 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json @@ -115,7 +115,7 @@ "https": "{{hdfs-site/dfs.datanode.https.address}}", "https_property": "{{hdfs-site/dfs.http.policy}}", "https_property_value": "HTTPS_ONLY", - "default_port": "12345" + "default_port": 12345 }, "reporting": { "ok": {
