Browse Source

AMBARI-975. Fix support for cascading updates to configs. (Hitesh Shah via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/branches/AMBARI-666@1406494 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar 12 năm trước cách đây
mục cha
commit
e3b14497c5
41 tập tin đã thay đổi với 2212 bổ sung1367 xóa
  1. 3 0
      AMBARI-666-CHANGES.txt
  2. 6 8
      ambari-agent/pom.xml
  3. 1 1
      ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb
  4. 1 0
      ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp
  5. 1 1
      ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb
  6. 15 5
      ambari-agent/src/main/python/ambari_agent/RepoInstaller.py
  7. 7 1
      ambari-server/pom.xml
  8. 1 0
      ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java
  9. 2 3
      ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
  10. 60 42
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
  11. 3 3
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
  12. 114 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
  13. 146 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
  14. 159 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
  15. 132 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
  16. 162 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
  17. 160 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
  18. 125 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
  19. 19 1219
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceProviderImpl.java
  20. 153 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
  21. 159 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
  22. 166 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
  23. 4 0
      ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
  24. 77 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ComponentConfigMappingDAO.java
  25. 77 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentConfigMappingDAO.java
  26. 0 2
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
  27. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
  28. 3 0
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
  29. 3 0
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
  30. 16 3
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
  31. 21 4
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
  32. 12 0
      ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
  33. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
  34. 81 3
      ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
  35. 14 0
      ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
  36. 1 1
      ambari-server/src/main/python/setupAgent.py
  37. 257 21
      ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
  38. 35 36
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ResourceProviderImplTest.java
  39. 3 3
      ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
  40. 8 8
      ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
  41. 2 2
      ambari-server/src/test/java/org/apache/ambari/server/state/host/HostTest.java

+ 3 - 0
AMBARI-666-CHANGES.txt

@@ -12,6 +12,9 @@ AMBARI-666 branch (unreleased changes)
 
   NEW FEATURES
 
+  AMBARI-975. Fix support for cascading updates to configs. (Hitesh Shah
+  via mahadev)
+
   AMBARI-971. Add api support for creating multiple resources in a single
   request. (John Speidel via mahadev)
 

+ 6 - 8
ambari-agent/pom.xml

@@ -16,6 +16,12 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
+  <parent>
+    <groupId>org.apache.ambari</groupId>
+    <artifactId>ambari-project</artifactId>
+    <version>1.0.3-SNAPSHOT</version>
+    <relativePath>../ambari-project</relativePath>
+  </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.apache.ambari</groupId>
   <artifactId>ambari-agent</artifactId>
@@ -96,7 +102,6 @@
           </execution>
         </executions>
       </plugin>
-
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>rpm-maven-plugin</artifactId>
@@ -117,7 +122,6 @@
             <require>puppet = 2.7.9</require>
           </requires>
           <mappings>
-
             <mapping>
               <directory>/usr/lib/python2.6/site-packages/ambari_agent</directory>
               <sources>
@@ -126,7 +130,6 @@
                 </source>
               </sources>
             </mapping>
-
             <mapping>
               <directory>/var/lib/${project.artifactId}/puppet</directory>
               <sources>
@@ -135,7 +138,6 @@
                 </source>
               </sources>
             </mapping>
-
             <mapping>
               <directory>/etc/ambari</directory>
               <sources>
@@ -144,7 +146,6 @@
                 </source>
               </sources>
             </mapping>
-
             <mapping>
               <directory>/usr/sbin</directory>
               <filemode>744</filemode>
@@ -154,7 +155,6 @@
                 </source>
               </sources>
             </mapping>
-
             <mapping>
               <directory>/var/run/ambari</directory>
             </mapping>
@@ -167,12 +167,10 @@
             <mapping>
               <directory>/var/ambari</directory>
             </mapping>
-
             <!-- -->
           </mappings>
         </configuration>
       </plugin>
-
     </plugins>
     <extensions>
       <extension>

+ 1 - 1
ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb

@@ -64,7 +64,7 @@ log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}:
 
 log4j.logger.org.apache.zookeeper=INFO
 #log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
-log4j.logger.org.apache.hadoop.hbase=DEBUG
+log4j.logger.org.apache.hadoop.hbase=INFO
 # Make these two classes INFO-level. Make them DEBUG to see more zk debug.
 log4j.logger.org.apache.hadoop.hbase.zookeeper.ZKUtil=INFO
 log4j.logger.org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher=INFO

+ 1 - 0
ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp

@@ -22,6 +22,7 @@ class hdp-repos::process_repo(
   $os_type,
   $repo_id,
   $base_url,
+  $mirror_list,
   $repo_name
 ) inherits hdp-hadoop::params
 {

+ 1 - 1
ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb

@@ -21,6 +21,6 @@
 #
 [<%=repo_id%>]
 name=<%=repo_name %>
-baseurl=<%=base_url %>
+<%if scope.function_hdp_is_empty(base_url)%>mirrorlist=<%=mirror_list %><% else %>baseurl=<%=base_url %><% end %>
 path=/
 enabled=1

+ 15 - 5
ambari-agent/src/main/python/ambari_agent/RepoInstaller.py

@@ -48,12 +48,22 @@ class RepoInstaller:
   def generateFiles(self):
     repoPuppetFiles = []
     for repo in self.repoInfoList:
-      repoFile = open(self.path + os.sep + repo['repo_id'] + '-' + str(self.taskId) + PUPPET_EXT, 'w+')
+      repoFile = open(self.path + os.sep + repo['repoId'] + '-' + str(self.taskId) + PUPPET_EXT, 'w+')
       writeImports(repoFile, self.modulesdir, inputFileName='imports.txt')
+      
+      baseUrl = ''
+      mirrorList = ''
+      
+      if repo.has_key('baseUrl'):
+        baseUrl = repo['baseUrl']
+
+      if repo.has_key('mirrorsList'):
+        mirrorList = repo['mirrorsList']
+
       repoFile.write('node /default/ {')
-      repoFile.write('class{ "hdp-repos::process_repo" : ' + ' os_type => "' + repo['os_type'] +
-      '", repo_id => "' + repo['repo_id'] + '", base_url => "' + repo['base_url'] +
-      '", repo_name => "' + repo['repo_name'] + '" }' )
+      repoFile.write('class{ "hdp-repos::process_repo" : ' + ' os_type => "' + repo['osType'] +
+      '", repo_id => "' + repo['repoId'] + '", base_url => "' + baseUrl +
+      '", mirror_list => "' + mirrorList +'", repo_name => "' + repo['repoName'] + '" }' )
       repoFile.write('}')
       repoFile.close()
       repoPuppetFiles.append(repoFile.name)
@@ -70,7 +80,7 @@ def main():
   jsonFile = open('test.json', 'r')
   jsonStr = jsonFile.read() 
   parsedJson = json.loads(jsonStr)
-  repoInstaller = RepoInstaller(parsedJson, '/tmp', '/home/centos/ambari_repo_info/ambari-agent/src/main/puppet/modules')
+  repoInstaller = RepoInstaller(parsedJson, '/tmp', '/home/centos/ambari_ws/ambari-agent/src/main/puppet/modules')
   repoInstaller.installRepos()
   
 if __name__ == '__main__':

+ 7 - 1
ambari-server/pom.xml

@@ -22,7 +22,7 @@
   <artifactId>ambari-server</artifactId>
   <packaging>jar</packaging>
   <name>Ambari Server</name>
-  <version>1.0.3</version>
+  <version>1.0.3-SNAPSHOT</version>
   <description>Ambari Server</description>
   <build>
     <plugins>
@@ -156,6 +156,12 @@
                 <source>
                   <location>src/main/resources/Ambari-DDL.sql</location>
                 </source>
+              </sources>
+            </mapping>
+
+            <mapping>
+              <directory>/var/lib/ambari-server/resources/stacks</directory>
+              <sources>
                 <source>
                   <location>src/main/resources/stacks</location>
                 </source>

+ 1 - 0
ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java

@@ -53,6 +53,7 @@ public class AgentResource {
   @Inject
   public static void init(HeartBeatHandler instance) {
     hh = instance;
+    hh.start();
   }
 
   /**

+ 2 - 3
ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java

@@ -95,7 +95,7 @@ public class AmbariMetaInfo {
   private static final String PROPERTY_XML_PROPERTY_VALUE = "value";
   private static final String PROPERTY_XML_PROPERTY_DESCRIPTION = "description";
 
-  
+
   /**
    * Ambari Meta Info Object
    * @param conf Configuration API to be used.
@@ -106,7 +106,7 @@ public class AmbariMetaInfo {
     String stackPath = conf.getMetadataPath();
     this.stackRoot = new File(stackPath);
   }
-  
+
   @Inject
   public AmbariMetaInfo(File stackRoot) throws Exception {
     this.stackRoot = stackRoot;
@@ -542,7 +542,6 @@ public class AmbariMetaInfo {
           }
         }
       }
-
     } catch (Exception e) {
       e.printStackTrace();
     }

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

@@ -164,22 +164,22 @@ public class AmbariManagementControllerImpl implements
     // FIXME add support for desired configs at cluster level
 
     boolean foundInvalidHosts = false;
-    String invalidHostsStr = "";
+    StringBuilder invalidHostsStr = new StringBuilder();
     if (request.getHostNames() != null) {
       for (String hostname : request.getHostNames()) {
         try {
           clusters.getHost(hostname);
         } catch (HostNotFoundException e) {
           if (foundInvalidHosts) {
-            invalidHostsStr += ",";
+            invalidHostsStr.append(",");
           }
           foundInvalidHosts = true;
-          invalidHostsStr += hostname;
+          invalidHostsStr.append(hostname);
         }
       }
     }
     if (foundInvalidHosts) {
-      throw new HostNotFoundException(invalidHostsStr);
+      throw new HostNotFoundException(invalidHostsStr.toString());
     }
 
     clusters.addCluster(request.getClusterName());
@@ -818,23 +818,23 @@ public class AmbariManagementControllerImpl implements
 
     cluster.addDesiredConfig(config);
   }
-  
+
   @Override
   public void createUsers(Set<UserRequest> requests) throws AmbariException {
-    
+
     for (UserRequest request : requests) {
 
       if (null == request.getUsername() || request.getUsername().isEmpty() ||
           null == request.getPassword() || request.getPassword().isEmpty()) {
         throw new AmbariException("Username and password must be supplied.");
       }
-      
+
       User user = users.getAnyUser(request.getUsername());
       if (null != user)
         throw new AmbariException("User already exists.");
-      
+
       users.createUser(request.getUsername(), request.getPassword());
-      
+
       if (0 != request.getRoles().size()) {
         user = users.getAnyUser(request.getUsername());
         if (null != user) {
@@ -845,9 +845,9 @@ public class AmbariManagementControllerImpl implements
         }
       }
     }
-    
+
   }
-  
+
   private Stage createNewStage(Cluster cluster, long requestId) {
     String logDir = baseLogDir + "/" + requestId;
     Stage stage = new Stage(requestId, logDir, cluster.getClusterName());
@@ -1276,7 +1276,8 @@ public class AmbariManagementControllerImpl implements
     clusters.mapHostsToCluster(request.getHostNames(),
         request.getClusterName());
 
-    if (!request.getStackVersion().equals(c.getDesiredStackVersion())) {
+    if (!request.getStackVersion().equals(
+        c.getDesiredStackVersion().getStackId())) {
       throw new IllegalArgumentException("Update of desired stack version"
           + " not supported");
     }
@@ -1364,9 +1365,11 @@ public class AmbariManagementControllerImpl implements
       }
     }
 
-    for (String serviceName : changedComponentCount.keySet()) {
+    for (Entry<String, Map<String, Integer>> entry :
+        changedComponentCount.entrySet()) {
+      String serviceName = entry.getKey();
       // smoke test service if more than one component is started
-      if (changedComponentCount.get(serviceName).size() > 1) {
+      if (entry.getValue().size() > 1) {
         smokeTestServices.add(serviceName);
         continue;
       }
@@ -1388,7 +1391,7 @@ public class AmbariManagementControllerImpl implements
 
     if (!changedScHosts.isEmpty()) {
       long nowTimestamp = System.currentTimeMillis();
-      requestId = new Long(actionManager.getNextRequestId());
+      requestId = Long.valueOf(actionManager.getNextRequestId());
 
       // FIXME cannot work with a single stage
       // multiple stages may be needed for reconfigure
@@ -1518,6 +1521,10 @@ public class AmbariManagementControllerImpl implements
       for (Entry<State, List<Service>> entry : changedServices.entrySet()) {
         State newState = entry.getKey();
         for (Service s : entry.getValue()) {
+          if (s.isClientOnlyService()
+              && newState == State.STARTED) {
+            continue;
+          }
           s.setDesiredState(newState);
         }
       }
@@ -1879,14 +1886,21 @@ public class AmbariManagementControllerImpl implements
         for (Entry<String,String> entry : request.getConfigVersions().entrySet()) {
           Config config = cluster.getDesiredConfig(entry.getKey(), entry.getValue());
           updated.put(config.getType(), config);
-          if (!updated.isEmpty()) {
-            s.updateDesiredConfigs(updated);
-            s.persist();
-          }
+        }
 
-          // FIXME delete relevant config types at component
-          // and hostcomponent level
-          // handle recursive updates to all components and hostcomponents
+        if (!updated.isEmpty()) {
+          s.updateDesiredConfigs(updated);
+          s.persist();
+        }
+
+        for (ServiceComponent sc : s.getServiceComponents().values()) {
+          sc.deleteDesiredConfigs(updated.keySet());
+          for (ServiceComponentHost sch :
+            sc.getServiceComponentHosts().values()) {
+            sch.deleteDesiredConfigs(updated.keySet());
+            sch.persist();
+          }
+          sc.persist();
         }
       }
     }
@@ -2136,13 +2150,17 @@ public class AmbariManagementControllerImpl implements
           Config config = cluster.getDesiredConfig(
               entry.getKey(), entry.getValue());
           updated.put(config.getType(), config);
-          if (!updated.isEmpty()) {
-            sc.updateDesiredConfigs(updated);
-            sc.persist();
-          }
         }
 
-        // TODO handle recursive updates to all hostcomponents
+        if (!updated.isEmpty()) {
+          sc.updateDesiredConfigs(updated);
+          for (ServiceComponentHost sch :
+              sc.getServiceComponentHosts().values()) {
+            sch.deleteDesiredConfigs(updated.keySet());
+            sch.persist();
+          }
+          sc.persist();
+        }
       }
     }
 
@@ -2419,7 +2437,7 @@ public class AmbariManagementControllerImpl implements
     return doStageCreation(cluster, null,
         null, changedScHosts);
   }
-  
+
   @Override
   public synchronized void updateUsers(Set<UserRequest> requests) throws AmbariException {
     for (UserRequest request : requests) {
@@ -2431,17 +2449,17 @@ public class AmbariManagementControllerImpl implements
         users.modifyPassword(u.getUserName(), request.getOldPassword(),
             request.getPassword());
       }
-      
+
       if (request.getRoles().size() > 0) {
         for (String role : u.getRoles()) {
           users.removeRoleFromUser(u, role);
         }
-        
+
         for (String role : request.getRoles()) {
           users.addRoleToUser(u, role);
         }
       }
-      
+
     }
   }
 
@@ -2493,11 +2511,11 @@ public class AmbariManagementControllerImpl implements
     // TODO Auto-generated method stub
     throw new AmbariException("Delete host components not supported");
   }
-  
+
   @Override
   public void deleteUsers(Set<UserRequest> requests)
     throws AmbariException {
-    
+
     for (UserRequest r : requests) {
       User u = users.getAnyUser(r.getUsername());
       if (null != u)
@@ -2670,39 +2688,39 @@ public class AmbariManagementControllerImpl implements
     }
     return response;
   }
-  
+
   @Override
   public Set<UserResponse> getUsers(Set<UserRequest> requests)
       throws AmbariException {
-    
+
     Set<UserResponse> responses = new HashSet<UserResponse>();
 
     for (UserRequest r : requests) {
-      
+
       // get them all
       if (null == r.getUsername()) {
         for (User u : users.getAllUsers()) {
           responses.add(new UserResponse(u.getUserName()));
         }
       } else {
-        
+
         User u = users.getAnyUser(r.getUsername());
-        
+
         if (null == u) {
           throw new AmbariException("Cannot find user '" + r.getUsername() + "'");
         }
-        
+
         UserResponse resp = new UserResponse(u.getUserName());
         resp.setRoles(new HashSet<String>(u.getRoles()));
 
         responses.add(resp);
       }
     }
-    
+
     return responses;
   }
-  
-  
+
+
 
   private String getClientHostForRunningAction(Cluster cluster,
       Service service) throws AmbariException {

+ 3 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java

@@ -68,9 +68,9 @@ import com.sun.jersey.spi.container.servlet.ServletContainer;
 @Singleton
 public class AmbariServer {
   private static Logger LOG = LoggerFactory.getLogger(AmbariServer.class);
-  public static int CLIENT_ONE_WAY = 4080;
-  public static int CLIENT_TWO_WAY = 8443;
-  public static int CLIENT_API_PORT = 8080;
+  public static final int CLIENT_ONE_WAY = 4080;
+  public static final int CLIENT_TWO_WAY = 8443;
+  public static final int CLIENT_API_PORT = 8080;
   private Server server = null;
   private Server serverForAgent = null;
 

+ 114 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java

@@ -0,0 +1,114 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.ActionRequest;
+import org.apache.ambari.server.controller.ActionResponse;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for action resources.
+ */
+class ActionResourceProvider extends ResourceProviderImpl {
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Actions
+  protected static final PropertyId ACTION_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name", "Actions");
+  protected static final PropertyId ACTION_SERVICE_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("service_name", "Actions");
+  protected static final PropertyId ACTION_ACTION_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("action_name", "Actions");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          ACTION_CLUSTER_NAME_PROPERTY_ID,
+          ACTION_SERVICE_NAME_PROPERTY_ID}));
+
+  ActionResourceProvider(Set<PropertyId> propertyIds,
+                         Map<Resource.Type, PropertyId> keyPropertyIds,
+                         AmbariManagementController managementController) {
+
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    Set<ActionRequest> requests = new HashSet<ActionRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+    return getRequestStatus(getManagementController().createActions(requests));
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws AmbariException {
+    ActionRequest actionRequest = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<ActionResponse> responses = getManagementController().getActions(
+        Collections.singleton(actionRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ActionResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Action);
+      resource.setProperty(ACTION_CLUSTER_NAME_PROPERTY_ID, response.getClusterName());
+      resource.setProperty(ACTION_SERVICE_NAME_PROPERTY_ID, response.getServiceName());
+      resource.setProperty(ACTION_ACTION_NAME_PROPERTY_ID, response.getActionName());
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  private ActionRequest getRequest(Map<PropertyId, Object> properties) {
+    return new ActionRequest(
+        (String)  properties.get(ACTION_CLUSTER_NAME_PROPERTY_ID),
+        (String)  properties.get(ACTION_SERVICE_NAME_PROPERTY_ID),
+        (String)  properties.get(ACTION_ACTION_NAME_PROPERTY_ID),
+        null);
+  }
+}

+ 146 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java

@@ -0,0 +1,146 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ClusterRequest;
+import org.apache.ambari.server.controller.ClusterResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for cluster resources.
+ */
+class ClusterResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Clusters
+  protected static final PropertyId CLUSTER_ID_PROPERTY_ID      = PropertyHelper.getPropertyId("cluster_id", "Clusters");
+  protected static final PropertyId CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("cluster_name", "Clusters");
+  protected static final PropertyId CLUSTER_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("version", "Clusters");
+  protected static final PropertyId CLUSTER_HOSTS_PROPERTY_ID   = PropertyHelper.getPropertyId("hosts", "Clusters");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          CLUSTER_ID_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  ClusterResourceProvider(Set<PropertyId> propertyIds,
+                          Map<Resource.Type, PropertyId> keyPropertyIds,
+                          AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+// ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+
+    for (Map<PropertyId, Object> properties : request.getProperties()) {
+      getManagementController().createCluster(getRequest(properties));
+    }
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    ClusterRequest clusterRequest = getRequest(getProperties(predicate));
+    Set<PropertyId> requestedIds   = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+
+    // TODO : handle multiple requests
+    Set<ClusterResponse> responses = getManagementController().getClusters(Collections.singleton(clusterRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ClusterResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Cluster);
+      setResourceProperty(resource, CLUSTER_ID_PROPERTY_ID, response.getClusterId(), requestedIds);
+      setResourceProperty(resource, CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
+      // FIXME requestedIds does not seem to be filled in properly for
+      // non-partial responses
+      resource.setProperty(CLUSTER_VERSION_PROPERTY_ID,
+          response.getDesiredStackVersion());
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+      ClusterRequest clusterRequest = getRequest(propertyMap);
+      getManagementController().updateCluster(clusterRequest);
+    }
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      ClusterRequest clusterRequest = getRequest(propertyMap);
+      getManagementController().deleteCluster(clusterRequest);
+    }
+    return getRequestStatus(null);
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a cluster request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the cluster request object
+   */
+  private ClusterRequest getRequest(Map<PropertyId, Object> properties) {
+
+    Long id = (Long) properties.get(CLUSTER_ID_PROPERTY_ID);
+    String stackVersion = (String) properties.get(CLUSTER_VERSION_PROPERTY_ID);
+
+    return new ClusterRequest(
+        id == null ? null : id,
+        (String) properties.get(CLUSTER_NAME_PROPERTY_ID),
+        stackVersion == null ? "HDP-0.1" : stackVersion,    // TODO : looks like version is required
+        /*properties.get(CLUSTER_HOSTS_PROPERTY_ID)*/ null);
+  }
+}

+ 159 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java

@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ServiceComponentRequest;
+import org.apache.ambari.server.controller.ServiceComponentResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for component resources.
+ */
+class ComponentResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Components
+  protected static final PropertyId COMPONENT_CLUSTER_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("cluster_name", "ServiceComponentInfo");
+  protected static final PropertyId COMPONENT_SERVICE_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("service_name", "ServiceComponentInfo");
+  protected static final PropertyId COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("component_name", "ServiceComponentInfo");
+  protected static final PropertyId COMPONENT_STATE_PROPERTY_ID          = PropertyHelper.getPropertyId("state", "ServiceComponentInfo");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          COMPONENT_CLUSTER_NAME_PROPERTY_ID,
+          COMPONENT_SERVICE_NAME_PROPERTY_ID,
+          COMPONENT_COMPONENT_NAME_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  ComponentResourceProvider(Set<PropertyId> propertyIds,
+                            Map<Resource.Type, PropertyId> keyPropertyIds,
+                            AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().createComponents(requests);
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    ServiceComponentRequest serviceComponentRequest = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<ServiceComponentResponse> responses = getManagementController().getComponents(Collections.singleton(serviceComponentRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ServiceComponentResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Component);
+//        setResourceProperty(resource, COMPONENT_CLUSTER_ID_PROPERTY_ID, response.getClusterId(), requestedIds);
+      setResourceProperty(resource, COMPONENT_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
+      setResourceProperty(resource, COMPONENT_COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
+//        setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID, response.getCurrentStackVersion(), requestedIds);
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+      ServiceComponentRequest compRequest = getRequest(propertyMap);
+
+      Map<String, String> configMap = new HashMap<String,String>();
+
+      for (Map.Entry<PropertyId,Object> entry : propertyMap.entrySet()) {
+        if (entry.getKey().getCategory().equals("config")) {
+          configMap.put(entry.getKey().getName(), (String) entry.getValue());
+        }
+      }
+
+      if (0 != configMap.size())
+        compRequest.setConfigVersions(configMap);
+
+      requests.add(compRequest);
+    }
+    return getRequestStatus(getManagementController().updateComponents(requests));
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+    return getRequestStatus(getManagementController().deleteComponents(requests));
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a component request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the component request object
+   */
+  private ServiceComponentRequest getRequest(Map<PropertyId, Object> properties) {
+    return new ServiceComponentRequest(
+        (String) properties.get(COMPONENT_CLUSTER_NAME_PROPERTY_ID),
+        (String) properties.get(COMPONENT_SERVICE_NAME_PROPERTY_ID),
+        (String) properties.get(COMPONENT_COMPONENT_NAME_PROPERTY_ID),
+        null,
+        (String) properties.get(COMPONENT_STATE_PROPERTY_ID));
+  }
+}

+ 132 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java

@@ -0,0 +1,132 @@
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ConfigurationRequest;
+import org.apache.ambari.server.controller.ConfigurationResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for configuration resources.
+ */
+class ConfigurationResourceProvider extends ResourceProviderImpl {
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Configurations (values are part of query strings and body post, so they don't have defined categories)
+  protected static final PropertyId CONFIGURATION_CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("cluster_name","Config");
+  protected static final PropertyId CONFIGURATION_CONFIG_TYPE_PROPERTY_ID     = PropertyHelper.getPropertyId("type");
+  protected static final PropertyId CONFIGURATION_CONFIG_TAG_PROPERTY_ID      = PropertyHelper.getPropertyId("tag");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          CONFIGURATION_CLUSTER_NAME_PROPERTY_ID,
+          CONFIGURATION_CONFIG_TYPE_PROPERTY_ID}));
+
+  ConfigurationResourceProvider(Set<PropertyId> propertyIds,
+                                Map<Resource.Type, PropertyId> keyPropertyIds,
+                                AmbariManagementController managementController) {
+
+    super(propertyIds, keyPropertyIds, managementController);
+
+  }
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    for (Map<PropertyId, Object> map : request.getProperties()) {
+
+      String cluster = (String) map.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID);
+      String type = (String) map.get(PropertyHelper.getPropertyId("type", ""));
+      String tag = (String) map.get(PropertyHelper.getPropertyId("tag", ""));
+      Map<String, String> configMap = new HashMap<String, String>();
+
+      Iterator<Map.Entry<PropertyId, Object>> it1 = map.entrySet().iterator();
+      while (it1.hasNext()) {
+        Map.Entry<PropertyId, Object> entry = it1.next();
+        if (entry.getKey().getCategory().equals("properties") && null != entry.getValue()) {
+          configMap.put(entry.getKey().getName(), entry.getValue().toString());
+        }
+      }
+
+      ConfigurationRequest configRequest = new ConfigurationRequest(cluster, type, tag, configMap);
+
+      getManagementController().createConfiguration(configRequest);
+    }
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws AmbariException {
+
+    ConfigurationRequest configRequest = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<ConfigurationResponse> responses = getManagementController().getConfigurations(Collections.singleton(configRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ConfigurationResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Configuration);
+      resource.setProperty(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID, response.getClusterName());
+      resource.setProperty(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID, response.getType());
+      resource.setProperty(CONFIGURATION_CONFIG_TAG_PROPERTY_ID, response.getVersionTag());
+      if (null != response.getConfigs() && response.getConfigs().size() > 0) {
+        Map<String, String> configs = response.getConfigs();
+
+        for (Map.Entry<String, String> entry : configs.entrySet()) {
+          PropertyId id = PropertyHelper.getPropertyId(entry.getKey(), "properties");
+          resource.setProperty(id, entry.getValue());
+        }
+      }
+
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  /**
+   * Throws an exception, as Configurations cannot be updated.
+   */
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws AmbariException {
+    throw new AmbariException ("Cannot update a Configuration resource.");
+  }
+
+  /**
+   * Throws an exception, as Configurations cannot be deleted.
+   */
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    throw new AmbariException ("Cannot delete a Configuration resource.");
+  }
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  private ConfigurationRequest getRequest(Map<PropertyId, Object> properties) {
+    String type = (String) properties.get(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID);
+
+    String tag = (String) properties.get(CONFIGURATION_CONFIG_TAG_PROPERTY_ID);
+
+    return new ConfigurationRequest(
+        (String) properties.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID),
+        type, tag, new HashMap<String, String>());
+  }
+}

+ 162 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java

@@ -0,0 +1,162 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ServiceComponentHostRequest;
+import org.apache.ambari.server.controller.ServiceComponentHostResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for host component resources.
+ */
+class HostComponentResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Host Components
+  protected static final PropertyId HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("cluster_name", "HostRoles");
+  protected static final PropertyId HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("service_name", "HostRoles");
+  protected static final PropertyId HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("component_name", "HostRoles");
+  protected static final PropertyId HOST_COMPONENT_HOST_NAME_PROPERTY_ID      = PropertyHelper.getPropertyId("host_name", "HostRoles");
+  protected static final PropertyId HOST_COMPONENT_STATE_PROPERTY_ID          = PropertyHelper.getPropertyId("state", "HostRoles");
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID,
+          HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID,
+          HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID,
+          HOST_COMPONENT_HOST_NAME_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  HostComponentResourceProvider(Set<PropertyId> propertyIds,
+                                Map<Resource.Type, PropertyId> keyPropertyIds,
+                                AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().createHostComponents(requests);
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    ServiceComponentHostRequest hostComponentRequest = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<ServiceComponentHostResponse> responses = getManagementController().getHostComponents(Collections.singleton(hostComponentRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ServiceComponentHostResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+      setResourceProperty(resource, HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
+      setResourceProperty(resource, HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
+      setResourceProperty(resource, HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
+      setResourceProperty(resource, HOST_COMPONENT_HOST_NAME_PROPERTY_ID, response.getHostname(), requestedIds);
+      setResourceProperty(resource, HOST_COMPONENT_STATE_PROPERTY_ID, response.getLiveState(), requestedIds);
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+
+      ServiceComponentHostRequest hostCompRequest = getRequest(propertyMap);
+
+      Map<String, String> configMap = new HashMap<String,String>();
+
+      for (Map.Entry<PropertyId,Object> entry : propertyMap.entrySet()) {
+        if (entry.getKey().getCategory().equals("config")) {
+          configMap.put(entry.getKey().getName(), (String) entry.getValue());
+        }
+      }
+
+      if (0 != configMap.size())
+        hostCompRequest.setConfigVersions(configMap);
+
+      requests.add(hostCompRequest);
+    }
+    return getRequestStatus(getManagementController().updateHostComponents(requests));
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+    return getRequestStatus(getManagementController().deleteHostComponents(requests));
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a component request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the component request object
+   */
+  private ServiceComponentHostRequest getRequest(Map<PropertyId, Object> properties) {
+    return new ServiceComponentHostRequest(
+        (String) properties.get(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID),
+        (String) properties.get(HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID),
+        (String) properties.get(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID),
+        (String) properties.get(HOST_COMPONENT_HOST_NAME_PROPERTY_ID),
+        null,
+        (String) properties.get(HOST_COMPONENT_STATE_PROPERTY_ID));
+  }
+}

+ 160 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java

@@ -0,0 +1,160 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.HostRequest;
+import org.apache.ambari.server.controller.HostResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for host resources.
+ */
+class HostResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Hosts
+  protected static final PropertyId HOST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name", "Hosts");
+  protected static final PropertyId HOST_NAME_PROPERTY_ID         = PropertyHelper.getPropertyId("host_name", "Hosts");
+  protected static final PropertyId HOST_IP_PROPERTY_ID           = PropertyHelper.getPropertyId("ip", "Hosts");
+  protected static final PropertyId HOST_TOTAL_MEM_PROPERTY_ID    = PropertyHelper.getPropertyId("total_mem", "Hosts");
+  protected static final PropertyId HOST_CPU_COUNT_PROPERTY_ID    = PropertyHelper.getPropertyId("cpu_count", "Hosts");
+  protected static final PropertyId HOST_OS_ARCH_PROPERTY_ID      = PropertyHelper.getPropertyId("os_arch", "Hosts");
+  protected static final PropertyId HOST_OS_TYPE_PROPERTY_ID      = PropertyHelper.getPropertyId("os_type", "Hosts");
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          HOST_NAME_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  HostResourceProvider(Set<PropertyId> propertyIds,
+                       Map<Resource.Type, PropertyId> keyPropertyIds,
+                       AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    Set<HostRequest> requests = new HashSet<HostRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().createHosts(requests);
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    HostRequest     hostRequest  = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<HostResponse> responses = getManagementController().getHosts(Collections.singleton(hostRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (HostResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Host);
+
+      // TODO : properly handle more than one cluster
+      if (null != hostRequest.getClusterNames()) {
+        for (String clusterName : hostRequest.getClusterNames()) {
+          if (response.getClusterNames().contains(clusterName)) {
+            setResourceProperty(resource, HOST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
+          }
+        }
+      }
+
+      setResourceProperty(resource, HOST_NAME_PROPERTY_ID, response.getHostname(), requestedIds);
+      setResourceProperty(resource, HOST_IP_PROPERTY_ID, response.getIpv4(), requestedIds);
+      setResourceProperty(resource, HOST_TOTAL_MEM_PROPERTY_ID, Long.valueOf(response.getTotalMemBytes()), requestedIds);
+      setResourceProperty(resource, HOST_CPU_COUNT_PROPERTY_ID, Long.valueOf(response.getCpuCount()), requestedIds);
+      setResourceProperty(resource, HOST_OS_ARCH_PROPERTY_ID, response.getOsArch(), requestedIds);
+      setResourceProperty(resource, HOST_OS_TYPE_PROPERTY_ID, response.getOsType(), requestedIds);
+      // TODO ...
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    Set<HostRequest> requests = new HashSet<HostRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().updateHosts(requests);
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    Set<HostRequest> requests = new HashSet<HostRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().deleteHosts(requests);
+    return getRequestStatus(null);
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a component request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the component request object
+   */
+  private HostRequest getRequest(Map<PropertyId, Object> properties) {
+    return new HostRequest(
+        (String)  properties.get(HOST_NAME_PROPERTY_ID),
+        // TODO : more than one cluster
+        properties.containsKey(HOST_CLUSTER_NAME_PROPERTY_ID) ?
+            Collections.singletonList((String)  properties.get(HOST_CLUSTER_NAME_PROPERTY_ID)) :
+              Collections.<String>emptyList(),
+        null);
+  }
+}

+ 125 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java

@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.RequestStatusRequest;
+import org.apache.ambari.server.controller.RequestStatusResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for request resources.
+ */
+class RequestResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+  // Requests
+  protected static final PropertyId REQUEST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name","Requests");
+  protected static final PropertyId REQUEST_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("id","Requests");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          REQUEST_ID_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  RequestResourceProvider(Set<PropertyId> propertyIds,
+                          Map<Resource.Type, PropertyId> keyPropertyIds,
+                          AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId>         requestedIds         = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    Map<PropertyId, Object> predicateProperties  = getProperties(predicate);
+    RequestStatusRequest requestStatusRequest = getRequest(predicateProperties);
+
+    String clusterName = (String) predicateProperties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
+
+    Set<RequestStatusResponse> responses = getManagementController()
+        .getRequestStatus(requestStatusRequest);
+    Set<Resource> resources = new HashSet<Resource>();
+    for (RequestStatusResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Request);
+      setResourceProperty(resource, REQUEST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
+      setResourceProperty(resource, REQUEST_ID_PROPERTY_ID, response.getRequestId(), requestedIds);
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a component request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the component request object
+   */
+  private RequestStatusRequest getRequest(Map<PropertyId, Object> properties) {
+    Long requestId = null;
+    if (properties.get(REQUEST_ID_PROPERTY_ID) != null) {
+      requestId = Long.valueOf((String) properties
+          .get(REQUEST_ID_PROPERTY_ID));
+    }
+    return new RequestStatusRequest(requestId);
+  }
+}

+ 19 - 1219
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceProviderImpl.java

@@ -18,40 +18,17 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
-import org.apache.ambari.server.controller.ActionRequest;
-import org.apache.ambari.server.controller.ActionResponse;
 import org.apache.ambari.server.controller.AmbariManagementController;
-import org.apache.ambari.server.controller.ClusterRequest;
-import org.apache.ambari.server.controller.ClusterResponse;
-import org.apache.ambari.server.controller.ConfigurationRequest;
-import org.apache.ambari.server.controller.ConfigurationResponse;
-import org.apache.ambari.server.controller.HostRequest;
-import org.apache.ambari.server.controller.HostResponse;
-import org.apache.ambari.server.controller.RequestStatusRequest;
 import org.apache.ambari.server.controller.RequestStatusResponse;
-import org.apache.ambari.server.controller.ServiceComponentHostRequest;
-import org.apache.ambari.server.controller.ServiceComponentHostResponse;
-import org.apache.ambari.server.controller.ServiceComponentRequest;
-import org.apache.ambari.server.controller.ServiceComponentResponse;
-import org.apache.ambari.server.controller.ServiceRequest;
-import org.apache.ambari.server.controller.ServiceResponse;
-import org.apache.ambari.server.controller.TaskStatusRequest;
-import org.apache.ambari.server.controller.TaskStatusResponse;
-import org.apache.ambari.server.controller.UserRequest;
-import org.apache.ambari.server.controller.UserResponse;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.PropertyId;
-import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
@@ -81,69 +58,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
   private final Map<Resource.Type, PropertyId> keyPropertyIds;
 
 
-  // ----- Property ID constants ---------------------------------------------
-
-  // Clusters
-  protected static final PropertyId CLUSTER_ID_PROPERTY_ID      = PropertyHelper.getPropertyId("cluster_id", "Clusters");
-  protected static final PropertyId CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("cluster_name", "Clusters");
-  protected static final PropertyId CLUSTER_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("version", "Clusters");
-  protected static final PropertyId CLUSTER_HOSTS_PROPERTY_ID   = PropertyHelper.getPropertyId("hosts", "Clusters");
-  // Services
-  protected static final PropertyId SERVICE_CLUSTER_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("cluster_name", "ServiceInfo");
-  protected static final PropertyId SERVICE_SERVICE_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("service_name", "ServiceInfo");
-  protected static final PropertyId SERVICE_SERVICE_STATE_PROPERTY_ID = PropertyHelper.getPropertyId("state", "ServiceInfo");
-
-  // Components
-  protected static final PropertyId COMPONENT_CLUSTER_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("cluster_name", "ServiceComponentInfo");
-  protected static final PropertyId COMPONENT_SERVICE_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("service_name", "ServiceComponentInfo");
-  protected static final PropertyId COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("component_name", "ServiceComponentInfo");
-  protected static final PropertyId COMPONENT_STATE_PROPERTY_ID          = PropertyHelper.getPropertyId("state", "ServiceComponentInfo");
-  // Hosts
-  protected static final PropertyId HOST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name", "Hosts");
-  protected static final PropertyId HOST_NAME_PROPERTY_ID         = PropertyHelper.getPropertyId("host_name", "Hosts");
-  protected static final PropertyId HOST_IP_PROPERTY_ID           = PropertyHelper.getPropertyId("ip", "Hosts");
-  protected static final PropertyId HOST_TOTAL_MEM_PROPERTY_ID    = PropertyHelper.getPropertyId("total_mem", "Hosts");
-  protected static final PropertyId HOST_CPU_COUNT_PROPERTY_ID    = PropertyHelper.getPropertyId("cpu_count", "Hosts");
-  protected static final PropertyId HOST_OS_ARCH_PROPERTY_ID      = PropertyHelper.getPropertyId("os_arch", "Hosts");
-  protected static final PropertyId HOST_OS_TYPE_PROPERTY_ID      = PropertyHelper.getPropertyId("os_type", "Hosts");
-  // Host Components
-  protected static final PropertyId HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("cluster_name", "HostRoles");
-  protected static final PropertyId HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID   = PropertyHelper.getPropertyId("service_name", "HostRoles");
-  protected static final PropertyId HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("component_name", "HostRoles");
-  protected static final PropertyId HOST_COMPONENT_HOST_NAME_PROPERTY_ID      = PropertyHelper.getPropertyId("host_name", "HostRoles");
-  protected static final PropertyId HOST_COMPONENT_STATE_PROPERTY_ID          = PropertyHelper.getPropertyId("state", "HostRoles");
-  // Configurations (values are part of query strings and body post, so they don't have defined categories)
-  protected static final PropertyId CONFIGURATION_CLUSTER_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("cluster_name","Config");
-  protected static final PropertyId CONFIGURATION_CONFIG_TYPE_PROPERTY_ID     = PropertyHelper.getPropertyId("type");
-  protected static final PropertyId CONFIGURATION_CONFIG_TAG_PROPERTY_ID      = PropertyHelper.getPropertyId("tag");
-  // Actions
-  protected static final PropertyId ACTION_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name", "Actions");
-  protected static final PropertyId ACTION_SERVICE_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("service_name", "Actions");
-  protected static final PropertyId ACTION_ACTION_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("action_name", "Actions");
-  // Requests
-  protected static final PropertyId REQUEST_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name","Requests");
-  protected static final PropertyId REQUEST_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("id","Requests");
-  // Tasks
-  protected static final PropertyId TASK_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name","Tasks");
-  protected static final PropertyId TASK_REQUEST_ID_PROPERTY_ID   = PropertyHelper.getPropertyId("request_id","Tasks");
-  protected static final PropertyId TASK_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("id","Tasks");
-  protected static final PropertyId TASK_STAGE_ID_PROPERTY_ID     = PropertyHelper.getPropertyId("stage_id","Tasks");
-  protected static final PropertyId TASK_HOST_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("host_name","Tasks");
-  protected static final PropertyId TASK_ROLE_PROPERTY_ID         = PropertyHelper.getPropertyId("role","Tasks");
-  protected static final PropertyId TASK_COMMAND_PROPERTY_ID      = PropertyHelper.getPropertyId("command","Tasks");
-  protected static final PropertyId TASK_STATUS_PROPERTY_ID       = PropertyHelper.getPropertyId("status","Tasks");
-  protected static final PropertyId TASK_EXIT_CODE_PROPERTY_ID    = PropertyHelper.getPropertyId("exit_code","Tasks");
-  protected static final PropertyId TASK_STDERR_PROPERTY_ID       = PropertyHelper.getPropertyId("stderr","Tasks");
-  protected static final PropertyId TASK_STOUT_PROPERTY_ID        = PropertyHelper.getPropertyId("stdout","Tasks");
-  protected static final PropertyId TASK_START_TIME_PROPERTY_ID   = PropertyHelper.getPropertyId("start_time","Tasks");
-  protected static final PropertyId TASK_ATTEMPT_CNT_PROPERTY_ID  = PropertyHelper.getPropertyId("attempt_cnt","Tasks");
-  
-  protected static final PropertyId USER_USERNAME_PROPERTY_ID     = PropertyHelper.getPropertyId("user_name","Users");
-  protected static final PropertyId USER_ROLES_PROPERTY_ID        = PropertyHelper.getPropertyId("roles", "Users");
-  protected static final PropertyId USER_PASSWORD_PROPERTY_ID     = PropertyHelper.getPropertyId("password", "Users");
-  protected static final PropertyId USER_OLD_PASSWORD_PROPERTY_ID = PropertyHelper.getPropertyId("old_password", "Users");
-
-  private final static Logger LOG =
+  protected final static Logger LOG =
       LoggerFactory.getLogger(ResourceProviderImpl.class);
 
     // ----- Constructors ------------------------------------------------------
@@ -154,7 +69,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
    * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
-  private ResourceProviderImpl(Set<PropertyId> propertyIds,
+  protected ResourceProviderImpl(Set<PropertyId> propertyIds,
                                Map<Resource.Type, PropertyId> keyPropertyIds,
                                AmbariManagementController managementController) {
     this.propertyIds          = propertyIds;
@@ -175,6 +90,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
     return keyPropertyIds;
   }
 
+
   // ----- accessors ---------------------------------------------------------
 
   /**
@@ -186,10 +102,22 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
     return managementController;
   }
 
+
   // ----- utility methods ---------------------------------------------------
 
   protected abstract Set<PropertyId> getPKPropertyIds();
 
+
+  /**
+   * Get a set of properties from the given property map and predicate.
+   *
+   * @param requestPropertyMap
+   * @param predicate
+   *
+   * @return the set of properties
+   *
+   * @throws AmbariException
+   */
   protected Set<Map<PropertyId, Object>> getPropertyMaps(Map<PropertyId, Object> requestPropertyMap,
                                                          Predicate predicate)
       throws AmbariException{
@@ -243,7 +171,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
    *
    * @return the map of properties
    */
-  private static Map<PropertyId, Object> getProperties(Predicate predicate) {
+  protected static Map<PropertyId, Object> getProperties(Predicate predicate) {
     if (predicate == null) {
       return Collections.emptyMap();
     }
@@ -259,7 +187,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
    * @param from         the source map
    * @param propertyIds  the set of property ids
    */
-  private static void setProperties(Map<PropertyId, Object> to, Map<PropertyId, Object> from, Set<PropertyId> propertyIds) {
+  protected static void setProperties(Map<PropertyId, Object> to, Map<PropertyId, Object> from, Set<PropertyId> propertyIds) {
     for (PropertyId propertyId : propertyIds) {
       if (from.containsKey(propertyId)) {
         to.put(propertyId, from.get(propertyId));
@@ -268,69 +196,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
   }
 
   /**
-   * Set a string property value on the given resource for the given id and value.
-   * Make sure that the id is in the given set of requested ids.
-   *
-   * @param resource      the resource
-   * @param propertyId    the property id
-   * @param value         the value to set
-   * @param requestedIds  the requested set of property ids
-   */
-  private static void setResourceProperty(Resource resource, PropertyId propertyId, String value, Set<PropertyId> requestedIds) {
-    if (requestedIds.contains(propertyId)) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting property for resource"
-            + ", resourceType=" + resource.getType()
-            + ", propertyId=" + propertyId.getName()
-            + ", value=" + value);
-      }
-      resource.setProperty(propertyId, value);
-    }
-    else {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Skipping property for resource as not in requestedIds"
-            + ", resourceType=" + resource.getType()
-            + ", propertyId=" + propertyId.getName()
-            + ", value=" + value);
-      }
-    }
-  }
-
-  /**
-   * Set a long property value on the given resource for the given id and value.
-   * Make sure that the id is in the given set of requested ids.
-   *
-   * @param resource      the resource
-   * @param propertyId    the property id
-   * @param value         the value to set
-   * @param requestedIds  the requested set of property ids
-   */
-  private static void setResourceProperty(Resource resource, PropertyId propertyId, Long value, Set<PropertyId> requestedIds) {
-    // FIXME requestedIds does not seem to be populated properly for get
-    // requests where a full response was requested
-    if (requestedIds == null
-        || requestedIds.isEmpty()
-        || requestedIds.contains(propertyId)) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Setting property for resource"
-            + ", resourceType=" + resource.getType()
-            + ", propertyId=" + propertyId.getName()
-            + ", value=" + value);
-      }
-      resource.setProperty(propertyId, value);
-    }
-    else {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Skipping property for resource as not in requestedIds"
-            + ", resourceType=" + resource.getType()
-            + ", propertyId=" + propertyId.getName()
-            + ", value=" + value);
-      }
-    }
-  }
-
-  /**
-   * Set a integer property value on the given resource for the given id and value.
+   * Set a property value on the given resource for the given id and value.
    * Make sure that the id is in the given set of requested ids.
    *
    * @param resource      the resource
@@ -338,7 +204,7 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
    * @param value         the value to set
    * @param requestedIds  the requested set of property ids
    */
-  private static void setResourceProperty(Resource resource, PropertyId propertyId, Integer value, Set<PropertyId> requestedIds) {
+  protected static void setResourceProperty(Resource resource, PropertyId propertyId, Object value, Set<PropertyId> requestedIds) {
     if (requestedIds.contains(propertyId)) {
       if (LOG.isDebugEnabled()) {
         LOG.debug("Setting property for resource"
@@ -358,29 +224,6 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
     }
   }
 
-  /**
-   * Set a short property value on the given resource for the given id and value.
-   * Make sure that the id is in the given set of requested ids.
-   *
-   * @param resource      the resource
-   * @param propertyId    the property id
-   * @param value         the value to set
-   * @param requestedIds  the requested set of property ids
-   */
-  private static void setResourceProperty(Resource resource, PropertyId propertyId, Short value, Set<PropertyId> requestedIds) {
-    if (requestedIds.contains(propertyId)) {
-      resource.setProperty(propertyId, value);
-    }
-    else {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Skipping property for resource as not in requestedIds"
-            + ", resourceType=" + resource.getType()
-            + ", propertyId=" + propertyId.getName()
-            + ", value=" + value);
-      }
-    }
-  }
-
   /**
    * Factory method for obtaining a resource provider based on a given type and management controller.
    *
@@ -420,1047 +263,4 @@ public abstract class ResourceProviderImpl implements ResourceProvider {
         throw new IllegalArgumentException("Unknown type " + type);
     }
   }
-
-
-  // ------ ClusterResourceProvider inner class ------------------------------
-
-  private static class ClusterResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            CLUSTER_ID_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private ClusterResourceProvider(Set<PropertyId> propertyIds,
-                                    Map<Resource.Type, PropertyId> keyPropertyIds,
-                                    AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-// ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-
-      for (Map<PropertyId, Object> properties : request.getProperties()) {
-        getManagementController().createCluster(getRequest(properties));
-      }
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      ClusterRequest  clusterRequest = getRequest(getProperties(predicate));
-      Set<PropertyId> requestedIds   = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-
-      // TODO : handle multiple requests
-      Set<ClusterResponse> responses = getManagementController().getClusters(Collections.singleton(clusterRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ClusterResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Cluster);
-        setResourceProperty(resource, CLUSTER_ID_PROPERTY_ID, response.getClusterId(), requestedIds);
-        setResourceProperty(resource, CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
-        // FIXME requestedIds does not seem to be filled in properly for
-        // non-partial responses
-        resource.setProperty(CLUSTER_VERSION_PROPERTY_ID,
-            response.getDesiredStackVersion());
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-        ClusterRequest clusterRequest = getRequest(propertyMap);
-        getManagementController().updateCluster(clusterRequest);
-      }
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        ClusterRequest clusterRequest = getRequest(propertyMap);
-        getManagementController().deleteCluster(clusterRequest);
-      }
-      return getRequestStatus(null);
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a cluster request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the cluster request object
-     */
-    private ClusterRequest getRequest(Map<PropertyId, Object> properties) {
-
-      Long id = (Long) properties.get(CLUSTER_ID_PROPERTY_ID);
-      String stackVersion = (String) properties.get(CLUSTER_VERSION_PROPERTY_ID);
-
-      return new ClusterRequest(
-          id == null ? null : id,
-          (String) properties.get(CLUSTER_NAME_PROPERTY_ID),
-          stackVersion == null ? "HDP-0.1" : stackVersion,    // TODO : looks like version is required
-          /*properties.get(CLUSTER_HOSTS_PROPERTY_ID)*/ null);
-    }
-  }
-
-  // ------ ServiceResourceProvider inner class ------------------------------
-
-  private static class ServiceResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            SERVICE_CLUSTER_NAME_PROPERTY_ID,
-            SERVICE_SERVICE_NAME_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private ServiceResourceProvider(Set<PropertyId> propertyIds,
-                                    Map<Resource.Type, PropertyId> keyPropertyIds,
-                                    AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().createServices(requests);
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      ServiceRequest  serviceRequest = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<ServiceResponse> responses = getManagementController().getServices(Collections.singleton(serviceRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ServiceResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Service);
-//        setResourceProperty(resource, SERVICE_CLUSTER_ID_PROPERTY_ID, response.getClusterId(), requestedIds);
-
-        resource.setProperty(SERVICE_CLUSTER_NAME_PROPERTY_ID, response.getClusterName());
-//        resource.setProperty(SERVICE_SERVICE_NAME_PROPERTY_ID, response.getServiceName());
-
-
-//        setResourceProperty(resource, SERVICE_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
-        setResourceProperty(resource, SERVICE_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
-//        setResourceProperty(resource, SERVICE_VERSION_PROPERTY_ID, response.getCurrentStackVersion(), requestedIds);
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-
-        Map<String, String> configMappings = new HashMap<String, String>();
-
-        for (PropertyId id : propertyMap.keySet()) {
-          if (id.getCategory().equals ("config")) {
-            configMappings.put(id.getName(), (String) propertyMap.get(id));
-          }
-        }
-
-        ServiceRequest svcRequest = getRequest(propertyMap);
-        if (configMappings.size() > 0)
-          svcRequest.setConfigVersions(configMappings);
-
-        requests.add(svcRequest);
-      }
-      return getRequestStatus(getManagementController().updateServices(requests));
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-      return getRequestStatus(getManagementController().deleteServices(requests));
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a service request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the service request object
-     */
-    private ServiceRequest getRequest(Map<PropertyId, Object> properties) {
-      return new ServiceRequest(
-          (String) properties.get(SERVICE_CLUSTER_NAME_PROPERTY_ID),
-          (String) properties.get(SERVICE_SERVICE_NAME_PROPERTY_ID),
-          null,
-          (String) properties.get(SERVICE_SERVICE_STATE_PROPERTY_ID));
-    }
-  }
-
-  // ------ ComponentResourceProvider inner class ----------------------------
-
-  private static class ComponentResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            COMPONENT_CLUSTER_NAME_PROPERTY_ID,
-            COMPONENT_SERVICE_NAME_PROPERTY_ID,
-            COMPONENT_COMPONENT_NAME_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private ComponentResourceProvider(Set<PropertyId> propertyIds,
-                                      Map<Resource.Type, PropertyId> keyPropertyIds,
-                                      AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().createComponents(requests);
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      ServiceComponentRequest serviceComponentRequest = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<ServiceComponentResponse> responses = getManagementController().getComponents(Collections.singleton(serviceComponentRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ServiceComponentResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Component);
-//        setResourceProperty(resource, COMPONENT_CLUSTER_ID_PROPERTY_ID, response.getClusterId(), requestedIds);
-        setResourceProperty(resource, COMPONENT_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
-        setResourceProperty(resource, COMPONENT_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
-        setResourceProperty(resource, COMPONENT_COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
-//        setResourceProperty(resource, COMPONENT_VERSION_PROPERTY_ID, response.getCurrentStackVersion(), requestedIds);
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-        ServiceComponentRequest compRequest = getRequest(propertyMap);
-
-        Map<String, String> configMap = new HashMap<String,String>();
-
-        for (Entry<PropertyId,Object> entry : propertyMap.entrySet()) {
-          if (entry.getKey().getCategory().equals("config")) {
-            configMap.put(entry.getKey().getName(), (String) entry.getValue());
-          }
-        }
-
-        if (0 != configMap.size())
-          compRequest.setConfigVersions(configMap);
-
-        requests.add(compRequest);
-      }
-      return getRequestStatus(getManagementController().updateComponents(requests));
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      Set<ServiceComponentRequest> requests = new HashSet<ServiceComponentRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-      return getRequestStatus(getManagementController().deleteComponents(requests));
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a component request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the component request object
-     */
-    private ServiceComponentRequest getRequest(Map<PropertyId, Object> properties) {
-      return new ServiceComponentRequest(
-          (String) properties.get(COMPONENT_CLUSTER_NAME_PROPERTY_ID),
-          (String) properties.get(COMPONENT_SERVICE_NAME_PROPERTY_ID),
-          (String) properties.get(COMPONENT_COMPONENT_NAME_PROPERTY_ID),
-          null,
-          (String) properties.get(COMPONENT_STATE_PROPERTY_ID));
-    }
-  }
-
-  // ------ HostResourceProvider inner class ---------------------------------
-
-  private static class HostResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            HOST_NAME_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private HostResourceProvider(Set<PropertyId> propertyIds,
-                                 Map<Resource.Type, PropertyId> keyPropertyIds,
-                                 AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      Set<HostRequest> requests = new HashSet<HostRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().createHosts(requests);
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      HostRequest     hostRequest  = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<HostResponse> responses = getManagementController().getHosts(Collections.singleton(hostRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (HostResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Host);
-
-        // TODO : properly handle more than one cluster
-        if (null != hostRequest.getClusterNames()) {
-          for (String clusterName : hostRequest.getClusterNames()) {
-            if (response.getClusterNames().contains(clusterName)) {
-              setResourceProperty(resource, HOST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
-            }
-          }
-        }
-
-        setResourceProperty(resource, HOST_NAME_PROPERTY_ID, response.getHostname(), requestedIds);
-        setResourceProperty(resource, HOST_IP_PROPERTY_ID, response.getIpv4(), requestedIds);
-        setResourceProperty(resource, HOST_TOTAL_MEM_PROPERTY_ID, Long.valueOf(response.getTotalMemBytes()), requestedIds);
-        setResourceProperty(resource, HOST_CPU_COUNT_PROPERTY_ID, Long.valueOf(response.getCpuCount()), requestedIds);
-        setResourceProperty(resource, HOST_OS_ARCH_PROPERTY_ID, response.getOsArch(), requestedIds);
-        setResourceProperty(resource, HOST_OS_TYPE_PROPERTY_ID, response.getOsType(), requestedIds);
-        // TODO ...
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      Set<HostRequest> requests = new HashSet<HostRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().updateHosts(requests);
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      Set<HostRequest> requests = new HashSet<HostRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().deleteHosts(requests);
-      return getRequestStatus(null);
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a component request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the component request object
-     */
-    private HostRequest getRequest(Map<PropertyId, Object> properties) {
-      return new HostRequest(
-          (String)  properties.get(HOST_NAME_PROPERTY_ID),
-          // TODO : more than one cluster
-          properties.containsKey(HOST_CLUSTER_NAME_PROPERTY_ID) ?
-              Collections.singletonList((String)  properties.get(HOST_CLUSTER_NAME_PROPERTY_ID)) :
-                Collections.<String>emptyList(),
-          null);
-    }
-  }
-
-  // ------ HostComponentResourceProvider inner class ------------------------
-
-  private static class HostComponentResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID,
-            HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID,
-            HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID,
-            HOST_COMPONENT_HOST_NAME_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private HostComponentResourceProvider(Set<PropertyId> propertyIds,
-                                          Map<Resource.Type, PropertyId> keyPropertyIds,
-                                          AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      getManagementController().createHostComponents(requests);
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      ServiceComponentHostRequest hostComponentRequest = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<ServiceComponentHostResponse> responses = getManagementController().getHostComponents(Collections.singleton(hostComponentRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ServiceComponentHostResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.HostComponent);
-        setResourceProperty(resource, HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
-        setResourceProperty(resource, HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
-        setResourceProperty(resource, HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID, response.getComponentName(), requestedIds);
-        setResourceProperty(resource, HOST_COMPONENT_HOST_NAME_PROPERTY_ID, response.getHostname(), requestedIds);
-        setResourceProperty(resource, HOST_COMPONENT_STATE_PROPERTY_ID, response.getLiveState(), requestedIds);
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-
-        ServiceComponentHostRequest hostCompRequest = getRequest(propertyMap);
-
-        Map<String, String> configMap = new HashMap<String,String>();
-
-        for (Entry<PropertyId,Object> entry : propertyMap.entrySet()) {
-          if (entry.getKey().getCategory().equals("config")) {
-            configMap.put(entry.getKey().getName(), (String) entry.getValue());
-          }
-        }
-
-        if (0 != configMap.size())
-          hostCompRequest.setConfigVersions(configMap);
-
-        requests.add(hostCompRequest);
-      }
-      return getRequestStatus(getManagementController().updateHostComponents(requests));
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      Set<ServiceComponentHostRequest> requests = new HashSet<ServiceComponentHostRequest>();
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-      return getRequestStatus(getManagementController().deleteHostComponents(requests));
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a component request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the component request object
-     */
-    private ServiceComponentHostRequest getRequest(Map<PropertyId, Object> properties) {
-      return new ServiceComponentHostRequest(
-          (String) properties.get(HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID),
-          (String) properties.get(HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID),
-          (String) properties.get(HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID),
-          (String) properties.get(HOST_COMPONENT_HOST_NAME_PROPERTY_ID),
-          null,
-          (String) properties.get(HOST_COMPONENT_STATE_PROPERTY_ID));
-    }
-  }
-
-  /**
-   * Resource provider for configuration resources.
-   */
-  private static class ConfigurationResourceProvider extends ResourceProviderImpl {
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            CONFIGURATION_CLUSTER_NAME_PROPERTY_ID,
-            CONFIGURATION_CONFIG_TYPE_PROPERTY_ID }));
-
-    private ConfigurationResourceProvider(Set<PropertyId> propertyIds,
-        Map<Resource.Type, PropertyId> keyPropertyIds,
-        AmbariManagementController managementController) {
-
-      super(propertyIds, keyPropertyIds, managementController);
-
-    }
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      for (Map<PropertyId, Object> map : request.getProperties()) {
-
-        String cluster = (String) map.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID);
-        String type = (String) map.get(PropertyHelper.getPropertyId("type", ""));
-        String tag = (String) map.get(PropertyHelper.getPropertyId("tag", ""));
-        Map<String, String> configMap = new HashMap<String, String>();
-
-        Iterator<Entry<PropertyId, Object>> it1 = map.entrySet().iterator();
-        while (it1.hasNext()) {
-          Entry<PropertyId, Object> entry = it1.next();
-          if (entry.getKey().getCategory().equals("properties") && null != entry.getValue()) {
-            configMap.put(entry.getKey().getName(), entry.getValue().toString());
-          }
-        }
-
-        ConfigurationRequest configRequest = new ConfigurationRequest(cluster, type, tag, configMap);
-
-        getManagementController().createConfiguration(configRequest);
-      }
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate)
-        throws AmbariException {
-
-      ConfigurationRequest configRequest = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<ConfigurationResponse> responses = getManagementController().getConfigurations(Collections.singleton(configRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ConfigurationResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Configuration);
-        resource.setProperty(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID, response.getClusterName());
-        resource.setProperty(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID, response.getType());
-        resource.setProperty(CONFIGURATION_CONFIG_TAG_PROPERTY_ID, response.getVersionTag());
-        if (null != response.getConfigs() && response.getConfigs().size() > 0) {
-          Map<String, String> configs = response.getConfigs();
-
-          for (Entry<String, String> entry : configs.entrySet()) {
-            PropertyId id = PropertyHelper.getPropertyId(entry.getKey(), "properties");
-            resource.setProperty(id, entry.getValue());
-          }
-        }
-
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    /**
-     * Throws an exception, as Configurations cannot be updated.
-     */
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate)
-        throws AmbariException {
-      throw new AmbariException ("Cannot update a Configuration resource.");
-    }
-
-    /**
-     * Throws an exception, as Configurations cannot be deleted.
-     */
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      throw new AmbariException ("Cannot delete a Configuration resource.");
-    }
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    private ConfigurationRequest getRequest(Map<PropertyId, Object> properties) {
-      String type = (String) properties.get(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID);
-
-      String tag = (String) properties.get(CONFIGURATION_CONFIG_TAG_PROPERTY_ID);
-
-      return new ConfigurationRequest(
-          (String) properties.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID),
-          type, tag, new HashMap<String, String>());
-    }
-  }
-
-  private static class ActionResourceProvider extends ResourceProviderImpl {
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            ACTION_CLUSTER_NAME_PROPERTY_ID,
-            ACTION_SERVICE_NAME_PROPERTY_ID }));
-
-    private ActionResourceProvider(Set<PropertyId> propertyIds,
-        Map<Resource.Type, PropertyId> keyPropertyIds,
-        AmbariManagementController managementController) {
-
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      Set<ActionRequest> requests = new HashSet<ActionRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      return getRequestStatus(getManagementController().createActions(requests));
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate)
-        throws AmbariException {
-      ActionRequest actionRequest = getRequest(getProperties(predicate));
-
-      // TODO : handle multiple requests
-      Set<ActionResponse> responses = getManagementController().getActions(
-          Collections.singleton(actionRequest));
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (ActionResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Action);
-        resource.setProperty(ACTION_CLUSTER_NAME_PROPERTY_ID, response.getClusterName());
-        resource.setProperty(ACTION_SERVICE_NAME_PROPERTY_ID, response.getServiceName());
-        resource.setProperty(ACTION_ACTION_NAME_PROPERTY_ID, response.getActionName());
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate)
-        throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    private ActionRequest getRequest(Map<PropertyId, Object> properties) {
-      return new ActionRequest(
-          (String)  properties.get(ACTION_CLUSTER_NAME_PROPERTY_ID),
-          (String)  properties.get(ACTION_SERVICE_NAME_PROPERTY_ID),
-          (String)  properties.get(ACTION_ACTION_NAME_PROPERTY_ID),
-          null);
-    }
-  }
-
-  // ------ RequestResourceProvider inner class ------------------------------
-
-  private static class RequestResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            REQUEST_ID_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private RequestResourceProvider(Set<PropertyId> propertyIds,
-                                          Map<Resource.Type, PropertyId> keyPropertyIds,
-                                          AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId>         requestedIds         = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      Map<PropertyId, Object> predicateProperties  = getProperties(predicate);
-      RequestStatusRequest    requestStatusRequest = getRequest(predicateProperties);
-
-      String clusterName = (String) predicateProperties.get(REQUEST_CLUSTER_NAME_PROPERTY_ID);
-
-      Set<RequestStatusResponse> responses = getManagementController()
-          .getRequestStatus(requestStatusRequest);
-      Set<Resource> resources = new HashSet<Resource>();
-      for (RequestStatusResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Request);
-        setResourceProperty(resource, REQUEST_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
-        setResourceProperty(resource, REQUEST_ID_PROPERTY_ID, response.getRequestId(), requestedIds);
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a component request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the component request object
-     */
-    private RequestStatusRequest getRequest(Map<PropertyId, Object> properties) {
-      Long requestId = null;
-      if (properties.get(REQUEST_ID_PROPERTY_ID) != null) {
-        requestId = Long.valueOf((String) properties
-            .get(REQUEST_ID_PROPERTY_ID));
-      }
-      return new RequestStatusRequest(requestId);
-    }
-  }
-
-  // ------ TaskResourceProvider inner class ------------------------
-
-  private static class TaskResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            TASK_ID_PROPERTY_ID}));
-
-    // ----- Constructors ----------------------------------------------------
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     *
-     * @param propertyIds           the property ids
-     * @param keyPropertyIds        the key property ids
-     * @param managementController  the management controller
-     */
-    private TaskResourceProvider(Set<PropertyId> propertyIds,
-                                          Map<Resource.Type, PropertyId> keyPropertyIds,
-                                          AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    // ----- ResourceProvider ------------------------------------------------
-
-    @Override
-    public RequestStatus createResources(Request request) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
-      Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
-      Map<PropertyId, Object> predicateProperties = getProperties(predicate);
-      TaskStatusRequest taskStatusRequest = getRequest(predicateProperties);
-
-      String clusterName = (String) predicateProperties.get(TASK_CLUSTER_NAME_PROPERTY_ID);
-      Long   request_id  = new Long((String) predicateProperties.get(TASK_REQUEST_ID_PROPERTY_ID));
-
-      // TODO : handle multiple requests
-      LOG.info("Request to management controller " + taskStatusRequest.getRequestId() +
-          " taskid " + taskStatusRequest.getTaskId());
-
-      Set<TaskStatusResponse> responses = getManagementController().getTaskStatus(Collections.singleton(taskStatusRequest));
-      LOG.info("Printing size of responses " + responses.size());
-      for (TaskStatusResponse response: responses) {
-        LOG.info("Printing response from management controller " + response.toString());
-      }
-
-      Set<Resource> resources = new HashSet<Resource>();
-      for (TaskStatusResponse response : responses) {
-        Resource resource = new ResourceImpl(Resource.Type.Task);
-
-        setResourceProperty(resource, TASK_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
-        setResourceProperty(resource, TASK_REQUEST_ID_PROPERTY_ID, request_id, requestedIds);
-        setResourceProperty(resource, TASK_ID_PROPERTY_ID, response.getTaskId(), requestedIds);
-        setResourceProperty(resource, TASK_STAGE_ID_PROPERTY_ID, response.getStageId(), requestedIds);
-        setResourceProperty(resource, TASK_HOST_NAME_PROPERTY_ID, response.getHostName(), requestedIds);
-        setResourceProperty(resource, TASK_ROLE_PROPERTY_ID, response.getRole(), requestedIds);
-        setResourceProperty(resource, TASK_COMMAND_PROPERTY_ID, response.getCommand(), requestedIds);
-        setResourceProperty(resource, TASK_STATUS_PROPERTY_ID, response.getStatus(), requestedIds);
-        setResourceProperty(resource, TASK_EXIT_CODE_PROPERTY_ID, response.getExitCode(), requestedIds);
-        setResourceProperty(resource, TASK_STDERR_PROPERTY_ID, response.getStderr(), requestedIds);
-        setResourceProperty(resource, TASK_STOUT_PROPERTY_ID, response.getStdout(), requestedIds);
-        setResourceProperty(resource, TASK_START_TIME_PROPERTY_ID, response.getStartTime(), requestedIds);
-        setResourceProperty(resource, TASK_ATTEMPT_CNT_PROPERTY_ID, response.getAttemptCount(), requestedIds);
-        LOG.info("Creating resource " + resource.toString());
-        resources.add(resource);
-      }
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
-      throw new UnsupportedOperationException("Not currently supported.");
-    }
-
-    // ----- utility methods -------------------------------------------------
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-
-    /**
-     * Get a component request object from a map of property values.
-     *
-     * @param properties  the predicate
-     *
-     * @return the component request object
-     */
-    private TaskStatusRequest getRequest(Map<PropertyId, Object> properties) {
-      String taskId = (String) properties.get(TASK_ID_PROPERTY_ID);
-      Long task_id = (taskId == null? null: Long.valueOf(taskId));
-      return new TaskStatusRequest(
-          Long.valueOf((String) properties.get(TASK_REQUEST_ID_PROPERTY_ID)),
-          task_id);
-    }
-  }
-  
-  private static class UserResourceProvider extends ResourceProviderImpl{
-
-    private static Set<PropertyId> pkPropertyIds =
-        new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
-            USER_USERNAME_PROPERTY_ID}));
-
-    /**
-     * Create a  new resource provider for the given management controller.
-     */
-    private UserResourceProvider(Set<PropertyId> propertyIds,
-                                          Map<Resource.Type, PropertyId> keyPropertyIds,
-                                          AmbariManagementController managementController) {
-      super(propertyIds, keyPropertyIds, managementController);
-    }
-
-    @Override
-    public RequestStatus createResources(Request request)
-        throws AmbariException {
-      
-      
-      Set<UserRequest> requests = new HashSet<UserRequest>();
-      for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
-        requests.add(getRequest(propertyMap));
-      }
-      
-      getManagementController().createUsers(requests);
-      
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public Set<Resource> getResources(Request request, Predicate predicate)
-        throws AmbariException {
-      
-      UserRequest userRequest = getRequest(getProperties(predicate));
-      
-      Set<UserResponse> responses = getManagementController().getUsers(
-          Collections.singleton(userRequest));
-      
-      Set<Resource> resources = new HashSet<Resource>();
-      for (UserResponse userResponse : responses) {
-        ResourceImpl resource = new ResourceImpl(Resource.Type.User);
-        
-        resource.setProperty(USER_USERNAME_PROPERTY_ID, userResponse.getUsername());
-
-        // TODO support arrays/sets in the JsonSerializer
-        if (userResponse.getRoles().size() > 0) {
-          int i = 0;
-          StringBuilder sb = new StringBuilder();
-          for (String role : userResponse.getRoles()) {
-            if ((i++) != 0)
-              sb.append(',');
-            sb.append(role);
-          }
-          resource.setProperty(USER_ROLES_PROPERTY_ID, sb.toString());
-        }
-        
-        resources.add(resource);
-      }
-      
-      return resources;
-    }
-
-    @Override
-    public RequestStatus updateResources(Request request, Predicate predicate)
-        throws AmbariException {
-
-      Set<UserRequest> requests = new HashSet<UserRequest>();
-      
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
-        UserRequest req = getRequest(propertyMap);
-        
-        requests.add(req);
-      }
-      
-      getManagementController().updateUsers(requests);      
-
-      return getRequestStatus(null);
-    }
-
-    @Override
-    public RequestStatus deleteResources(Predicate predicate)
-        throws AmbariException {
-      Set<UserRequest> requests = new HashSet<UserRequest>();
-      
-      for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
-        UserRequest req = getRequest(propertyMap);
-        
-        requests.add(req);
-
-      }
-      getManagementController().deleteUsers(requests);      
-
-      return getRequestStatus(null);
-    }
-
-    @Override
-    protected Set<PropertyId> getPKPropertyIds() {
-      return pkPropertyIds;
-    }
-    
-    private UserRequest getRequest(Map<PropertyId, Object> properties) {
-      UserRequest request = new UserRequest ((String) properties.get(USER_USERNAME_PROPERTY_ID));
-      
-      request.setPassword((String) properties.get(USER_PASSWORD_PROPERTY_ID));
-      request.setOldPassword((String) properties.get(USER_OLD_PASSWORD_PROPERTY_ID));
-      
-      // TODO - support array/sets directly out of the request
-      if (null != properties.get(USER_ROLES_PROPERTY_ID)) {
-        HashSet<String> roles = new HashSet<String>();
-        for (String str : ((String) properties.get(USER_ROLES_PROPERTY_ID)).split(",")) {
-          roles.add(str);
-        }
-        request.setRoles(roles);
-      }
-      
-      return request;
-    }
-    
-    
-    
-  }
-
 }

+ 153 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java

@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.ServiceRequest;
+import org.apache.ambari.server.controller.ServiceResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for service resources.
+ */
+class ServiceResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Services
+  protected static final PropertyId SERVICE_CLUSTER_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("cluster_name", "ServiceInfo");
+  protected static final PropertyId SERVICE_SERVICE_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("service_name", "ServiceInfo");
+  protected static final PropertyId SERVICE_SERVICE_STATE_PROPERTY_ID = PropertyHelper.getPropertyId("state", "ServiceInfo");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          SERVICE_CLUSTER_NAME_PROPERTY_ID,
+          SERVICE_SERVICE_NAME_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  ServiceResourceProvider(Set<PropertyId> propertyIds,
+                          Map<Resource.Type, PropertyId> keyPropertyIds,
+                          AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+    getManagementController().createServices(requests);
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    ServiceRequest  serviceRequest = getRequest(getProperties(predicate));
+
+    // TODO : handle multiple requests
+    Set<ServiceResponse> responses = getManagementController().getServices(Collections.singleton(serviceRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (ServiceResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Service);
+        setResourceProperty(resource, SERVICE_CLUSTER_NAME_PROPERTY_ID, response.getClusterName(), requestedIds);
+        setResourceProperty(resource, SERVICE_SERVICE_NAME_PROPERTY_ID, response.getServiceName(), requestedIds);
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+
+      Map<String, String> configMappings = new HashMap<String, String>();
+
+      for (PropertyId id : propertyMap.keySet()) {
+        if (id.getCategory().equals ("config")) {
+          configMappings.put(id.getName(), (String) propertyMap.get(id));
+        }
+      }
+
+      ServiceRequest svcRequest = getRequest(propertyMap);
+      if (configMappings.size() > 0)
+        svcRequest.setConfigVersions(configMappings);
+
+      requests.add(svcRequest);
+    }
+    return getRequestStatus(getManagementController().updateServices(requests));
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      requests.add(getRequest(propertyMap));
+    }
+    return getRequestStatus(getManagementController().deleteServices(requests));
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a service request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the service request object
+   */
+  private ServiceRequest getRequest(Map<PropertyId, Object> properties) {
+    return new ServiceRequest(
+        (String) properties.get(SERVICE_CLUSTER_NAME_PROPERTY_ID),
+        (String) properties.get(SERVICE_SERVICE_NAME_PROPERTY_ID),
+        null,
+        (String) properties.get(SERVICE_SERVICE_STATE_PROPERTY_ID));
+  }
+}

+ 159 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java

@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.TaskStatusRequest;
+import org.apache.ambari.server.controller.TaskStatusResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for task resources.
+ */
+class TaskResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Tasks
+  protected static final PropertyId TASK_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("cluster_name","Tasks");
+  protected static final PropertyId TASK_REQUEST_ID_PROPERTY_ID   = PropertyHelper.getPropertyId("request_id","Tasks");
+  protected static final PropertyId TASK_ID_PROPERTY_ID           = PropertyHelper.getPropertyId("id","Tasks");
+  protected static final PropertyId TASK_STAGE_ID_PROPERTY_ID     = PropertyHelper.getPropertyId("stage_id","Tasks");
+  protected static final PropertyId TASK_HOST_NAME_PROPERTY_ID    = PropertyHelper.getPropertyId("host_name","Tasks");
+  protected static final PropertyId TASK_ROLE_PROPERTY_ID         = PropertyHelper.getPropertyId("role","Tasks");
+  protected static final PropertyId TASK_COMMAND_PROPERTY_ID      = PropertyHelper.getPropertyId("command","Tasks");
+  protected static final PropertyId TASK_STATUS_PROPERTY_ID       = PropertyHelper.getPropertyId("status","Tasks");
+  protected static final PropertyId TASK_EXIT_CODE_PROPERTY_ID    = PropertyHelper.getPropertyId("exit_code","Tasks");
+  protected static final PropertyId TASK_STDERR_PROPERTY_ID       = PropertyHelper.getPropertyId("stderr","Tasks");
+  protected static final PropertyId TASK_STOUT_PROPERTY_ID        = PropertyHelper.getPropertyId("stdout","Tasks");
+  protected static final PropertyId TASK_START_TIME_PROPERTY_ID   = PropertyHelper.getPropertyId("start_time","Tasks");
+  protected static final PropertyId TASK_ATTEMPT_CNT_PROPERTY_ID  = PropertyHelper.getPropertyId("attempt_cnt","Tasks");
+
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          TASK_ID_PROPERTY_ID}));
+
+  // ----- Constructors ----------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param keyPropertyIds        the key property ids
+   * @param managementController  the management controller
+   */
+  TaskResourceProvider(Set<PropertyId> propertyIds,
+                       Map<Resource.Type, PropertyId> keyPropertyIds,
+                       AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  // ----- ResourceProvider ------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+    Set<PropertyId> requestedIds = PropertyHelper.getRequestPropertyIds(getPropertyIds(), request, predicate);
+    Map<PropertyId, Object> predicateProperties = getProperties(predicate);
+    TaskStatusRequest taskStatusRequest = getRequest(predicateProperties);
+
+    String clusterName = (String) predicateProperties.get(TASK_CLUSTER_NAME_PROPERTY_ID);
+    Long   request_id  = new Long((String) predicateProperties.get(TASK_REQUEST_ID_PROPERTY_ID));
+
+    // TODO : handle multiple requests
+    LOG.info("Request to management controller " + taskStatusRequest.getRequestId() +
+        " taskid " + taskStatusRequest.getTaskId());
+
+    Set<TaskStatusResponse> responses = getManagementController().getTaskStatus(Collections.singleton(taskStatusRequest));
+    LOG.info("Printing size of responses " + responses.size());
+    for (TaskStatusResponse response: responses) {
+      LOG.info("Printing response from management controller " + response.toString());
+    }
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (TaskStatusResponse response : responses) {
+      Resource resource = new ResourceImpl(Resource.Type.Task);
+
+      setResourceProperty(resource, TASK_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
+      setResourceProperty(resource, TASK_REQUEST_ID_PROPERTY_ID, request_id, requestedIds);
+      setResourceProperty(resource, TASK_ID_PROPERTY_ID, response.getTaskId(), requestedIds);
+      setResourceProperty(resource, TASK_STAGE_ID_PROPERTY_ID, response.getStageId(), requestedIds);
+      setResourceProperty(resource, TASK_HOST_NAME_PROPERTY_ID, response.getHostName(), requestedIds);
+      setResourceProperty(resource, TASK_ROLE_PROPERTY_ID, response.getRole(), requestedIds);
+      setResourceProperty(resource, TASK_COMMAND_PROPERTY_ID, response.getCommand(), requestedIds);
+      setResourceProperty(resource, TASK_STATUS_PROPERTY_ID, response.getStatus(), requestedIds);
+      setResourceProperty(resource, TASK_EXIT_CODE_PROPERTY_ID, response.getExitCode(), requestedIds);
+      setResourceProperty(resource, TASK_STDERR_PROPERTY_ID, response.getStderr(), requestedIds);
+      setResourceProperty(resource, TASK_STOUT_PROPERTY_ID, response.getStdout(), requestedIds);
+      setResourceProperty(resource, TASK_START_TIME_PROPERTY_ID, response.getStartTime(), requestedIds);
+      setResourceProperty(resource, TASK_ATTEMPT_CNT_PROPERTY_ID, response.getAttemptCount(), requestedIds);
+      LOG.info("Creating resource " + resource.toString());
+      resources.add(resource);
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate) throws AmbariException {
+    throw new UnsupportedOperationException("Not currently supported.");
+  }
+
+  // ----- utility methods -------------------------------------------------
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  /**
+   * Get a component request object from a map of property values.
+   *
+   * @param properties  the predicate
+   *
+   * @return the component request object
+   */
+  private TaskStatusRequest getRequest(Map<PropertyId, Object> properties) {
+    String taskId = (String) properties.get(TASK_ID_PROPERTY_ID);
+    Long task_id = (taskId == null? null: Long.valueOf(taskId));
+    return new TaskStatusRequest(
+        Long.valueOf((String) properties.get(TASK_REQUEST_ID_PROPERTY_ID)),
+        task_id);
+  }
+}

+ 166 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java

@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.UserRequest;
+import org.apache.ambari.server.controller.UserResponse;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for user resources.
+ */
+class UserResourceProvider extends ResourceProviderImpl{
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Users
+  protected static final PropertyId USER_USERNAME_PROPERTY_ID     = PropertyHelper.getPropertyId("user_name", "Users");
+  protected static final PropertyId USER_ROLES_PROPERTY_ID        = PropertyHelper.getPropertyId("roles", "Users");
+  protected static final PropertyId USER_PASSWORD_PROPERTY_ID     = PropertyHelper.getPropertyId("password", "Users");
+  protected static final PropertyId USER_OLD_PASSWORD_PROPERTY_ID = PropertyHelper.getPropertyId("old_password", "Users");
+
+  private static Set<PropertyId> pkPropertyIds =
+      new HashSet<PropertyId>(Arrays.asList(new PropertyId[]{
+          USER_USERNAME_PROPERTY_ID}));
+
+  /**
+   * Create a new resource provider for the given management controller.
+   */
+  UserResourceProvider(Set<PropertyId> propertyIds,
+                       Map<Resource.Type, PropertyId> keyPropertyIds,
+                       AmbariManagementController managementController) {
+    super(propertyIds, keyPropertyIds, managementController);
+  }
+
+  @Override
+  public RequestStatus createResources(Request request)
+      throws AmbariException {
+
+
+    Set<UserRequest> requests = new HashSet<UserRequest>();
+    for (Map<PropertyId, Object> propertyMap : request.getProperties()) {
+      requests.add(getRequest(propertyMap));
+    }
+
+    getManagementController().createUsers(requests);
+
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws AmbariException {
+
+    UserRequest userRequest = getRequest(getProperties(predicate));
+
+    Set<UserResponse> responses = getManagementController().getUsers(
+        Collections.singleton(userRequest));
+
+    Set<Resource> resources = new HashSet<Resource>();
+    for (UserResponse userResponse : responses) {
+      ResourceImpl resource = new ResourceImpl(Resource.Type.User);
+
+      resource.setProperty(USER_USERNAME_PROPERTY_ID, userResponse.getUsername());
+
+      // TODO support arrays/sets in the JsonSerializer
+      if (userResponse.getRoles().size() > 0) {
+        int i = 0;
+        StringBuilder sb = new StringBuilder();
+        for (String role : userResponse.getRoles()) {
+          if ((i++) != 0)
+            sb.append(',');
+          sb.append(role);
+        }
+        resource.setProperty(USER_ROLES_PROPERTY_ID, sb.toString());
+      }
+
+      resources.add(resource);
+    }
+
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws AmbariException {
+
+    Set<UserRequest> requests = new HashSet<UserRequest>();
+
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(request.getProperties().iterator().next(), predicate)) {
+      UserRequest req = getRequest(propertyMap);
+
+      requests.add(req);
+    }
+
+    getManagementController().updateUsers(requests);
+
+    return getRequestStatus(null);
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate)
+      throws AmbariException {
+    Set<UserRequest> requests = new HashSet<UserRequest>();
+
+    for (Map<PropertyId, Object> propertyMap : getPropertyMaps(null, predicate)) {
+      UserRequest req = getRequest(propertyMap);
+
+      requests.add(req);
+
+    }
+    getManagementController().deleteUsers(requests);
+
+    return getRequestStatus(null);
+  }
+
+  @Override
+  protected Set<PropertyId> getPKPropertyIds() {
+    return pkPropertyIds;
+  }
+
+  private UserRequest getRequest(Map<PropertyId, Object> properties) {
+    UserRequest request = new UserRequest ((String) properties.get(USER_USERNAME_PROPERTY_ID));
+
+    request.setPassword((String) properties.get(USER_PASSWORD_PROPERTY_ID));
+    request.setOldPassword((String) properties.get(USER_OLD_PASSWORD_PROPERTY_ID));
+
+    // TODO - support array/sets directly out of the request
+    if (null != properties.get(USER_ROLES_PROPERTY_ID)) {
+      HashSet<String> roles = new HashSet<String>();
+
+      Collections.addAll(roles, ((String) properties.get(USER_ROLES_PROPERTY_ID)).split(","));
+
+      request.setRoles(roles);
+    }
+
+    return request;
+  }
+}

+ 4 - 0
ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java

@@ -127,6 +127,10 @@ public class RoleCommandOrder {
         Role.JOBTRACKER, RoleCommand.START);
     addDependency(Role.SQOOP_SERVICE_CHECK, RoleCommand.EXECUTE,
         Role.TASKTRACKER, RoleCommand.START);
+    addDependency(Role.ZOOKEEPER_SERVICE_CHECK, RoleCommand.EXECUTE,
+        Role.ZOOKEEPER_SERVER, RoleCommand.START);
+    addDependency(Role.ZOOKEEPER_QUORUM_SERVICE_CHECK, RoleCommand.EXECUTE,
+        Role.ZOOKEEPER_SERVER, RoleCommand.START);
     
     addDependency(Role.ZOOKEEPER_SERVER, RoleCommand.STOP,
         Role.HBASE_MASTER, RoleCommand.STOP);

+ 77 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ComponentConfigMappingDAO.java

@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.dao;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.persist.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+
+import org.apache.ambari.server.orm.entities.ComponentConfigMappingEntity;
+
+public class ComponentConfigMappingDAO {
+
+  @Inject
+  Provider<EntityManager> entityManagerProvider;
+  @Inject
+  DaoUtils daoUtils;
+
+  @Transactional
+  public List<ComponentConfigMappingEntity> findByType(
+      Collection<String> configTypes) {
+    TypedQuery<ComponentConfigMappingEntity> query =
+        entityManagerProvider.get().createQuery(
+            "SELECT config FROM ComponentConfigMappingEntity config"
+            + " WHERE config.configType IN ?1",
+        ComponentConfigMappingEntity.class);
+    return daoUtils.selectList(query, configTypes);
+  }
+
+  @Transactional
+  public void refresh(
+      ComponentConfigMappingEntity componentConfigMappingEntity) {
+    entityManagerProvider.get().refresh(componentConfigMappingEntity);
+  }
+
+  @Transactional
+  public ComponentConfigMappingEntity merge(
+      ComponentConfigMappingEntity componentConfigMappingEntity) {
+    return entityManagerProvider.get().merge(
+        componentConfigMappingEntity);
+  }
+
+  @Transactional
+  public void remove(
+      ComponentConfigMappingEntity componentConfigMappingEntity) {
+    entityManagerProvider.get().remove(merge(componentConfigMappingEntity));
+  }
+
+  @Transactional
+  public void removeByType(Collection<String> configTypes) {
+    for (ComponentConfigMappingEntity entity : findByType(configTypes)) {
+      remove(entity);
+    }
+  }
+
+}

+ 77 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentConfigMappingDAO.java

@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.dao;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.persist.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+
+import org.apache.ambari.server.orm.entities.HostComponentConfigMappingEntity;
+
+public class HostComponentConfigMappingDAO {
+
+  @Inject
+  Provider<EntityManager> entityManagerProvider;
+  @Inject
+  DaoUtils daoUtils;
+
+  @Transactional
+  public List<HostComponentConfigMappingEntity> findByType(
+      Collection<String> configTypes) {
+    TypedQuery<HostComponentConfigMappingEntity> query =
+        entityManagerProvider.get().createQuery(
+            "SELECT config FROM HostComponentConfigMappingEntity config"
+            + " WHERE config.configType IN ?1",
+        HostComponentConfigMappingEntity.class);
+    return daoUtils.selectList(query, configTypes);
+  }
+
+  @Transactional
+  public void refresh(
+      HostComponentConfigMappingEntity componentConfigMappingEntity) {
+    entityManagerProvider.get().refresh(componentConfigMappingEntity);
+  }
+
+  @Transactional
+  public HostComponentConfigMappingEntity merge(
+      HostComponentConfigMappingEntity componentConfigMappingEntity) {
+    return entityManagerProvider.get().merge(
+        componentConfigMappingEntity);
+  }
+
+  @Transactional
+  public void remove(
+      HostComponentConfigMappingEntity componentConfigMappingEntity) {
+    entityManagerProvider.get().remove(merge(componentConfigMappingEntity));
+  }
+
+  @Transactional
+  public void removeByType(Collection<String> configTypes) {
+    for (HostComponentConfigMappingEntity entity : findByType(configTypes)) {
+      remove(entity);
+    }
+  }
+
+}

+ 0 - 2
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java

@@ -33,10 +33,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 public class HostRoleCommandDAO {
 

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/Service.java

@@ -81,4 +81,6 @@ public interface Service {
   public void deleteServiceComponent(String componentName)
       throws AmbariException;
 
+  public boolean isClientOnlyService();
+
 }

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java

@@ -19,6 +19,7 @@
 package org.apache.ambari.server.state;
 
 import java.util.Map;
+import java.util.Set;
 
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.AmbariException;
@@ -42,6 +43,8 @@ public interface ServiceComponent {
 
   public void updateDesiredConfigs(Map<String, Config> configs);
 
+  public void deleteDesiredConfigs(Set<String> configTypes);
+
   public StackId getDesiredStackVersion();
 
   public void setDesiredStackVersion(StackId stackVersion);

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java

@@ -19,6 +19,7 @@
 package org.apache.ambari.server.state;
 
 import java.util.Map;
+import java.util.Set;
 
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.controller.ServiceComponentHostResponse;
@@ -71,6 +72,8 @@ public interface ServiceComponentHost {
 
   public void updateDesiredConfigs(Map<String, Config> configs);
 
+  public void deleteDesiredConfigs(Set<String> configTypes);
+
   public StackId getDesiredStackVersion();
 
   public void setDesiredStackVersion(StackId stackVersion);

+ 16 - 3
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java

@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import com.google.gson.Gson;
 import com.google.inject.Inject;
@@ -60,6 +61,8 @@ public class ServiceComponentImpl implements ServiceComponent {
   private ServiceComponentHostFactory serviceComponentHostFactory;
   @Inject
   private AmbariMetaInfo ambariMetaInfo;
+  @Inject
+  private ComponentConfigMappingDAO componentConfigMappingDAO;
 
   boolean persisted = false;
   private ServiceComponentDesiredStateEntity desiredStateEntity;
@@ -329,6 +332,7 @@ public class ServiceComponentImpl implements ServiceComponent {
 
       this.desiredConfigs.put(entry.getKey(), entry.getValue().getVersionTag());
     }
+    saveIfPersisted();
   }
 
   @Override
@@ -419,7 +423,7 @@ public class ServiceComponentImpl implements ServiceComponent {
 
   @Override
   @Transactional
-  public void refresh() {
+  public synchronized void refresh() {
     if (isPersisted()) {
       ServiceComponentDesiredStateEntityPK pk = new ServiceComponentDesiredStateEntityPK();
       pk.setComponentName(getName());
@@ -432,7 +436,7 @@ public class ServiceComponentImpl implements ServiceComponent {
   }
 
   @Transactional
-  private void saveIfPersisted() {
+  private synchronized void saveIfPersisted() {
     if (isPersisted()) {
       serviceComponentDesiredStateDAO.merge(desiredStateEntity);
     }
@@ -468,7 +472,8 @@ public class ServiceComponentImpl implements ServiceComponent {
   }
 
   @Override
-  public synchronized void removeAllServiceComponentHosts() throws AmbariException {
+  public synchronized void removeAllServiceComponentHosts()
+      throws AmbariException {
     LOG.info("Deleting all servicecomponenthosts for component"
         + ", clusterName=" + getClusterName()
         + ", serviceName=" + getServiceName()
@@ -508,4 +513,12 @@ public class ServiceComponentImpl implements ServiceComponent {
     // FIXME update DB
   }
 
+  @Override
+  public synchronized void deleteDesiredConfigs(Set<String> configTypes) {
+    for (String configType : configTypes) {
+      desiredConfigs.remove(configType);
+    }
+    componentConfigMappingDAO.removeByType(configTypes);
+  }
+
 }

+ 21 - 4
ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java

@@ -25,6 +25,7 @@ import java.util.Map.Entry;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ServiceComponentNotFoundException;
+import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.ServiceResponse;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
@@ -58,10 +59,10 @@ public class ServiceImpl implements Service {
 
   private boolean persisted = false;
   private final Cluster cluster;
-  private Map<String, Config> configs;
   // [ String type -> Config Tag ], no need to hold the direct reference to the config
   private Map<String, String> desiredConfigs;
   private Map<String, ServiceComponent> components;
+  private final boolean isClientOnlyService;
 
   @Inject
   Gson gson;
@@ -77,6 +78,8 @@ public class ServiceImpl implements Service {
   private ClusterDAO clusterDAO;
   @Inject
   private ServiceComponentFactory serviceComponentFactory;
+  @Inject
+  private AmbariMetaInfo ambariMetaInfo;
 
   private void init() {
     // TODO load from DB during restart?
@@ -98,7 +101,14 @@ public class ServiceImpl implements Service {
     this.desiredConfigs = new HashMap<String, String>();
 
     this.components = new HashMap<String, ServiceComponent>();
-    setDesiredStackVersion(cluster.getDesiredStackVersion());
+
+    StackId stackId = cluster.getDesiredStackVersion();
+    setDesiredStackVersion(stackId);
+
+    ServiceInfo sInfo = ambariMetaInfo.getServiceInfo(stackId.getStackName(),
+        stackId.getStackVersion(), serviceName);
+    this.isClientOnlyService = sInfo.isClientOnlyService();
+
     init();
   }
 
@@ -117,8 +127,6 @@ public class ServiceImpl implements Service {
 
     this.components = new HashMap<String, ServiceComponent>();
 
-    this.configs = new HashMap<String, Config>();
-
     if (!serviceEntity.getServiceComponentDesiredStateEntities().isEmpty()) {
       for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity
           : serviceEntity.getServiceComponentDesiredStateEntities()) {
@@ -134,6 +142,10 @@ public class ServiceImpl implements Service {
           mappingEntity.getVersionTag());
     }
 
+    StackId stackId = getDesiredStackVersion();
+    ServiceInfo sInfo = ambariMetaInfo.getServiceInfo(stackId.getStackName(),
+        stackId.getStackVersion(), getName());
+    this.isClientOnlyService = sInfo.isClientOnlyService();
 
     persisted = true;
   }
@@ -465,4 +477,9 @@ public class ServiceImpl implements Service {
     // FIXME update DB
   }
 
+  @Override
+  public boolean isClientOnlyService() {
+    return isClientOnlyService;
+  }
+
 }

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

@@ -75,6 +75,18 @@ public class ServiceInfo {
     return components;
   }
 
+  public boolean isClientOnlyService() {
+    if (components == null || components.isEmpty()) {
+      return false;
+    }
+    for (ComponentInfo compInfo : components) {
+      if (!compInfo.isClient()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   public ComponentInfo getClientComponent() {
     if (components == null || components.isEmpty()) {
       return null;

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java

@@ -375,7 +375,7 @@ public class ClusterImpl implements Cluster {
     return r;
   }
 
-  public void debugDump(StringBuilder sb) {
+  public synchronized void debugDump(StringBuilder sb) {
     sb.append("Cluster={ clusterName=" + getClusterName()
         + ", clusterId=" + getClusterId()
         + ", desiredStackVersion=" + desiredStackVersion.getStackId()

+ 81 - 3
ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java

@@ -73,6 +73,24 @@ public class HostImpl implements Host {
 
   private boolean persisted = false;
 
+  private static final String HARDWAREISA = "hardware_isa";
+  private static final String HARDWAREMODEL = "hardware_model";
+  private static final String INTERFACES = "interfaces";
+  private static final String KERNEL = "kernel";
+  private static final String KERNELMAJOREVERSON = "kernel_majorversion";
+  private static final String KERNELRELEASE = "kernel_release";
+  private static final String KERNELVERSION = "kernel_version";
+  private static final String MACADDRESS = "mac_address";
+  private static final String NETMASK = "netmask";
+  private static final String OSFAMILY = "os_family";
+  private static final String PHYSICALPROCESSORCOUNT =
+      "physicalprocessors_count";
+  private static final String PROCESSORCOUNT = "processors_count";
+  private static final String SELINUXENABLED = "selinux_enabled";
+  private static final String SWAPSIZE = "swap_size";
+  private static final String SWAPFREE = "swap_free";
+  private static final String TIMEZONE = "timezone";
+
   private static final StateMachineFactory
     <HostImpl, HostState, HostEventType, HostEvent>
       stateMachineFactory
@@ -317,7 +335,7 @@ public class HostImpl implements Host {
         setIPv6(hostInfo.getIPAddress());
       }
 
-      setCpuCount(hostInfo.getProcessorCount());
+      setCpuCount(hostInfo.getPhysicalProcessorCount());
       setTotalMemBytes(hostInfo.getMemoryTotal());
       setAvailableMemBytes(hostInfo.getFreeMemory());
 
@@ -344,6 +362,61 @@ public class HostImpl implements Host {
       }
 
       // FIXME add all other information into host attributes
+      this.setAgentVersion(new AgentVersion(
+          hostInfo.getAgentUserId()));
+
+      Map<String, String> attrs = new HashMap<String, String>();
+      if (hostInfo.getHardwareIsa() != null) {
+        attrs.put(HARDWAREISA, hostInfo.getHardwareIsa());
+      }
+      if (hostInfo.getHardwareModel() != null) {
+        attrs.put(HARDWAREMODEL, hostInfo.getHardwareModel());
+      }
+      if (hostInfo.getInterfaces() != null) {
+        attrs.put(INTERFACES, hostInfo.getInterfaces());
+      }
+      if (hostInfo.getKernel() != null) {
+        attrs.put(KERNEL, hostInfo.getKernel());
+      }
+      if (hostInfo.getKernelMajVersion() != null) {
+        attrs.put(KERNELMAJOREVERSON, hostInfo.getKernelMajVersion());
+      }
+      if (hostInfo.getKernelRelease() != null) {
+        attrs.put(KERNELRELEASE, hostInfo.getKernelRelease());
+      }
+      if (hostInfo.getKernelVersion() != null) {
+        attrs.put(KERNELVERSION, hostInfo.getKernelVersion());
+      }
+      if (hostInfo.getMacAddress() != null) {
+        attrs.put(MACADDRESS, hostInfo.getMacAddress());
+      }
+      if (hostInfo.getNetMask() != null) {
+        attrs.put(NETMASK, hostInfo.getNetMask());
+      }
+      if (hostInfo.getOSFamily() != null) {
+        attrs.put(OSFAMILY, hostInfo.getOSFamily());
+      }
+      if (hostInfo.getPhysicalProcessorCount() != 0) {
+        attrs.put(PHYSICALPROCESSORCOUNT,
+          Long.toString(hostInfo.getPhysicalProcessorCount()));
+      }
+      if (hostInfo.getProcessorCount() != 0) {
+        attrs.put(PROCESSORCOUNT,
+          Long.toString(hostInfo.getProcessorCount()));
+      }
+      if (Boolean.toString(hostInfo.getSeLinux()) != null) {
+        attrs.put(SELINUXENABLED, Boolean.toString(hostInfo.getSeLinux()));
+      }
+      if (hostInfo.getSwapSize() != null) {
+        attrs.put(SWAPSIZE, hostInfo.getSwapSize());
+      }
+      if (hostInfo.getSwapFree() != null) {
+        attrs.put(SWAPFREE, hostInfo.getSwapFree());
+      }
+      if (hostInfo.getTimeZone() != null) {
+        attrs.put(TIMEZONE, hostInfo.getTimeZone());
+      }
+      setHostAttributes(attrs);
 
       saveIfPersisted();
     }
@@ -665,8 +738,13 @@ public class HostImpl implements Host {
   public void setHostAttributes(Map<String, String> hostAttributes) {
     try {
       writeLock.lock();
-      //TODO should this add attributes and not replace them?
-      hostEntity.setHostAttributes(gson.toJson(hostAttributes,
+      Map<String, String> hostAttrs = gson.<Map<String, String>>
+          fromJson(hostEntity.getHostAttributes(), hostAttributesType);
+      if (hostAttrs == null) {
+        hostAttrs = new HashMap<String, String>();
+      }
+      hostAttrs.putAll(hostAttributes);
+      hostEntity.setHostAttributes(gson.toJson(hostAttrs,
           hostAttributesType));
       saveIfPersisted();
     } finally {

+ 14 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java

@@ -64,6 +64,8 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO;
   @Inject
   Clusters clusters;
+  @Inject
+  private HostComponentConfigMappingDAO hostComponentConfigMappingDAO;
 
   private HostComponentStateEntity stateEntity;
   private HostComponentDesiredStateEntity desiredStateEntity;
@@ -990,4 +992,16 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     return false;
   }
 
+  @Override
+  public void deleteDesiredConfigs(Set<String> configTypes) {
+    try {
+      writeLock.lock();
+      for (String configType : configTypes) {
+        desiredConfigs.remove(configType);
+      }
+      hostComponentConfigMappingDAO.removeByType(configTypes);
+    } finally {
+      writeLock.unlock();
+    }
+  }
 }

+ 1 - 1
ambari-server/src/main/python/setupAgent.py

@@ -58,7 +58,7 @@ def installPuppet():
 def installAgent():
   """ Run yum install and make sure the agent install alright """
   # TODO replace rpm with yum -y
-  rpmCommand = ["yum", "install", "-y", "/tmp/ambari-agent*.rpm"]
+  rpmCommand = ["yum", "install", "-y", "--nogpgcheck", "/tmp/ambari-agent*.rpm"]
   return execOsCommand(rpmCommand)
 
 def configureAgent():

+ 257 - 21
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -1461,7 +1461,7 @@ public class AmbariManagementControllerTest {
           sch.setState(State.INSTALLED);
         } else {
           ++counter;
-          switch (counter%1) {          
+          switch (counter%1) {
             case 0:
               sch.setState(State.START_FAILED);
               break;
@@ -1565,10 +1565,11 @@ public class AmbariManagementControllerTest {
   public void testGetServices() throws AmbariException {
     clusters.addCluster("c1");
     Cluster c1 = clusters.getCluster("c1");
+    c1.setDesiredStackVersion(new StackId("HDP-0.1"));
     Service s1 = serviceFactory.createNew(c1, "HDFS");
 
     c1.addService(s1);
-    s1.setDesiredStackVersion(new StackId("HDP-0.0.1"));
+    s1.setDesiredStackVersion(new StackId("HDP-0.1"));
     s1.setDesiredState(State.INSTALLED);
 
     s1.persist();
@@ -1582,7 +1583,7 @@ public class AmbariManagementControllerTest {
     Assert.assertEquals(s1.getCluster().getClusterName(),
         resp1.getClusterName());
     Assert.assertEquals(s1.getName(), resp1.getServiceName());
-    Assert.assertEquals("HDP-0.0.1", s1.getDesiredStackVersion().getStackId());
+    Assert.assertEquals("HDP-0.1", s1.getDesiredStackVersion().getStackId());
     Assert.assertEquals(s1.getDesiredStackVersion().getStackId(),
         resp1.getDesiredStackVersion());
     Assert.assertEquals(State.INSTALLED.toString(), resp1.getDesiredState());
@@ -1595,6 +1596,8 @@ public class AmbariManagementControllerTest {
     clusters.addCluster("c2");
     Cluster c1 = clusters.getCluster("c1");
     Cluster c2 = clusters.getCluster("c2");
+    c1.setDesiredStackVersion(new StackId("HDP-0.2"));
+    c2.setDesiredStackVersion(new StackId("HDP-0.2"));
 
     Service s1 = serviceFactory.createNew(c1, "HDFS");
     Service s2 = serviceFactory.createNew(c1, "MAPREDUCE");
@@ -2974,21 +2977,21 @@ public class AmbariManagementControllerTest {
     assertEquals(2, tasks.size());
 
   }
-  
+
   private void createUser(String userName) throws Exception {
     UserRequest request = new UserRequest(userName);
     request.setPassword("password");
-    
+
     controller.createUsers(new HashSet<UserRequest>(Collections.singleton(request)));
   }
-  
+
   @Test
   public void testCreateAndGetUsers() throws Exception {
     createUser("user1");
-    
+
     Set<UserResponse> r =
         controller.getUsers(Collections.singleton(new UserRequest("user1")));
-            
+
     Assert.assertEquals(1, r.size());
     UserResponse resp = r.iterator().next();
     Assert.assertEquals("user1", resp.getUsername());
@@ -2999,39 +3002,272 @@ public class AmbariManagementControllerTest {
     createUser("user1");
     createUser("user2");
     createUser("user3");
-    
+
     UserRequest request = new UserRequest(null);
-    
+
     Set<UserResponse> responses = controller.getUsers(Collections.singleton(request));
-    
+
     Assert.assertEquals(3, responses.size());
   }
-  
+
   @Test
   public void testUpdateUsers() throws Exception {
     createUser("user1");
-    
+
     users.createDefaultRoles();
-    
+
     UserRequest request = new UserRequest("user1");
     request.setRoles(new HashSet<String>(){{
       add("user");
       add("admin");
     }});
-    
+
     controller.updateUsers(Collections.singleton(request));
   }
- 
+
   @Test
   public void testDeleteUsers() throws Exception {
     createUser("user1");
-    
-    UserRequest request = new UserRequest("user1");    
+
+    UserRequest request = new UserRequest("user1");
     controller.deleteUsers(Collections.singleton(request));
-    
+
     Set<UserResponse> responses = controller.getUsers(Collections.singleton(new UserRequest(null)));
-    
+
     Assert.assertEquals(0, responses.size());
   }
-  
+
+
+  @Test
+  public void testConfigUpdates() throws AmbariException {
+    String clusterName = "foo1";
+    createCluster(clusterName);
+    clusters.getCluster(clusterName)
+        .setDesiredStackVersion(new StackId("HDP-0.1"));
+    String serviceName = "HDFS";
+    createService(clusterName, serviceName, null);
+    String componentName1 = "NAMENODE";
+    String componentName2 = "DATANODE";
+    String componentName3 = "HDFS_CLIENT";
+    createServiceComponent(clusterName, serviceName, componentName1,
+        State.INIT);
+    createServiceComponent(clusterName, serviceName, componentName2,
+        State.INIT);
+    createServiceComponent(clusterName, serviceName, componentName3,
+        State.INIT);
+
+    String host1 = "h1";
+    clusters.addHost(host1);
+    clusters.getHost("h1").persist();
+    String host2 = "h2";
+    clusters.addHost(host2);
+    clusters.getHost("h2").persist();
+
+    clusters.getHost("h1").setOsType("centos5");
+    clusters.getHost("h2").setOsType("centos6");
+    clusters.mapHostToCluster(host1, clusterName);
+    clusters.mapHostToCluster(host2, clusterName);
+
+
+    // null service should work
+    createServiceComponentHost(clusterName, null, componentName1,
+        host1, null);
+    createServiceComponentHost(clusterName, serviceName, componentName2,
+        host1, null);
+    createServiceComponentHost(clusterName, serviceName, componentName2,
+        host2, null);
+    createServiceComponentHost(clusterName, serviceName, componentName3,
+        host1, null);
+    createServiceComponentHost(clusterName, serviceName, componentName3,
+        host2, null);
+
+    Assert.assertNotNull(clusters.getCluster(clusterName)
+        .getService(serviceName)
+        .getServiceComponent(componentName1)
+        .getServiceComponentHost(host1));
+    Assert.assertNotNull(clusters.getCluster(clusterName)
+        .getService(serviceName)
+        .getServiceComponent(componentName2)
+        .getServiceComponentHost(host1));
+    Assert.assertNotNull(clusters.getCluster(clusterName)
+        .getService(serviceName)
+        .getServiceComponent(componentName2)
+        .getServiceComponentHost(host2));
+    Assert.assertNotNull(clusters.getCluster(clusterName)
+        .getService(serviceName)
+        .getServiceComponent(componentName3)
+        .getServiceComponentHost(host1));
+    Assert.assertNotNull(clusters.getCluster(clusterName)
+        .getService(serviceName)
+        .getServiceComponent(componentName3)
+        .getServiceComponentHost(host2));
+
+    Map<String, String> configs = new HashMap<String, String>();
+    configs.put("a", "b");
+
+    ConfigurationRequest cr1, cr2, cr3, cr4, cr5, cr6, cr7, cr8;
+    cr1 = new ConfigurationRequest(clusterName, "typeA","v1", configs);
+    cr2 = new ConfigurationRequest(clusterName, "typeB","v1", configs);
+    cr3 = new ConfigurationRequest(clusterName, "typeC","v1", configs);
+    cr4 = new ConfigurationRequest(clusterName, "typeD","v1", configs);
+    cr5 = new ConfigurationRequest(clusterName, "typeA","v2", configs);
+    cr6 = new ConfigurationRequest(clusterName, "typeB","v2", configs);
+    cr7 = new ConfigurationRequest(clusterName, "typeC","v2", configs);
+    cr8 = new ConfigurationRequest(clusterName, "typeE","v1", configs);
+    controller.createConfiguration(cr1);
+    controller.createConfiguration(cr2);
+    controller.createConfiguration(cr3);
+    controller.createConfiguration(cr4);
+    controller.createConfiguration(cr5);
+    controller.createConfiguration(cr6);
+    controller.createConfiguration(cr7);
+    controller.createConfiguration(cr8);
+
+    Cluster cluster = clusters.getCluster(clusterName);
+    Service s = cluster.getService(serviceName);
+    ServiceComponent sc1 = s.getServiceComponent(componentName1);
+    ServiceComponent sc2 = s.getServiceComponent(componentName2);
+    ServiceComponentHost sch1 = sc1.getServiceComponentHost(host1);
+
+    Set<ServiceComponentHostRequest> schReqs =
+        new HashSet<ServiceComponentHostRequest>();
+    Set<ServiceComponentRequest> scReqs =
+        new HashSet<ServiceComponentRequest>();
+    Set<ServiceRequest> sReqs = new HashSet<ServiceRequest>();
+    Map<String, String> configVersions = new HashMap<String, String>();
+
+    // update configs at SCH and SC level
+    configVersions.clear();
+    configVersions.put("typeA", "v1");
+    configVersions.put("typeB", "v1");
+    configVersions.put("typeC", "v1");
+    schReqs.clear();
+    schReqs.add(new ServiceComponentHostRequest(clusterName, serviceName,
+        componentName1, host1, configVersions, null));
+    Assert.assertNull(controller.updateHostComponents(schReqs));
+
+    Assert.assertEquals(0, s.getDesiredConfigs().size());
+    Assert.assertEquals(0, sc1.getDesiredConfigs().size());
+    Assert.assertEquals(3, sch1.getDesiredConfigs().size());
+
+    configVersions.clear();
+    configVersions.put("typeC", "v1");
+    configVersions.put("typeD", "v1");
+    scReqs.clear();
+    scReqs.add(new ServiceComponentRequest(clusterName, serviceName,
+        componentName2, configVersions, null));
+    Assert.assertNull(controller.updateComponents(scReqs));
+
+    Assert.assertEquals(0, s.getDesiredConfigs().size());
+    Assert.assertEquals(0, sc1.getDesiredConfigs().size());
+    Assert.assertEquals(2, sc2.getDesiredConfigs().size());
+    Assert.assertEquals(3, sch1.getDesiredConfigs().size());
+
+    // update configs at service level
+    configVersions.clear();
+    configVersions.put("typeA", "v2");
+    configVersions.put("typeC", "v2");
+    configVersions.put("typeE", "v1");
+    sReqs.clear();
+    sReqs.add(new ServiceRequest(clusterName, serviceName, configVersions,
+        null));
+    Assert.assertNull(controller.updateServices(sReqs));
+
+    Assert.assertEquals(3, s.getDesiredConfigs().size());
+    Assert.assertEquals(3, sc1.getDesiredConfigs().size());
+    Assert.assertEquals(4, sc2.getDesiredConfigs().size());
+    Assert.assertEquals(4, sch1.getDesiredConfigs().size());
+
+    Assert.assertEquals("v2",
+        s.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        s.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        s.getDesiredConfigs().get("typeE").getVersionTag());
+
+    Assert.assertEquals("v2",
+        sc1.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        sc1.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sc1.getDesiredConfigs().get("typeE").getVersionTag());
+
+    Assert.assertEquals("v2",
+        sc2.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        sc2.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sc2.getDesiredConfigs().get("typeE").getVersionTag());
+    Assert.assertEquals("v1",
+        sc2.getDesiredConfigs().get("typeD").getVersionTag());
+
+    Assert.assertEquals("v2",
+        sch1.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        sch1.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeE").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeB").getVersionTag());
+
+    // update configs at SCH level
+    configVersions.clear();
+    configVersions.put("typeA", "v1");
+    configVersions.put("typeB", "v1");
+    configVersions.put("typeC", "v1");
+    schReqs.clear();
+    schReqs.add(new ServiceComponentHostRequest(clusterName, serviceName,
+        componentName1, host1, configVersions, null));
+    Assert.assertNull(controller.updateHostComponents(schReqs));
+
+    Assert.assertEquals(3, s.getDesiredConfigs().size());
+    Assert.assertEquals(3, sc1.getDesiredConfigs().size());
+    Assert.assertEquals(4, sc2.getDesiredConfigs().size());
+    Assert.assertEquals(4, sch1.getDesiredConfigs().size());
+
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeE").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeB").getVersionTag());
+
+    // update configs at SC level
+    configVersions.clear();
+    configVersions.put("typeC", "v2");
+    configVersions.put("typeD", "v1");
+    scReqs.clear();
+    scReqs.add(new ServiceComponentRequest(clusterName, serviceName,
+        componentName1, configVersions, null));
+    Assert.assertNull(controller.updateComponents(scReqs));
+
+    Assert.assertEquals(3, s.getDesiredConfigs().size());
+    Assert.assertEquals(4, sc1.getDesiredConfigs().size());
+    Assert.assertEquals(4, sc2.getDesiredConfigs().size());
+    Assert.assertEquals(5, sch1.getDesiredConfigs().size());
+
+    Assert.assertEquals("v2",
+        sc1.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        sc1.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sc2.getDesiredConfigs().get("typeD").getVersionTag());
+    Assert.assertEquals("v1",
+        sc1.getDesiredConfigs().get("typeE").getVersionTag());
+
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeA").getVersionTag());
+    Assert.assertEquals("v2",
+        sch1.getDesiredConfigs().get("typeC").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeD").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeE").getVersionTag());
+    Assert.assertEquals("v1",
+        sch1.getDesiredConfigs().get("typeB").getVersionTag());
+
+  }
+
 }

+ 35 - 36
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ResourceProviderImplTest.java

@@ -30,7 +30,6 @@ import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.easymock.EasyMock;
 import org.easymock.IArgumentMatcher;
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.easymock.EasyMock.anyObject;
@@ -77,10 +76,10 @@ public class ResourceProviderImplTest {
     Map<PropertyId, Object> properties = new LinkedHashMap<PropertyId, Object>();
 
     // add the cluster name to the properties map
-    properties.put(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID, "Cluster100");
+    properties.put(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID, "Cluster100");
 
     // add the version to the properties map
-    properties.put(ResourceProviderImpl.CLUSTER_VERSION_PROPERTY_ID, "4.02");
+    properties.put(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID, "4.02");
 
     propertySet.add(properties);
 
@@ -88,10 +87,10 @@ public class ResourceProviderImplTest {
     properties = new LinkedHashMap<PropertyId, Object>();
 
     // add the cluster id to the properties map
-    properties.put(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID, 99L);
+    properties.put(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID, 99L);
 
     // add the version to the properties map
-    properties.put(ResourceProviderImpl.CLUSTER_VERSION_PROPERTY_ID, "4.03");
+    properties.put(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID, "4.03");
 
     propertySet.add(properties);
 
@@ -139,8 +138,8 @@ public class ResourceProviderImplTest {
 
     Set<PropertyId> propertyIds = new HashSet<PropertyId>();
 
-    propertyIds.add(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID);
-    propertyIds.add(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID);
+    propertyIds.add(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID);
 
     // create the request
     Request request = PropertyHelper.getReadRequest(propertyIds);
@@ -150,26 +149,26 @@ public class ResourceProviderImplTest {
 
     Assert.assertEquals(5, resources.size());
     for (Resource resource : resources) {
-      Long id = (Long) resource.getPropertyValue(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID);
-      String name = (String) resource.getPropertyValue(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID);
+      Long id = (Long) resource.getPropertyValue(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID);
+      String name = (String) resource.getPropertyValue(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID);
       Assert.assertEquals(name, "Cluster" + id);
     }
 
     // get cluster named Cluster102
-    Predicate  predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
+    Predicate  predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
     resources = provider.getResources(request, predicate);
 
     Assert.assertEquals(1, resources.size());
-    Assert.assertEquals(102L, resources.iterator().next().getPropertyValue(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID));
-    Assert.assertEquals("Cluster102", resources.iterator().next().getPropertyValue(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID));
+    Assert.assertEquals(102L, resources.iterator().next().getPropertyValue(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID));
+    Assert.assertEquals("Cluster102", resources.iterator().next().getPropertyValue(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID));
 
     // get cluster with id == 103
-    predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
+    predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
     resources = provider.getResources(request, predicate);
 
     Assert.assertEquals(1, resources.size());
-    Assert.assertEquals(103L, resources.iterator().next().getPropertyValue(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID));
-    Assert.assertEquals("Cluster103", resources.iterator().next().getPropertyValue(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID));
+    Assert.assertEquals(103L, resources.iterator().next().getPropertyValue(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID));
+    Assert.assertEquals("Cluster103", resources.iterator().next().getPropertyValue(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID));
 
     // verify
     verify(managementController);
@@ -201,17 +200,17 @@ public class ResourceProviderImplTest {
 
     Map<PropertyId, Object> properties = new LinkedHashMap<PropertyId, Object>();
 
-    properties.put(ResourceProviderImpl.CLUSTER_VERSION_PROPERTY_ID, "4.02");
+    properties.put(ClusterResourceProvider.CLUSTER_VERSION_PROPERTY_ID, "4.02");
 
     // create the request
     Request request = PropertyHelper.getUpdateRequest(properties);
 
     // update the cluster named Cluster102
-    Predicate  predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
+    Predicate  predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
     provider.updateResources(request, predicate);
 
     // update the cluster where id == 103
-    predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
+    predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
     provider.updateResources(request, predicate);
 
     // verify
@@ -243,11 +242,11 @@ public class ResourceProviderImplTest {
         managementController);
 
     // delete the cluster named Cluster102
-    Predicate  predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
+    Predicate  predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
     provider.deleteResources(predicate);
 
     // delete the cluster where id == 103
-    predicate = new PredicateBuilder().property(ResourceProviderImpl.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
+    predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_ID_PROPERTY_ID).equals(103L).toPredicate();
     provider.deleteResources(predicate);
 
     // verify
@@ -281,9 +280,9 @@ public class ResourceProviderImplTest {
     Map<PropertyId, Object> properties = new LinkedHashMap<PropertyId, Object>();
 
     // add properties to the request map
-    properties.put(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
-    properties.put(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID, "Service100");
-    properties.put(ResourceProviderImpl.SERVICE_SERVICE_STATE_PROPERTY_ID, "DEPLOYED");
+    properties.put(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
+    properties.put(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID, "Service100");
+    properties.put(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "DEPLOYED");
 
     propertySet.add(properties);
 
@@ -333,8 +332,8 @@ public class ResourceProviderImplTest {
 
     Set<PropertyId> propertyIds = new HashSet<PropertyId>();
 
-    propertyIds.add(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID);
+    propertyIds.add(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID);
 
     // create the request
     Request request = PropertyHelper.getReadRequest(propertyIds);
@@ -345,9 +344,9 @@ public class ResourceProviderImplTest {
     Assert.assertEquals(5, resources.size());
     Set<String> names = new HashSet<String>();
     for (Resource resource : resources) {
-      String clusterName = (String) resource.getPropertyValue(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID);
+      String clusterName = (String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
       Assert.assertEquals("Cluster100", clusterName);
-      names.add((String) resource.getPropertyValue(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID));
+      names.add((String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
     }
     // Make sure that all of the response objects got moved into resources
     for (ServiceResponse serviceResponse : allResponse ) {
@@ -355,23 +354,23 @@ public class ResourceProviderImplTest {
     }
 
     // get service named Service102
-    Predicate  predicate = new PredicateBuilder().property(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
+    Predicate  predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
     resources = provider.getResources(request, predicate);
 
     Assert.assertEquals(1, resources.size());
-    Assert.assertEquals("Cluster100", resources.iterator().next().getPropertyValue(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID));
-    Assert.assertEquals("Service102", resources.iterator().next().getPropertyValue(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID));
+    Assert.assertEquals("Cluster100", resources.iterator().next().getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID));
+    Assert.assertEquals("Service102", resources.iterator().next().getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
 
     // get services where state == "DEPLOYED"
-    predicate = new PredicateBuilder().property(ResourceProviderImpl.SERVICE_SERVICE_STATE_PROPERTY_ID).equals("DEPLOYED").toPredicate();
+    predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID).equals("DEPLOYED").toPredicate();
     resources = provider.getResources(request, predicate);
 
     Assert.assertEquals(3, resources.size());
     names = new HashSet<String>();
     for (Resource resource : resources) {
-      String clusterName = (String) resource.getPropertyValue(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID);
+      String clusterName = (String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID);
       Assert.assertEquals("Cluster100", clusterName);
-      names.add((String) resource.getPropertyValue(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID));
+      names.add((String) resource.getPropertyValue(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID));
     }
     // Make sure that all of the response objects got moved into resources
     for (ServiceResponse serviceResponse : stateResponse ) {
@@ -404,14 +403,14 @@ public class ResourceProviderImplTest {
     // add the property map to a set for the request.
     Map<PropertyId, Object> properties = new LinkedHashMap<PropertyId, Object>();
 
-    properties.put(ResourceProviderImpl.SERVICE_SERVICE_STATE_PROPERTY_ID, "DEPLOYED");
+    properties.put(ServiceResourceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "DEPLOYED");
 
     // create the request
     Request request = PropertyHelper.getUpdateRequest(properties);
 
     // update the service named Service102
-    Predicate  predicate = new PredicateBuilder().property(ResourceProviderImpl.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
-        and().property(ResourceProviderImpl.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
+    Predicate  predicate = new PredicateBuilder().property(ServiceResourceProvider.SERVICE_CLUSTER_NAME_PROPERTY_ID).equals("Cluster100").
+        and().property(ServiceResourceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("Service102").toPredicate();
     provider.updateResources(request, predicate);
 
     // verify

+ 3 - 3
ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java

@@ -72,7 +72,7 @@ public class ServiceTest {
 
   @Test
   public void testCreateService() throws AmbariException {
-    String serviceName = "s1";
+    String serviceName = "HDFS";
     Service s = serviceFactory.createNew(cluster, serviceName);
     cluster.addService(s);
     s.persist();
@@ -91,7 +91,7 @@ public class ServiceTest {
 
   @Test
   public void testGetAndSetServiceInfo() throws AmbariException {
-    String serviceName = "s1";
+    String serviceName = "HDFS";
     Service s = serviceFactory.createNew(cluster, serviceName);
     cluster.addService(s);
     s.persist();
@@ -190,7 +190,7 @@ public class ServiceTest {
 
   @Test
   public void testConvertToResponse() throws AmbariException {
-    String serviceName = "s1";
+    String serviceName = "HDFS";
     Service s = serviceFactory.createNew(cluster, serviceName);
     cluster.addService(s);
     Service service = cluster.getService(serviceName);

+ 8 - 8
ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java

@@ -196,8 +196,8 @@ public class ClusterTest {
     // public Service getService(String serviceName) throws AmbariException;
     // public Map<String, Service> getServices();
 
-    Service s1 = serviceFactory.createNew(c1, "s1");
-    Service s2 = serviceFactory.createNew(c1, "s2");
+    Service s1 = serviceFactory.createNew(c1, "HDFS");
+    Service s2 = serviceFactory.createNew(c1, "MAPREDUCE");
 
     c1.addService(s1);
     c1.addService(s2);
@@ -205,7 +205,7 @@ public class ClusterTest {
     s1.persist();
     s2.persist();
 
-    Service s3 = serviceFactory.createNew(c1, "s2");
+    Service s3 = serviceFactory.createNew(c1, "MAPREDUCE");
 
     try {
       c1.addService(s3);
@@ -214,13 +214,13 @@ public class ClusterTest {
       // Expected
     }
 
-    Service s = c1.getService("s1");
+    Service s = c1.getService("HDFS");
     Assert.assertNotNull(s);
-    Assert.assertEquals("s1", s.getName());
+    Assert.assertEquals("HDFS", s.getName());
     Assert.assertEquals(c1.getClusterId(), s.getClusterId());
 
     try {
-      c1.getService("s3");
+      c1.getService("HBASE");
       fail("Expected error for unknown service");
     } catch (Exception e) {
       // Expected
@@ -228,8 +228,8 @@ public class ClusterTest {
 
     Map<String, Service> services = c1.getServices();
     Assert.assertEquals(2, services.size());
-    Assert.assertTrue(services.containsKey("s1"));
-    Assert.assertTrue(services.containsKey("s2"));
+    Assert.assertTrue(services.containsKey("HDFS"));
+    Assert.assertTrue(services.containsKey("MAPREDUCE"));
   }
 
 

+ 2 - 2
ambari-server/src/test/java/org/apache/ambari/server/state/host/HostTest.java

@@ -68,7 +68,7 @@ public class HostTest {
   public void testHostInfoImport() throws AmbariException{
     HostInfo info = new HostInfo();
     info.setMemorySize(100);
-    info.setProcessorCount(10);
+    info.setPhysicalProcessorCount(10);
     List<DiskInfo> mounts = new ArrayList<DiskInfo>();
     mounts.add(new DiskInfo("/dev/sda", "/mnt/disk1",
         "5000000", "4000000", "10%", "size"));
@@ -88,7 +88,7 @@ public class HostTest {
     Assert.assertEquals(info.getHostName(), host.getHostName());
     Assert.assertEquals(info.getFreeMemory(), host.getAvailableMemBytes());
     Assert.assertEquals(info.getMemoryTotal(), host.getTotalMemBytes());
-    Assert.assertEquals(info.getProcessorCount(), host.getCpuCount());
+    Assert.assertEquals(info.getPhysicalProcessorCount(), host.getCpuCount());
     Assert.assertEquals(info.getMounts().size(), host.getDisksInfo().size());
     Assert.assertEquals(info.getArchitecture(), host.getOsArch());
     Assert.assertEquals(info.getOS(), host.getOsType());