You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sm...@apache.org on 2015/12/15 07:02:28 UTC

[31/31] ambari git commit: AMBARI-14370. Move functional tests from ambari-server project to a separate project ambari-funtest (Nahappan Somasundaram via smohanty)

AMBARI-14370. Move functional tests from ambari-server project to a separate project ambari-funtest (Nahappan Somasundaram via smohanty)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ffb4d3b8
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ffb4d3b8
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ffb4d3b8

Branch: refs/heads/trunk
Commit: ffb4d3b8ce043d3cb3e9b8a69619dc82797c68ce
Parents: c0b1f40
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Mon Dec 14 22:01:32 2015 -0800
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Mon Dec 14 22:01:32 2015 -0800

----------------------------------------------------------------------
 ambari-funtest/pom.xml                          |  557 ++
 ambari-funtest/src/main/assemblies/funtest.xml  |   79 +
 .../java/org/apache/ambari/funtest/AppTest.java |   55 +
 .../funtest/server/AmbariHttpWebRequest.java    |  393 +
 .../funtest/server/ClusterConfigParams.java     |   84 +
 .../ambari/funtest/server/ConnectionParams.java |   89 +
 .../funtest/server/LocalAmbariServer.java       |   99 +
 .../ambari/funtest/server/WebRequest.java       |  192 +
 .../ambari/funtest/server/WebResponse.java      |   57 +
 .../AddDesiredConfigurationWebRequest.java      |  108 +
 .../api/cluster/CreateClusterWebRequest.java    |   88 +
 .../cluster/CreateConfigurationWebRequest.java  |   87 +
 .../api/cluster/GetAllClustersWebRequest.java   |   53 +
 .../api/cluster/GetClusterWebRequest.java       |   49 +
 .../api/cluster/GetRequestStatusWebRequest.java |   78 +
 .../server/api/host/AddHostWebRequest.java      |   63 +
 .../server/api/host/GetHostWebRequest.java      |   56 +
 .../api/host/GetRegisteredHostWebRequest.java   |   59 +
 .../server/api/host/RegisterHostWebRequest.java |   59 +
 .../api/service/AddServiceWebRequest.java       |   98 +
 .../api/service/DeleteServiceWebRequest.java    |   67 +
 .../api/service/GetServiceWebRequest.java       |   67 +
 .../api/service/InstallServiceWebRequest.java   |   39 +
 .../api/service/SetServiceStateWebRequest.java  |   97 +
 .../api/service/StartServiceWebRequest.java     |   38 +
 .../api/service/StopServiceWebRequest.java      |   38 +
 .../AddServiceComponentWebRequest.java          |   69 +
 .../GetServiceComponentWebRequest.java          |   69 +
 .../SetServiceComponentStateWebRequest.java     |   87 +
 .../AddServiceComponentHostWebRequest.java      |   69 +
 .../BulkAddServiceComponentHostsWebRequest.java |  127 +
 ...kSetServiceComponentHostStateWebRequest.java |   91 +
 .../GetServiceComponentHostWebRequest.java      |   69 +
 .../SetServiceComponentHostStateWebRequest.java |   89 +
 .../server/orm/InMemoryDefaultTestModule.java   |   88 +
 .../funtest/server/tests/DeleteServiceTest.java |  197 +
 .../funtest/server/tests/LocalAmbariServer.java |   99 +
 .../funtest/server/tests/ServerTestBase.java    |  166 +
 .../server/tests/StartStopServerTest.java       |  104 +
 .../funtest/server/utils/ClusterUtils.java      |  182 +
 .../server/utils/RequestStatusPoller.java       |   93 +
 .../funtest/server/utils/RestApiUtils.java      |   52 +
 .../src/test/resources/log4j.properties         |   21 +
 .../src/test/resources/os_family.json           |   45 +
 .../test/resources/stacks/HDP/0.1/metainfo.xml  |   22 +
 .../resources/stacks/HDP/0.1/repos/repoinfo.xml |   57 +
 .../services/HDFS/configuration/hbase-site.xml  |  137 +
 .../services/HDFS/configuration/hdfs-site.xml   |  396 +
 .../stacks/HDP/0.1/services/HDFS/metainfo.xml   |  155 +
 .../MAPREDUCE/configuration/hbase-site.xml      |  137 +
 .../MAPREDUCE/configuration/hdfs-site.xml       |  396 +
 .../MAPREDUCE/configuration/mapred-site.xml     |  400 +
 .../HDP/0.1/services/MAPREDUCE/metainfo.xml     |   89 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/0.1/services/PIG/metainfo.xml    |   61 +
 .../test/resources/stacks/HDP/0.2/metainfo.xml  |   22 +
 .../resources/stacks/HDP/0.2/repos/repoinfo.xml |   57 +
 .../services/HBASE/configuration/hbase-site.xml |  137 +
 .../stacks/HDP/0.2/services/HBASE/metainfo.xml  |  121 +
 .../0.2/services/HDFS/configuration/global.xml  |  145 +
 .../services/HDFS/configuration/hadoop-env.xml  |  230 +
 .../services/HDFS/configuration/hbase-site.xml  |  137 +
 .../services/HDFS/configuration/hdfs-log4j.xml  |  202 +
 .../services/HDFS/configuration/hdfs-site.xml   |  396 +
 .../stacks/HDP/0.2/services/HDFS/metainfo.xml   |  134 +
 .../stacks/HDP/0.2/services/HIVE/metainfo.xml   |  127 +
 .../services/MAPREDUCE/configuration/global.xml |  160 +
 .../MAPREDUCE/configuration/hbase-site.xml      |  137 +
 .../MAPREDUCE/configuration/hdfs-site.xml       |  396 +
 .../MAPREDUCE/configuration/mapred-site.xml     |  400 +
 .../HDP/0.2/services/MAPREDUCE/metainfo.xml     |   97 +
 .../HDP/0.2/services/ZOOKEEPER/metainfo.xml     |   72 +
 .../resources/stacks/HDP/1.2.0/metainfo.xml     |   22 +
 .../stacks/HDP/1.2.0/repos/repoinfo.xml         |  123 +
 .../HDP/1.2.0/services/GANGLIA/metainfo.xml     |   97 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  344 +
 .../HDP/1.2.0/services/HBASE/metainfo.xml       |  120 +
 .../HDP/1.2.0/services/HCATALOG/metainfo.xml    |   57 +
 .../services/HDFS/configuration/core-site.xml   |  251 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  408 +
 .../stacks/HDP/1.2.0/services/HDFS/metainfo.xml |  137 +
 .../services/HIVE/configuration/hive-site.xml   |  132 +
 .../stacks/HDP/1.2.0/services/HIVE/metainfo.xml |  143 +
 .../configuration/capacity-scheduler.xml        |  195 +
 .../MAPREDUCE/configuration/core-site.xml       |   20 +
 .../configuration/mapred-queue-acls.xml         |   39 +
 .../MAPREDUCE/configuration/mapred-site.xml     |  537 ++
 .../HDP/1.2.0/services/MAPREDUCE/metainfo.xml   |   86 +
 .../services/OOZIE/configuration/oozie-site.xml |  245 +
 .../HDP/1.2.0/services/OOZIE/metainfo.xml       |  110 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/1.2.0/services/PIG/metainfo.xml  |   60 +
 .../HDP/1.2.0/services/SQOOP/metainfo.xml       |   73 +
 .../WEBHCAT/configuration/webhcat-site.xml      |  126 +
 .../HDP/1.2.0/services/WEBHCAT/metainfo.xml     |   95 +
 .../HDP/1.2.0/services/ZOOKEEPER/metainfo.xml   |   72 +
 .../resources/stacks/HDP/1.3.0/metainfo.xml     |   23 +
 .../stacks/HDP/1.3.0/repos/repoinfo.xml         |  111 +
 .../services/GANGLIA/configuration/global.xml   |   55 +
 .../HDP/1.3.0/services/GANGLIA/metainfo.xml     |   97 +
 .../services/HBASE/configuration/global.xml     |  179 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  365 +
 .../HDP/1.3.0/services/HBASE/metainfo.xml       |  120 +
 .../services/HCATALOG/configuration/global.xml  |   45 +
 .../HDP/1.3.0/services/HCATALOG/metainfo.xml    |   57 +
 .../services/HDFS/configuration/core-site.xml   |  253 +
 .../services/HDFS/configuration/global.xml      |  202 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  418 +
 .../stacks/HDP/1.3.0/services/HDFS/metainfo.xml |  136 +
 .../services/HIVE/configuration/global.xml      |  120 +
 .../services/HIVE/configuration/hive-site.xml   |  237 +
 .../stacks/HDP/1.3.0/services/HIVE/metainfo.xml |  143 +
 .../1.3.0/services/HUE/configuration/global.xml |   35 +
 .../services/HUE/configuration/hue-site.xml     |  290 +
 .../stacks/HDP/1.3.0/services/HUE/metainfo.xml  |   35 +
 .../configuration/capacity-scheduler.xml        |  195 +
 .../MAPREDUCE/configuration/core-site.xml       |   20 +
 .../services/MAPREDUCE/configuration/global.xml |  160 +
 .../configuration/mapred-queue-acls.xml         |   39 +
 .../MAPREDUCE/configuration/mapred-site.xml     |  537 ++
 .../HDP/1.3.0/services/MAPREDUCE/metainfo.xml   |   86 +
 .../services/OOZIE/configuration/global.xml     |  105 +
 .../services/OOZIE/configuration/oozie-site.xml |  245 +
 .../HDP/1.3.0/services/OOZIE/metainfo.xml       |  110 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/1.3.0/services/PIG/metainfo.xml  |   60 +
 .../HDP/1.3.0/services/SQOOP/metainfo.xml       |   73 +
 .../WEBHCAT/configuration/webhcat-site.xml      |  126 +
 .../HDP/1.3.0/services/WEBHCAT/metainfo.xml     |   34 +
 .../services/ZOOKEEPER/configuration/global.xml |   75 +
 .../HDP/1.3.0/services/ZOOKEEPER/metainfo.xml   |   71 +
 .../resources/stacks/HDP/1.3.1/metainfo.xml     |   23 +
 .../stacks/HDP/1.3.1/repos/repoinfo.xml         |   97 +
 .../HDP/1.3.1/services/GANGLIA/metainfo.xml     |   97 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  345 +
 .../HDP/1.3.1/services/HBASE/metainfo.xml       |  121 +
 .../HDP/1.3.1/services/HCATALOG/metainfo.xml    |   57 +
 .../services/HCFS/configuration/core-site.xml   |  251 +
 .../HCFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HCFS/configuration/hdfs-site.xml   |  408 +
 .../stacks/HDP/1.3.1/services/HCFS/metainfo.xml |   33 +
 .../services/HDFS/configuration/core-site.xml   |  251 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  408 +
 .../stacks/HDP/1.3.1/services/HDFS/metainfo.xml |  136 +
 .../services/HIVE/configuration/hive-site.xml   |  132 +
 .../stacks/HDP/1.3.1/services/HIVE/metainfo.xml |  143 +
 .../configuration/capacity-scheduler.xml        |  195 +
 .../MAPREDUCE/configuration/core-site.xml       |   20 +
 .../configuration/mapred-queue-acls.xml         |   39 +
 .../MAPREDUCE/configuration/mapred-site.xml     |  531 ++
 .../HDP/1.3.1/services/MAPREDUCE/metainfo.xml   |   86 +
 .../HDP/1.3.1/services/NONAME/metainfo.xml      |   33 +
 .../services/OOZIE/configuration/oozie-site.xml |  245 +
 .../HDP/1.3.1/services/OOZIE/metainfo.xml       |  110 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/1.3.1/services/PIG/metainfo.xml  |   60 +
 .../HDP/1.3.1/services/SQOOP/metainfo.xml       |   73 +
 .../WEBHCAT/configuration/webhcat-site.xml      |  126 +
 .../HDP/1.3.1/services/WEBHCAT/metainfo.xml     |   95 +
 .../HDP/1.3.1/services/ZOOKEEPER/metainfo.xml   |   72 +
 .../resources/stacks/HDP/1.3.4/metainfo.xml     |   22 +
 .../HDP/1.3.4/services/GANGLIA/metainfo.xml     |   96 +
 .../HDP/1.3.4/services/HBASE/metainfo.xml       |  122 +
 .../services/HDFS/configuration/hdfs-log4j.xml  |  198 +
 .../stacks/HDP/1.3.4/services/HDFS/metainfo.xml |  136 +
 .../stacks/HDP/1.3.4/services/HIVE/metainfo.xml |  179 +
 .../stacks/HDP/1.3.4/services/HUE/metainfo.xml  |   36 +
 .../HDP/1.3.4/services/MAPREDUCE/metainfo.xml   |  102 +
 .../HDP/1.3.4/services/OOZIE/metainfo.xml       |  110 +
 .../stacks/HDP/1.3.4/services/PIG/metainfo.xml  |   60 +
 .../HDP/1.3.4/services/SQOOP/metainfo.xml       |   75 +
 .../HDP/1.3.4/services/WEBHCAT/metainfo.xml     |   94 +
 .../HDP/1.3.4/services/ZOOKEEPER/metainfo.xml   |   71 +
 .../resources/stacks/HDP/2.0.1/metainfo.xml     |   22 +
 .../stacks/HDP/2.0.1/repos/repoinfo.xml         |   75 +
 .../HDP/2.0.1/services/GANGLIA/metainfo.xml     |  129 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  350 +
 .../HDP/2.0.1/services/HBASE/metainfo.xml       |  112 +
 .../HDP/2.0.1/services/HCATALOG/metainfo.xml    |   56 +
 .../services/HDFS/configuration/core-site.xml   |  257 +
 .../services/HDFS/configuration/global.xml      |  202 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  431 +
 .../stacks/HDP/2.0.1/services/HDFS/metainfo.xml |  158 +
 .../services/HIVE/configuration/hive-site.xml   |  136 +
 .../stacks/HDP/2.0.1/services/HIVE/metainfo.xml |  156 +
 .../configuration/container-executor.cfg        |   20 +
 .../MAPREDUCE2/configuration/core-site.xml      |   20 +
 .../MAPREDUCE2/configuration/global.xml         |   44 +
 .../configuration/mapred-queue-acls.xml         |   39 +
 .../MAPREDUCE2/configuration/mapred-site.xml    |  300 +
 .../HDP/2.0.1/services/MAPREDUCE2/metainfo.xml  |   87 +
 .../services/OOZIE/configuration/oozie-site.xml |  245 +
 .../HDP/2.0.1/services/OOZIE/metainfo.xml       |  140 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/2.0.1/services/PIG/metainfo.xml  |   62 +
 .../stacks/HDP/2.0.1/services/TEZ/metainfo.xml  |   34 +
 .../WEBHCAT/configuration/webhcat-site.xml      |  126 +
 .../HDP/2.0.1/services/WEBHCAT/metainfo.xml     |  102 +
 .../YARN/configuration/capacity-scheduler.xml   |  112 +
 .../YARN/configuration/container-executor.cfg   |   20 +
 .../services/YARN/configuration/core-site.xml   |   20 +
 .../services/YARN/configuration/global.xml      |   49 +
 .../services/YARN/configuration/yarn-site.xml   |  172 +
 .../stacks/HDP/2.0.1/services/YARN/metainfo.xml |  110 +
 .../HDP/2.0.1/services/ZOOKEEPER/metainfo.xml   |   75 +
 .../resources/stacks/HDP/2.0.5/metainfo.xml     |   22 +
 .../stacks/HDP/2.0.5/repos/repoinfo.xml         |   61 +
 .../HDP/2.0.5/services/GANGLIA/metainfo.xml     |  130 +
 .../services/HBASE/configuration/global.xml     |  179 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  363 +
 .../HDP/2.0.5/services/HBASE/metainfo.xml       |  112 +
 .../HDP/2.0.5/services/HBASE/metrics.json       | 3206 +++++++
 .../HDP/2.0.5/services/HCATALOG/metainfo.xml    |   56 +
 .../stacks/HDP/2.0.5/services/HDFS/alerts.json  |  144 +
 .../services/HDFS/configuration/core-site.xml   |  195 +
 .../services/HDFS/configuration/global.xml      |  197 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  454 +
 .../stacks/HDP/2.0.5/services/HDFS/metainfo.xml |  196 +
 .../stacks/HDP/2.0.5/services/HDFS/metrics.json | 2961 +++++++
 .../services/HIVE/configuration/hive-site.xml   |  255 +
 .../stacks/HDP/2.0.5/services/HIVE/metainfo.xml |  260 +
 .../configuration/container-executor.cfg        |   20 +
 .../MAPREDUCE2/configuration/core-site.xml      |   20 +
 .../MAPREDUCE2/configuration/global.xml         |   44 +
 .../configuration/mapred-queue-acls.xml         |   39 +
 .../MAPREDUCE2/configuration/mapred-site.xml    |  382 +
 .../HDP/2.0.5/services/MAPREDUCE2/metainfo.xml  |   87 +
 .../services/OOZIE/configuration/oozie-site.xml |  245 +
 .../HDP/2.0.5/services/OOZIE/metainfo.xml       |  140 +
 .../services/PIG/configuration/pig.properties   |   52 +
 .../stacks/HDP/2.0.5/services/PIG/metainfo.xml  |   62 +
 .../HDP/2.0.5/services/SQOOP/metainfo.xml       |   73 +
 .../YARN/configuration/capacity-scheduler.xml   |  112 +
 .../YARN/configuration/container-executor.cfg   |   20 +
 .../services/YARN/configuration/core-site.xml   |   20 +
 .../services/YARN/configuration/global.xml      |   64 +
 .../services/YARN/configuration/yarn-site.xml   |  311 +
 .../stacks/HDP/2.0.5/services/YARN/metainfo.xml |  115 +
 .../stacks/HDP/2.0.5/services/YARN/metrics.json | 1661 ++++
 .../services/ZOOKEEPER/configuration/global.xml |   75 +
 .../ZOOKEEPER/configuration/zoo.cfg.xml         |   62 +
 .../HDP/2.0.5/services/ZOOKEEPER/metainfo.xml   |   89 +
 .../stacks/HDP/2.0.6.1/hooks/dummy-script.py    |   20 +
 .../resources/stacks/HDP/2.0.6.1/metainfo.xml   |   24 +
 .../stacks/HDP/2.0.6.1/repos/repoinfo.xml       |   61 +
 .../stacks/HDP/2.0.6.1/role_command_order.json  |   92 +
 .../services/FLUME/configuration/flume-conf.xml |   34 +
 .../services/FLUME/configuration/flume-env.xml  |   44 +
 .../FLUME/configuration/flume-log4j.xml         |   31 +
 .../HDP/2.0.6.1/services/FLUME/metainfo.xml     |   69 +
 .../HDP/2.0.6.1/services/HBASE/metainfo.xml     |   27 +
 .../HDP/2.0.6.1/services/SQOOP/metainfo.xml     |   34 +
 .../HDP/2.0.6.1/services/YARN/metainfo.xml      |   27 +
 .../stacks/HDP/2.0.6/hooks/dummy-script.py      |   20 +
 .../resources/stacks/HDP/2.0.6/metainfo.xml     |   24 +
 .../stacks/HDP/2.0.6/repos/repoinfo.xml         |   61 +
 .../stacks/HDP/2.0.6/role_command_order.json    |   92 +
 .../services/FLUME/configuration/flume-conf.xml |   34 +
 .../services/FLUME/configuration/flume-env.xml  |   44 +
 .../FLUME/configuration/flume-log4j.xml         |   34 +
 .../HDP/2.0.6/services/FLUME/metainfo.xml       |   69 +
 .../HDP/2.0.6/services/HBASE/metainfo.xml       |  113 +
 .../HDP/2.0.6/services/SQOOP/metainfo.xml       |   34 +
 .../services/YARN/configuration/yarn-site.xml   |  117 +
 .../stacks/HDP/2.0.6/services/YARN/metainfo.xml |  122 +
 .../resources/stacks/HDP/2.0.7/metainfo.xml     |   24 +
 .../stacks/HDP/2.0.7/repos/repoinfo.xml         |   61 +
 .../stacks/HDP/2.0.7/role_command_order.json    |   92 +
 .../services/HBASE/configuration/global.xml     |  174 +
 .../HBASE/configuration/hbase-policy.xml        |   53 +
 .../services/HBASE/configuration/hbase-site.xml |  356 +
 .../HDP/2.0.7/services/HBASE/metainfo.xml       |  130 +
 .../services/HBASE/package/dummy-script.py      |   20 +
 .../services/HDFS/configuration/core-site.xml   |  167 +
 .../services/HDFS/configuration/global.xml      |  202 +
 .../HDFS/configuration/hadoop-policy.xml        |  134 +
 .../services/HDFS/configuration/hdfs-site.xml   |  514 ++
 .../stacks/HDP/2.0.7/services/HDFS/metainfo.xml |  158 +
 .../2.0.7/services/HDFS/package/dummy-script.py |   20 +
 .../services/HIVE/configuration/hive-site.xml   |  261 +
 .../stacks/HDP/2.0.7/services/HIVE/metainfo.xml |  174 +
 .../services/HIVE/package/files/addMysqlUser.sh |   41 +
 .../services/HIVE/package/files/hcatSmoke.sh    |   35 +
 .../services/HIVE/package/files/hiveSmoke.sh    |   23 +
 .../services/HIVE/package/files/hiveserver2.sql |   23 +
 .../HIVE/package/files/hiveserver2Smoke.sh      |   31 +
 .../services/HIVE/package/files/pigSmoke.sh     |   18 +
 .../HIVE/package/files/startHiveserver2.sh      |   22 +
 .../HIVE/package/files/startMetastore.sh        |   22 +
 .../services/HIVE/package/scripts/__init__.py   |   19 +
 .../2.0.7/services/HIVE/package/scripts/hcat.py |   47 +
 .../HIVE/package/scripts/hcat_client.py         |   43 +
 .../HIVE/package/scripts/hcat_service_check.py  |   63 +
 .../2.0.7/services/HIVE/package/scripts/hive.py |  123 +
 .../HIVE/package/scripts/hive_client.py         |   41 +
 .../HIVE/package/scripts/hive_metastore.py      |   63 +
 .../HIVE/package/scripts/hive_server.py         |   63 +
 .../HIVE/package/scripts/hive_service.py        |   56 +
 .../HIVE/package/scripts/mysql_server.py        |   77 +
 .../HIVE/package/scripts/mysql_service.py       |   44 +
 .../services/HIVE/package/scripts/params.py     |  123 +
 .../HIVE/package/scripts/service_check.py       |   56 +
 .../HIVE/package/scripts/status_params.py       |   30 +
 .../HIVE/package/templates/hcat-env.sh.j2       |   25 +
 .../HIVE/package/templates/hive-env.sh.j2       |   55 +
 .../HDP/2.0.7/services/SQOOP/metainfo.xml       |   39 +
 .../services/YARN/config-mr2/mapred-site.xml    |   28 +
 .../services/YARN/configuration/yarn-site.xml   |   60 +
 .../stacks/HDP/2.0.7/services/YARN/metainfo.xml |  171 +
 .../HDP/2.0.7/services/ZOOKEEPER/metainfo.xml   |   89 +
 .../stacks/HDP/2.0.8/hooks/dummy-script.py      |   20 +
 .../resources/stacks/HDP/2.0.8/kerberos.json    |   42 +
 .../resources/stacks/HDP/2.0.8/metainfo.xml     |   24 +
 .../stacks/HDP/2.0.8/repos/repoinfo.xml         |   61 +
 .../stacks/HDP/2.0.8/role_command_order.json    |   79 +
 .../HDP/2.0.8/services/FAKENAGIOS/metainfo.xml  |   51 +
 .../services/HBASE/configuration/hbase-site.xml |  356 +
 .../HDP/2.0.8/services/HBASE/metainfo.xml       |   84 +
 .../services/HDFS/configuration/hdfs-site.xml   |   45 +
 .../HDP/2.0.8/services/HDFS/kerberos.json       |  141 +
 .../stacks/HDP/2.0.8/services/HDFS/metainfo.xml |  146 +
 .../stacks/HDP/2.0.8/services/HDFS/metrics.json | 7860 +++++++++++++++++
 .../2.0.8/services/HDFS/package/dummy-script.py |   20 +
 .../HDP/2.0.8/services/SQOOP/metainfo.xml       |   40 +
 .../resources/stacks/HDP/2.1.1/metainfo.xml     |   24 +
 .../resources/stacks/HDP/2.1.1/repos/hdp.json   |   10 +
 .../stacks/HDP/2.1.1/repos/repoinfo.xml         |   62 +
 .../stacks/HDP/2.1.1/role_command_order.json    |   81 +
 .../2.1.1/services/AMBARI_METRICS/metainfo.xml  |  133 +
 .../stacks/HDP/2.1.1/services/HDFS/metainfo.xml |  146 +
 .../PIG/configuration/pig-properties.xml        |   94 +
 .../stacks/HDP/2.1.1/services/PIG/metainfo.xml  |   34 +
 .../2.1.1/services/PIG/role_command_order.json  |   12 +
 .../STORM/configuration/placeholder.txt         |   17 +
 .../HDP/2.1.1/services/STORM/metainfo.xml       |  106 +
 .../HDP/2.1.1/services/STORM/metrics.json       |  114 +
 .../services/STORM/package/placeholder.txt      |   17 +
 .../stacks/HDP/2.1.1/services/TEZ/metainfo.xml  |   34 +
 .../HDP/2.1.1/upgrades/config-upgrade.xml       |  133 +
 .../HDP/2.1.1/upgrades/upgrade_bucket_test.xml  |   88 +
 .../HDP/2.1.1/upgrades/upgrade_direction.xml    |  101 +
 .../upgrades/upgrade_nonrolling_new_stack.xml   |  974 +++
 .../upgrades/upgrade_server_action_test.xml     |   65 +
 .../stacks/HDP/2.1.1/upgrades/upgrade_test.xml  |  211 +
 .../HDP/2.1.1/upgrades/upgrade_test_checks.xml  |  203 +
 .../2.1.1/upgrades/upgrade_test_nonrolling.xml  |  190 +
 .../HDP/2.1.1/upgrades/upgrade_to_new_stack.xml |  213 +
 .../resources/stacks/HDP/2.2.0.ECS/metainfo.xml |   24 +
 .../stacks/HDP/2.2.0.ECS/repos/hdp.json         |   10 +
 .../stacks/HDP/2.2.0.ECS/repos/repoinfo.xml     |   62 +
 .../HDP/2.2.0.ECS/services/ECS/metainfo.xml     |   35 +
 .../HDP/2.2.0.ECS/services/HDFS/metainfo.xml    |   28 +
 .../resources/stacks/HDP/2.2.0/metainfo.xml     |   24 +
 .../resources/stacks/HDP/2.2.0/repos/hdp.json   |   10 +
 .../stacks/HDP/2.2.0/repos/repoinfo.xml         |   62 +
 .../stacks/HDP/2.2.0/role_command_order.json    |   81 +
 .../HDP/2.2.0/services/GANGLIA/metainfo.xml     |   39 +
 .../stacks/HDP/2.2.0/services/HDFS/metainfo.xml |   59 +
 .../HDP/2.2.0/services/ZOOKEEPER/metainfo.xml   |   40 +
 .../HDP/2.2.0/upgrades/config-upgrade.xml       |  101 +
 .../stacks/HDP/2.2.0/upgrades/upgrade_test.xml  |  221 +
 .../HDP/2.2.0/upgrades/upgrade_test_checks.xml  |  208 +
 .../upgrades/upgrade_test_skip_failures.xml     |   74 +
 .../resources/stacks/OTHER/1.0/metainfo.xml     |   23 +
 .../resources/stacks/OTHER/1.0/repos/hdp.json   |   10 +
 .../stacks/OTHER/1.0/repos/repoinfo.xml         |   62 +
 .../stacks/OTHER/1.0/role_command_order.json    |   92 +
 .../services/HDFS/configuration/hdfs-site.xml   |   45 +
 .../stacks/OTHER/1.0/services/HDFS/metainfo.xml |  146 +
 .../stacks/OTHER/1.0/services/HDFS/metrics.json | 7861 ++++++++++++++++++
 .../1.0/services/HDFS/package/dummy-script.py   |   20 +
 .../OTHER/1.0/services/SQOOP2/metainfo.xml      |   30 +
 .../STORM/configuration/placeholder.txt         |   17 +
 .../OTHER/1.0/services/STORM/metainfo.xml       |   29 +
 .../OTHER/1.0/services/STORM/metrics.json       |  103 +
 .../1.0/services/STORM/package/placeholder.txt  |   17 +
 .../resources/stacks/OTHER/2.0/metainfo.xml     |   24 +
 .../resources/stacks/OTHER/2.0/repos/hdp.json   |   10 +
 .../stacks/OTHER/2.0/repos/repoinfo.xml         |   62 +
 .../OTHER/2.0/services/HBASE/metainfo.xml       |   32 +
 .../OTHER/2.0/services/HBASE/widgets.json       |  190 +
 .../OTHER/2.0/services/SQOOP2/metainfo.xml      |   28 +
 .../stacks/XYZ/1.0.0/services/stack_advisor.py  |   67 +
 .../stacks/XYZ/1.0.1/services/stack_advisor.py  |   30 +
 ambari-funtest/src/test/resources/version       |    1 +
 .../api/AmbariHttpWebRequest.java               |  393 -
 .../api/ClusterConfigParams.java                |   84 -
 .../functionaltests/api/ConnectionParams.java   |   89 -
 .../server/functionaltests/api/WebRequest.java  |  192 -
 .../server/functionaltests/api/WebResponse.java |   57 -
 .../AddDesiredConfigurationWebRequest.java      |  108 -
 .../api/cluster/CreateClusterWebRequest.java    |   88 -
 .../cluster/CreateConfigurationWebRequest.java  |   87 -
 .../api/cluster/GetAllClustersWebRequest.java   |   53 -
 .../api/cluster/GetClusterWebRequest.java       |   49 -
 .../api/cluster/GetRequestStatusWebRequest.java |   78 -
 .../api/host/AddHostWebRequest.java             |   63 -
 .../api/host/GetHostWebRequest.java             |   56 -
 .../api/host/GetRegisteredHostWebRequest.java   |   59 -
 .../api/host/RegisterHostWebRequest.java        |   59 -
 .../api/service/AddServiceWebRequest.java       |   98 -
 .../api/service/DeleteServiceWebRequest.java    |   67 -
 .../api/service/GetServiceWebRequest.java       |   67 -
 .../api/service/InstallServiceWebRequest.java   |   39 -
 .../api/service/SetServiceStateWebRequest.java  |   97 -
 .../api/service/StartServiceWebRequest.java     |   38 -
 .../api/service/StopServiceWebRequest.java      |   38 -
 .../AddServiceComponentWebRequest.java          |   69 -
 .../GetServiceComponentWebRequest.java          |   69 -
 .../SetServiceComponentStateWebRequest.java     |   87 -
 .../AddServiceComponentHostWebRequest.java      |   69 -
 .../BulkAddServiceComponentHostsWebRequest.java |  127 -
 ...kSetServiceComponentHostStateWebRequest.java |   91 -
 .../GetServiceComponentHostWebRequest.java      |   69 -
 .../SetServiceComponentHostStateWebRequest.java |   89 -
 .../server/DeleteServiceTest.java               |  197 -
 .../server/LocalAmbariServer.java               |   99 -
 .../functionaltests/server/ServerTestBase.java  |  146 -
 .../server/StartStopServerTest.java             |  102 -
 .../functionaltests/utils/ClusterUtils.java     |  247 -
 .../functionaltests/utils/RestApiUtils.java     |   52 -
 pom.xml                                         |    4 +
 432 files changed, 68106 insertions(+), 3472 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-funtest/pom.xml b/ambari-funtest/pom.xml
new file mode 100644
index 0000000..7e47c69
--- /dev/null
+++ b/ambari-funtest/pom.xml
@@ -0,0 +1,557 @@
+<?xml version="1.0"?>
+<!-- Licensed 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.
+  See accompanying LICENSE file. -->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.ambari</groupId>
+    <artifactId>ambari-project</artifactId>
+    <version>2.0.0.0-SNAPSHOT</version>
+    <relativePath>../ambari-project</relativePath>
+  </parent>
+  <groupId>org.apache.ambari</groupId>
+  <artifactId>ambari-funtest</artifactId>
+  <version>2.0.0.0-SNAPSHOT</version>
+  <packaging>${packagingFormat}</packaging>
+  <name>Ambari Functional Tests</name>
+  <description>Ambari Functional Tests</description>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptors>
+            <descriptor>${assemblydescriptor}</descriptor>
+          </descriptors>
+          <tarLongFileMode>gnu</tarLongFileMode>
+        </configuration>
+        <executions>
+          <execution>
+            <id>build-tarball</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/*.java</include>
+          </includes>
+          <forkMode>once</forkMode>
+        </configuration>
+        <executions>
+          <!-- Will display BUILD SUCCESSFUL if build is successful.
+               Does not matter if the tests fail -->
+          <execution>
+            <id>run-integration-tests</id>
+            <phase>test</phase>
+            <goals>
+              <goal>integration-test</goal>
+            </goals>
+          </execution>
+          <!-- Will display BUILD FAILURE if build fails or any test fails -->
+          <execution>
+            <id>run-verify</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <configuration>
+            <excludes>
+              <exclude>src/test/resources/version</exclude>
+              <exclude>src/test/resources/os_family.json</exclude>
+              <exclude>src/test/resources/stacks/**</exclude>
+              <exclude>derby.log</exclude>
+            </excludes>
+          </configuration>
+      </plugin>
+    </plugins>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+        <excludes>
+          <exclude>stacks/**</exclude>
+          <exclude>common-services/**</exclude>
+        </excludes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <includes>
+          <include>stacks/**</include>
+          <include>common-services/**</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+  <profiles>
+    <profile>
+      <id>linux</id>
+      <activation>
+        <os>
+          <family>unix</family>
+        </os>
+      </activation>
+      <properties>
+        <envClassifier>linux</envClassifier>
+        <dirsep>/</dirsep>
+        <pathsep>:</pathsep>
+        <executable.shell>sh</executable.shell>
+        <fileextension.shell>sh</fileextension.shell>
+        <fileextension.dot.shell-default></fileextension.dot.shell-default>
+        <assemblydescriptor>src/main/assemblies/funtest.xml</assemblydescriptor>
+        <packagingFormat>jar</packagingFormat>
+      </properties>
+    </profile>
+  </profiles>
+  <dependencies>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-csv</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>uk.com.robust-it</groupId>
+      <artifactId>cloning</artifactId>
+      <version>1.9.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject.extensions</groupId>
+      <artifactId>guice-assistedinject</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject.extensions</groupId>
+      <artifactId>guice-persist</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject.extensions</groupId>
+      <artifactId>guice-servlet</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject.extensions</groupId>
+      <artifactId>guice-multibindings</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-config</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-web</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-mock</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-ldap</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.ldap</groupId>
+      <artifactId>spring-ldap-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-server-annotations</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>net.sf.ehcache</groupId>
+          <artifactId>ehcache-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-core-integ</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>net.sf.ehcache</groupId>
+          <artifactId>ehcache-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-server-integ</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-jdbm</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-kerberos-codec</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>net.sf.ehcache</groupId>
+          <artifactId>ehcache-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-core</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>net.sf.ehcache</groupId>
+          <artifactId>ehcache-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-protocol-ldap</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>kerberos-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.directory.shared</groupId>
+      <artifactId>shared-ldap</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.persistence</groupId>
+      <artifactId>eclipselink</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-security</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlets</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+    </dependency>
+    <!--jsp support for jetty -->
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jsp-api-2.1-glassfish</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jsp-2.1-glassfish</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ant</groupId>
+      <artifactId>ant-launcher</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-httpclient</groupId>
+      <artifactId>commons-httpclient</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-net</groupId>
+      <artifactId>commons-net</artifactId>
+      <version>1.4.1</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-json</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.codehaus.jackson</groupId>
+          <artifactId>jackson-xc</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.jettison</groupId>
+          <artifactId>jettison</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.jackson</groupId>
+          <artifactId>jackson-mapper-asl</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-server</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey.contribs</groupId>
+      <artifactId>jersey-multipart</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey.contribs</groupId>
+      <artifactId>jersey-guice</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-mapper-asl</artifactId>
+      <version>1.9.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-core-asl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-jaxrs</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jackson</groupId>
+      <artifactId>jackson-xc</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey.jersey-test-framework</groupId>
+      <artifactId>jersey-test-framework-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.jersey.jersey-test-framework</groupId>
+      <artifactId>jersey-test-framework-grizzly2</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.jettison</groupId>
+      <artifactId>jettison</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.easymock</groupId>
+      <artifactId>easymock</artifactId>
+      <version>3.4</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-easymock</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-reflect</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>nl.jqno.equalsverifier</groupId>
+      <artifactId>equalsverifier</artifactId>
+      <version>1.7.4</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.objenesis</groupId>
+      <artifactId>objenesis-tck</artifactId>
+      <version>1.2</version>
+    </dependency>
+    <dependency>
+      <groupId>cglib</groupId>
+      <artifactId>cglib</artifactId>
+      <version>2.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>asm</groupId>
+      <artifactId>asm</artifactId>
+      <version>3.3.1</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject</groupId>
+      <artifactId>guice</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <version>9.3-1101-jdbc4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.2.5</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>14.0.1</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.findbugs</groupId>
+      <artifactId>jsr305</artifactId>
+      <version>1.3.9</version>
+    </dependency>
+    <dependency>
+      <groupId>org.quartz-scheduler</groupId>
+      <artifactId>quartz</artifactId>
+      <version>2.2.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.quartz-scheduler</groupId>
+      <artifactId>quartz-jobs</artifactId>
+      <version>2.2.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity</artifactId>
+      <version>1.7</version>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.mail</groupId>
+      <artifactId>mailapi</artifactId>
+      <version>1.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.sun.mail</groupId>
+      <artifactId>smtp</artifactId>
+      <version>1.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.snmp4j</groupId>
+      <artifactId>snmp4j</artifactId>
+      <version>1.10.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ambari</groupId>
+      <artifactId>ambari-metrics-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.ambari</groupId>
+      <artifactId>ambari-server</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>2.1.4</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.ehcache</groupId>
+      <artifactId>ehcache</artifactId>
+      <version>2.10.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.nimbusds</groupId>
+      <artifactId>nimbus-jose-jwt</artifactId>
+      <version>3.9</version>
+      <scope>compile</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.bouncycastle</groupId>
+          <artifactId>bcprov-jdk15on</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/main/assemblies/funtest.xml
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/main/assemblies/funtest.xml b/ambari-funtest/src/main/assemblies/funtest.xml
new file mode 100644
index 0000000..93d2e17
--- /dev/null
+++ b/ambari-funtest/src/main/assemblies/funtest.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<assembly>
+  <id>dist</id>
+  <formats>
+    <format>dir</format>
+    <format>tar.gz</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+      <source>${project.build.directory}/${artifact.artifactId}-${artifact.version}.jar</source>
+      <outputDirectory>ambari-funtest-${project.version}/lib/ambari-funtest</outputDirectory>
+    </file>
+  </files>
+  <fileSets>
+    <!-- Distro files, readme, licenses, etc -->
+    <fileSet>
+      <directory>${basedir}/../</directory>
+      <outputDirectory>ambari-funtest-${project.version}/</outputDirectory>
+      <includes>
+        <include>*.txt</include>
+      </includes>
+    </fileSet>
+    <!--
+    <fileSet>
+      <directory>${basedir}/src/main/bin</directory>
+      <outputDirectory>ambari-funtest-${project.version}/bin</outputDirectory>
+      <includes>
+        <include>*</include>
+      </includes>
+      <fileMode>0755</fileMode>
+    </fileSet>
+    -->
+    <fileSet>
+      <directory>${basedir}/src/main/resources/</directory>
+      <outputDirectory>/ambari-funtest-${project.version}/keystore</outputDirectory>
+      <includes>
+        <include>db/*</include>
+        <include>ca.config</include>
+        <include>pass.txt</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>${basedir}/../ambari-web/public</directory>
+      <outputDirectory>ambari-funtest-${project.version}/web</outputDirectory>
+      <includes>
+        <include>**</include>
+      </includes>
+    </fileSet>
+    <fileSet>
+      <directory>src/main/conf</directory>
+      <outputDirectory>/ambari-funtest-${project.version}/etc/ambari-funtest/conf</outputDirectory>
+    </fileSet>
+  </fileSets>
+  <dependencySets>
+    <dependencySet>
+      <outputDirectory>ambari-funtest-${project.version}/lib/ambari-funtest</outputDirectory>
+      <unpack>false</unpack>
+      <scope>compile</scope>
+    </dependencySet>
+  </dependencySets>
+</assembly>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/AppTest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/AppTest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/AppTest.java
new file mode 100644
index 0000000..e7fd76f
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/AppTest.java
@@ -0,0 +1,55 @@
+/**
+ * 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.funtest;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/AmbariHttpWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/AmbariHttpWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/AmbariHttpWebRequest.java
new file mode 100644
index 0000000..4a91176
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/AmbariHttpWebRequest.java
@@ -0,0 +1,393 @@
+/*
+ * 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.funtest.server;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.stream.JsonReader;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+import org.apache.commons.codec.binary.Base64;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Map;
+
+
+/**
+ * REST API Client that performs various operations on the Ambari Server
+ * using Http.
+ */
+public class AmbariHttpWebRequest extends WebRequest {
+    private static final Log LOG = LogFactory.getLog(AmbariHttpWebRequest.class);
+    private static String SERVER_URL_FORMAT = "http://%s:%d";
+    private static String SERVER_SSL_URL_FORMAT = "https://%s:%d";
+
+    private String content;
+
+    private String serverName;
+    private int serverApiPort;
+    private int serverAgentPort;
+    private WebResponse response;
+    private String curlApi;
+
+    /**
+     *  Constructor to set the REST API URL, Server API port, Server Agent API port, user id and password.
+     *
+     * @param params
+     */
+    public AmbariHttpWebRequest(ConnectionParams params) {
+        setServerName(params.getServerName());
+        setServerApiPort(params.getServerApiPort());
+        setServerAgentPort(params.getServerAgentPort());
+        setUserName(params.getUserName());
+        setPassword(params.getPassword());
+        addHeader("X-Requested-By", "ambari");
+        if (getUserName() != null) {
+            addHeader("Authorization", getBasicAuthentication());
+        }
+    }
+
+    /**
+     * Sends the request to the Ambari server and returns the response.
+     *
+     * @return - Response from the Ambari server.
+     * @throws IOException
+     */
+    @Override
+    public WebResponse getResponse() throws IOException {
+        if (response == null) {
+            LOG.info(getCurlApi());
+            response = executeRequest();
+        }
+
+        return response;
+    }
+
+    /**
+     * Gets the full URI
+     *
+     * @return - Full path to the URI
+     */
+    @Override
+    public String getUrl() {
+        return getServerApiUrl() + getApiPath();
+    }
+
+    /**
+     * Gets the JSON content (request data).
+     *
+     * @return - JSON content.
+     */
+    @Override
+    public String getContent() {
+        if (content == null) {
+            content = getRequestData();
+        }
+
+        return content;
+    }
+
+    /**
+     * Gets the content encoding.
+     *
+     * @return - Content encoding.
+     */
+    @Override
+    public String getContentEncoding() { return "UTF-8"; }
+
+    /**
+     * Gets the content type, like application/json, application/text, etc.
+     *
+     * @return - Content type.
+     */
+    @Override
+    public String getContentType() { return "application/json"; }
+
+    /**
+     * Gets the curl command line call for this request. Useful for
+     * debugging.
+     *
+     * @return - Curl command line call.
+     */
+    public String getCurlApi() {
+        if (curlApi == null) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("curl");
+            if (getUserName() != null) {
+                sb.append(String.format(" -u %s", getUserName()));
+                if (getPassword() != null) {
+                    sb.append(String.format(":%s", getPassword()));
+                }
+            }
+            sb.append(String.format(" -H \"%s\"", "X-Requested-By: ambari"));
+            sb.append(String.format(" -X %s", getHttpMethod()));
+            if (getHttpMethod().equals("PUT") || getHttpMethod().equals("POST")) {
+                if (getContent() != null) {
+                    sb.append(String.format(" -d '%s'", getContent()));
+                }
+            }
+            sb.append(String.format(" %s", getUrl()));
+            curlApi = sb.toString();
+        }
+
+        return curlApi;
+    }
+
+    /**
+     * Sets the REST API URL for the Ambari Server
+     *
+     * @param serverName - REST API URL
+     */
+    public void setServerName(String serverName) { this.serverName = serverName; }
+
+    /**
+     * Gets the REST API URL for the Ambari Server
+     *
+     * @return - REST API URL
+     */
+    public String getServerName() { return this.serverName; }
+
+    /**
+     * Gets the port number for the REST API used by the web clients.
+     *
+     * @return - Server API port number.
+     */
+    public int getServerApiPort() { return this.serverApiPort; }
+
+    /**
+     * Sets the port number for the REST API used by the web clients.
+     *
+     * @param serverApiPort - Server API port.
+     */
+    public void setServerApiPort(int serverApiPort) { this.serverApiPort = serverApiPort; }
+
+    /**
+     * Gets the port number for the REST API used by the agent.
+     *
+     * @return - Agent API port number.
+     */
+    public int getServerAgentPort() { return this.serverAgentPort; }
+
+    /**
+     * Sets the port number for the REST API used by the agent.
+     *
+     * @param serverAgentPort - Agent API port number.
+     */
+    public void setServerAgentPort(int serverAgentPort) { this.serverAgentPort = serverAgentPort; }
+
+    /**
+     * Gets the REST API path fragment.
+     *
+     * @return - REST API path.
+     */
+    protected String getApiPath() { return ""; }
+
+    /**
+     * Gets the request data used in POST and PUT requests.
+     *
+     * @return - Request data.
+     */
+    protected String getRequestData() { return ""; }
+
+    /**
+     * Gets the basic authentication string to be used for the Authorization header.
+     *
+     * @return - Base-64 encoded authentication string.
+     */
+    protected String getBasicAuthentication() {
+        String authString = getUserName() + ":" + getPassword();
+        byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
+        String authStringEnc = new String(authEncBytes);
+
+        return "Basic " + authStringEnc;
+    }
+
+    /**
+     * Gets URL for the Ambari Server (without the API path)
+     *
+     * @return - Ambari server URL.
+     */
+    protected String getServerApiUrl() {
+        return String.format(SERVER_URL_FORMAT, getServerName(), getServerApiPort());
+    }
+
+    /**
+     * Gets URL for the Agent Server (without the API path)
+     *
+     * @return - Agent server URL.
+     */
+    protected String getServerAgentUrl() {
+        return String.format(SERVER_URL_FORMAT, getServerName(), getServerAgentPort());
+    }
+
+    /**
+     * Helper method to create simple Json objects.
+     *
+     * @param name - Name
+     * @param value - Value
+     * @return - A JsonObject {name: value}
+     */
+    protected static JsonObject createJsonObject(String name, String value) {
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty(name, value);
+        return jsonObject;
+    }
+
+    /**
+     * Helper method to create simple Json objects.
+     *
+     * @param name - Name
+     * @param jsonElement - Json object.
+     * @return - A JsonObject {name: jsonElement }
+     */
+    protected static JsonObject createJsonObject(String name, JsonElement jsonElement) {
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.add(name, jsonElement);
+        return jsonObject;
+    }
+
+    /**
+     * Executes the current request by using HttpClient methods and returns the response.
+     *
+     * @return - Response from the Ambari server/Agent server.
+     * @throws IOException
+     */
+    private WebResponse executeRequest() throws IOException {
+        HttpMethodBase methodBase = null;
+        String httpMethod;
+
+        httpMethod = getHttpMethod();
+
+        if (httpMethod.equals("GET")) {
+            methodBase = getGetMethod();
+        } else if (httpMethod.equals("POST")) {
+            methodBase = getPostMethod();
+        } else if (httpMethod.equals("PUT")) {
+            methodBase = getPutMethod();
+        } else if (httpMethod.equals("DELETE")) {
+            methodBase = getDeleteMethod();
+        } else {
+            new RuntimeException(String.format("Unsupported HTTP method: %s", httpMethod));
+        }
+
+        WebResponse response = new WebResponse();
+        HttpClient httpClient = new HttpClient();
+        Map<String, String> headers = getHeaders();
+
+        for (Map.Entry<String, String> header : headers.entrySet()) {
+            methodBase.addRequestHeader(header.getKey(), header.getValue());
+        }
+
+        methodBase.setQueryString(getQueryString());
+
+        try {
+            int statusCode = httpClient.executeMethod(methodBase);
+            response.setStatusCode(statusCode);
+            response.setContent(methodBase.getResponseBodyAsString());
+        } finally {
+            methodBase.releaseConnection();
+        }
+
+        return response;
+    }
+
+    /**
+     * Constructs a GetMethod instance.
+     *
+     * @return - GetMethod.
+     */
+    private GetMethod getGetMethod() {
+        return new GetMethod(getUrl());
+    }
+
+    /**
+     * Constructs a PutMethod instance and sets the request data on it.
+     *
+     * @return - PutMethod.
+     */
+    @SuppressWarnings("deprecation")
+    private PutMethod getPutMethod() {
+        PutMethod putMethod = new PutMethod(getUrl());
+
+        putMethod.setRequestBody(getContent());
+
+        return putMethod;
+    }
+
+    /**
+     * Constructs a PostMethod and sets the request data on it.
+     *
+     * @return - PostMethod.
+     */
+    @SuppressWarnings("deprecation")
+    private PostMethod getPostMethod() {
+        PostMethod postMethod = new PostMethod(getUrl());
+
+        /*
+        RequestEntity requestEntity = new StringRequestEntity(
+                request.getContent(),
+                request.getContentType(),
+                request.getContentEncoding());
+
+        postMethod.setRequestEntity(requestEntity);
+        */
+
+        postMethod.setRequestBody(getContent());
+
+        return postMethod;
+    }
+
+    /**
+     * Constructs a DeleteMethod.
+     *
+     * @return - DeleteMethod.
+     */
+    private DeleteMethod getDeleteMethod() {
+        return new DeleteMethod(getUrl());
+    }
+
+    @SuppressWarnings("deprecation")
+    private RuntimeException createRuntimeException(HttpException httpException) {
+        String message = httpException.getMessage();
+        try {
+            JsonElement jsonElement = new JsonParser().parse(new JsonReader(new StringReader(httpException.getMessage())));
+            if (jsonElement != null && jsonElement.getAsJsonObject().has("message")) {
+                message = jsonElement.getAsJsonObject().get("message").getAsString();
+            }
+        } catch (Throwable t) {
+        }
+        if (httpException.getReasonCode() != HttpStatus.SC_OK) {
+            message = httpException.getReasonCode() + " " + httpException.getReason() + ": " + message;
+        }
+        return new RuntimeException(message, httpException);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ClusterConfigParams.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ClusterConfigParams.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ClusterConfigParams.java
new file mode 100644
index 0000000..712432f
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ClusterConfigParams.java
@@ -0,0 +1,84 @@
+/*
+ * 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.funtest.server;
+
+import java.util.Map;
+
+/**
+ * Configurations in Ambari are distinguished using type and tag.
+ * Once a configuration is created, it can be applied to a service,
+ * specifying the type and tag for the configuration.
+ *
+ * Example:
+ * curl -i -X POST -d '{"type": "core-site", "tag": "version1363902625", "properties" : { "fs.default.name" : "localhost:8020"}}'
+ * http://<cluster-name>:8080/api/v1/clusters/c1/configurations
+ */
+public class ClusterConfigParams {
+    /**
+     * Name of the cluster
+     */
+    private String clusterName;
+
+    /**
+     * Configuration tag
+     */
+    private String configTag;
+
+    /**
+     * Configuration type
+     */
+    private String configType;
+
+    /**
+     * Configuration properties
+     */
+    private Map<String, String> properties;
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Map<String, String> properties) {
+        this.properties = properties;
+    }
+
+    public String getConfigType() {
+        return configType;
+    }
+
+    public void setConfigType(String configType) {
+        this.configType = configType;
+    }
+
+    public String getConfigTag() {
+        return configTag;
+    }
+
+    public void setConfigTag(String configTag) {
+        this.configTag = configTag;
+    }
+
+    public String getClusterName() {
+        return clusterName;
+    }
+
+    public void setClusterName(String clusterName) {
+        this.clusterName = clusterName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ConnectionParams.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ConnectionParams.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ConnectionParams.java
new file mode 100644
index 0000000..8352393
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/ConnectionParams.java
@@ -0,0 +1,89 @@
+/*
+ * 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.funtest.server;
+
+/**
+ * Ambari server connection parameters
+ */
+public class ConnectionParams {
+    /**
+     * Server name
+     */
+    private String serverName;
+
+    /**
+     * Server port
+     */
+    private int serverApiPort;
+
+    /**
+     * Agent server port
+     */
+    private int serverAgentPort;
+
+    /**
+     * User name
+     */
+    private String userName;
+
+    /**
+     * Password
+     */
+    private String password;
+
+    public String getServerName() {
+        return serverName;
+    }
+
+    public void setServerName(String serverName) {
+        this.serverName = serverName;
+    }
+
+    public int getServerApiPort() {
+        return serverApiPort;
+    }
+
+    public void setServerApiPort(int serverApiPort) {
+        this.serverApiPort = serverApiPort;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public int getServerAgentPort() {
+        return serverAgentPort;
+    }
+
+    public void setServerAgentPort(int serverAgentPort) {
+        this.serverAgentPort = serverAgentPort;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/LocalAmbariServer.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/LocalAmbariServer.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/LocalAmbariServer.java
new file mode 100644
index 0000000..3698027
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/LocalAmbariServer.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.funtest.server;
+
+import com.google.inject.Inject;
+import com.google.inject.persist.PersistService;
+import org.apache.ambari.server.controller.AmbariServer;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import com.google.inject.Injector;
+
+/**
+* Wrap AmbariServer as a testable unit.
+*/
+public class LocalAmbariServer implements Runnable {
+
+  private static Log LOG = LogFactory.getLog(AmbariServer.class);
+
+  /**
+   * Actual ambari server instance.
+   */
+  private AmbariServer ambariServer = null;
+
+  @Inject
+  private Injector injector;
+
+  public LocalAmbariServer() {}
+
+  /**
+   * Thread entry point.
+   */
+  @Override
+  public void run(){
+    try {
+      startServer();
+    }
+    catch (Exception ex) {
+      LOG.info("Exception received ", ex);
+      throw new RuntimeException(ex);
+    }
+  }
+
+  /**
+   * Configures the Guice injector to use the in-memory test DB
+   * and attempts to start an instance of AmbariServer.
+   *
+   * @throws Exception
+   */
+  private void startServer() throws Exception {
+    try {
+      LOG.info("Attempting to start ambari server...");
+
+      AmbariServer.setupProxyAuth();
+      injector.getInstance(GuiceJpaInitializer.class);
+      ambariServer = injector.getInstance(AmbariServer.class);
+      ambariServer.initViewRegistry();
+      ambariServer.run();
+    } catch (InterruptedException ex) {
+      LOG.info(ex);
+    } catch (Throwable t) {
+      LOG.error("Failed to run the Ambari Server", t);
+      stopServer();
+      throw t;
+    }
+  }
+
+  /**
+   * Attempts to stop the test AmbariServer instance.
+   * @throws Exception
+   */
+  public void stopServer() throws Exception {
+    LOG.info("Stopping ambari server...");
+
+    if (ambariServer != null) {
+      ambariServer.stop();
+    }
+
+    if (injector != null) {
+        injector.getInstance(PersistService.class).stop();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebRequest.java
new file mode 100644
index 0000000..766c84b
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebRequest.java
@@ -0,0 +1,192 @@
+/*
+ * 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.funtest.server;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Makes a request to a URL.
+ */
+public class WebRequest {
+    private String httpMethod;
+    private String url;
+    private String queryString;
+    private String content;
+    private String contentType;
+    private String contentEncoding;
+    private String userName;
+    private String password;
+
+    private Map<String, String> headers = new HashMap<>();
+
+    public WebRequest() {}
+
+    public WebResponse getResponse() throws Exception {
+        return null;
+    }
+
+    /**
+     * Gets the HTTP Method (POST, GET, PUT, DELETE)
+     *
+     * @return - HTTP Method
+     */
+    public String getHttpMethod() { return this.httpMethod; }
+
+    /**
+     * Sets the HTTP Method to use.
+     *
+     * @param httpMethod
+     */
+    public void setHttpMethod(String httpMethod) { this.httpMethod = httpMethod; }
+
+    /**
+     * Gets the full URL to the request.
+     *
+     * @return
+     */
+    public String getUrl() { return this.url; }
+
+    /**
+     * Sets the full URL to the request.
+     *
+     * @param url
+     */
+    public void setUrl(String url) { this.url = url; }
+
+    /**
+     * Gets the query string (name1=value1?name2=value2)
+     *
+     * @return
+     */
+    public String getQueryString() { return this.queryString; }
+
+    /**
+     * Sets the query string
+     *
+     * @param queryString
+     */
+    public void setQueryString(String queryString) { this.queryString = queryString; }
+
+    /**
+     * Gets the request data.
+     *
+     * @return
+     */
+    public String getContent() { return this.content; }
+
+    /**
+     * Sets the request data.
+     *
+     * @param content
+     */
+    public void setContent(String content) { this.content = content; }
+
+    /**
+     * Gets the content type (application/json, application/text)
+     *
+     * @return
+     */
+    public String getContentType() { return this.contentType; }
+
+    /**
+     * Sets the content type.
+     *
+     * @param contentType
+     */
+    public void setContentType(String contentType) { this.contentType = contentType; }
+
+    /**
+     * Gets the content encoding (UTF-8)
+     *
+     * @return
+     */
+    public String getContentEncoding() { return this.contentEncoding; }
+
+    /**
+     * Sets the content encoding
+     *
+     * @param contentEncoding
+     */
+    public void setContentEncoding(String contentEncoding) { this.contentEncoding = contentEncoding; }
+
+    /**
+     * Gets the request headers.
+     *
+     * @return - A read-only collection of headers.
+     */
+    public Map<String, String> getHeaders() {
+        return Collections.unmodifiableMap(this.headers);
+    }
+
+    /**
+     * Clear the request headers.
+     */
+    public void clearHeaders() { this.headers.clear(); }
+
+    /**
+     * Add a collection of request headers.
+     *
+     * @param headers
+     */
+    public void addHeaders(Map<String, String> headers) {
+        for (Map.Entry<String, String> entry : headers.entrySet()) {
+            addHeader(entry.getKey(), entry.getValue());
+        }
+    }
+
+    /**
+     * Add a name-value pair to the request headers.
+     *
+     * @param name
+     * @param value
+     */
+    public void addHeader(String name, String value) {
+        this.headers.put(name, value);
+    }
+
+    /**
+     * Sets the user id for the REST API URL
+     *
+     * @param userName
+     */
+    public void setUserName(String userName) { this.userName = userName; }
+
+    /**
+     * Gets the user name
+     *
+     * @return - User name
+     */
+    public String getUserName() { return this.userName; }
+
+    /**
+     * Sets the password
+     *
+     * @param password - Password
+     */
+    public void setPassword(String password) { this.password = password; }
+
+    /**
+     * Gets the password
+     *
+     * @return - Password
+     */
+    public String getPassword() { return this.password; }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebResponse.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebResponse.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebResponse.java
new file mode 100644
index 0000000..6bf737a
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/WebResponse.java
@@ -0,0 +1,57 @@
+/*
+ * 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.funtest.server;
+
+/**
+ * Gets a response from a URL.
+ */
+public class WebResponse {
+    private String content;
+    private int statusCode;
+
+    public WebResponse() {}
+
+    /**
+     * Gets the response content.
+     *
+     * @return - Response content.
+     */
+    public String getContent() { return this.content; }
+
+    /**
+     * Sets the response content.
+     *
+     * @param content - Response content.
+     */
+    public void setContent(String content) { this.content = content; }
+
+    /**
+     * Gets the response status code.
+     *
+     * @return - Response status code.
+     */
+    public int getStatusCode() { return this.statusCode; }
+
+    /**
+     * Sets the response status code.
+     *
+     * @param statusCode - Response status code.
+     */
+    public void setStatusCode(int statusCode) { this.statusCode = statusCode;}
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/AddDesiredConfigurationWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/AddDesiredConfigurationWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/AddDesiredConfigurationWebRequest.java
new file mode 100644
index 0000000..847451e
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/AddDesiredConfigurationWebRequest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.funtest.server.api.cluster;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ClusterConfigParams;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Adds an existing configuration, identified by it's type and tag, to a cluster.
+ */
+public class AddDesiredConfigurationWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String configType;
+    private String configTag;
+    private static String pathFormat = "/api/v1/clusters/%s";
+
+    /**
+     *
+     * @param serverParams - Ambari server connection information
+     * @param configParams - Cluster configuration parameters
+     */
+    public AddDesiredConfigurationWebRequest(ConnectionParams serverParams, ClusterConfigParams configParams) {
+        super(serverParams);
+        this.clusterName = configParams.getClusterName();
+        this.configType = configParams.getConfigType();
+        this.configTag = configParams.getConfigTag();
+    }
+
+    /**
+     * Gets the cluster name.
+     *
+     * @return - Cluster name.
+     */
+    public String getClusterName() { return this.clusterName; }
+
+    /**
+     * Gets the configuration type.
+     *
+     * @return - Configuration type.
+     */
+    public String getConfigType() { return this.configType; }
+
+    /**
+     * Gets the configuration tag.
+     *
+     * @return - Configuration tag.
+     */
+    public String getConfigTag() { return this.configTag; }
+
+    /**
+     * Gets the REST API method.
+     *
+     * @return - PUT.
+     */
+    @Override
+    public String getHttpMethod() {
+        return "PUT";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName);
+    }
+
+    /**
+     * Gets the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * { "Clusters" : {"desired_configs": {"type": "test-site", "tag" : "version1" }}}
+         */
+        JsonObject jsonObject;
+        JsonObject jsonDesiredConfigs = new JsonObject();
+
+        jsonDesiredConfigs.addProperty("type", configType);
+        jsonDesiredConfigs.addProperty("tag", configTag);
+        jsonObject = createJsonObject("Clusters", createJsonObject("desired_configs", jsonDesiredConfigs));
+        Gson gson = new Gson();
+        return gson.toJson(jsonObject);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateClusterWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateClusterWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateClusterWebRequest.java
new file mode 100644
index 0000000..5219206
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateClusterWebRequest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.funtest.server.api.cluster;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Creates a new cluster.
+ */
+public class CreateClusterWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String clusterVersion;
+    private static String pathFormat = "/api/v1/clusters/%s";
+
+    /**
+     * Creates a new cluster with the specified name and version.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Cluster name, like "test-cluster"
+     * @param clusterVersion - Cluster version, like "HDP-2.2.0"
+     */
+    public CreateClusterWebRequest(ConnectionParams params, String clusterName, String clusterVersion) {
+        super(params);
+        this.clusterName = clusterName;
+        this.clusterVersion = clusterVersion;
+    }
+
+    /**
+     * Gets the cluster name.
+     *
+     * @return - Cluster name.
+     */
+    public String getClusterName() { return this.clusterName; }
+
+    /**
+     * Gets the cluster version.
+     *
+     * @return - Cluster version.
+     */
+    public String getClusterVersion() { return this.clusterVersion; }
+
+    @Override
+    public String getHttpMethod() {
+        return "POST";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName);
+    }
+
+    /**
+     * Gets the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        JsonObject jsonClustersObj = new JsonObject();
+        jsonClustersObj.add("Clusters", createJsonObject("version", getClusterVersion()));
+        Gson gson = new Gson();
+        return gson.toJson(jsonClustersObj);
+    }
+}