瀏覽代碼

AMBARI-5445 When new host components are created thru API, some indication should be given that Nagios has to be restarted (dsen)

Dmitry Sen 11 年之前
父節點
當前提交
11a9f1d5b6
共有 20 個文件被更改,包括 305 次插入33 次删除
  1. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
  2. 14 1
      ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
  3. 42 7
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
  4. 11 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
  5. 6 2
      ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
  6. 10 1
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
  7. 11 0
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
  8. 31 2
      ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
  9. 5 0
      ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java
  10. 1 1
      ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
  11. 1 1
      ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
  12. 1 1
      ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
  13. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml
  14. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml
  15. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml
  16. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml
  17. 6 1
      ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
  18. 59 4
      ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
  19. 21 2
      ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java
  20. 80 10
      ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java

@@ -339,6 +339,7 @@ public class HeartBeatHandler {
               LOG.info("Updating applied config on service " + scHost.getServiceName() +
                   ", component " + scHost.getServiceComponentName() + ", host " + scHost.getHostName());
               scHost.updateActualConfigs(report.getConfigurationTags());
+              scHost.setRestartRequired(false);
             }
 
             if (RoleCommand.CUSTOM_COMMAND.toString().equals(report.getRoleCommand()) &&
@@ -354,6 +355,7 @@ public class HeartBeatHandler {
                     "START".equals(report.getCustomCommand()))) {
               scHost.handleEvent(new ServiceComponentHostStartedEvent(schName,
                   hostname, now));
+              scHost.setRestartRequired(false);
             } else if (RoleCommand.STOP.toString().equals(report.getRoleCommand()) ||
                 (RoleCommand.CUSTOM_COMMAND.toString().equals(report.getRoleCommand()) &&
                     "STOP".equals(report.getCustomCommand()))) {

+ 14 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java

@@ -466,7 +466,8 @@ public class AmbariMetaInfo {
     return serviceInfoResult;
   }
 
-  public List<ServiceInfo> getSupportedServices(String stackName, String version) throws AmbariException {
+  public List<ServiceInfo> getSupportedServices(String stackName, String version)
+    throws AmbariException {
     List<ServiceInfo> servicesResult = null;
     StackInfo stack = getStackInfo(stackName, version);
     if (stack != null)
@@ -474,6 +475,18 @@ public class AmbariMetaInfo {
     return servicesResult;
   }
 
+  public List<String> getMonitoringServiceNames(String stackName, String version)
+    throws AmbariException{
+
+    List<String> monitoringServices = new ArrayList<String>();
+    for (ServiceInfo service : getSupportedServices(stackName, version)) {
+      if (service.isMonitoringService()) {
+        monitoringServices.add(service.getName());
+      }
+    }
+    return monitoringServices;
+  }
+
   public List<StackInfo> getSupportedStacks() {
     return stacksResult;
   }

+ 42 - 7
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -497,24 +497,22 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       throw new DuplicateResourceException(msg + names.toString());
     }
 
+    // set restartRequired flag for  monitoring services
+    setMonitoringServicesRestartRequired(requests);
     // now doing actual work
     persistServiceComponentHosts(requests);
   }
 
   @Transactional
-  void persistServiceComponentHosts(Set<ServiceComponentHostRequest> requests) throws AmbariException {
+  void persistServiceComponentHosts(Set<ServiceComponentHostRequest> requests)
+    throws AmbariException {
+
     for (ServiceComponentHostRequest request : requests) {
       Cluster cluster = clusters.getCluster(request.getClusterName());
       Service s = cluster.getService(request.getServiceName());
       ServiceComponent sc = s.getServiceComponent(
           request.getComponentName());
 
-      StackId stackId = sc.getDesiredStackVersion();
-      ComponentInfo compInfo = ambariMetaInfo.getComponentCategory(
-          stackId.getStackName(), stackId.getStackVersion(),
-          s.getName(), sc.getName());
-      boolean isClient = compInfo.isClient();
-
       ServiceComponentHost sch =
           serviceComponentHostFactory.createNew(sc, request.getHostname());
 
@@ -531,6 +529,39 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     }
   }
 
+  private void setMonitoringServicesRestartRequired(
+    Set<ServiceComponentHostRequest> requests) throws AmbariException {
+
+    for (ServiceComponentHostRequest request : requests) {
+      Cluster cluster = clusters.getCluster(request.getClusterName());
+
+      StackId stackId = cluster.getCurrentStackVersion();
+      List<String> monitoringServices = ambariMetaInfo.getMonitoringServiceNames(
+        stackId.getStackName(), stackId.getStackVersion());
+
+      for (String serviceName : monitoringServices) {
+        if (cluster.getServices().containsKey(serviceName)) {
+          Service service = cluster.getService(serviceName);
+
+          for (ServiceComponent sc : service.getServiceComponents().values()) {
+            if (sc.isMasterComponent()) {
+              for (ServiceComponentHost sch : sc.getServiceComponentHosts().values()) {
+                sch.setRestartRequired(true);
+              }
+              continue;
+            }
+
+            String hostname = request.getHostname();
+            if (sc.getServiceComponentHosts().containsKey(hostname)) {
+              ServiceComponentHost sch = sc.getServiceComponentHost(hostname);
+              sch.setRestartRequired(true);
+            }
+          }
+        }
+      }
+    }
+  }
+
 
   @Override
   public synchronized void createConfiguration(
@@ -2116,6 +2147,10 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       }
     }
 
+    // set restartRequired flag for  monitoring services
+    if (!safeToRemoveSCHs.isEmpty()) {
+      setMonitoringServicesRestartRequired(requests);
+    }
     return null;
   }
 

+ 11 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java

@@ -74,6 +74,10 @@ public class HostComponentDesiredStateEntity {
   @Column(name="maintenance_state", nullable = false, insertable = true, updatable = true)
   private MaintenanceState maintenanceState = MaintenanceState.OFF;
 
+  @Basic
+  @Column(name = "restart_required", insertable = true, updatable = true, nullable = false)
+  private Boolean restartRequired = false;
+
   public Long getClusterId() {
     return clusterId;
   }
@@ -185,4 +189,11 @@ public class HostComponentDesiredStateEntity {
     this.hostEntity = hostEntity;
   }
 
+  public boolean isRestartRequired() {
+    return restartRequired;
+  }
+
+  public void setRestartRequired(boolean restartRequired) {
+    this.restartRequired = restartRequired;
+  }
 }

+ 6 - 2
ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java

@@ -236,10 +236,14 @@ public class ConfigHelper {
    */
   public boolean isStaleConfigs(ServiceComponentHost sch) throws AmbariException {
 
-    Map<String, HostConfig> actual = sch.getActualConfigs();
+    if (sch.isRestartRequired()) {
+      return true;
+    }
+
+    Map <String, HostConfig> actual = sch.getActualConfigs();
     if (null == actual || actual.isEmpty())
       return false;
-    
+
     Cluster cluster = clusters.getClusterById(sch.getClusterId());
     StackId stackId = cluster.getDesiredStackVersion();
     

+ 10 - 1
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java

@@ -136,5 +136,14 @@ public interface ServiceComponentHost {
    */
   public List<Map<String, String>> getProcesses();
 
-  
+  /**
+   * @return whether restart required
+   */
+  public boolean isRestartRequired();
+
+  /**
+   * @param restartRequired the restartRequired flag
+   */
+  public void setRestartRequired(boolean restartRequired);
+
 }

+ 11 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java

@@ -57,6 +57,10 @@ public class ServiceInfo {
   @XmlElementWrapper(name="configuration-dependencies")
   @XmlElement(name="config-type")
   private List<String> configDependencies;
+
+  @JsonIgnore
+  @XmlElement(defaultValue = "false")
+  private boolean monitoringService;
   
   @XmlTransient
   private File metricsFile = null;
@@ -382,4 +386,11 @@ public class ServiceInfo {
     return configDir;
   }
 
+  public boolean isMonitoringService() {
+    return monitoringService;
+  }
+
+  public void setMonitoringService(boolean monitoringService) {
+    this.monitoringService = monitoringService;
+  }
 }

+ 31 - 2
ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java

@@ -1438,6 +1438,35 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
       clusterGlobalLock.readLock().unlock();
     }
   }
-  
-  
+
+  @Override
+  public boolean isRestartRequired() {
+    clusterGlobalLock.readLock().lock();
+    try {
+      readLock.lock();
+      try {
+        return desiredStateEntity.isRestartRequired();
+      } finally {
+        readLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
+  public void setRestartRequired(boolean restartRequired) {
+    clusterGlobalLock.readLock().lock();
+    try {
+      writeLock.lock();
+      try {
+        desiredStateEntity.setRestartRequired(restartRequired);
+        saveIfPersisted();
+      } finally {
+        writeLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
 }

+ 5 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java

@@ -56,6 +56,11 @@ public class UpgradeCatalog160 extends AbstractUpgradeCatalog {
     dbAccessor.createTable("hostgroup_configuration", columns, "blueprint_name",
         "hostgroup_name", "type_name");
 
+    //=========================================================================
+    // Add columns
+    dbAccessor.addColumn("hostcomponentdesiredstate",
+      new DBAccessor.DBColumnInfo("restart_required", Boolean.class, 1, 0, false));
+
     // ========================================================================
     // Add constraints
     dbAccessor.addFKConstraint("hostgroup_configuration", "FK_hg_config_blueprint_name",

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -30,7 +30,7 @@ CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data LONGTEXT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
 CREATE TABLE clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY (service_name, cluster_id));
 CREATE TABLE clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
-CREATE TABLE hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', PRIMARY KEY (cluster_id, component_name, host_name, service_name));
+CREATE TABLE hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', restart_required TINYINT(1) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 CREATE TABLE hostcomponentstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, current_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 CREATE TABLE hosts (host_name VARCHAR(255) NOT NULL, cpu_count INTEGER NOT NULL, cpu_info VARCHAR(255) NOT NULL, discovery_status VARCHAR(2000) NOT NULL, host_attributes LONGTEXT NOT NULL, ipv4 VARCHAR(255), ipv6 VARCHAR(255), last_registration_time BIGINT NOT NULL, os_arch VARCHAR(255) NOT NULL, os_info VARCHAR(1000) NOT NULL, os_type VARCHAR(255) NOT NULL, ph_cpu_count INTEGER, public_host_name VARCHAR(255), rack_info VARCHAR(255) NOT NULL, total_mem BIGINT NOT NULL, PRIMARY KEY (host_name));
 CREATE TABLE hoststate (agent_version VARCHAR(255) NOT NULL, available_mem BIGINT NOT NULL, current_state VARCHAR(255) NOT NULL, health_status VARCHAR(255), host_name VARCHAR(255) NOT NULL, time_in_state BIGINT NOT NULL, maintenance_state VARCHAR(512), PRIMARY KEY (host_name));

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -20,7 +20,7 @@ CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255
 CREATE TABLE clusterconfig (version_tag VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_data CLOB NOT NULL, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
 CREATE TABLE clusterservices (service_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, service_enabled NUMBER(10) NOT NULL, PRIMARY KEY (service_name, cluster_id));
 CREATE TABLE clusterstate (cluster_id NUMBER(19) NOT NULL, current_cluster_state VARCHAR2(255) NULL, current_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
-CREATE TABLE hostcomponentdesiredstate (cluster_id NUMBER(19) NOT NULL, component_name VARCHAR2(255) NOT NULL, desired_stack_version VARCHAR2(255) NULL, desired_state VARCHAR2(255) NOT NULL, host_name VARCHAR2(255) NOT NULL, service_name VARCHAR2(255) NOT NULL, admin_state VARCHAR2(32) NULL, maintenance_state VARCHAR2(32) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
+CREATE TABLE hostcomponentdesiredstate (cluster_id NUMBER(19) NOT NULL, component_name VARCHAR2(255) NOT NULL, desired_stack_version VARCHAR2(255) NULL, desired_state VARCHAR2(255) NOT NULL, host_name VARCHAR2(255) NOT NULL, service_name VARCHAR2(255) NOT NULL, admin_state VARCHAR2(32) NULL, maintenance_state VARCHAR2(32) NOT NULL, restart_required NUMBER(1) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 CREATE TABLE hostcomponentstate (cluster_id NUMBER(19) NOT NULL, component_name VARCHAR2(255) NOT NULL, current_stack_version VARCHAR2(255) NOT NULL, current_state VARCHAR2(255) NOT NULL, host_name VARCHAR2(255) NOT NULL, service_name VARCHAR2(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 CREATE TABLE hosts (host_name VARCHAR2(255) NOT NULL, cpu_count INTEGER NOT NULL, cpu_info VARCHAR2(255) NULL, discovery_status VARCHAR2(2000) NULL, host_attributes CLOB NULL, ipv4 VARCHAR2(255) NULL, ipv6 VARCHAR2(255) NULL, last_registration_time INTEGER NOT NULL, os_arch VARCHAR2(255) NULL, os_info VARCHAR2(1000) NULL, os_type VARCHAR2(255) NULL, ph_cpu_count INTEGER NOT NULL, public_host_name VARCHAR2(255) NULL, rack_info VARCHAR2(255) NOT NULL, total_mem INTEGER NOT NULL, PRIMARY KEY (host_name));
 CREATE TABLE hoststate (agent_version VARCHAR2(255) NULL, available_mem NUMBER(19) NOT NULL, current_state VARCHAR2(255) NOT NULL, health_status VARCHAR2(255) NULL, host_name VARCHAR2(255) NOT NULL, time_in_state NUMBER(19) NOT NULL, maintenance_state VARCHAR2(512), PRIMARY KEY (host_name));

+ 1 - 1
ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql

@@ -43,7 +43,7 @@ GRANT ALL PRIVILEGES ON TABLE ambari.clusterservices TO :username;
 CREATE TABLE ambari.clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusterstate TO :username;
 
-CREATE TABLE ambari.hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
+CREATE TABLE ambari.hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL, restart_required BOOLEAN NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 GRANT ALL PRIVILEGES ON TABLE ambari.hostcomponentdesiredstate TO :username;
 
 CREATE TABLE ambari.hostcomponentstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, current_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml

@@ -108,6 +108,7 @@
       <configuration-dependencies>
         <config-type>global</config-type>
       </configuration-dependencies>
+      <monitoringService>true</monitoringService>
     </service>
   </services>
 </metainfo>

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml

@@ -95,6 +95,7 @@
           </packages>
         </osSpecific>
       </osSpecifics>
+      <monitoringService>true</monitoringService>
     </service>
   </services>
 </metainfo>

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml

@@ -103,6 +103,7 @@
       <configuration-dependencies>
         <config-type>global</config-type>
       </configuration-dependencies>
+      <monitoringService>true</monitoringService>
     </service>
   </services>
 </metainfo>

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml

@@ -94,6 +94,7 @@
           </packages>
         </osSpecific>
       </osSpecifics>
+      <monitoringService>true</monitoringService>
     </service>
   </services>
 </metainfo>

+ 6 - 1
ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java

@@ -339,7 +339,8 @@ public class TestHeartbeatHandler {
         getServiceComponent(NAMENODE).getServiceComponentHost(DummyHostname1);
     serviceComponentHost1.setState(State.INSTALLED);
     serviceComponentHost2.setState(State.STARTED);
-
+    serviceComponentHost1.setRestartRequired(true);
+    serviceComponentHost2.setRestartRequired(true);
 
     HeartBeat hb = new HeartBeat();
     hb.setResponseId(0);
@@ -376,13 +377,17 @@ public class TestHeartbeatHandler {
     reports.add(crn);
     hb.setReports(reports);
 
+    assertTrue(serviceComponentHost1.isRestartRequired());
+
     handler.handleHeartBeat(hb);
 
     // the heartbeat test passed if actual configs is populated
     State componentState1 = serviceComponentHost1.getState();
     assertEquals(State.STARTED, componentState1);
+    assertFalse(serviceComponentHost1.isRestartRequired());
     State componentState2 = serviceComponentHost2.getState();
     assertEquals(State.INSTALLED, componentState2);
+    assertTrue(serviceComponentHost2.isRestartRequired());
   }
 
   @Test

+ 59 - 4
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -133,7 +133,6 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.persist.PersistService;
-import com.google.inject.persist.Transactional;
 
 public class AmbariManagementControllerTest {
 
@@ -1172,9 +1171,15 @@ public class AmbariManagementControllerTest {
     Cluster foo = clusters.getCluster("foo");
     Cluster c1 = clusters.getCluster("c1");
     Cluster c2 = clusters.getCluster("c2");
-    foo.setDesiredStackVersion(new StackId("HDP-0.2"));
-    c1.setDesiredStackVersion(new StackId("HDP-0.2"));
-    c2.setDesiredStackVersion(new StackId("HDP-0.2"));
+    StackId stackId = new StackId("HDP-0.2");
+    foo.setDesiredStackVersion(stackId);
+    foo.setCurrentStackVersion(stackId);
+    stackId = new StackId("HDP-0.2");
+    c1.setDesiredStackVersion(stackId);
+    c1.setCurrentStackVersion(stackId);
+    stackId = new StackId("HDP-0.2");
+    c2.setDesiredStackVersion(stackId);
+    c2.setCurrentStackVersion(stackId);
 
     try {
       set1.clear();
@@ -9364,6 +9369,56 @@ public class AmbariManagementControllerTest {
     Assert.assertNull(hrc3);
   }
 
+  @Test
+  public void setMonitoringServicesRestartRequired() throws Exception {
+    String clusterName = "c1";
+    createCluster(clusterName);
+    Cluster cluster = clusters.getCluster(clusterName);
+    StackId stackId = new StackId("HDP-2.0.5");
+    cluster.setDesiredStackVersion(stackId);
+    cluster.setCurrentStackVersion(stackId);
+
+    String hdfsService = "HDFS";
+    String nagiosService = "NAGIOS";
+    createService(clusterName, hdfsService, null);
+    createService(clusterName, nagiosService, null);
+
+    String namenode = "NAMENODE";
+    String datanode = "DATANODE";
+    String hdfsClient = "HDFS_CLIENT";
+    String nagiosServer = "NAGIOS_SERVER";
+    createServiceComponent(clusterName, hdfsService, namenode,
+      State.INIT);
+    createServiceComponent(clusterName, hdfsService, datanode,
+      State.INIT);
+    createServiceComponent(clusterName, nagiosService, nagiosServer,
+      State.INIT);
+
+    String host1 = "h1";
+
+    addHost(host1, clusterName);
+    createServiceComponentHost(clusterName, hdfsService, namenode, host1, null);
+    createServiceComponentHost(clusterName, hdfsService, datanode, host1, null);
+    createServiceComponentHost(clusterName, nagiosService, nagiosServer, host1,
+      null);
+
+
+    ServiceComponentHost nagiosSch = null;
+    for (ServiceComponentHost sch : cluster.getServiceComponentHosts(host1)) {
+      if (sch.getServiceComponentName().equals(nagiosServer)) {
+        nagiosSch = sch;
+      }
+    }
+    assertFalse(nagiosSch.isRestartRequired());
+
+    createServiceComponent(clusterName, hdfsService, hdfsClient,
+      State.INIT);
+    createServiceComponentHost(clusterName, hdfsService, hdfsClient, host1, null);
+
+    assertTrue(nagiosSch.isRestartRequired());
+
+  }
+
   @Test
   public void testMaintenanceState() throws Exception {
     String clusterName = "c1";

+ 21 - 2
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java

@@ -53,10 +53,11 @@ public class UpgradeCatalog160Test {
     final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);
     Configuration configuration = createNiceMock(Configuration.class);
     Capture<List<DBAccessor.DBColumnInfo>> hgConfigcolumnCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
+    Capture<DBAccessor.DBColumnInfo> restartRequiredColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
 
     expect(configuration.getDatabaseUrl()).andReturn(Configuration.JDBC_IN_MEMORY_URL).anyTimes();
 
-    setBPHostGroupConfigExpectations(dbAccessor, hgConfigcolumnCapture);
+    setBPHostGroupConfigExpectations(dbAccessor, hgConfigcolumnCapture, restartRequiredColumnCapture);
 
     replay(dbAccessor, configuration);
     AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
@@ -69,6 +70,7 @@ public class UpgradeCatalog160Test {
     verify(dbAccessor, configuration);
 
     assertHGConfigColumns(hgConfigcolumnCapture);
+    assertRestartRequiredColumn(restartRequiredColumnCapture);
   }
 
   @Test
@@ -98,10 +100,15 @@ public class UpgradeCatalog160Test {
     return injector.getInstance(UpgradeCatalog160.class);
   }
 
-  private void setBPHostGroupConfigExpectations(DBAccessor dbAccessor, Capture<List<DBAccessor.DBColumnInfo>> columnCapture) throws SQLException {
+  private void setBPHostGroupConfigExpectations(DBAccessor dbAccessor,
+    Capture<List<DBAccessor.DBColumnInfo>> columnCapture,
+    Capture<DBAccessor.DBColumnInfo> restartRequiredColumnCapture) throws SQLException {
+
     dbAccessor.createTable(eq("hostgroup_configuration"), capture(columnCapture),
         eq("blueprint_name"), eq("hostgroup_name"), eq("type_name"));
 
+    dbAccessor.addColumn(eq("hostcomponentdesiredstate"),
+      capture(restartRequiredColumnCapture));
 
     dbAccessor.addFKConstraint("hostgroup_configuration", "FK_hg_config_blueprint_name",
         "blueprint_name", "hostgroup", "blueprint_name", true);
@@ -140,4 +147,16 @@ public class UpgradeCatalog160Test {
     assertNull(column.getDefaultValue());
     assertFalse(column.isNullable());
   }
+
+  private void assertRestartRequiredColumn(
+    Capture<DBAccessor.DBColumnInfo> restartRequiredColumnCapture) {
+    DBAccessor.DBColumnInfo column = restartRequiredColumnCapture.getValue();
+    assertEquals("restart_required", column.getName());
+    assertEquals(1, (int) column.getLength());
+    assertEquals(Boolean.class, column.getType());
+    assertEquals(0, column.getDefaultValue());
+    assertFalse(column.isNullable());
+
+  }
+
 }

+ 80 - 10
ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml

@@ -16,15 +16,85 @@
    limitations under the License.
 -->
 <metainfo>
-    <user>root</user>
-    <comment>Nagios Monitoring and Alerting system</comment>
-    <version>3.5.0</version>
-
-    <components>
+  <schemaVersion>2.0</schemaVersion>
+  <services>
+    <service>
+      <name>NAGIOS</name>
+      <comment>Nagios Monitoring and Alerting system</comment>
+      <version>3.5.0</version>
+      <components>
         <component>
-            <name>NAGIOS_SERVER</name>
-            <category>MASTER</category>
+          <name>NAGIOS_SERVER</name>
+          <category>MASTER</category>
+          <commandScript>
+            <script>scripts/nagios_server.py</script>
+            <scriptType>PYTHON</scriptType>
+            <timeout>600</timeout>
+          </commandScript>
         </component>
-    </components>
-
-</metainfo>
+      </components>
+      <osSpecifics>
+        <osSpecific>
+          <osFamily>any</osFamily>
+          <packages>
+            <package>
+              <type>rpm</type>
+              <name>perl</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>perl-Net-SNMP</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>nagios-plugins</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>nagios</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>nagios-www</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>nagios-devel</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>fping</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>hdp_mon_nagios_addons</name>
+            </package>
+          </packages>
+        </osSpecific>
+        <osSpecific>
+          <osFamily>suse11</osFamily>
+          <packages>
+            <package>
+              <type>rpm</type>
+              <name>php5-json</name>
+            </package>
+            <package>
+              <type>rpm</type>
+              <name>apache2-mod_php5</name>
+            </package>
+          </packages>
+        </osSpecific>
+        <osSpecific>
+          <osFamily>redhat5</osFamily>
+          <packages>
+            <package>
+              <type>rpm</type>
+              <name>php-pecl-json.x86_64</name>
+            </package>
+          </packages>
+        </osSpecific>
+      </osSpecifics>
+      <monitoringService>true</monitoringService>
+    </service>
+  </services>
+</metainfo>