You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ma...@apache.org on 2012/11/07 09:32:13 UTC

svn commit: r1406494 [1/3] - in /incubator/ambari/branches/AMBARI-666: ./ ambari-agent/ ambari-agent/src/main/puppet/modules/hdp-hbase/templates/ ambari-agent/src/main/puppet/modules/hdp-repos/manifests/ ambari-agent/src/main/puppet/modules/hdp-repos/t...

Author: mahadev
Date: Wed Nov  7 08:32:11 2012
New Revision: 1406494

URL: http://svn.apache.org/viewvc?rev=1406494&view=rev
Log:
AMBARI-975. Fix support for cascading updates to configs. (Hitesh Shah via mahadev)

Added:
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ComponentConfigMappingDAO.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentConfigMappingDAO.java
Modified:
    incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
    incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml
    incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb
    incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp
    incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb
    incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/RepoInstaller.py
    incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ResourceProviderImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostRoleCommandDAO.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/host/HostImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/main/python/setupAgent.py
    incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ResourceProviderImplTest.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
    incubator/ambari/branches/AMBARI-666/ambari-server/src/test/java/org/apache/ambari/server/state/host/HostTest.java

Modified: incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt (original)
+++ incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt Wed Nov  7 08:32:11 2012
@@ -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)
 

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml Wed Nov  7 08:32:11 2012
@@ -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>

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-hbase/templates/log4j.properties.erb Wed Nov  7 08:32:11 2012
@@ -64,7 +64,7 @@ log4j.appender.console.layout.Conversion
 
 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

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/manifests/process_repo.pp Wed Nov  7 08:32:11 2012
@@ -22,6 +22,7 @@ class hdp-repos::process_repo(
   $os_type,
   $repo_id,
   $base_url,
+  $mirror_list,
   $repo_name
 ) inherits hdp-hadoop::params
 {

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/puppet/modules/hdp-repos/templates/repo.erb Wed Nov  7 08:32:11 2012
@@ -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

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/RepoInstaller.py
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/RepoInstaller.py?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/RepoInstaller.py (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/RepoInstaller.py Wed Nov  7 08:32:11 2012
@@ -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__':

Modified: incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml Wed Nov  7 08:32:11 2012
@@ -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>

Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/agent/rest/AgentResource.java Wed Nov  7 08:32:11 2012
@@ -53,6 +53,7 @@ public class AgentResource {
   @Inject
   public static void init(HeartBeatHandler instance) {
     hh = instance;
+    hh.start();
   }
 
   /**

Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java Wed Nov  7 08:32:11 2012
@@ -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();
     }

Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java Wed Nov  7 08:32:11 2012
@@ -164,22 +164,22 @@ public class AmbariManagementControllerI
     // 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 AmbariManagementControllerI
 
     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 AmbariManagementControllerI
         }
       }
     }
-    
+
   }
-  
+
   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 AmbariManagementControllerI
     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 AmbariManagementControllerI
       }
     }
 
-    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 AmbariManagementControllerI
 
     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 AmbariManagementControllerI
       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 AmbariManagementControllerI
         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 AmbariManagementControllerI
           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 AmbariManagementControllerI
     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 AmbariManagementControllerI
         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 AmbariManagementControllerI
     // 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 AmbariManagementControllerI
     }
     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 {

Modified: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java?rev=1406494&r1=1406493&r2=1406494&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java Wed Nov  7 08:32:11 2012
@@ -68,9 +68,9 @@ import com.sun.jersey.spi.container.serv
 @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;
 

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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);
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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);
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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));
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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>());
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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));
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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);
+  }
+}

Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java?rev=1406494&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java Wed Nov  7 08:32:11 2012
@@ -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);
+  }
+}