Browse Source

AMBARI-16010 Update HDFS HA alerts definitions during upgrade (dsen)

Dmytro Sen 9 năm trước cách đây
mục cha
commit
d408e2c808

+ 26 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java

@@ -432,6 +432,17 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
       }});
     }};
 
+    String newNameservicePropertyValue = "{{hdfs-site/dfs.internal.nameservices}}";
+    final Set<String> alertNamesForNameserviceUpdate = new HashSet<String>() {{
+      add("namenode_webui");
+      add("namenode_hdfs_blocks_health");
+      add("namenode_hdfs_pending_deletion_blocks");
+      add("namenode_rpc_latency");
+      add("namenode_directory_status");
+      add("datanode_health_summary");
+      add("namenode_cpu");
+      add("namenode_hdfs_capacity_utilization");
+    }};
 
     // list of alerts that need to get property updates
     Set<String> alertNamesForPropertyUpdates = new HashSet<String>() {{
@@ -466,6 +477,7 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
       add("ams_metrics_collector_hbase_master_cpu");
       add("ambari_agent_disk_usage");
       add("namenode_last_checkpoint");
+      addAll(alertNamesForNameserviceUpdate);
     }};
 
     LOG.info("Updating alert definitions.");
@@ -581,6 +593,10 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
           }
         }
 
+        if (alertNamesForNameserviceUpdate.contains(alertDefinition.getDefinitionName())) {
+          String source = alertDefinition.getSource();
+          alertDefinition.setSource(setNameservice(source, newNameservicePropertyValue));
+        }
         // regeneration of hash and writing modified alerts to database, must go after all modifications finished
         alertDefinition.setHash(UUID.randomUUID().toString());
         alertDefinitionDAO.merge(alertDefinition);
@@ -588,6 +604,16 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
     }
   }
 
+  protected String setNameservice(String source, String paramValue) {
+    final String nameservicePropertyName = "nameservice";
+    JsonObject sourceJson = new JsonParser().parse(source).getAsJsonObject();
+    JsonObject highAvailability = sourceJson.getAsJsonObject("uri").getAsJsonObject("high_availability");
+    if (highAvailability.has(nameservicePropertyName)) {
+      highAvailability.addProperty(nameservicePropertyName, paramValue);
+    }
+    return sourceJson.toString();
+  }
+
   /*
   * Simple put method with check for key is not null
   * */

+ 46 - 12
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java

@@ -22,18 +22,8 @@ package org.apache.ambari.server.upgrade;
 import javax.persistence.EntityManager;
 
 import junit.framework.Assert;
-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.newCapture;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.reset;
-import static org.easymock.EasyMock.verify;
+
+import static org.easymock.EasyMock.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertNull;
@@ -67,7 +57,9 @@ import org.apache.ambari.server.controller.MaintenanceStateHelper;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
 import org.apache.ambari.server.state.AlertFirmness;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -1094,5 +1086,47 @@ public class UpgradeCatalog240Test {
       }
     }
   }
+
+  @Test
+  public void testNameserviceAlertsUpdate() {
+    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 namenodeWebUiAlertDefinitionEntity = new AlertDefinitionEntity();
+    namenodeWebUiAlertDefinitionEntity.setDefinitionName("namenode_webui");
+    namenodeWebUiAlertDefinitionEntity.setSource("{\"uri\": {\"high_availability\": {\"nameservice\": \"{{hdfs-site/dfs.nameservices}}\",\"alias_key\" : \"{{hdfs-site/dfs.ha.namenodes.{{ha-nameservice}}}}\",\"http_pattern\" : \"{{hdfs-site/dfs.namenode.http-address.{{ha-nameservice}}.{{alias}}}}\",\"https_pattern\" : \"{{hdfs-site/dfs.namenode.https-address.{{ha-nameservice}}.{{alias}}}}\"}}}");
+
+    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(mockAlertDefinitionDAO.findByName(eq(clusterId), eq("namenode_webui")))
+        .andReturn(namenodeWebUiAlertDefinitionEntity).atLeastOnce();
+
+    easyMockSupport.replayAll();
+    mockInjector.getInstance(UpgradeCatalog240.class).updateAlerts();
+
+    assertTrue(namenodeWebUiAlertDefinitionEntity.getSource().contains("{{hdfs-site/dfs.internal.nameservices}}"));
+    easyMockSupport.verifyAll();
+  }
 }