Repository: ambari
Updated Branches:
  refs/heads/branch-2.4 e25ef6a6e -> 153d21a7f


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/153d21a7
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/153d21a7
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/153d21a7

Branch: refs/heads/branch-2.4
Commit: 153d21a7fcdc278e534998f6c1c7a12d8d87df5f
Parents: e25ef6a
Author: Vitaly Brodetskyi <[email protected]>
Authored: Mon Jun 13 23:25:51 2016 +0300
Committer: Vitaly Brodetskyi <[email protected]>
Committed: Mon Jun 13 23:25:51 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/153d21a7/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/153d21a7/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 f185346..6fe3083 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;
@@ -31,18 +35,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.entities.ArtifactEntity;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -53,6 +55,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;
@@ -66,6 +69,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;
@@ -104,6 +109,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 =
@@ -254,6 +261,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/153d21a7/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 bdcb8bf..bb18bc6 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
@@ -374,6 +374,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/153d21a7/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/153d21a7/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 c221138..e5b1e34 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);
@@ -502,6 +512,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);
 
@@ -538,6 +549,7 @@ public class UpgradeCatalog240Test {
             .addMockedMethod(updateFalconConfigs)
             .addMockedMethod(fixAuthorizationDescriptions)
             .addMockedMethod(removeAuthorizations)
+            .addMockedMethod(addConnectionTimeoutParamForWebAndMetricAlerts)
             .createMock();
 
     Field field = AbstractUpgradeCatalog.class.getDeclaredField("dbAccessor");
@@ -569,6 +581,7 @@ public class UpgradeCatalog240Test {
     upgradeCatalog240.updateFalconConfigs();
     upgradeCatalog240.fixAuthorizationDescriptions();
     upgradeCatalog240.removeAuthorizations();
+    upgradeCatalog240.addConnectionTimeoutParamForWebAndMetricAlerts();
 
     replay(upgradeCatalog240, dbAccessor);
 
@@ -1782,5 +1795,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/153d21a7/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": {

Reply via email to