Sfoglia il codice sorgente

AMBARI-1331 - Step 8 hangs on deploy task 2 of 59, server has exception

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/trunk@1441612 13f79535-47bb-0310-9956-ffa450edef68
Tom Beerbower 12 anni fa
parent
commit
7170887107

+ 2 - 0
CHANGES.txt

@@ -223,6 +223,8 @@ Trunk (unreleased changes):
 
  BUG FIXES
 
+ AMBARI-1331. Step 8 hangs on deploy tas 2 of 59, server has exception (tbeerbower)
+
  AMBARI-1164. Disk info ganglia metrics is broken for some OS. (Dmytro Shkvyra via jspeidel)
 
  AMBARI-1325. Left border is missing from the main nav. (srimanth)

+ 5 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java

@@ -120,8 +120,11 @@ class ActionResourceProvider extends AbstractResourceProvider {
     Map<String, String> params = new HashMap<String, String>();
     for (Entry<String, Object> entry : properties.entrySet()) {
       String propertyid = entry.getKey();
-      if (PropertyHelper.getPropertyCategory(propertyid).equals("parameters")
-          && null != entry.getValue()) {
+
+      String propertyCategory = PropertyHelper.getPropertyCategory(propertyid);
+      if (propertyCategory != null &&
+          propertyCategory.equals("parameters") &&
+          null != entry.getValue()) {
         params.put(PropertyHelper.getPropertyName(propertyid), entry.getValue().toString());
       }
     }

+ 2 - 1
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java

@@ -139,7 +139,8 @@ class ComponentResourceProvider extends AbstractResourceProvider {
       Map<String, String>     configMap   = new HashMap<String,String>();
 
       for (Map.Entry<String,Object> entry : propertyMap.entrySet()) {
-        if (PropertyHelper.getPropertyCategory(entry.getKey()).equals("config")) {
+        String propertyCategory = PropertyHelper.getPropertyCategory(entry.getKey());
+        if (propertyCategory != null && propertyCategory.equals("config")) {
           configMap.put(PropertyHelper.getPropertyName(entry.getKey()), (String) entry.getValue());
         }
       }

+ 50 - 20
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java

@@ -1,5 +1,3 @@
-package org.apache.ambari.server.controller.internal;
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,8 @@ package org.apache.ambari.server.controller.internal;
  * 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.ConfigurationRequest;
@@ -56,23 +56,37 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
   protected static final String CONFIGURATION_CONFIG_TYPE_PROPERTY_ID  = PropertyHelper.getPropertyId(null, "type");
   protected static final String CONFIGURATION_CONFIG_TAG_PROPERTY_ID   = PropertyHelper.getPropertyId(null, "tag");
 
-  private static final String CONFIG_HOST_NAME = PropertyHelper.getPropertyId("Config", "host_name");
+  private static final String CONFIG_HOST_NAME      = PropertyHelper.getPropertyId("Config", "host_name");
   private static final String CONFIG_COMPONENT_NAME = PropertyHelper.getPropertyId("Config", "component_name");
 
-
+  /**
+   * The primary key property ids for the configuration resource type.
+   */
   private static Set<String> pkPropertyIds =
       new HashSet<String>(Arrays.asList(new String[]{
           CONFIGURATION_CLUSTER_NAME_PROPERTY_ID,
           CONFIGURATION_CONFIG_TYPE_PROPERTY_ID}));
 
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Constructor
+   *
+   * @param propertyIds           the property ids supported by this provider
+   * @param keyPropertyIds        the key properties for this provider
+   * @param managementController  the associated management controller
+   */
   ConfigurationResourceProvider(Set<String> propertyIds,
                                 Map<Resource.Type, String> keyPropertyIds,
                                 AmbariManagementController managementController) {
 
     super(propertyIds, keyPropertyIds, managementController);
-
   }
 
+
+  // ----- ResourceProvider --------------------------------------------------
+
   @Override
   public RequestStatus createResources(Request request)
       throws SystemException,
@@ -83,15 +97,14 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
     for (Map<String, Object> map : request.getProperties()) {
 
       String cluster = (String) map.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID);
-      // TODO : why not CONFIGURATION_CONFIG_TYPE_PROPERTY_ID?
-      String type = (String) map.get(PropertyHelper.getPropertyId("", "type"));
-      // TODO : why not CONFIGURATION_CONFIG_TAG_PROPERTY_ID?
-      String tag = (String) map.get(PropertyHelper.getPropertyId("", "tag"));
+      String type = (String) map.get(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID);
+      String tag  = (String) map.get(CONFIGURATION_CONFIG_TAG_PROPERTY_ID);
 
       Map<String, String> configMap = new HashMap<String, String>();
 
       for (Entry<String, Object> entry : map.entrySet()) {
-        if (PropertyHelper.getPropertyCategory(entry.getKey()).equals("properties") && null != entry.getValue()) {
+        String propertyCategory = PropertyHelper.getPropertyCategory(entry.getKey());
+        if (propertyCategory != null && propertyCategory.equals("properties") && null != entry.getValue()) {
           configMap.put(PropertyHelper.getPropertyName(entry.getKey()), entry.getValue().toString());
         }
       }
@@ -145,8 +158,6 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
         
         resources.add(resource);
       }
-
-
       return resources;
       
     } else {
@@ -175,10 +186,8 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
             resource.setProperty(id, entry.getValue());
           }
         }
-
         resources.add(resource);
       }
-      
       return resources;
     }
   }
@@ -196,7 +205,8 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
    * Throws an exception, as Configurations cannot be deleted.
    */
   @Override
-  public RequestStatus deleteResources(Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+  public RequestStatus deleteResources(Predicate predicate) throws SystemException,
+      UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
     throw new UnsupportedOperationException("Cannot delete a Configuration resource.");
   }
 
@@ -214,7 +224,8 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
       // TODO : hack to allow for inconsistent property names
       // for example, the tag property can come here as Config/tag, /tag or tag
       if (!propertyId.equals("tag") && !propertyId.equals("type") &&
-          !propertyId.equals("/tag") && !propertyId.equals("/type")) {
+          !propertyId.equals("/tag") && !propertyId.equals("/type") &&
+          !propertyId.equals("properties")) {
 
         String propertyCategory = PropertyHelper.getPropertyCategory(propertyId);
 
@@ -226,15 +237,28 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
     return unsupportedProperties;
   }
 
+  // ----- AbstractResourceProvider ------------------------------------------
+
   @Override
   protected Set<String> getPKPropertyIds() {
     return pkPropertyIds;
   }
 
-  public static Map<String, String> getConfigPropertyValues(Map<String, Object> propertyMap) {
+
+  // ----- utility methods ---------------------------------------------------
+
+  /**
+   * Get the config related property ids from the given map of property ids.
+   *
+   * @param propertyIdMap  the map of property ids
+   *
+   * @return  a subset of the given map containing olny the property ids that have a
+   *          category of "config"
+   */
+  public static Map<String, String> getConfigPropertyValues(Map<String, Object> propertyIdMap) {
     Map<String, String> configMap = new HashMap<String, String>();
 
-    for (Map.Entry<String,Object> entry : propertyMap.entrySet()) {
+    for (Map.Entry<String,Object> entry : propertyIdMap.entrySet()) {
       String propertyId = entry.getKey();
       if (PropertyHelper.getPropertyCategory(propertyId).equals("config")) {
         configMap.put(PropertyHelper.getPropertyName(propertyId), (String) entry.getValue());
@@ -243,10 +267,16 @@ class ConfigurationResourceProvider extends AbstractResourceProvider {
     return configMap;
   }
 
+  /**
+   * Get a configuration request object from the given map of properties.
+   *
+   * @param properties  the map of properties
+   *
+   * @return a configuration request
+   */
   private ConfigurationRequest getRequest(Map<String, Object> properties) {
     String type = (String) properties.get(CONFIGURATION_CONFIG_TYPE_PROPERTY_ID);
-
-    String tag = (String) properties.get(CONFIGURATION_CONFIG_TAG_PROPERTY_ID);
+    String tag  = (String) properties.get(CONFIGURATION_CONFIG_TAG_PROPERTY_ID);
 
     return new ConfigurationRequest(
         (String) properties.get(CONFIGURATION_CLUSTER_NAME_PROPERTY_ID),

+ 5 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java

@@ -186,9 +186,11 @@ class HostComponentResourceProvider extends AbstractResourceProvider {
     Set<String> unsupportedProperties = new HashSet<String>();
 
     for (String propertyId : propertyIds) {
-      String propertyCategory = PropertyHelper.getPropertyCategory(propertyId);
-      if (propertyCategory == null || !propertyCategory.equals("config")) {
-        unsupportedProperties.add(propertyId);
+      if (!propertyId.equals("config")) {
+        String propertyCategory = PropertyHelper.getPropertyCategory(propertyId);
+        if (propertyCategory == null || !propertyCategory.equals("config")) {
+          unsupportedProperties.add(propertyId);
+        }
       }
     }
     return unsupportedProperties;

+ 5 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java

@@ -179,9 +179,11 @@ class ServiceResourceProvider extends AbstractResourceProvider {
     Set<String> unsupportedProperties = new HashSet<String>();
 
     for (String propertyId : propertyIds) {
-      String propertyCategory = PropertyHelper.getPropertyCategory(propertyId);
-      if (propertyCategory == null || !propertyCategory.equals("config")) {
-        unsupportedProperties.add(propertyId);
+      if (!propertyId.equals("config")) {
+        String propertyCategory = PropertyHelper.getPropertyCategory(propertyId);
+        if (propertyCategory == null || !propertyCategory.equals("config")) {
+          unsupportedProperties.add(propertyId);
+        }
       }
     }
     return unsupportedProperties;

+ 108 - 27
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java

@@ -31,7 +31,6 @@ import org.easymock.IArgumentMatcher;
 import org.junit.Assert;
 import org.junit.Test;
 
-import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
@@ -135,9 +134,9 @@ public class AbstractResourceProviderTest {
     idResponse.add(new ClusterResponse(103L, "Cluster103", null, null));
 
     // set expectations
-    expect(managementController.getClusters(anyObject(Set.class))).andReturn(allResponse).once();
-    expect(managementController.getClusters(anyObject(Set.class))).andReturn(nameResponse).once();
-    expect(managementController.getClusters(anyObject(Set.class))).andReturn(idResponse).once();
+    expect(managementController.getClusters(EasyMock.<Set<ClusterRequest>>anyObject())).andReturn(allResponse).once();
+    expect(managementController.getClusters(EasyMock.<Set<ClusterRequest>>anyObject())).andReturn(nameResponse).once();
+    expect(managementController.getClusters(EasyMock.<Set<ClusterRequest>>anyObject())).andReturn(idResponse).once();
 
     // replay
     replay(managementController);
@@ -197,7 +196,7 @@ public class AbstractResourceProviderTest {
     nameResponse.add(new ClusterResponse(102L, "Cluster102", null, null));
 
     // set expectations
-    expect(managementController.getClusters(anyObject(Set.class))).andReturn(nameResponse).once();
+    expect(managementController.getClusters(EasyMock.<Set<ClusterRequest>>anyObject())).andReturn(nameResponse).once();
     expect(managementController.updateCluster(Matchers.clusterRequest(102L, "Cluster102", "HDP-0.1", null))).andReturn(response).once();
     expect(managementController.updateCluster(Matchers.clusterRequest(103L, null, "HDP-0.1", null))).andReturn(response).once();
 
@@ -247,9 +246,6 @@ public class AbstractResourceProviderTest {
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
 
-    Set<ClusterResponse> nameResponse = new HashSet<ClusterResponse>();
-    nameResponse.add(new ClusterResponse(102L, "Cluster102", null, null));
-
     // set expectations
     managementController.deleteCluster(Matchers.clusterRequest(null, "Cluster102", null, null));
     managementController.deleteCluster(Matchers.clusterRequest(103L, null, null, null));
@@ -293,9 +289,7 @@ public class AbstractResourceProviderTest {
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
 
-//    Set<ServiceRequest> requests = new HashSet<ServiceRequest>();
-//    requests.add(Matchers.serviceRequest("Cluster100", "Service100", null, "DEPLOYED"));
-    managementController.createServices(anyObject(Set.class));
+    managementController.createServices(Matchers.serviceRequestSet("Cluster100", "Service100", null, "DEPLOYED"));
 
     // replay
     replay(managementController, response);
@@ -350,9 +344,9 @@ public class AbstractResourceProviderTest {
     stateResponse.add(new ServiceResponse(100L, "Cluster100", "Service104", null, "HDP-0.1", "DEPLOYED"));
 
     // set expectations
-    expect(managementController.getServices(anyObject(Set.class))).andReturn(allResponse).once();
-    expect(managementController.getServices(anyObject(Set.class))).andReturn(nameResponse).once();
-    expect(managementController.getServices(anyObject(Set.class))).andReturn(stateResponse).once();
+    expect(managementController.getServices(EasyMock.<Set<ServiceRequest>>anyObject())).andReturn(allResponse).once();
+    expect(managementController.getServices(EasyMock.<Set<ServiceRequest>>anyObject())).andReturn(nameResponse).once();
+    expect(managementController.getServices(EasyMock.<Set<ServiceRequest>>anyObject())).andReturn(stateResponse).once();
 
     // replay
     replay(managementController);
@@ -422,7 +416,7 @@ public class AbstractResourceProviderTest {
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
 
     // set expectations
-    expect(managementController.updateServices(anyObject(Set.class))).andReturn(response).once();
+    expect(managementController.updateServices(EasyMock.<Set<ServiceRequest>>anyObject())).andReturn(response).once();
 
     // replay
     replay(managementController, response);
@@ -527,9 +521,22 @@ public class AbstractResourceProviderTest {
       return null;
     }
 
-    public static ServiceRequest serviceRequest(String clusterName, String serviceName, Map<String, String> configVersions, String desiredState)
+    public static Set<ServiceRequest> serviceRequestSet(String clusterName, String serviceName, Map<String, String> configVersions, String desiredState)
+    {
+      EasyMock.reportMatcher(new ServiceRequestSetMatcher(clusterName, serviceName, configVersions, desiredState));
+      return null;
+    }
+
+    public static Set<ServiceComponentRequest> componentRequestSet(String clusterName, String serviceName, String componentName,
+                                                           Map<String, String> configVersions, String desiredState)
+    {
+      EasyMock.reportMatcher(new ComponentRequestSetMatcher(clusterName, serviceName, componentName, configVersions, desiredState));
+      return null;
+    }
+
+    public static ConfigurationRequest configurationRequest(String clusterName, String type, String tag, Map<String, String> configs)
     {
-      EasyMock.reportMatcher(new ServiceRequestMatcher(clusterName, serviceName, configVersions, desiredState));
+      EasyMock.reportMatcher(new ConfigurationRequestMatcher(clusterName, type, tag, configs));
       return null;
     }
   }
@@ -562,25 +569,100 @@ public class AbstractResourceProviderTest {
     }
   }
 
-  public static class ServiceRequestMatcher extends ServiceRequest implements IArgumentMatcher {
+  public static class ServiceRequestSetMatcher extends HashSet<ServiceRequest> implements IArgumentMatcher {
+
+    private final ServiceRequest serviceRequest;
 
-    public ServiceRequestMatcher(String clusterName, String serviceName, Map<String, String> configVersions, String desiredState) {
-      super(clusterName, serviceName, configVersions, desiredState);
+    public ServiceRequestSetMatcher(String clusterName, String serviceName, Map<String, String> configVersions, String desiredState) {
+      this.serviceRequest = new ServiceRequest(clusterName, serviceName, configVersions, desiredState);
+      add(this.serviceRequest);
     }
 
     @Override
     public boolean matches(Object o) {
-      return o instanceof ServiceRequest &&
-          eq(((ServiceRequest) o).getClusterName(), getClusterName()) &&
-          eq(((ServiceRequest) o).getServiceName(), getServiceName()) &&
-          eq(((ServiceRequest) o).getConfigVersions(), getConfigVersions()) &&
-          eq(((ServiceRequest) o).getDesiredState(), getDesiredState());
+      if (!(o instanceof Set)) {
+        return false;
+      }
 
+      Set set = (Set) o;
+
+      if (set.size() != 1) {
+        return false;
+      }
+
+      Object request = set.iterator().next();
+
+      return request instanceof ServiceRequest &&
+          eq(((ServiceRequest) request).getClusterName(), serviceRequest.getClusterName()) &&
+          eq(((ServiceRequest) request).getServiceName(), serviceRequest.getServiceName()) &&
+          eq(((ServiceRequest) request).getConfigVersions(), serviceRequest.getConfigVersions()) &&
+          eq(((ServiceRequest) request).getDesiredState(), serviceRequest.getDesiredState());
     }
 
     @Override
     public void appendTo(StringBuffer stringBuffer) {
-      stringBuffer.append("ClusterRequestMatcher(" + "" + ")");
+      stringBuffer.append("ServiceRequestSetMatcher(" + "" + ")");
+    }
+  }
+
+  public static class ComponentRequestSetMatcher extends HashSet<ServiceComponentRequest> implements IArgumentMatcher {
+
+    private final ServiceComponentRequest serviceComponentRequest;
+
+    public ComponentRequestSetMatcher(String clusterName, String serviceName, String componentName,
+                                   Map<String, String> configVersions, String desiredState) {
+      this.serviceComponentRequest = new ServiceComponentRequest(clusterName, serviceName, componentName, configVersions, desiredState);
+      add(this.serviceComponentRequest);
+    }
+
+    @Override
+    public boolean matches(Object o) {
+
+      if (!(o instanceof Set)) {
+        return false;
+      }
+
+      Set set = (Set) o;
+
+      if (set.size() != 1) {
+        return false;
+      }
+
+      Object request = set.iterator().next();
+
+      return request instanceof ServiceComponentRequest &&
+          eq(((ServiceComponentRequest) request).getClusterName(), serviceComponentRequest.getClusterName()) &&
+          eq(((ServiceComponentRequest) request).getServiceName(), serviceComponentRequest.getServiceName()) &&
+          eq(((ServiceComponentRequest) request).getComponentName(), serviceComponentRequest.getComponentName()) &&
+          eq(((ServiceComponentRequest) request).getConfigVersions(), serviceComponentRequest.getConfigVersions()) &&
+          eq(((ServiceComponentRequest) request).getDesiredState(), serviceComponentRequest.getDesiredState());
+    }
+
+    @Override
+    public void appendTo(StringBuffer stringBuffer) {
+      stringBuffer.append("ComponentRequestMatcher(" + "" + ")");
+    }
+  }
+
+  public static class ConfigurationRequestMatcher extends ConfigurationRequest implements IArgumentMatcher {
+
+    public ConfigurationRequestMatcher(String clusterName, String type, String tag, Map<String, String> configs) {
+      super(clusterName, type, tag, configs);
+    }
+
+    @Override
+    public boolean matches(Object o) {
+      return o instanceof ConfigurationRequest &&
+          eq(((ConfigurationRequest) o).getClusterName(), getClusterName()) &&
+          eq(((ConfigurationRequest) o).getType(), getType()) &&
+          eq(((ConfigurationRequest) o).getVersionTag(), getVersionTag()) &&
+          eq(((ConfigurationRequest) o).getConfigs(), getConfigs());
+
+    }
+
+    @Override
+    public void appendTo(StringBuffer stringBuffer) {
+      stringBuffer.append("ConfigurationRequestMatcher(" + "" + ")");
     }
   }
 
@@ -597,5 +679,4 @@ public class AbstractResourceProviderTest {
       return lastEvent;
     }
   }
-
 }

+ 87 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ComponentResourceProviderTest.java

@@ -0,0 +1,87 @@
+/**
+ * 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.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.RequestStatusResponse;
+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.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+/**
+ * Tests for the component resource provider.
+ */
+public class ComponentResourceProviderTest {
+  @Test
+  public void testUpdateResources() throws Exception {
+    Resource.Type type = Resource.Type.Component;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+
+    Set<ServiceComponentResponse> nameResponse = new HashSet<ServiceComponentResponse>();
+    nameResponse.add(new ServiceComponentResponse(102L, "Cluster102", "Service", "Component", null, "1", "STARTED"));
+
+    // set expectations
+    expect(managementController.getComponents(EasyMock.<Set<ServiceComponentRequest>>anyObject())).andReturn(nameResponse).once();
+    expect(managementController.updateComponents(
+        AbstractResourceProviderTest.Matchers.componentRequestSet("Cluster102", "Service", "Component", null, "STARTED"))).andReturn(response).once();
+
+    // replay
+    replay(managementController, response);
+
+    ResourceProvider provider = AbstractResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    Map<String, Object> properties = new LinkedHashMap<String, Object>();
+
+    properties.put(ComponentResourceProvider.COMPONENT_STATE_PROPERTY_ID, "STARTED");
+
+    // create the request
+    Request request = PropertyHelper.getUpdateRequest(properties);
+
+    // update the cluster named Cluster102
+    Predicate predicate = new PredicateBuilder().property(ClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals("Cluster102").toPredicate();
+    provider.updateResources(request, predicate);
+
+    // verify
+    verify(managementController, response);
+  }
+}

+ 78 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java

@@ -0,0 +1,78 @@
+/**
+ * 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.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.RequestStatusResponse;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+/**
+ * Tests for the configuration resource provider.
+ */
+public class ConfigurationResourceProviderTest {
+  @Test
+  public void testCreateResources() throws Exception {
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+
+    managementController.createConfiguration(AbstractResourceProviderTest.Matchers.configurationRequest(
+        "Cluster100", "type", "tag", new HashMap<String, String>()));
+
+    // replay
+    replay(managementController, response);
+
+    ConfigurationResourceProvider provider = new ConfigurationResourceProvider(
+        PropertyHelper.getPropertyIds(Resource.Type.Configuration ),
+        PropertyHelper.getKeyPropertyIds(Resource.Type.Configuration),
+        managementController);
+
+    Set<Map<String, Object>> propertySet = new LinkedHashSet<Map<String, Object>>();
+
+    Map<String, Object> properties = new LinkedHashMap<String, Object>();
+
+    properties.put(ConfigurationResourceProvider.CONFIGURATION_CLUSTER_NAME_PROPERTY_ID, "Cluster100");
+    properties.put(ConfigurationResourceProvider.CONFIGURATION_CONFIG_TAG_PROPERTY_ID, "tag");
+    properties.put(ConfigurationResourceProvider.CONFIGURATION_CONFIG_TYPE_PROPERTY_ID, "type");
+
+    propertySet.add(properties);
+
+    // create the request
+    Request request = PropertyHelper.getCreateRequest(propertySet);
+
+    provider.createResources(request);
+
+    // verify
+    verify(managementController, response);
+  }
+}