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 2013/10/18 02:25:50 UTC

[28/30] AMBARI-3266. Contribute Ambari-SCOM. (Tom Beerbower via mahadev)

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/resources/META-INF/spring-security.xml
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/resources/META-INF/spring-security.xml b/contrib/ambari-scom/ambari-scom-server/src/main/resources/META-INF/spring-security.xml
new file mode 100644
index 0000000..3354801
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/resources/META-INF/spring-security.xml
@@ -0,0 +1,46 @@
+<!--
+   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.
+-->
+<beans:beans xmlns="http://www.springframework.org/schema/security"
+             xmlns:beans="http://www.springframework.org/schema/beans"
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+             xsi:schemaLocation="http://www.springframework.org/schema/beans
+                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                    http://www.springframework.org/schema/security
+                    http://www.springframework.org/schema/security/spring-security-3.1.xsd">
+
+    <http use-expressions="true"
+          disable-url-rewriting="true" entry-point-ref="ambariEntryPoint">
+        <http-basic entry-point-ref="ambariEntryPoint"/>
+        <intercept-url pattern="/**" access="isAuthenticated()" method="GET"/>
+        <intercept-url pattern="/**" access="hasRole('ADMIN')"/>
+    </http>
+
+    <!--<ldap-server id="ldapServer" root="dc=ambari,dc=apache,dc=org"/>-->
+
+    <authentication-manager>
+
+        <authentication-provider user-service-ref="ambariLocalUserService">
+            <password-encoder ref="passwordEncoder"/>
+        </authentication-provider>
+
+        <authentication-provider ref="ambariLdapAuthenticationProvider"/>
+
+    </authentication-manager>
+
+    <beans:bean id="ambariEntryPoint" class="org.apache.ambari.server.security.AmbariEntryPoint">
+    </beans:bean>
+</beans:beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/resources/log4j.properties b/contrib/ambari-scom/ambari-scom-server/src/main/resources/log4j.properties
new file mode 100644
index 0000000..e47ebdc
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/resources/log4j.properties
@@ -0,0 +1,37 @@
+# Copyright 2011 The Apache Software Foundation
+# 
+# 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.
+
+# Define some default values that can be overridden by system properties
+# Root logger option
+log4j.rootLogger=INFO,file
+
+# Direct log messages to a log file
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=/var/log/ambari-server/ambari-server.log
+log4j.appender.file.MaxFileSize=10MB
+log4j.appender.file.MaxBackupIndex=20
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] %c{1}:%L - %m%n
+
+# Log config changes
+log4j.logger.configchange=INFO,configchange
+log4j.additivity.configchange=false
+log4j.appender.configchange=org.apache.log4j.FileAppender
+log4j.appender.configchange.File=/var/log/ambari-server/ambari-config-changes.log
+log4j.appender.configchange.layout=org.apache.log4j.PatternLayout
+log4j.appender.configchange.layout.ConversionPattern=%d{ISO8601} %5p - %m%n

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterDefinitionTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterDefinitionTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterDefinitionTest.java
new file mode 100644
index 0000000..848c90f
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterDefinitionTest.java
@@ -0,0 +1,118 @@
+/**
+ * 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.msi;
+
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Set;
+
+/**
+ */
+public class ClusterDefinitionTest {
+  @Test
+  public void testGetServices() throws Exception {
+
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    Set<String> services = clusterDefinition.getServices();
+
+    Assert.assertTrue(services.contains("HDFS"));
+    Assert.assertTrue(services.contains("FLUME"));
+    Assert.assertTrue(services.contains("OOZIE"));
+    Assert.assertTrue(services.contains("MAPREDUCE"));
+    Assert.assertTrue(services.contains("HBASE"));
+    Assert.assertTrue(services.contains("ZOOKEEPER"));
+    Assert.assertTrue(services.contains("HIVE"));
+    Assert.assertTrue(services.contains("WEBHCAT"));
+  }
+
+  @Test
+  public void testGetHosts() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    Set<String> hosts = clusterDefinition.getHosts();
+
+    Assert.assertTrue(hosts.contains("NAMENODE_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("SECONDARY_NAMENODE_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("FLUME_SERVICE1.acme.com"));
+    Assert.assertTrue(hosts.contains("FLUME_SERVICE2.acme.com"));
+    Assert.assertTrue(hosts.contains("FLUME_SERVICE3.acme.com"));
+    Assert.assertTrue(hosts.contains("HBASE_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("HIVE_SERVER_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("JOBTRACKER_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("OOZIE_SERVER_MASTER.acme.com"));
+    Assert.assertTrue(hosts.contains("slave1.acme.com"));
+    Assert.assertTrue(hosts.contains("slave2.acme.com"));
+    Assert.assertTrue(hosts.contains("slave3.acme.com"));
+    Assert.assertTrue(hosts.contains("WEBHCAT_MASTER.acme.com"));
+  }
+
+  @Test
+  public void testGetComponents() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    Set<String> components = clusterDefinition.getComponents("HDFS");
+    Assert.assertTrue(components.contains("NAMENODE"));
+    Assert.assertTrue(components.contains("SECONDARY_NAMENODE"));
+    Assert.assertTrue(components.contains("DATANODE"));
+
+    components = clusterDefinition.getComponents("MAPREDUCE");
+    Assert.assertTrue(components.contains("JOBTRACKER"));
+    Assert.assertTrue(components.contains("TASKTRACKER"));
+
+    components = clusterDefinition.getComponents("FLUME");
+    Assert.assertTrue(components.contains("FLUME_SERVER"));
+
+    components = clusterDefinition.getComponents("OOZIE");
+    Assert.assertTrue(components.contains("OOZIE_SERVER"));
+
+    components = clusterDefinition.getComponents("WEBHCAT");
+    Assert.assertTrue(components.contains("WEBHCAT_SERVER"));
+
+    components = clusterDefinition.getComponents("HBASE");
+    Assert.assertTrue(components.contains("HBASE_MASTER"));
+    Assert.assertTrue(components.contains("HBASE_REGIONSERVER"));
+
+    components = clusterDefinition.getComponents("ZOOKEEPER");
+    Assert.assertTrue(components.contains("ZOOKEEPER_SERVER"));
+
+    components = clusterDefinition.getComponents("HIVE");
+    Assert.assertTrue(components.contains("HIVE_SERVER"));
+  }
+
+  @Test
+  public void testGetHostComponents() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    Set<String> hostComponents = clusterDefinition.getHostComponents("HDFS", "NAMENODE_MASTER.acme.com");
+
+    Assert.assertTrue(hostComponents.contains("NAMENODE"));
+
+    hostComponents = clusterDefinition.getHostComponents("HDFS", "slave1.acme.com");
+
+    Assert.assertTrue(hostComponents.contains("DATANODE"));
+
+    hostComponents = clusterDefinition.getHostComponents("HDFS", "slave2.acme.com");
+
+    Assert.assertTrue(hostComponents.contains("DATANODE"));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterProviderTest.java
new file mode 100644
index 0000000..a7dc528
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ClusterProviderTest.java
@@ -0,0 +1,99 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * Tests for ClusterProvider
+ */
+public class ClusterProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    ClusterProvider provider = new ClusterProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(1, resources.size());
+    Assert.assertEquals("myCluster", resources.iterator().next().getPropertyValue(ClusterProvider.CLUSTER_NAME_PROPERTY_ID));
+  }
+
+  @Test
+  public void testGetResourcesWithPredicate() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+
+    ClusterProvider provider = new ClusterProvider(clusterDefinition);
+
+    Predicate predicate = new PredicateBuilder().property(ClusterProvider.CLUSTER_NAME_PROPERTY_ID).equals("myCluster").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+    Resource next = resources.iterator().next();
+    Assert.assertEquals("myCluster",    next.getPropertyValue(ClusterProvider.CLUSTER_NAME_PROPERTY_ID));
+    Assert.assertEquals("HDP-1.2.9", next.getPropertyValue(ClusterProvider.CLUSTER_VERSION_PROPERTY_ID));
+
+    predicate = new PredicateBuilder().property(ClusterProvider.CLUSTER_NAME_PROPERTY_ID).equals("non-existent Cluster").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertTrue(resources.isEmpty());
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ClusterProvider provider = new ClusterProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ClusterProvider provider = new ClusterProvider(clusterDefinition);
+
+    provider.updateResources(PropertyHelper.getUpdateRequest(new HashMap<String, Object>(), null), null);
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ClusterProvider provider = new ClusterProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ComponentProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ComponentProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ComponentProviderTest.java
new file mode 100644
index 0000000..0f16912
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ComponentProviderTest.java
@@ -0,0 +1,124 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+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.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * Tests for ComponentProvider.
+ */
+public class ComponentProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ComponentProvider provider = new ComponentProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(16, resources.size());
+  }
+
+  @Test
+  public void testGetResourcesWithPredicate() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ComponentProvider provider = new ComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ComponentProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("TASKTRACKER").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    predicate = new PredicateBuilder().property(ComponentProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("TASKTRACKER").or().
+        property(ComponentProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("DATANODE").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(2, resources.size());
+
+    predicate = new PredicateBuilder().property(ComponentProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("BadComponent").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertTrue(resources.isEmpty());
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ComponentProvider provider = new ComponentProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ComponentProvider provider = new ComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ComponentProvider.COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("TASKTRACKER").toPredicate();
+
+    HashMap<String, Object> properties = new HashMap<String, Object>();
+
+    properties.put(ComponentProvider.COMPONENT_STATE_PROPERTY_ID, "STARTED");
+
+    Request updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+
+    properties.put(ComponentProvider.COMPONENT_STATE_PROPERTY_ID, "INSTALLED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Stopped, stateProvider.getState());
+
+    properties.put(ComponentProvider.COMPONENT_STATE_PROPERTY_ID, "STARTED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ComponentProvider provider = new ComponentProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostComponentProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostComponentProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostComponentProviderTest.java
new file mode 100644
index 0000000..582c5bd
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostComponentProviderTest.java
@@ -0,0 +1,165 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+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.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ *
+ */
+public class HostComponentProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(26, resources.size());
+  }
+
+  @Test
+  public void testGetResourcesWithPredicate() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostComponentProvider.HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID).equals("MAPREDUCE").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(5, resources.size());
+
+    predicate = new PredicateBuilder().property(HostComponentProvider.HOST_COMPONENT_HOST_NAME_PROPERTY_ID).equals("UnknownHost").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertTrue(resources.isEmpty());
+  }
+
+  @Test
+  public void testGetResourcesCheckState() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostComponentProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("HBASE_REGIONSERVER").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(3, resources.size());
+
+    for (Resource resource : resources) {
+      Assert.assertEquals("STARTED", resource.getPropertyValue(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID));
+    }
+
+    stateProvider.setHealthy(false);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(3, resources.size());
+
+    for (Resource resource : resources) {
+      Assert.assertEquals("INSTALLED", resource.getPropertyValue(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID));
+    }
+  }
+
+  @Test
+  public void testGetResourcesCheckStateFromCategory() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostComponentProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("HBASE_REGIONSERVER").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest("HostRoles"), predicate);
+    Assert.assertEquals(3, resources.size());
+
+    for (Resource resource : resources) {
+      Assert.assertEquals("STARTED", resource.getPropertyValue(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID));
+    }
+
+    stateProvider.setHealthy(false);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(3, resources.size());
+
+    for (Resource resource : resources) {
+      Assert.assertEquals("INSTALLED", resource.getPropertyValue(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID));
+    }
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostComponentProvider.HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID).equals("HBASE_REGIONSERVER").toPredicate();
+
+    HashMap<String, Object> properties = new HashMap<String, Object>();
+
+    properties.put(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID, "STARTED");
+
+    Request updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+
+    properties.put(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID, "INSTALLED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Stopped, stateProvider.getState());
+
+    properties.put(HostComponentProvider.HOST_COMPONENT_STATE_PROPERTY_ID, "STARTED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostComponentProvider provider = new HostComponentProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostProviderTest.java
new file mode 100644
index 0000000..4fc29ac
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/HostProviderTest.java
@@ -0,0 +1,157 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ *
+ */
+public class HostProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(13, resources.size());
+  }
+
+  @Test
+  public void testGetResourcesWithPredicate() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("NAMENODE_MASTER.acme.com").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("HBASE_MASTER.acme.com").or().
+        property(HostProvider.HOST_NAME_PROPERTY_ID).equals("slave3.acme.com").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(2, resources.size());
+
+    predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("unknownHost").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertTrue(resources.isEmpty());
+  }
+
+  @Test
+  public void testGetResourcesHostIP() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("NAMENODE_MASTER.acme.com").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    String ip = (String) resource.getPropertyValue(HostProvider.HOST_IP_PROPERTY_ID);
+
+    Assert.assertEquals("127.0.0.1", ip);
+  }
+
+  @Test
+  public void testGetResourcesCheckState() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("slave3.acme.com").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals("HEALTHY", resource.getPropertyValue(HostProvider.HOST_STATE_PROPERTY_ID));
+
+    stateProvider.setState(StateProvider.State.Unknown);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    resource = resources.iterator().next();
+    Assert.assertEquals("UNHEALTHY", resource.getPropertyValue(HostProvider.HOST_STATE_PROPERTY_ID));
+  }
+
+  @Test
+  public void testGetResourcesCheckStateFromCategory() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(HostProvider.HOST_NAME_PROPERTY_ID).equals("slave3.acme.com").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest("Hosts"), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals("HEALTHY", resource.getPropertyValue(HostProvider.HOST_STATE_PROPERTY_ID));
+
+    stateProvider.setState(StateProvider.State.Unknown);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    resource = resources.iterator().next();
+    Assert.assertEquals("UNHEALTHY", resource.getPropertyValue(HostProvider.HOST_STATE_PROPERTY_ID));
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+
+    provider.updateResources(PropertyHelper.getUpdateRequest(new HashMap<String, Object>(), null), null);
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    HostProvider provider = new HostProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/NoOpProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/NoOpProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/NoOpProviderTest.java
new file mode 100644
index 0000000..dabf2b7
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/NoOpProviderTest.java
@@ -0,0 +1,47 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Test;
+
+import java.util.Collections;
+
+/**
+ * NoOpProvider tests.
+ */
+public class NoOpProviderTest {
+
+  @Test
+  public void testGetKeyPropertyIds() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    NoOpProvider provider = new NoOpProvider(Resource.Type.Workflow, clusterDefinition);
+    Assert.assertNotNull(provider.getKeyPropertyIds());
+  }
+
+  @Test
+  public void testCheckPropertyIds() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    NoOpProvider provider = new NoOpProvider(Resource.Type.Workflow, clusterDefinition);
+    Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("id")).isEmpty());
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/RequestProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/RequestProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/RequestProviderTest.java
new file mode 100644
index 0000000..8ef3d9d
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/RequestProviderTest.java
@@ -0,0 +1,80 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+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.Set;
+
+/**
+ * Tests for RequestProvider
+ */
+public class RequestProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    clusterDefinition.getRequestResources().add(new ResourceImpl(Resource.Type.Request));
+
+    RequestProvider provider = new RequestProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(1, resources.size());
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    RequestProvider provider = new RequestProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    RequestProvider provider = new RequestProvider(clusterDefinition);
+
+    provider.updateResources(PropertyHelper.getUpdateRequest(new HashMap<String, Object>(), null), null);
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    RequestProvider provider = new RequestProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ServiceProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ServiceProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ServiceProviderTest.java
new file mode 100644
index 0000000..285859f
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/ServiceProviderTest.java
@@ -0,0 +1,168 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+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.utilities.PredicateBuilder;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ *
+ */
+public class ServiceProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(8, resources.size());
+  }
+
+  @Test
+  public void testGetResourcesWithPredicate() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("MAPREDUCE").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("HDFS").or().
+        property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("FLUME").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(2, resources.size());
+
+    predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("NO SERVICE").toPredicate();
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertTrue(resources.isEmpty());
+  }
+
+  @Test
+  public void testGetResourcesCheckState() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("MAPREDUCE").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals("STARTED", resource.getPropertyValue(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID));
+
+    stateProvider.setHealthy(false);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    resource = resources.iterator().next();
+    Assert.assertEquals("INSTALLED", resource.getPropertyValue(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID));
+  }
+
+  @Test
+  public void testGetResourcesCheckStateFromCategory() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("MAPREDUCE").toPredicate();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest("ServiceInfo"), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals("STARTED", resource.getPropertyValue(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID));
+
+    stateProvider.setHealthy(false);
+
+    resources = provider.getResources(PropertyHelper.getReadRequest(), predicate);
+    Assert.assertEquals(1, resources.size());
+
+    resource = resources.iterator().next();
+    Assert.assertEquals("INSTALLED", resource.getPropertyValue(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID));
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    TestStateProvider stateProvider = new TestStateProvider();
+    ClusterDefinition clusterDefinition = new ClusterDefinition(stateProvider, new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+    Predicate predicate = new PredicateBuilder().property(ServiceProvider.SERVICE_SERVICE_NAME_PROPERTY_ID).equals("MAPREDUCE").toPredicate();
+
+    HashMap<String, Object> properties = new HashMap<String, Object>();
+
+    properties.put(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "STARTED");
+
+    Request updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+
+    properties.put(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "INSTALLED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Stopped, stateProvider.getState());
+
+    properties.put(ServiceProvider.SERVICE_SERVICE_STATE_PROPERTY_ID, "STARTED");
+
+    updateRequest = PropertyHelper.getUpdateRequest(properties, null);
+
+    provider.updateResources(updateRequest, predicate);
+
+    Assert.assertEquals(StateProvider.State.Running, stateProvider.getState());
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    ServiceProvider provider = new ServiceProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TaskProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TaskProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TaskProviderTest.java
new file mode 100644
index 0000000..2fcfec6
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TaskProviderTest.java
@@ -0,0 +1,80 @@
+/**
+ * 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.msi;
+
+import junit.framework.Assert;
+import org.apache.ambari.scom.TestClusterDefinitionProvider;
+import org.apache.ambari.scom.TestHostInfoProvider;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+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.Set;
+
+/**
+ * Tests for TaskProvider
+ */
+public class TaskProviderTest {
+
+  @Test
+  public void testGetResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    clusterDefinition.getTaskResources().add(new ResourceImpl(Resource.Type.Task));
+
+    TaskProvider provider = new TaskProvider(clusterDefinition);
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    Assert.assertEquals(1, resources.size());
+  }
+
+  @Test
+  public void testCreateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    TaskProvider provider = new TaskProvider(clusterDefinition);
+
+    try {
+      provider.createResources(PropertyHelper.getReadRequest());
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    TaskProvider provider = new TaskProvider(clusterDefinition);
+
+    provider.updateResources(PropertyHelper.getUpdateRequest(new HashMap<String, Object>(), null), null);
+  }
+
+  @Test
+  public void testDeleteResources() throws Exception {
+    ClusterDefinition clusterDefinition = new ClusterDefinition(new TestStateProvider(), new TestClusterDefinitionProvider(), new TestHostInfoProvider());
+    TaskProvider provider = new TaskProvider(clusterDefinition);
+
+    try {
+      provider.deleteResources(null);
+      Assert.fail("Expected UnsupportedOperationException.");
+    } catch (UnsupportedOperationException e) {
+      //expected
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TestStateProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TestStateProvider.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TestStateProvider.java
new file mode 100644
index 0000000..ad78478
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/msi/TestStateProvider.java
@@ -0,0 +1,73 @@
+/**
+ * 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.msi;
+
+/**
+ * Test state provider.
+ */
+public class TestStateProvider implements StateProvider {
+
+  private State state = State.Running;
+
+  public void setHealthy(boolean healthy) {
+    state = healthy ? State.Running : State.Stopped;
+  }
+
+  public void setState(State state) {
+    this.state = state;
+  }
+
+  public State getState() {
+    return state;
+  }
+
+  @Override
+  public State getRunningState(String hostName, String componentName) {
+    return state;
+  }
+
+  @Override
+  public Process setRunningState(String hostName, String componentName, State state) {
+    this.state = state;
+    return new TestProcess();
+  }
+
+  private class TestProcess implements Process {
+
+    @Override
+    public boolean isRunning() {
+      return false;
+    }
+
+    @Override
+    public int getExitCode() {
+      return 0;
+    }
+
+    @Override
+    public String getOutput() {
+      return "output";
+    }
+
+    @Override
+    public String getError() {
+      return "error";
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/ClusterDefinitionProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/ClusterDefinitionProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/ClusterDefinitionProviderTest.java
new file mode 100644
index 0000000..c59d08b
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/ClusterDefinitionProviderTest.java
@@ -0,0 +1,83 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.configuration.Configuration;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * ClusterDefinitionProvider tests.
+ */
+public class ClusterDefinitionProviderTest {
+
+  public static ClusterDefinitionProvider getProvider(String filename, String clusterName, String versionId) {
+    Properties ambariProperties = new Properties();
+    ambariProperties.setProperty(ClusterDefinitionProvider.SCOM_CLUSTER_DEFINITION_FILENAME, filename);
+    ambariProperties.setProperty(ClusterDefinitionProvider.SCOM_CLUSTER_NAME, clusterName);
+    ambariProperties.setProperty(ClusterDefinitionProvider.SCOM_VERSION_ID, versionId);
+
+    Configuration configuration =  new TestConfiguration(ambariProperties);
+
+    ClusterDefinitionProvider streamProvider = new ClusterDefinitionProvider();
+
+    streamProvider.init(configuration);
+
+    return streamProvider;
+  }
+
+  @Test
+  public void testGetFileName() throws Exception {
+    ClusterDefinitionProvider provider = getProvider("myFile", "myCluster", "myVersion");
+    Assert.assertEquals("myFile", provider.getFileName());
+  }
+
+  @Test
+  public void testGetClusterName() throws Exception {
+    ClusterDefinitionProvider provider = getProvider("myFile", "myCluster", "myVersion");
+    Assert.assertEquals("myCluster", provider.getClusterName());
+  }
+
+  @Test
+  public void testGetVersionId() throws Exception {
+    ClusterDefinitionProvider provider = getProvider("myFile", "myCluster", "myVersion");
+    Assert.assertEquals("myVersion", provider.getVersionId());
+  }
+
+  @Test
+  public void testGetInputStream() throws Exception {
+    ClusterDefinitionProvider provider = getProvider("clusterproperties.txt", "myCluster", "myVersion");
+    InputStream inputStream = provider.getInputStream();
+    Assert.assertNotNull(inputStream);
+  }
+
+  private static class TestConfiguration extends Configuration {
+
+    private TestConfiguration(Properties properties) {
+      super(properties);
+    }
+
+    @Override
+    protected void loadSSLParams() {
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLPropertyProviderTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLPropertyProviderTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLPropertyProviderTest.java
new file mode 100644
index 0000000..7b18957
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLPropertyProviderTest.java
@@ -0,0 +1,442 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.controller.internal.ResourceImpl;
+import org.apache.ambari.server.controller.internal.TemporalInfoImpl;
+import org.apache.ambari.server.controller.jdbc.ConnectionFactory;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.TemporalInfo;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+/**
+ * SQLPropertyProvider Tests
+ */
+public class SQLPropertyProviderTest {
+
+  private static final String PROPERTY_ID_1 = "metrics/rpc/RpcQueueTime_avg_time";
+  private static final String PROPERTY_ID_2 = "metrics/rpc/RpcSlowResponse_num_ops";
+  private static final String CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "cluster_name");
+  private static final String HOST_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "host_name");
+  private static final String COMPONENT_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("HostRoles", "component_name");
+
+  @Test
+  public void testPopulateResources() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        new TestHostInfoProvider(),
+        CLUSTER_NAME_PROPERTY_ID,
+        HOST_NAME_PROPERTY_ID,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "domU-12-31-39-0E-34-E1.compute-1.internal");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // only ask for one property
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID_1, new TemporalInfoImpl(10L, 20L, 1L));
+    Request request = PropertyHelper.getReadRequest(Collections.singleton(PROPERTY_ID_1), temporalInfoMap);
+
+    Assert.assertEquals(1, provider.populateResources(Collections.singleton(resource), request, null).size());
+
+    Assert.assertTrue(resource.getPropertyValue(PROPERTY_ID_1) instanceof Number[][]);
+
+    Number[][] datapoints = (Number[][]) resource.getPropertyValue(PROPERTY_ID_1);
+
+    for (int i = 0; i < datapoints.length; ++i) {
+      Assert.assertEquals((long) i, datapoints[i][0]);
+      Assert.assertEquals(999990L + i, datapoints[i][1]);
+    }
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+
+  @Test
+  public void testPopulateResources_temporalStartTimeOnly() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    TestHostInfoProvider hostProvider = new TestHostInfoProvider();
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        hostProvider,
+        CLUSTER_NAME_PROPERTY_ID,
+        HOST_NAME_PROPERTY_ID,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "domU-12-31-39-0E-34-E1.compute-1.internal");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // only ask for one property
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID_1, new TemporalInfoImpl(10L, -1L, -1L));
+    Request request = PropertyHelper.getReadRequest(Collections.singleton(PROPERTY_ID_1), temporalInfoMap);
+
+    Assert.assertEquals(1, provider.populateResources(Collections.singleton(resource), request, null).size());
+
+    Assert.assertTrue(resource.getPropertyValue(PROPERTY_ID_1) instanceof Number[][]);
+
+    Number[][] datapoints = (Number[][]) resource.getPropertyValue(PROPERTY_ID_1);
+
+    for (int i = 0; i < datapoints.length; ++i) {
+      Assert.assertEquals((long) i, datapoints[i][0]);
+      Assert.assertEquals(999990L + i, datapoints[i][1]);
+    }
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+
+  @Test
+  public void testPopulateResources_hostNameProperty() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    TestHostInfoProvider hostProvider = new TestHostInfoProvider();
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        hostProvider,
+        CLUSTER_NAME_PROPERTY_ID,
+        HOST_NAME_PROPERTY_ID,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "domU-12-31-39-0E-34-E1.compute-1.internal");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // only ask for one property
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID_1, new TemporalInfoImpl(10L, -1L, -1L));
+    Request request = PropertyHelper.getReadRequest(Collections.singleton(PROPERTY_ID_1), temporalInfoMap);
+
+    provider.populateResources(Collections.singleton(resource), request, null);
+
+    Assert.assertEquals("domU-12-31-39-0E-34-E1.compute-1.internal", hostProvider.getHostId());
+    Assert.assertNull(hostProvider.getClusterName());
+    Assert.assertNull(hostProvider.getComponentName());
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+
+  @Test
+  public void testPopulateResources_noHostNameProperty() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    TestHostInfoProvider hostProvider = new TestHostInfoProvider();
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        hostProvider,
+        CLUSTER_NAME_PROPERTY_ID,
+        null,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // only ask for one property
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID_1, new TemporalInfoImpl(10L, -1L, -1L));
+    Request request = PropertyHelper.getReadRequest(Collections.singleton(PROPERTY_ID_1), temporalInfoMap);
+
+    provider.populateResources(Collections.singleton(resource), request, null);
+
+    Assert.assertNull(hostProvider.getHostId());
+    Assert.assertEquals("c1", hostProvider.getClusterName());
+    Assert.assertEquals("DATANODE", hostProvider.getComponentName());
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+
+  @Test
+  public void testPopulateResources_pointInTime() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        new TestHostInfoProvider(),
+        CLUSTER_NAME_PROPERTY_ID,
+        HOST_NAME_PROPERTY_ID,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "domU-12-31-39-0E-34-E1.compute-1.internal");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // only ask for one property
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    Request request = PropertyHelper.getReadRequest(Collections.singleton(PROPERTY_ID_2), temporalInfoMap);
+
+    Assert.assertEquals(1, provider.populateResources(Collections.singleton(resource), request, null).size());
+
+    // should be the last value of the time series...
+    Assert.assertEquals( 3L, resource.getPropertyValue(PROPERTY_ID_2));
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+
+
+  @Test
+  public void testPopulateResources_multi() throws Exception {
+
+    ConnectionFactory connectionFactory = createNiceMock(ConnectionFactory.class);
+    Connection connection = createNiceMock(Connection.class);
+    PreparedStatement statement = createNiceMock(PreparedStatement.class);
+    ResultSet resultSet = createNiceMock(ResultSet.class);
+
+    // set expectations
+    expect(connectionFactory.getConnection()).andReturn(connection).once();
+    expect(connection.prepareStatement((String) anyObject())).andReturn(statement).once();
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999990L);
+    expect(resultSet.getNString("MetricValue")).andReturn("0");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999991L);
+    expect(resultSet.getNString("MetricValue")).andReturn("1");
+    expect(resultSet.next()).andReturn(false);
+
+    expect(statement.executeQuery()).andReturn(resultSet).once();
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999992L);
+    expect(resultSet.getNString("MetricValue")).andReturn("2");
+    expect(resultSet.next()).andReturn(true);
+    expect(resultSet.getLong("RecordTimeStamp")).andReturn(999993L);
+    expect(resultSet.getNString("MetricValue")).andReturn("3");
+    expect(resultSet.next()).andReturn(false);
+
+    // replay
+    replay(connectionFactory, connection, statement, resultSet);
+
+    SQLPropertyProvider provider = new SQLPropertyProvider(
+        PropertyHelper.getGangliaPropertyIds(Resource.Type.HostComponent, PropertyHelper.MetricsVersion.HDP1),
+        new TestHostInfoProvider(),
+        CLUSTER_NAME_PROPERTY_ID,
+        HOST_NAME_PROPERTY_ID,
+        COMPONENT_NAME_PROPERTY_ID,
+        connectionFactory);
+
+    // namenode
+    Resource resource = new ResourceImpl(Resource.Type.HostComponent);
+
+    resource.setProperty(CLUSTER_NAME_PROPERTY_ID, "c1");
+    resource.setProperty(HOST_NAME_PROPERTY_ID, "domU-12-31-39-0E-34-E1.compute-1.internal");
+    resource.setProperty(COMPONENT_NAME_PROPERTY_ID, "DATANODE");
+
+    // ask for two properties ... on temporal, one point in time
+    Map<String, TemporalInfo> temporalInfoMap = new HashMap<String, TemporalInfo>();
+    temporalInfoMap.put(PROPERTY_ID_1, new TemporalInfoImpl(10L, 20L, 1L));
+
+    Set<String> propertyIds = new LinkedHashSet<String>();
+    propertyIds.add(PROPERTY_ID_1);
+    propertyIds.add(PROPERTY_ID_2);
+
+    Request request = PropertyHelper.getReadRequest(propertyIds, temporalInfoMap);
+
+    Assert.assertEquals(1, provider.populateResources(Collections.singleton(resource), request, null).size());
+
+    // check the temporal value
+    Assert.assertTrue(resource.getPropertyValue(PROPERTY_ID_1) instanceof Number[][]);
+
+    Number[][] datapoints = (Number[][]) resource.getPropertyValue(PROPERTY_ID_1);
+
+    for (int i = 0; i < datapoints.length; ++i) {
+      Assert.assertEquals((long) i, datapoints[i][0]);
+      Assert.assertEquals(999990L + i, datapoints[i][1]);
+    }
+
+    // check the point in time value ... should be the last value of the time series...
+    Assert.assertEquals( 3L, resource.getPropertyValue(PROPERTY_ID_2));
+
+    // verify
+    verify(connectionFactory, connection, statement, resultSet);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/873b3502/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLProviderModuleTest.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLProviderModuleTest.java b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLProviderModuleTest.java
new file mode 100644
index 0000000..bc4cc7d
--- /dev/null
+++ b/contrib/ambari-scom/ambari-scom-server/src/test/java/org/apache/ambari/scom/SQLProviderModuleTest.java
@@ -0,0 +1,51 @@
+/**
+ * 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.scom;
+
+import org.apache.ambari.server.controller.jmx.JMXPropertyProvider;
+import org.apache.ambari.server.controller.spi.PropertyProvider;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * SQLProviderModule Tests
+ */
+public class SQLProviderModuleTest {
+  @Test
+  public void testCreatePropertyProviders() {
+    SQLProviderModule providerModule = new SQLProviderModule();
+
+    providerModule.createPropertyProviders(Resource.Type.Component);
+
+    List<PropertyProvider> providers = providerModule.getPropertyProviders(Resource.Type.Component);
+
+    Assert.assertTrue(providers.get(0) instanceof JMXPropertyProvider);
+    Assert.assertTrue(providers.get(1) instanceof SQLPropertyProvider);
+
+    providerModule.createPropertyProviders(Resource.Type.HostComponent);
+
+    providers = providerModule.getPropertyProviders(Resource.Type.HostComponent);
+
+    Assert.assertTrue(providers.get(0) instanceof JMXPropertyProvider);
+    Assert.assertTrue(providers.get(1) instanceof SQLPropertyProvider);
+  }
+}