You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2014/04/22 18:13:51 UTC

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

Repository: ambari
Updated Branches:
  refs/heads/trunk 833eda897 -> 11a9f1d5b


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


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/11a9f1d5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/11a9f1d5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/11a9f1d5

Branch: refs/heads/trunk
Commit: 11a9f1d5b6116668a8914fb1d4cab58c6149e76f
Parents: 833eda8
Author: Dmitry Sen <ds...@hortonworks.com>
Authored: Tue Apr 22 19:13:45 2014 +0300
Committer: Dmitry Sen <ds...@hortonworks.com>
Committed: Tue Apr 22 19:13:45 2014 +0300

----------------------------------------------------------------------
 .../ambari/server/agent/HeartBeatHandler.java   |  2 +
 .../server/api/services/AmbariMetaInfo.java     | 15 +++-
 .../AmbariManagementControllerImpl.java         | 49 +++++++++--
 .../HostComponentDesiredStateEntity.java        | 11 +++
 .../ambari/server/state/ConfigHelper.java       |  8 +-
 .../server/state/ServiceComponentHost.java      | 11 ++-
 .../apache/ambari/server/state/ServiceInfo.java | 11 +++
 .../svccomphost/ServiceComponentHostImpl.java   | 33 ++++++-
 .../server/upgrade/UpgradeCatalog160.java       |  5 ++
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  2 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  2 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  2 +-
 .../HDP/1.3.2/services/GANGLIA/metainfo.xml     |  1 +
 .../HDP/1.3.2/services/NAGIOS/metainfo.xml      |  1 +
 .../HDP/2.0.6/services/GANGLIA/metainfo.xml     |  1 +
 .../HDP/2.0.6/services/NAGIOS/metainfo.xml      |  1 +
 .../server/agent/TestHeartbeatHandler.java      |  7 +-
 .../AmbariManagementControllerTest.java         | 63 +++++++++++++-
 .../server/upgrade/UpgradeCatalog160Test.java   | 23 ++++-
 .../HDP/2.0.5/services/NAGIOS/metainfo.xml      | 90 +++++++++++++++++---
 20 files changed, 305 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
index 0f284a2..c376bcd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartBeatHandler.java
+++ b/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()))) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/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 bafd9b5..659499e 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
@@ -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;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 93b0dca..978ffaf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/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;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
index 8b29852..6fb5021 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
+++ b/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;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index 964d2d6..16f8382 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/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();
     

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
index 0938af6..3718556 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
+++ b/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);
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
index 39566d9..6020481 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
+++ b/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;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 1d4ae4b..3586c08 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ b/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();
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java
index f66fe1c..b0521ee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog160.java
+++ b/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",

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index 1d04d0b..3e55558 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/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));

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index ae18892..816d63c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/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));

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index 1be43f1..df05fd4 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/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));

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml
index 528db40..b1e37a6 100644
--- a/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/GANGLIA/metainfo.xml
+++ b/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>

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml
index 74f6c2b..3b3986c 100644
--- a/ambari-server/src/main/resources/stacks/HDP/1.3.2/services/NAGIOS/metainfo.xml
+++ b/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>

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml
index 98703bc..d8ea723 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/GANGLIA/metainfo.xml
+++ b/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>

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml b/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml
index f435f6d..025835c 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/NAGIOS/metainfo.xml
+++ b/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>

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java b/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
index f0b130b..a04e2e1 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatHandler.java
+++ b/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

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index 9727db9..ff3f08a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/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();
@@ -9365,6 +9370,56 @@ public class AmbariManagementControllerTest {
   }
 
   @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";
     createCluster(clusterName);

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java
index e2234b2..a3de765 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog160Test.java
+++ b/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());
+
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/11a9f1d5/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml b/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml
index 76471cf..3a06b91 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/NAGIOS/metainfo.xml
+++ b/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>
\ No newline at end of file