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/10/08 03:38:08 UTC

svn commit: r1395430 [2/13] - in /incubator/ambari/branches/AMBARI-666: ./ ambari-agent/src/main/puppet/manifestloader/ ambari-agent/src/main/puppet/modules/configgenerator/manifests/ ambari-agent/src/main/puppet/modules/hdp-hadoop/manifests/ ambari-ag...

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/Heartbeat.py
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/Heartbeat.py?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/Heartbeat.py (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/Heartbeat.py Mon Oct  8 01:37:59 2012
@@ -39,17 +39,19 @@ class Heartbeat:
     timestamp = int(time.time()*1000)
     queueResult = self.actionQueue.result()
     installedRoleStates = serverStatus.build()
+    
     nodeStatus = { "status" : "HEALTHY",
                    "cause" : "NONE"}
     
     heartbeat = { 'responseId'        : int(id),
                   'timestamp'         : timestamp,
                   'hostname'          : socket.gethostname(),
-                 # 'reports'           : self.reports,
                  # 'componentStatus'   : self.componentStatus,
                   'nodeStatus'        : nodeStatus
                 }
-  
+    if len(queueResult) != 0:
+      heartbeat['reports'] = queueResult
+      pass
     
     return heartbeat
 

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/security.py
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/security.py?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/security.py (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/security.py Mon Oct  8 01:37:59 2012
@@ -119,7 +119,7 @@ class CertificateManager():
     response = f.read()
     f.close()
     data = json.loads(response)
-    logger.info("Sign response from Server: \n" + pprint.pformat(data))
+    logger.debug("Sign response from Server: \n" + pprint.pformat(data))
     result=data['result']
     if result == 'OK':
       agentCrtContent=data['signedCa']

Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/shell.py
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/shell.py?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/shell.py (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/ambari_agent/shell.py Mon Oct  8 01:37:59 2012
@@ -88,18 +88,19 @@ class shellRunner:
     code = 0
     cmd = " "
     cmd = cmd.join(script)
-    p = subprocess.Popen(cmd, preexec_fn=changeUid, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, close_fds=True)
+    p = subprocess.Popen(cmd, preexec_fn=changeUid, stdout=subprocess.PIPE, 
+                         stderr=subprocess.PIPE, shell=True, close_fds=True)
     out, err = p.communicate()
     code = p.wait()
     logger.debug("Exitcode for %s is %d" % (cmd,code))
     return {'exitCode': code, 'output': out, 'error': err}
 
   # dispatch action types
-  def runAction(self, clusterId, component, role, user, command, cleanUpCommand, result):
+  def runAction(self, clusterId, component, role, 
+                user, command, cleanUpCommand, result):
     oldDir = os.getcwd()
     #TODO: handle this better. Don't like that it is doing a chdir for the main process
     os.chdir(self.getWorkDir(clusterId, role))
-    oldUid = os.getuid()
     try:
       if user is not None:
         user=getpwnam(user)[2]
@@ -107,7 +108,8 @@ class shellRunner:
         user = oldUid
       threadLocal.uid = user
     except Exception:
-      logger.warn("%s %s %s can not switch user for RUN_ACTION." % (clusterId, component, role))
+      logger.warn("%s %s %s can not switch user for RUN_ACTION." 
+                  % (clusterId, component, role))
     code = 0
     cmd = sys.executable
     tempfilename = tempfile.mktemp()
@@ -116,7 +118,8 @@ class shellRunner:
     tmp.close()
     cmd = "%s %s %s" % (cmd, tempfilename, " ".join(command['param']))
     commandResult = {}
-    p = subprocess.Popen(cmd, preexec_fn=changeUid, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, close_fds=True)
+    p = subprocess.Popen(cmd, preexec_fn=changeUid, stdout=subprocess.PIPE,
+                          stderr=subprocess.PIPE, shell=True, close_fds=True)
     out, err = p.communicate()
     code = p.wait()
     if code != 0:
@@ -134,7 +137,8 @@ class shellRunner:
       cmd = "%s %s %s" % (cmd, tempfilename, " ".join(cleanUpCommand['param']))
       cleanUpCode = 0
       cleanUpResult = {}
-      p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, close_fds=True)
+      p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                            shell=True, close_fds=True)
       out, err = p.communicate()
       cleanUpCode = p.wait()
       if cleanUpCode != 0:
@@ -147,17 +151,20 @@ class shellRunner:
     try:
       os.chdir(oldDir)
     except Exception:
-      logger.warn("%s %s %s can not restore environment for RUN_ACTION." % (clusterId, component, role))
+      logger.warn("%s %s %s can not restore environment for RUN_ACTION."
+                   % (clusterId, component, role))
     return result
 
   # Start a process and presist its state
-  def startProcess(self, clusterId, clusterDefinitionRevision, component, role, script, user, result):
+  def startProcess(self, clusterId, clusterDefinitionRevision, component,
+                    role, script, user, result):
     global serverTracker
     oldDir = os.getcwd()
     try:
       os.chdir(self.getWorkDir(clusterId,role))
     except Exception:
-      logger.warn("%s %s %s can not switch dir for START_ACTION." % (clusterId, component, role))
+      logger.warn("%s %s %s can not switch dir for START_ACTION."
+                   % (clusterId, component, role))
     oldUid = os.getuid()
     try:
       if user is not None:
@@ -166,10 +173,12 @@ class shellRunner:
         user = os.getuid()
       threadLocal.uid = user
     except Exception:
-      logger.warn("%s %s %s can not switch user for START_ACTION." % (clusterId, component, role))
+      logger.warn("%s %s %s can not switch user for START_ACTION." 
+                  % (clusterId, component, role))
     code = 0
     commandResult = {}
-    process = self.getServerKey(clusterId,clusterDefinitionRevision,component,role)
+    process = self.getServerKey(clusterId,clusterDefinitionRevision,
+                                component,role)
     if not process in serverTracker:
       try:
         plauncher = processlauncher(script,user)
@@ -177,7 +186,8 @@ class shellRunner:
         plauncher.blockUntilProcessCreation()
       except Exception:
         traceback.print_exc()
-        logger.warn("Can not launch process for %s %s %s" % (clusterId, component, role))
+        logger.warn("Can not launch process for %s %s %s" 
+                    % (clusterId, component, role))
         code = -1
       serverTracker[process] = plauncher
       commandResult['exitCode'] = code 
@@ -185,16 +195,19 @@ class shellRunner:
     try:
       os.chdir(oldDir)
     except Exception:
-      logger.warn("%s %s %s can not restore environment for START_ACTION." % (clusterId, component, role))
+      logger.warn("%s %s %s can not restore environment for START_ACTION." \
+                   % (clusterId, component, role))
     return result
 
   # Stop a process and remove presisted state
   def stopProcess(self, processKey):
     global serverTracker
     keyFragments = processKey.split('/')
-    process = self.getServerKey(keyFragments[0],keyFragments[1],keyFragments[2],keyFragments[3])
+    process = self.getServerKey(keyFragments[0],keyFragments[1],
+                                keyFragments[2],keyFragments[3])
     if process in serverTracker:
-      logger.info ("Sending %s with PID %d the SIGTERM signal" % (process,serverTracker[process].getpid()))
+      logger.info ("Sending %s with PID %d the SIGTERM signal"
+                    % (process,serverTracker[process].getpid()))
       killprocessgrp(serverTracker[process].getpid())
       del serverTracker[process]
 
@@ -227,10 +240,13 @@ class processlauncher(threading.Thread):
       tmp.write(self.script['script'])
       tmp.close()
       threadLocal.uid = self.uid
-      self.cmd = "%s %s %s" % (pythoncmd, tempfilename, " ".join(self.script['param']))
+      self.cmd = "%s %s %s" % (pythoncmd, tempfilename,
+                                " ".join(self.script['param']))
       logger.info("Launching %s as uid %d" % (self.cmd,self.uid) )
-      p = subprocess.Popen(self.cmd, preexec_fn=self.changeUidAndSetSid, stdout=subprocess.PIPE, 
-                           stderr=subprocess.PIPE, shell=True, close_fds=True)
+      p = subprocess.Popen(self.cmd,
+                            preexec_fn=self.changeUidAndSetSid, 
+                            stdout=subprocess.PIPE, 
+                            stderr=subprocess.PIPE, shell=True, close_fds=True)
       logger.info("Launched %s; PID %d" % (self.cmd,p.pid))
       self.serverpid = p.pid
       self.out, self.err = p.communicate()
@@ -253,7 +269,8 @@ class processlauncher(threading.Thread):
       time.sleep(1)
       logger.info("Waiting for process %s to start" % self.cmd)
       if sleepCount > 10:
-        logger.warn("Couldn't start process %s even after %d seconds" % (self.cmd,sleepCount))
+        logger.warn("Couldn't start process %s even after %d seconds"
+                     % (self.cmd,sleepCount))
         os._exit(1)
     return self.serverpid
 

Added: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/imports.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/imports.txt?rev=1395430&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/imports.txt (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/imports.txt Mon Oct  8 01:37:59 2012
@@ -0,0 +1,12 @@
+import "/etc/puppet/agent/modules/hdp/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-hadoop/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-hbase/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-zookeeper/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-oozie/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-pig/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-sqoop/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-templeton/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-hive/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-hcat/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-mysql/manifests/*.pp"
+import "/etc/puppet/agent/modules/hdp-monitor-webserver/manifests/*.pp"

Added: incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/manifestGenerator.py
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/manifestGenerator.py?rev=1395430&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/manifestGenerator.py (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/src/main/python/manifestGenerator/manifestGenerator.py Mon Oct  8 01:37:59 2012
@@ -0,0 +1,98 @@
+import json
+
+def generateManifest(inputJsonStr):
+#reading json
+  parsedJson = json.loads(inputJsonStr)
+  hostname = parsedJson['hostname']
+  clusterHostInfo = parsedJson['clusterHostInfo']
+  params = parsedJson['params']
+  configurations = parsedJson['configurations']
+  hostAttributes = parsedJson['hostAttributes']
+  roles = parsedJson['roles']
+  
+#writing manifest
+  manifest = open('site.pp', 'w')
+
+  #writing imports from external static file
+  writeImports(manifest)
+  
+  #writing nodes
+  writeNodes(manifest, clusterHostInfo)
+  
+  #writing params from map
+  writeParams(manifest, params)
+  
+  #writing config maps
+  writeConfigurations(manifest, configurations)
+
+  #cycle here - writing host attributes
+  writeHostAttributes(manifest, hostAttributes)
+
+  #writing task definitions 
+  writeTasks(manifest, roles)
+     
+  manifest.close()
+    
+  
+  #read static imports from file and write them to manifest
+  def writeImports(outputFile, inputFileName='imports.txt'):
+    inputFile = open(inputFileName, 'r')
+    
+    for line in inputFile:
+      outputFile.write(line)
+      
+    inputFile.close()
+
+  #write nodes
+  def writeNodes(outputFile, clusterHostInfo):
+    for node in clusterHostInfo.iterkeys():
+      outputFile.write('$' + node + '= ['
+    
+      coma = ''
+      for host in node:
+        outputFile.write(coma + '\'' + host + '\'')
+        coma = ', '
+
+      outputFile.write(']\n'
+
+  #write params
+  def writeParams(outputFile, params):
+    for param in params.iterkeys():
+      outputFile.write('$' +  param + '="' + params[param] + '"\n')
+
+  #write host attributes
+  def writeHostAttributes(outputFile, hostAttributes):
+    outputFile.write('$hostAttributes={\n')
+  
+    coma = ''
+    for attribute in hostAttributes.iterkeys():
+      outputFile.write(coma + '"' +  attribute + '" => "{' + hostAttributes[attribute] + '"}')
+      coma = ',\n'
+
+    outputFile.write('}\n')
+
+  #write configurations
+  def writeConfigurations(outputFile, configs):
+    outputFile.write('$configuration =  {\n'
+  
+    for configName in configs.iterkeys():
+      outputFile.write('$' + configName + '=> {\n')
+      config = configs[configName]
+      
+      coma = ''
+      for configParam in config.iterkeys():
+        outputFile.write(coma + '"' + configParam + '" => "' + config[configParam] + '"')
+        coma = ',\n'
+
+      outputFile.write('\n}\n')
+      
+    outputFile.write('\n}\n'
+
+  #write node tasks
+  def writeTasks(outputFile, tasks):
+    for task in tasks :
+      nodename = task['role']
+      command = task['roleCommand']
+      taskParams = task['params']
+    #TODO: write node task to file
+      
\ No newline at end of file

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/pom.xml?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/pom.xml Mon Oct  8 01:37:59 2012
@@ -30,6 +30,11 @@
     </profiles>
   <dependencies>
     <dependency>
+      <groupId>org.apache.ambari</groupId>
+      <artifactId>ambari-server</artifactId>
+      <version>1.0.3-SNAPSHOT</version>
+    </dependency>
+    <dependency>
       <groupId>org.codehaus.jackson</groupId>
       <artifactId>jackson-mapper-asl</artifactId>
       <version>1.9.2</version>
@@ -62,17 +67,14 @@
     <dependency>
       <groupId>org.codehaus.jackson</groupId>
       <artifactId>jackson-core-asl</artifactId>
-      <version>1.9.2</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.jackson</groupId>
       <artifactId>jackson-jaxrs</artifactId>
-      <version>1.9.2</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.jackson</groupId>
       <artifactId>jackson-xc</artifactId>
-      <version>1.9.7</version>
     </dependency>
     <dependency>
       <groupId>asm</groupId>
@@ -99,5 +101,10 @@
       <groupId>com.sun.grizzly</groupId>
       <artifactId>grizzly-comet-webserver</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.google.inject</groupId>
+      <artifactId>guice</artifactId>
+      <version>3.0</version>
+    </dependency>
   </dependencies>
 </project>

Added: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ProviderModule.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ProviderModule.java?rev=1395430&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ProviderModule.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ProviderModule.java Mon Oct  8 01:37:59 2012
@@ -0,0 +1,30 @@
+/**
+ * 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.api.controller;
+
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+
+
+/**
+ *
+ */
+public interface ProviderModule {
+  public ResourceProvider getResourceProvider(Resource.Type type);
+}

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ganglia/GangliaPropertyProvider.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ganglia/GangliaPropertyProvider.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ganglia/GangliaPropertyProvider.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/ganglia/GangliaPropertyProvider.java Mon Oct  8 01:37:59 2012
@@ -19,11 +19,11 @@
 package org.apache.ambari.api.controller.ganglia;
 
 import org.apache.ambari.api.controller.internal.PropertyIdImpl;
-import org.apache.ambari.api.controller.spi.Predicate;
-import org.apache.ambari.api.controller.spi.PropertyId;
-import org.apache.ambari.api.controller.spi.PropertyProvider;
-import org.apache.ambari.api.controller.spi.Request;
-import org.apache.ambari.api.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.api.controller.utilities.PredicateHelper;
 
 import java.util.HashMap;

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ClusterControllerImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ClusterControllerImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ClusterControllerImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ClusterControllerImpl.java Mon Oct  8 01:37:59 2012
@@ -15,17 +15,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.ClusterController;
-import org.apache.ambari.api.controller.spi.Predicate;
-import org.apache.ambari.api.controller.spi.PropertyProvider;
-import org.apache.ambari.api.controller.spi.Request;
-import org.apache.ambari.api.controller.spi.Resource;
-import org.apache.ambari.api.controller.spi.ResourceProvider;
-import org.apache.ambari.api.controller.spi.Schema;
+import org.apache.ambari.api.controller.ProviderModule;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.spi.ClusterController;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.Schema;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -36,16 +40,32 @@ import java.util.Set;
  */
 public class ClusterControllerImpl implements ClusterController {
 
-  private final Map<Resource.Type, Schema> schemas;
+  /**
+   * Module of providers for this controller.
+   */
+  private final ProviderModule providerModule;
+
+  /**
+   * Map of resource providers keyed by resource type.
+   */
+  private final Map<Resource.Type, ResourceProvider> resourceProviders;
+
 
-  public ClusterControllerImpl(Map<Resource.Type, Schema> schemas) {
-    this.schemas = schemas;
+  // ----- Constructors ------------------------------------------------------
+
+  public ClusterControllerImpl(ProviderModule providerModule) {
+    this.providerModule = providerModule;
+    this.resourceProviders = getResourceSchemas();
   }
 
+
+  // ----- ClusterController -------------------------------------------------
+
   @Override
-  public Iterable<Resource> getResources(Resource.Type type, Request request, Predicate predicate) {
-    ResourceProvider provider = schemas.get(type).getResourceProvider();
-    Set<Resource> resources = null;
+  public Iterable<Resource> getResources(Resource.Type type, Request request, Predicate predicate)
+      throws AmbariException{
+    ResourceProvider provider = resourceProviders.get(type);
+    Set<Resource> resources;
 
     if (provider == null) {
       resources = Collections.emptySet();
@@ -58,49 +78,134 @@ public class ClusterControllerImpl imple
 
   @Override
   public Schema getSchema(Resource.Type type) {
-    return schemas.get(type);
+    return resourceProviders.get(type).getSchema();
+  }
+
+  @Override
+  public void createResources(Resource.Type type, Request request) throws AmbariException {
+    ResourceProvider provider = resourceProviders.get(type);
+    if (provider != null) {
+      provider.createResources(request);
+    }
   }
 
+  @Override
+  public void updateResources(Resource.Type type, Request request, Predicate predicate) throws AmbariException {
+    ResourceProvider provider = resourceProviders.get(type);
+    if (provider != null) {
+      provider.updateResources(request, predicate);
+    }
+  }
+
+  @Override
+  public void deleteResources(Resource.Type type, Predicate predicate) throws AmbariException {
+    ResourceProvider provider = resourceProviders.get(type);
+    if (provider != null) {
+      provider.deleteResources(predicate);
+    }
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
   private Set<Resource> populateResources(Resource.Type type,
                                           Set<Resource> resources,
                                           Request request,
-                                          Predicate predicate) {
+                                          Predicate predicate) throws AmbariException{
     Set<Resource> keepers = resources;
 
-    for (PropertyProvider propertyProvider : schemas.get(type).getPropertyProviders()) {
+    for (PropertyProvider propertyProvider : resourceProviders.get(type).getPropertyProviders()) {
       //TODO : only call the provider if it provides properties that we need ...
       keepers = propertyProvider.populateResources(keepers, request, predicate);
     }
     return keepers;
   }
 
+  private Map<Resource.Type, ResourceProvider> getResourceSchemas() {
+    Map<Resource.Type, ResourceProvider> resourceProviders = new HashMap<Resource.Type, ResourceProvider>();
+
+    resourceProviders.put(Resource.Type.Cluster, providerModule.getResourceProvider(Resource.Type.Cluster));
+    resourceProviders.put(Resource.Type.Service, providerModule.getResourceProvider(Resource.Type.Service));
+    resourceProviders.put(Resource.Type.Host, providerModule.getResourceProvider(Resource.Type.Host));
+    resourceProviders.put(Resource.Type.Component, providerModule.getResourceProvider(Resource.Type.Component));
+    resourceProviders.put(Resource.Type.HostComponent, providerModule.getResourceProvider(Resource.Type.HostComponent));
+
+    return resourceProviders;
+  }
+
+
+  // ----- ResourceIterable inner class --------------------------------------
+
   private static class ResourceIterable implements Iterable<Resource> {
+
+    /**
+     * The resources to iterate over.
+     */
     private final Set<Resource> resources;
+
+    /**
+     * The predicate used to filter the set.
+     */
     private final Predicate predicate;
 
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a ResourceIterable.
+     *
+     * @param resources  the set of resources to iterate over
+     * @param predicate  the predicate used to filter the set of resources
+     */
     private ResourceIterable(Set<Resource> resources, Predicate predicate) {
       this.resources = resources;
       this.predicate = predicate;
     }
 
+    // ----- Iterable --------------------------------------------------------
+
     @Override
     public Iterator<Resource> iterator() {
       return new ResourceIterator(resources, predicate);
     }
   }
 
+
+  // ----- ResourceIterator inner class --------------------------------------
+
   private static class ResourceIterator implements Iterator<Resource> {
 
+    /**
+     * The underlying iterator.
+     */
     private final Iterator<Resource> iterator;
+
+    /**
+     * The predicate used to filter the resource being iterated over.
+     */
     private final Predicate predicate;
+
+    /**
+     * The next resource.
+     */
     private Resource nextResource;
 
+
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a new ResourceIterator.
+     *
+     * @param resources  the set of resources to iterate over
+     * @param predicate  the predicate used to filter the set of resources
+     */
     private ResourceIterator(Set<Resource> resources, Predicate predicate) {
-      this.iterator = resources.iterator();
-      this.predicate = predicate;
+      this.iterator     = resources.iterator();
+      this.predicate    = predicate;
       this.nextResource = getNextResource();
     }
 
+    // ----- Iterator --------------------------------------------------------
+
     @Override
     public boolean hasNext() {
       return nextResource != null;
@@ -123,6 +228,13 @@ public class ClusterControllerImpl imple
       throw new UnsupportedOperationException("Remove not supported.");
     }
 
+    // ----- helper methods --------------------------------------------------
+
+    /**
+     * Get the next resource.
+     *
+     * @return the next resource.
+     */
     private Resource getNextResource() {
       while (iterator.hasNext()) {
         Resource next = iterator.next();

Added: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/DefaultProviderModule.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/DefaultProviderModule.java?rev=1395430&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/DefaultProviderModule.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/DefaultProviderModule.java Mon Oct  8 01:37:59 2012
@@ -0,0 +1,48 @@
+/**
+ * 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.api.controller.internal;
+
+import org.apache.ambari.api.controller.ProviderModule;
+import org.apache.ambari.api.controller.utilities.Properties;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.AmbariManagementControllerImpl;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *
+ */
+public class DefaultProviderModule implements ProviderModule {
+
+  private static final List<PropertyProvider> PROPERTY_PROVIDERS =
+      new LinkedList<PropertyProvider>();
+
+  @Override
+  public ResourceProvider getResourceProvider(Resource.Type type) {
+    AmbariManagementController managementController =
+        new AmbariManagementControllerImpl(null, null);
+    return ResourceProviderImpl.getResourceProvider(type,
+        PROPERTY_PROVIDERS, Properties.getPropertyIds(type, "DB"),
+        Properties.getKeyPropertyIds(type), managementController);
+  }
+}

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyIdImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyIdImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyIdImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyIdImpl.java Mon Oct  8 01:37:59 2012
@@ -18,26 +18,52 @@
 
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.PropertyId;
 
 /**
- *
+ * Simple PropertyId implementation.
  */
 public class PropertyIdImpl implements PropertyId {
+  /**
+   * The property name.
+   */
   private String name;
+
+  /**
+   * The category name.
+   */
   private String category;
+
+  /**
+   * Indicates whether or not this property is temporal.
+   */
   private boolean temporal;
 
-  public PropertyIdImpl() {
 
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a property id.  Required for JSON serialization.
+   */
+  public PropertyIdImpl() {
   }
 
+  /**
+   * Create a property id.
+   *
+   * @param name      the property name.
+   * @param category  the property category.
+   * @param temporal  a temporal indicator
+   */
   public PropertyIdImpl(String name, String category, boolean temporal) {
-    this.name = name;
+    this.name     = name;
     this.category = category;
     this.temporal = temporal;
   }
 
+
+  // ----- PropertyId --------------------------------------------------------
+
   public String getName() {
     return name;
   }
@@ -50,17 +76,27 @@ public class PropertyIdImpl implements P
     return temporal;
   }
 
+
+  // ----- Object overrides --------------------------------------------------
+
   @Override
   public int hashCode() {
-    return name.hashCode() + (category == null ? 0 : category.hashCode()) + (temporal ? 1 : 0);
+    return name.hashCode() +
+        (category == null ? 0 : category.hashCode()) +
+        (temporal ? 1 : 0);
   }
 
   @Override
   public boolean equals(Object o) {
 
-    if (!(o instanceof PropertyIdImpl)) {
+    if (this == o) {
+      return true;
+    }
+
+    if (!(o.getClass().equals(PropertyIdImpl.class))) {
       return false;
     }
+
     PropertyIdImpl that = (PropertyIdImpl) o;
 
     return this.name.equals(that.getName()) &&
@@ -68,21 +104,18 @@ public class PropertyIdImpl implements P
         this.isTemporal() == that.isTemporal();
   }
 
+  @Override
+  public String toString() {
+    return "PropertyId[" + category + ", " + name + "]";
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
   private static boolean equals(Object o1, Object o2) {
     if (o1 == null) {
       return o2 == null;
     }
-
-    if (o2 == null) {
-      return o1 == null;
-    }
-
-    return o1.equals(o2);
-  }
-
-
-  @Override
-  public String toString() {
-    return "PropertyId[" + category + ", " + name + "]";
+    return o2 != null && o1.equals(o2);
   }
 }

Added: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyPredicateVisitor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyPredicateVisitor.java?rev=1395430&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyPredicateVisitor.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/PropertyPredicateVisitor.java Mon Oct  8 01:37:59 2012
@@ -0,0 +1,62 @@
+/**
+ * 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.api.controller.internal;
+
+import org.apache.ambari.server.controller.predicate.ArrayPredicate;
+import org.apache.ambari.server.controller.predicate.ComparisonPredicate;
+import org.apache.ambari.server.controller.predicate.PredicateVisitor;
+import org.apache.ambari.server.controller.predicate.UnaryPredicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Predicate visitor for extracting property values from the PropertyPredicates of a predicate graph.
+ */
+public class PropertyPredicateVisitor implements PredicateVisitor {
+  private final Map<PropertyId, Object> properties = new HashMap<PropertyId, Object>();
+
+  @Override
+  public void acceptComparisonPredicate(ComparisonPredicate predicate) {
+    properties.put(predicate.getPropertyId(), predicate.getValue());
+  }
+
+  @Override
+  public void acceptArrayPredicate(ArrayPredicate predicate) {
+    //Do nothing
+  }
+
+  @Override
+  public void acceptUnaryPredicate(UnaryPredicate predicate) {
+    //Do nothing
+  }
+
+
+  // ----- accessors ---------------------------------------------------------
+
+  /**
+   * Get the properties.
+   *
+   * @return the properties
+   */
+  public Map<PropertyId, Object> getProperties() {
+    return properties;
+  }
+}

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/RequestImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/RequestImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/RequestImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/RequestImpl.java Mon Oct  8 01:37:59 2012
@@ -18,8 +18,8 @@
 
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.PropertyId;
-import org.apache.ambari.api.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Request;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -31,21 +31,47 @@ import java.util.Set;
  */
 public class RequestImpl implements Request {
 
+  /**
+   * The property ids associated with this request.  Used for requests that
+   * get resource values.
+   */
   private final Set<PropertyId> propertyIds;
-  private final Set<Map<PropertyId, String>> properties;
 
-  public RequestImpl(Set<PropertyId> propertyIds, Set<Map<PropertyId, String>> properties) {
-    this.propertyIds = propertyIds == null ? Collections.unmodifiableSet(new HashSet<PropertyId>()) : Collections.unmodifiableSet(propertyIds);
-    this.properties = properties == null ? Collections.unmodifiableSet(new HashSet<Map<PropertyId, String>>()) : Collections.unmodifiableSet(properties);
+  /**
+   * The properties associated with this request.  Used for requests that create
+   * resources or update resource values.
+   */
+  private final Set<Map<PropertyId, Object>> properties;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a request.
+   *
+   * @param propertyIds  the property ids associated with the request; may be null
+   * @param properties   the properties associated with the request; may be null
+   */
+  public RequestImpl(Set<PropertyId> propertyIds, Set<Map<PropertyId, Object>> properties) {
+    this.propertyIds = propertyIds == null ?
+        Collections.unmodifiableSet(new HashSet<PropertyId>()) :
+        Collections.unmodifiableSet(propertyIds);
+
+    this.properties = properties == null ?
+        Collections.unmodifiableSet(new HashSet<Map<PropertyId, Object>>()) :
+        Collections.unmodifiableSet(properties);
   }
 
+
+  // ----- Request -----------------------------------------------------------
+
   @Override
   public Set<PropertyId> getPropertyIds() {
     return propertyIds;
   }
 
   @Override
-  public Set<Map<PropertyId, String>> getProperties() {
+  public Set<Map<PropertyId, Object>> getProperties() {
     return properties;
   }
 

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceImpl.java Mon Oct  8 01:37:59 2012
@@ -18,23 +18,42 @@
 
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.PropertyId;
-import org.apache.ambari.api.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.Resource;
 
 import java.util.HashMap;
 import java.util.Map;
 
 /**
- * Default resource implementation.
+ * Simple resource implementation.
  */
 public class ResourceImpl implements Resource {
+
+  /**
+   * The resource type.
+   */
   private final Type type;
+
+  /**
+   * The map of categories/properties for this resource.
+   */
   private final Map<String, Map<String, String>> categories = new HashMap<String, Map<String, String>>();
 
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a resource of the given type.
+   *
+   * @param type  the resource type
+   */
   public ResourceImpl(Type type) {
     this.type = type;
   }
 
+
+  // ----- Resource ----------------------------------------------------------
+
   @Override
   public Type getType() {
     return type;
@@ -90,6 +109,9 @@ public class ResourceImpl implements Res
     return null;
   }
 
+
+  // ----- Object overrides --------------------------------------------------
+
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceProviderImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceProviderImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceProviderImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/ResourceProviderImpl.java Mon Oct  8 01:37:59 2012
@@ -18,201 +18,646 @@
 
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.ManagementController;
-import org.apache.ambari.api.controller.spi.Predicate;
-import org.apache.ambari.api.controller.spi.PropertyId;
-import org.apache.ambari.api.controller.spi.Request;
-import org.apache.ambari.api.controller.spi.Resource;
-import org.apache.ambari.api.controller.spi.ResourceProvider;
+import org.apache.ambari.api.controller.utilities.PredicateHelper;
+import org.apache.ambari.api.controller.utilities.Properties;
+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.HostRequest;
+import org.apache.ambari.server.controller.HostResponse;
+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.spi.Predicate;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.Schema;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
+ * Basic resource provider implementation that maps to a management controller.
  */
 public abstract class ResourceProviderImpl implements ResourceProvider {
 
-  protected final Set<PropertyId> propertyIds;
-
-  private final ManagementController managementController;
-
-  private ResourceProviderImpl(Set<PropertyId> propertyIds, ManagementController managementController) {
-    this.propertyIds = propertyIds;
+  /**
+   * The list of property providers for this provider's resource type.
+   */
+  private final List<PropertyProvider> propertyProviders;
+
+  /**
+   * The set of property ids supported by this resource provider.
+   */
+  private final Set<PropertyId> propertyIds;
+
+  /**
+   * The management controller to delegate to.
+   */
+  private final AmbariManagementController managementController;
+
+  /**
+   * The schema for this provider's resource type.
+   */
+  private final Schema schema;
+
+
+  // ----- Property ID constants ---------------------------------------------
+
+  // Clusters
+  private static final PropertyId CLUSTER_ID_PROPERTY_ID      = Properties.getPropertyId("cluster_id", "Clusters");
+  private static final PropertyId CLUSTER_NAME_PROPERTY_ID    = Properties.getPropertyId("cluster_name", "Clusters");
+  private static final PropertyId CLUSTER_VERSION_PROPERTY_ID = Properties.getPropertyId("version", "Clusters");
+  // Services
+  private static final PropertyId SERVICE_CLUSTER_NAME_PROPERTY_ID  = Properties.getPropertyId("cluster_name", "ServiceInfo");
+  private static final PropertyId SERVICE_SERVICE_NAME_PROPERTY_ID  = Properties.getPropertyId("service_name", "ServiceInfo");
+  private static final PropertyId SERVICE_SERVICE_STATE_PROPERTY_ID = Properties.getPropertyId("state", "ServiceInfo");
+  // Components
+  private static final PropertyId COMPONENT_CLUSTER_NAME_PROPERTY_ID   = Properties.getPropertyId("cluster_name", "ServiceComponentInfo");
+  private static final PropertyId COMPONENT_SERVICE_NAME_PROPERTY_ID   = Properties.getPropertyId("service_name", "ServiceComponentInfo");
+  private static final PropertyId COMPONENT_COMPONENT_NAME_PROPERTY_ID = Properties.getPropertyId("service_name", "ServiceComponentInfo");
+  private static final PropertyId COMPONENT_STATE_PROPERTY_ID          = Properties.getPropertyId("state", "ServiceComponentInfo");
+  // Hosts
+  private static final PropertyId HOST_CLUSTER_NAME_PROPERTY_ID = Properties.getPropertyId("cluster_name", "Hosts");
+  private static final PropertyId HOST_NAME_PROPERTY_ID         = Properties.getPropertyId("host_name", "Hosts");
+  private static final PropertyId HOST_IP_PROPERTY_ID           = Properties.getPropertyId("ip", "Hosts");
+  private static final PropertyId HOST_TOTAL_MEM_PROPERTY_ID    = Properties.getPropertyId("total_mem", "Hosts");
+  private static final PropertyId HOST_CPU_COUNT_PROPERTY_ID    = Properties.getPropertyId("cpu_count", "Hosts");
+  private static final PropertyId HOST_OS_ARCH_PROPERTY_ID      = Properties.getPropertyId("os_arch", "Hosts");
+  private static final PropertyId HOST_OS_TYPE_PROPERTY_ID      = Properties.getPropertyId("os_type", "Hosts");
+  // Host Components
+  private static final PropertyId HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID   = Properties.getPropertyId("cluster_name", "HostRoles");
+  private static final PropertyId HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID   = Properties.getPropertyId("service_name", "HostRoles");
+  private static final PropertyId HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID = Properties.getPropertyId("service_name", "HostRoles");
+  private static final PropertyId HOST_COMPONENT_HOST_NAME_PROPERTY_ID      = Properties.getPropertyId("host_name", "HostRoles");
+  private static final PropertyId HOST_COMPONENT_STATE_PROPERTY_ID          = Properties.getPropertyId("state", "HostRoles");
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a  new resource provider for the given management controller.
+   *
+   * @param propertyIds           the property ids
+   * @param managementController  the management controller
+   */
+  private ResourceProviderImpl(List<PropertyProvider> propertyProviders,
+                               Set<PropertyId> propertyIds,
+                               Map<Resource.Type, PropertyId> keyPropertyIds,
+                               AmbariManagementController managementController) {
+    this.propertyProviders    = propertyProviders;
+    this.propertyIds          = propertyIds;
     this.managementController = managementController;
+    this.schema               = new SchemaImpl(this, keyPropertyIds);
   }
 
+
+  // ----- ResourceProvider --------------------------------------------------
+
   @Override
   public Set<PropertyId> getPropertyIds() {
     return propertyIds;
   }
 
-  public ManagementController getManagementController() {
+  @Override
+  public List<PropertyProvider> getPropertyProviders() {
+    return propertyProviders;
+  }
+
+  @Override
+  public Schema getSchema() {
+    return schema;
+  }
+
+
+  // ----- accessors ---------------------------------------------------------
+
+  /**
+   * Get the associated management controller.
+   *
+   * @return the associated management controller
+   */
+  public AmbariManagementController getManagementController() {
     return managementController;
   }
 
-  public static ResourceProvider getResourceProvider(Resource.Type type, Set<PropertyId> propertyIds, ManagementController managementController)  {
 
+  // ----- utility methods ---------------------------------------------------
+
+  /**
+   * Get a map of property values from a given predicate.
+   *
+   * @param predicate  the predicate
+   *
+   * @return the map of properties
+   */
+  private static Map<PropertyId, Object> getProperties(Predicate predicate) {
+    PropertyPredicateVisitor visitor = new PropertyPredicateVisitor();
+    PredicateHelper.visit(predicate, visitor);
+    return visitor.getProperties();
+  }
+
+  /**
+   * Transfer property values from one map to another for the given list of property ids.
+   *
+   * @param to           the target map
+   * @param from         the source map
+   * @param propertyIds  the list of property ids
+   */
+  private static void setProperties(Map<PropertyId, Object> to, Map<PropertyId, Object> from, PropertyId ... propertyIds) {
+    for (PropertyId propertyId : propertyIds) {
+      if (from.containsKey(propertyId)) {
+        to.put(propertyId, from.get(propertyId));
+      }
+    }
+  }
+
+  /**
+   * 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)) {
+      resource.setProperty(propertyId, 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) {
+    if (requestedIds.contains(propertyId)) {
+      resource.setProperty(propertyId, value);
+    }
+  }
+
+  /**
+   * Set a integer 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, Integer value, Set<PropertyId> requestedIds) {
+    if (requestedIds.contains(propertyId)) {
+      resource.setProperty(propertyId, value);
+    }
+  }
+
+  /**
+   * Factory method for obtaining a resource provider based on a given type and management controller.
+   *
+   * @param type                  the resource type
+   * @param propertyIds           the property ids
+   * @param managementController  the management controller
+   *
+   * @return a new resource provider
+   */
+  public static ResourceProvider getResourceProvider(Resource.Type type,
+                                                     List<PropertyProvider> propertyProviders,
+                                                     Set<PropertyId> propertyIds,
+                                                     Map<Resource.Type, PropertyId> keyPropertyIds,
+                                                     AmbariManagementController managementController) {
     switch (type) {
       case Cluster:
-        return new ClusterResourceProvider(propertyIds, managementController);
+        return new ClusterResourceProvider(propertyProviders, propertyIds, keyPropertyIds, managementController);
       case Service:
-        return new ServiceResourceProvider(propertyIds, managementController);
+        return new ServiceResourceProvider(propertyProviders, propertyIds, keyPropertyIds, managementController);
       case Component:
-        return new ComponentResourceProvider(propertyIds, managementController);
+        return new ComponentResourceProvider(propertyProviders, propertyIds, keyPropertyIds, managementController);
       case Host:
-        return new HostResourceProvider(propertyIds, managementController);
+        return new HostResourceProvider(propertyProviders, propertyIds, keyPropertyIds, managementController);
       case HostComponent:
-        return new HostComponentResourceProvider(propertyIds, managementController);
+        return new HostComponentResourceProvider(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
     throw new IllegalArgumentException("Unknown type " + type);
   }
 
-  protected Request getRequest(Request request) {
-    Set<PropertyId> propertyIds = new HashSet<PropertyId>(request.getPropertyIds());
-    if (propertyIds.size() == 0) {
-      request = new RequestImpl(this.propertyIds, null);
-    }
-    return request;
-  }
+
+  // ------ ClusterResourceProvider inner class ------------------------------
 
   private static class ClusterResourceProvider extends ResourceProviderImpl{
 
-    private ClusterResourceProvider(Set<PropertyId> propertyIds, ManagementController managementController) {
-      super(propertyIds, managementController);
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a  new resource provider for the given management controller.
+     *
+     * @param propertyIds           the property ids
+     * @param managementController  the management controller
+     */
+    private ClusterResourceProvider(List<PropertyProvider> propertyProviders, Set<PropertyId> propertyIds, Map<Resource.Type, PropertyId> keyPropertyIds, AmbariManagementController managementController) {
+      super(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
 
+// ----- ResourceProvider ------------------------------------------------
+
     @Override
-    public void createResources(Request request) {
-      getManagementController().createClusters(request);
+    public void createResources(Request request) throws AmbariException {
+
+      for (Map<PropertyId, Object> properties : request.getProperties()) {
+        getManagementController().createCluster(getRequest(properties));
+      }
     }
 
     @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) {
-      request = getRequest(request);
-      return getManagementController().getClusters(request, predicate);
+    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+      Set<PropertyId> requestedIds   = request.getPropertyIds();
+      ClusterRequest  clusterRequest = getRequest(getProperties(predicate));
+
+      Set<ClusterResponse> responses = getManagementController().getClusters(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);
+      }
+      return resources;
     }
 
     @Override
-    public void updateResources(Request request, Predicate predicate) {
-      getManagementController().updateClusters(request, predicate);
+    public void updateResources(Request request, Predicate predicate) throws AmbariException {
+      // get the cluster request properties from the given request
+      Map<PropertyId, Object> properties = request.getProperties().iterator().next();
+      // get the id for the cluster request from the predicate
+      setProperties(properties, getProperties(predicate), CLUSTER_ID_PROPERTY_ID);
+
+      ClusterRequest clusterRequest = getRequest(properties);
+      getManagementController().updateCluster(clusterRequest);
     }
 
     @Override
-    public void deleteResources(Predicate predicate) {
-      getManagementController().deleteClusters(predicate);
+    public void deleteResources(Predicate predicate) throws AmbariException {
+      ClusterRequest clusterRequest = getRequest(getProperties(predicate));
+      getManagementController().deleteCluster(clusterRequest);
+    }
+
+    // ----- utility methods -------------------------------------------------
+
+    /**
+     * 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) {
+
+      return new ClusterRequest(
+          (Long) properties.get(CLUSTER_ID_PROPERTY_ID),
+          (String) properties.get(CLUSTER_NAME_PROPERTY_ID),
+          (String) properties.get(CLUSTER_VERSION_PROPERTY_ID),
+          null);  // TODO : host names
     }
   }
 
+  // ------ ServiceResourceProvider inner class ------------------------------
+
   private static class ServiceResourceProvider extends ResourceProviderImpl{
 
-    private ServiceResourceProvider(Set<PropertyId> propertyIds, ManagementController managementController) {
-      super(propertyIds, managementController);
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a  new resource provider for the given management controller.
+     *
+     * @param propertyIds           the property ids
+     * @param managementController  the management controller
+     */
+    private ServiceResourceProvider(List<PropertyProvider> propertyProviders, Set<PropertyId> propertyIds, Map<Resource.Type, PropertyId> keyPropertyIds, AmbariManagementController managementController) {
+      super(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
 
+    // ----- ResourceProvider ------------------------------------------------
+
     @Override
-    public void createResources(Request request) {
-      getManagementController().createServices(request);
+    public void createResources(Request request) throws AmbariException {
+      for (Map<PropertyId, Object> properties : request.getProperties()) {
+        getManagementController().createService(getRequest(properties));
+      }
     }
 
     @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) {
-      request = getRequest(request);
-      return getManagementController().getServices(request, predicate);
+    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+      Set<PropertyId> requestedIds   = request.getPropertyIds();
+      ServiceRequest  serviceRequest = getRequest(getProperties(predicate));
+
+      Set<ServiceResponse> responses = getManagementController().getServices(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);
+        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);
+      }
+      return resources;
     }
 
     @Override
-    public void updateResources(Request request, Predicate predicate) {
-      getManagementController().updateServices(request, predicate);
+    public void updateResources(Request request, Predicate predicate) throws AmbariException {
+      // get the service request properties from the given request
+      Map<PropertyId, Object> properties = request.getProperties().iterator().next();
+      // get the pk for the service request from the predicate
+      setProperties(properties, getProperties(predicate),
+          SERVICE_CLUSTER_NAME_PROPERTY_ID, SERVICE_SERVICE_NAME_PROPERTY_ID);
+
+      ServiceRequest serviceRequest = getRequest(properties);
+      getManagementController().updateService(serviceRequest);
     }
 
     @Override
-    public void deleteResources(Predicate predicate) {
-      getManagementController().deleteServices(predicate);
+    public void deleteResources(Predicate predicate) throws AmbariException {
+      ServiceRequest serviceRequest = getRequest(getProperties(predicate));
+      getManagementController().deleteService(serviceRequest);
+    }
+
+    // ----- utility methods -------------------------------------------------
+
+    /**
+     * 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 ComponentResourceProvider(Set<PropertyId> propertyIds, ManagementController managementController) {
-      super(propertyIds, managementController);
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a  new resource provider for the given management controller.
+     *
+     * @param propertyIds           the property ids
+     * @param managementController  the management controller
+     */
+    private ComponentResourceProvider(List<PropertyProvider> propertyProviders, Set<PropertyId> propertyIds, Map<Resource.Type, PropertyId> keyPropertyIds, AmbariManagementController managementController) {
+      super(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
 
+    // ----- ResourceProvider ------------------------------------------------
+
     @Override
-    public void createResources(Request request) {
-      getManagementController().createComponents(request);
+    public void createResources(Request request) throws AmbariException {
+      for (Map<PropertyId, Object> properties : request.getProperties()) {
+        getManagementController().createComponent(getRequest(properties));
+      }
     }
 
     @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) {
-      request = getRequest(request);
-      return getManagementController().getComponents(request, predicate);
+    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+      Set<PropertyId>          requestedIds            = request.getPropertyIds();
+      ServiceComponentRequest  serviceComponentRequest = getRequest(getProperties(predicate));
+
+      Set<ServiceComponentResponse> responses = getManagementController().getComponents(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);
+      }
+      return resources;
     }
 
     @Override
-    public void updateResources(Request request, Predicate predicate) {
-      getManagementController().updateComponents(request, predicate);
+    public void updateResources(Request request, Predicate predicate) throws AmbariException {
+      // get the component request properties from the given request
+      Map<PropertyId, Object> properties = request.getProperties().iterator().next();
+      // get the pk for the service request from the predicate
+      setProperties(properties, getProperties(predicate),
+          COMPONENT_CLUSTER_NAME_PROPERTY_ID, COMPONENT_SERVICE_NAME_PROPERTY_ID, COMPONENT_COMPONENT_NAME_PROPERTY_ID);
+
+      ServiceComponentRequest serviceComponentRequest = getRequest(properties);
+      getManagementController().updateComponent(serviceComponentRequest);
     }
 
     @Override
-    public void deleteResources(Predicate predicate) {
-      getManagementController().deleteComponents(predicate);
+    public void deleteResources(Predicate predicate) throws AmbariException {
+      ServiceComponentRequest serviceComponentRequest = getRequest(getProperties(predicate));
+      getManagementController().deleteComponent(serviceComponentRequest);
+    }
+
+    // ----- utility methods -------------------------------------------------
+
+    /**
+     * 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 HostResourceProvider(Set<PropertyId> propertyIds, ManagementController managementController) {
-      super(propertyIds, managementController);
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a  new resource provider for the given management controller.
+     *
+     * @param propertyIds           the property ids
+     * @param managementController  the management controller
+     */
+    private HostResourceProvider(List<PropertyProvider> propertyProviders, Set<PropertyId> propertyIds, Map<Resource.Type, PropertyId> keyPropertyIds, AmbariManagementController managementController) {
+      super(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
 
+    // ----- ResourceProvider ------------------------------------------------
+
     @Override
-    public void createResources(Request request) {
-      getManagementController().createHosts(request);
+    public void createResources(Request request) throws AmbariException {
+      for (Map<PropertyId, Object> properties : request.getProperties()) {
+        getManagementController().createHost(getRequest(properties));
+      }
     }
 
     @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) {
-      request = getRequest(request);
-      return getManagementController().getHosts(request, predicate);
+    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+      Set<PropertyId> requestedIds = request.getPropertyIds();
+      HostRequest     hostRequest  = getRequest(getProperties(predicate));
+
+      Set<HostResponse> responses = getManagementController().getHosts(hostRequest);
+
+      Set<Resource> resources = new HashSet<Resource>();
+      for (HostResponse response : responses) {
+        Resource resource = new ResourceImpl(Resource.Type.Host);
+        // TODO : more than one cluster
+//        setResourceProperty(resource, HOST_CLUSTER_NAME_PROPERTY_ID, response.getClusterNames(), 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, response.getTotalMemBytes(), requestedIds);
+        setResourceProperty(resource, HOST_CPU_COUNT_PROPERTY_ID, response.getCpuCount(), requestedIds);
+        setResourceProperty(resource, HOST_OS_ARCH_PROPERTY_ID, response.getOsArch(), requestedIds);
+        setResourceProperty(resource, HOST_OS_TYPE_PROPERTY_ID, response.getOsType(), requestedIds);
+        // TODO ...
+      }
+      return resources;
     }
 
     @Override
-    public void updateResources(Request request, Predicate predicate) {
-      getManagementController().updateHosts(request, predicate);
+    public void updateResources(Request request, Predicate predicate) throws AmbariException {
+      // get the host request properties from the given request
+      Map<PropertyId, Object> properties = request.getProperties().iterator().next();
+      // get the pk for the service request from the predicate
+      setProperties(properties, getProperties(predicate), HOST_CLUSTER_NAME_PROPERTY_ID);
+
+      HostRequest hostRequest = getRequest(properties);
+      getManagementController().updateHost(hostRequest);
     }
 
     @Override
-    public void deleteResources(Predicate predicate) {
-      getManagementController().deleteHosts(predicate);
+    public void deleteResources(Predicate predicate) throws AmbariException {
+      HostRequest hostRequest = getRequest(getProperties(predicate));
+      getManagementController().deleteHost(hostRequest);
+    }
+
+    // ----- utility methods -------------------------------------------------
+
+    /**
+     * 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
+          Collections.singletonList((String) properties.get(HOST_CLUSTER_NAME_PROPERTY_ID)),
+          null);
     }
   }
 
+  // ------ HostComponentResourceProvider inner class ------------------------
+
   private static class HostComponentResourceProvider extends ResourceProviderImpl{
 
-    private HostComponentResourceProvider(Set<PropertyId> propertyIds, ManagementController managementController) {
-      super(propertyIds, managementController);
+    // ----- Constructors ----------------------------------------------------
+
+    /**
+     * Create a  new resource provider for the given management controller.
+     *
+     * @param propertyIds           the property ids
+     * @param managementController  the management controller
+     */
+    private HostComponentResourceProvider(List<PropertyProvider> propertyProviders, Set<PropertyId> propertyIds, Map<Resource.Type, PropertyId> keyPropertyIds, AmbariManagementController managementController) {
+      super(propertyProviders, propertyIds, keyPropertyIds, managementController);
     }
 
+    // ----- ResourceProvider ------------------------------------------------
+
     @Override
-    public void createResources(Request request) {
-      getManagementController().createHostComponents(request);
+    public void createResources(Request request) throws AmbariException {
+      for (Map<PropertyId, Object> properties : request.getProperties()) {
+        getManagementController().createHostComponent(getRequest(properties));
+      }
     }
 
     @Override
-    public Set<Resource> getResources(Request request, Predicate predicate) {
-      request = getRequest(request);
-      return getManagementController().getHostComponents(request, predicate);
+    public Set<Resource> getResources(Request request, Predicate predicate) throws AmbariException {
+      Set<PropertyId>             requestedIds         = request.getPropertyIds();
+      ServiceComponentHostRequest hostComponentRequest = getRequest(getProperties(predicate));
+
+      Set<ServiceComponentHostResponse> responses = getManagementController().getHostComponents(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);
+      }
+      return resources;
     }
 
     @Override
-    public void updateResources(Request request, Predicate predicate) {
-      getManagementController().updateHostComponents(request, predicate);
+    public void updateResources(Request request, Predicate predicate) throws AmbariException {
+      // get the host request properties from the given request
+      Map<PropertyId, Object> properties = request.getProperties().iterator().next();
+      // get the pk for the service request from the predicate
+      setProperties(properties, getProperties(predicate),
+          HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID, HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID,
+          HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID, HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
+
+      ServiceComponentHostRequest hostComponentRequest = getRequest(properties);
+      getManagementController().updateHostComponent(hostComponentRequest);
     }
 
     @Override
-    public void deleteResources(Predicate predicate) {
-      getManagementController().deleteHostComponents(predicate);
+    public void deleteResources(Predicate predicate) throws AmbariException {
+      ServiceComponentHostRequest clusterRequest = getRequest(getProperties(predicate));
+      getManagementController().deleteHostComponent(clusterRequest);
+    }
+
+    // ----- utility methods -------------------------------------------------
+
+    /**
+     * 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));
     }
   }
 }
-

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/SchemaImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/SchemaImpl.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/SchemaImpl.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/internal/SchemaImpl.java Mon Oct  8 01:37:59 2012
@@ -18,11 +18,11 @@
 
 package org.apache.ambari.api.controller.internal;
 
-import org.apache.ambari.api.controller.spi.PropertyId;
-import org.apache.ambari.api.controller.spi.PropertyProvider;
-import org.apache.ambari.api.controller.spi.Resource;
-import org.apache.ambari.api.controller.spi.ResourceProvider;
-import org.apache.ambari.api.controller.spi.Schema;
+import org.apache.ambari.server.controller.spi.PropertyId;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.spi.Schema;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -31,21 +31,43 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * Default schema implementation.
+ * Simple schema implementation.
  */
 public class SchemaImpl implements Schema {
+  /**
+   * The associated resource provider.
+   */
   private final ResourceProvider resourceProvider;
+
+  /**
+   * The list of associated property providers.
+   */
   private final List<PropertyProvider> propertyProviders;
+
+  /**
+   * Key property mapping by resource type.
+   */
   private final Map<Resource.Type, PropertyId> keyPropertyIds;
 
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Create a new schema for the given providers.
+   *
+   * @param resourceProvider   the resource provider
+   * @param keyPropertyIds     the key property mapping
+   */
   public SchemaImpl(ResourceProvider resourceProvider,
-                    List<PropertyProvider> propertyProviders,
                     Map<Resource.Type, PropertyId> keyPropertyIds) {
     this.resourceProvider = resourceProvider;
-    this.propertyProviders = propertyProviders;
+    this.propertyProviders = resourceProvider.getPropertyProviders();
     this.keyPropertyIds = keyPropertyIds;
   }
 
+
+  // ----- Schema ------------------------------------------------------------
+
   @Override
   public PropertyId getKeyPropertyId(Resource.Type type) {
     return keyPropertyIds.get(type);
@@ -67,17 +89,10 @@ public class SchemaImpl implements Schem
     return categories;
   }
 
-  @Override
-  public ResourceProvider getResourceProvider() {
-    return resourceProvider;
-  }
 
-  @Override
-  public List<PropertyProvider> getPropertyProviders() {
-    return propertyProviders;
-  }
+  // ----- helper methods ----------------------------------------------------
 
-  public Set<PropertyId> getPropertyIds() {
+  private Set<PropertyId> getPropertyIds() {
     Set<PropertyId> propertyIds = new HashSet<PropertyId>(resourceProvider.getPropertyIds());
     for (PropertyProvider propertyProvider : propertyProviders) {
       propertyIds.addAll(propertyProvider.getPropertyIds());

Modified: incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/jdbc/ConnectionFactory.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/jdbc/ConnectionFactory.java?rev=1395430&r1=1395429&r2=1395430&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/jdbc/ConnectionFactory.java (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-api/src/main/java/org/apache/ambari/api/controller/jdbc/ConnectionFactory.java Mon Oct  8 01:37:59 2012
@@ -22,8 +22,15 @@ import java.sql.Connection;
 import java.sql.SQLException;
 
 /**
- *
+ * Simple JDBC connection factory interface.
  */
 public interface ConnectionFactory {
+  /**
+   * Get a connection.
+   *
+   * @return the connection
+   *
+   * @throws SQLException thrown if the connection cannot be obtained
+   */
   public Connection getConnection() throws SQLException;
 }