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:27 UTC

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

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateConfigurationWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateConfigurationWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateConfigurationWebRequest.java
new file mode 100644
index 0000000..884eb7b
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/CreateConfigurationWebRequest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.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;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CreateConfigurationWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String configType;
+    private String configTag;
+    private Map<String, String> properties;
+    private static String pathFormat = "/api/v1/clusters/%s/configurations";
+
+    public CreateConfigurationWebRequest(ConnectionParams serverParams, ClusterConfigParams configParams) {
+        super(serverParams);
+        this.clusterName = configParams.getClusterName();
+        this.configType = configParams.getConfigType();
+        this.configTag = configParams.getConfigTag();
+        this.properties = new HashMap<>(configParams.getProperties());
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getConfigType() { return this.configType; }
+
+    public String getConfigTag() { return this.configTag; }
+
+    @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() {
+        /**
+         *  {"type": "core-site", "tag": "version1363902625", "properties" : { "fs.default.name" : "localhost:8020"}}
+         */
+        JsonObject jsonPropertiesObj = new JsonObject();
+        for (Map.Entry<String, String> property : properties.entrySet()) {
+            jsonPropertiesObj.addProperty(property.getKey(), property.getValue());
+        }
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("type", configType);
+        jsonObject.addProperty("tag", configTag);
+        jsonObject.add("properties", jsonPropertiesObj);
+        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/GetAllClustersWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetAllClustersWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetAllClustersWebRequest.java
new file mode 100644
index 0000000..4b916d1
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetAllClustersWebRequest.java
@@ -0,0 +1,53 @@
+/*
+ * 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 org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets all the clusters.
+ */
+public class GetAllClustersWebRequest extends AmbariHttpWebRequest {
+    private static String pathFormat = "/api/v1/clusters";
+
+    public GetAllClustersWebRequest(ConnectionParams params) {
+        super(params);
+    }
+
+    /**
+     * Gets the REST API method.
+     *
+     * @return - GET.
+     */
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return pathFormat;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetClusterWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetClusterWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetClusterWebRequest.java
new file mode 100644
index 0000000..49b0687
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetClusterWebRequest.java
@@ -0,0 +1,49 @@
+/*
+ * 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 org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+public class GetClusterWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private static String pathFormat = "/api/v1/clusters/%s";
+
+    public GetClusterWebRequest(ConnectionParams params, String clusterName) {
+        super(params);
+        this.clusterName = clusterName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetRequestStatusWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetRequestStatusWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetRequestStatusWebRequest.java
new file mode 100644
index 0000000..e2cf8ae
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/cluster/GetRequestStatusWebRequest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.funtest.server.api.cluster;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets the status of a request by request id. For example:
+ * curl --user admin:admin -i -X GET http://AMBARI_SERVER_HOST:8080/api/v1/clusters/CLUSTER_NAME/requests/9
+ * curl --user admin:admin -i -X GET http://AMBARI_SERVER_HOST:8080/api/v1/clusters/CLUSTER_NAME/requests/9/tasks/101
+ *
+ * Response:
+ * {
+ * "href" : "http://AMBARI_SERVER_HOST:8080/api/v1/clusters/CLUSTER_NAME/requests/9/tasks/101",
+ * "Tasks" : {
+ * ...
+ * "status" : "COMPLETED",
+ * ...
+ * }
+ * }
+ */
+public class GetRequestStatusWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private int requestId;
+    private int taskId;
+    private static String pathFormat = "/api/v1/clusters/%s/requests/%d";
+    private static String pathFormatWithTask = "/api/v1/clusters/%s/requests/%d/tasks/%d";
+
+    public GetRequestStatusWebRequest(ConnectionParams params, String clusterName, int requestId) {
+        this(params, clusterName, requestId, -1);
+    }
+
+    public GetRequestStatusWebRequest(ConnectionParams params, String clusterName, int requestId, int taskId) {
+        super(params);
+        this.clusterName = clusterName;
+        this.requestId = requestId;
+        this.taskId = taskId;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public int getRequestId() { return this.requestId; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        if (taskId != -1)
+            return String.format(pathFormatWithTask, clusterName, requestId, taskId);
+
+        return String.format(pathFormat, clusterName, requestId);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/AddHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/AddHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/AddHostWebRequest.java
new file mode 100644
index 0000000..70b0642
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/AddHostWebRequest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.host;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Adds a host to an existing cluster.
+ */
+public class AddHostWebRequest extends AmbariHttpWebRequest {
+    private String clusterName = null;
+    private String hostName = null;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts/%s";
+
+    /**
+     * Adds the specified host to an existing cluster.
+     *
+     * @param params - Ambari connection information.
+     * @param clusterName - Existing cluster name.
+     * @param hostName - New host name. Host must have been registered previously using RegisterHostWebRequest.
+     */
+    public AddHostWebRequest(ConnectionParams params, String clusterName, String hostName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostName = hostName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.hostName; }
+
+    @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, hostName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetHostWebRequest.java
new file mode 100644
index 0000000..d4fa154
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetHostWebRequest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.host;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets the host identitied by the cluster name and host name.
+ */
+public class GetHostWebRequest extends AmbariHttpWebRequest {
+    private String clusterName = null;
+    private String hostName = null;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts/%s";
+
+    public GetHostWebRequest(ConnectionParams params, String clusterName, String hostName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostName = hostName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.hostName; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, hostName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetRegisteredHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetRegisteredHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetRegisteredHostWebRequest.java
new file mode 100644
index 0000000..95c2168
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/GetRegisteredHostWebRequest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.host;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets a host that was previously registered with Ambari. Use this
+ * method to verify if a host was registered.
+ */
+public class GetRegisteredHostWebRequest extends AmbariHttpWebRequest {
+    private String hostName = null;
+    private static String pathFormat = "/api/v1/hosts/%s";
+
+    /**
+     * Gets the host information for a registered host.
+     *
+     * @param params - Ambari server connection information.
+     * @param hostName - Name of the registered host.
+     */
+    public GetRegisteredHostWebRequest(ConnectionParams params, String hostName) {
+        super(params);
+        this.hostName = hostName;
+    }
+
+    public String getHostName() { return this.hostName; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, hostName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/RegisterHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/RegisterHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/RegisterHostWebRequest.java
new file mode 100644
index 0000000..1a50b64
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/host/RegisterHostWebRequest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.host;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Registers a host with Ambari. A host must
+ * be registered before it can be added to a cluster.
+ */
+public class RegisterHostWebRequest extends AmbariHttpWebRequest {
+    private String hostName = null;
+    private static String pathFormat = "/agent/v1/register/%s";
+
+    /**
+     * Registers a new host with Ambari.
+     *
+     * @param params - Ambari server connection information.
+     * @param hostName - Host name to be newly registered.
+     */
+    public RegisterHostWebRequest(ConnectionParams params, String hostName) {
+        super(params);
+        this.hostName = hostName;
+    }
+
+    public String getHostName() { return this.hostName; }
+
+    @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, hostName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/AddServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/AddServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/AddServiceWebRequest.java
new file mode 100644
index 0000000..43f4109
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/AddServiceWebRequest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Adds a service to the specified cluster. The service name is sent in the request data.
+ */
+public class AddServiceWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private static String pathFormat = "/api/v1/clusters/%s/services";
+
+    /**
+     * Add serviceName to the cluster clusterName
+     *
+     * @param params - Ambari server connection information
+     * @param clusterName - Existing name of a cluster.
+     * @param serviceName - Service name to be added.
+     */
+    public AddServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+    }
+
+    /**
+     * Gets the cluster name.
+     * @return
+     */
+    public String getClusterName() { return this.clusterName; }
+
+    /**
+     * Gets the service name to be added.
+     *
+     * @return
+     */
+    public String getServiceName() { return this.serviceName; }
+
+    /**
+     * Gets the REST API method to use.
+     *
+     * @return - POST.
+     */
+    @Override
+    public String getHttpMethod() {
+        return "POST";
+    }
+
+    /**
+     * Gets the API fragment to be added to the server URL.
+     * @return
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * {
+         *   "ServiceInfo" : {
+         *     "service_name" : serviceName
+         *   }
+         * }
+         */
+        JsonObject jsonServiceInfoObj;
+        jsonServiceInfoObj = createJsonObject("ServiceInfo", createJsonObject("service_name", serviceName));
+        Gson gson = new Gson();
+        return gson.toJson(jsonServiceInfoObj);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/DeleteServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/DeleteServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/DeleteServiceWebRequest.java
new file mode 100644
index 0000000..f1adaa9
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/DeleteServiceWebRequest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.service;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Deletes the specified service from the specified cluster.
+ */
+public class DeleteServiceWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s";
+
+    /**
+     * Deletes a service from a cluster.
+     *
+     * @param params - Ambari server connection information
+     * @param clusterName - Cluster from where the service is to be deleted.
+     * @param serviceName - Service to be deleted.
+     */
+    public DeleteServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+    }
+
+    public String getClusterName() {
+        return this.clusterName;
+    }
+
+    public String getHostName() {
+        return this.serviceName;
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return "DELETE";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, serviceName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/GetServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/GetServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/GetServiceWebRequest.java
new file mode 100644
index 0000000..cf8f280
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/GetServiceWebRequest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.service;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets the specified service from the specified cluster.
+ */
+public class GetServiceWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s";
+
+    /**
+     * Gets a service from a cluster.
+     *
+     * @param params - Ambari server connection information
+     * @param clusterName - Cluster from where the service is to be deleted.
+     * @param serviceName - Service to be deleted.
+     */
+    public GetServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+    }
+
+    public String getClusterName() {
+        return this.clusterName;
+    }
+
+    public String getHostName() {
+        return this.serviceName;
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, serviceName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/InstallServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/InstallServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/InstallServiceWebRequest.java
new file mode 100644
index 0000000..0837066
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/InstallServiceWebRequest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.service;
+
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+/**
+ * Installs a service.
+ */
+public class InstallServiceWebRequest extends SetServiceStateWebRequest {
+
+    /**
+     * Updates the state of the specified service to INSTALLED.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Service to be installed.
+     */
+    public InstallServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params, clusterName, serviceName, State.INSTALLED, "Install service");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/SetServiceStateWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/SetServiceStateWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/SetServiceStateWebRequest.java
new file mode 100644
index 0000000..a6c2530
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/SetServiceStateWebRequest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+/**
+ * Updates the state of a service in a cluster.
+ */
+public class SetServiceStateWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private State serviceState;
+    private String requestContext;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s";
+
+    /**
+     * Updates the state of the specified service in the specified cluster.
+     *
+     * @param params - Ambari connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Service name whose state is to be updated.
+     * @param serviceState - New service state.
+     * @param requestContext - Comments or remarks.
+     */
+    public SetServiceStateWebRequest(ConnectionParams params, String clusterName, String serviceName, State serviceState,
+                                     String requestContext) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+        this.serviceState = serviceState;
+        this.requestContext = requestContext;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.serviceName; }
+
+    public State getServiceState() { return this.serviceState; }
+
+    public String getRequestContext() { return this.requestContext; }
+
+    @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, serviceName);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * {
+         * "RequestInfo" : {"context" : requestContext},
+         * "Body" : {"ServiceInfo" : {"state" : serviceState}}
+         * }
+         */
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.add("RequestInfo", createJsonObject("context", requestContext));
+        jsonObject.add("Body", createJsonObject("ServiceInfo", createJsonObject("state", serviceState.toString())));
+        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/service/StartServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StartServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StartServiceWebRequest.java
new file mode 100644
index 0000000..d33db00
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StartServiceWebRequest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.service;
+
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+/**
+ * Starts a service by updating it's state to STARTED.
+ */
+public class StartServiceWebRequest extends SetServiceStateWebRequest {
+    /**
+     * Updates the state of the specified service to STARTED.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Service to be started.
+     */
+    public StartServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params, clusterName, serviceName, State.STARTED, "Start service");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StopServiceWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StopServiceWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StopServiceWebRequest.java
new file mode 100644
index 0000000..d40e8b6
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/service/StopServiceWebRequest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.service;
+
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+/**
+ * Stop a service by updating it's state to INSTALLED.
+ */
+public class StopServiceWebRequest extends SetServiceStateWebRequest {
+    /**
+     * Updates the state of the specified service to INSTALLED.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Service to be stopped.
+     */
+    public StopServiceWebRequest(ConnectionParams params, String clusterName, String serviceName) {
+        super(params, clusterName, serviceName, State.INSTALLED, "Stop service");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/AddServiceComponentWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/AddServiceComponentWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/AddServiceComponentWebRequest.java
new file mode 100644
index 0000000..3ff4201
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/AddServiceComponentWebRequest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicecomponent;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Adds a component to a service.
+ */
+public class AddServiceComponentWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private String componentName;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s/components/%s";
+
+    /**
+     * Adds the specified service component to the specified service.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Existing service name.
+     * @param componentName - Component to be added to a service.
+     */
+    public AddServiceComponentWebRequest(ConnectionParams params, String clusterName, String serviceName,
+                                         String componentName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+        this.componentName = componentName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getServiceName() { return this.serviceName; }
+
+    public String getComponentName() { return this.componentName; }
+
+    @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, serviceName, componentName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/GetServiceComponentWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/GetServiceComponentWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/GetServiceComponentWebRequest.java
new file mode 100644
index 0000000..3f96c1c
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/GetServiceComponentWebRequest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicecomponent;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets a component to a service.
+ */
+public class GetServiceComponentWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private String componentName;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s/components/%s";
+
+    /**
+     * Gets the specified service component to the specified service.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param serviceName - Existing service name.
+     * @param componentName - Component to be added to a service.
+     */
+    public GetServiceComponentWebRequest(ConnectionParams params, String clusterName, String serviceName,
+                                         String componentName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+        this.componentName = componentName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getServiceName() { return this.serviceName; }
+
+    public String getComponentName() { return this.componentName; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, serviceName, componentName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/SetServiceComponentStateWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/SetServiceComponentStateWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/SetServiceComponentStateWebRequest.java
new file mode 100644
index 0000000..f74fcea
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponent/SetServiceComponentStateWebRequest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.funtest.server.api.servicecomponent;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+public class SetServiceComponentStateWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String serviceName;
+    private String componentName;
+    private State componentState;
+    private String requestContext;
+    private static String pathFormat = "/api/v1/clusters/%s/services/%s";
+
+    public SetServiceComponentStateWebRequest(ConnectionParams params, String clusterName, String serviceName,
+                                              String componentName, State componentState, String requestContext) {
+        super(params);
+        this.clusterName = clusterName;
+        this.serviceName = serviceName;
+        this.componentName = componentName;
+        this.componentState = componentState;
+        this.requestContext = requestContext;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getServiceName() { return this.serviceName; }
+
+    public State getComponentState() { return this.componentState; }
+
+    public String getRequestContext() { return this.requestContext; }
+
+    @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, serviceName, componentName);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * {
+         * "RequestInfo" : {"context" : requestContext},
+         * "Body" : {"ServiceComponentInfo" : {"state" : componentState}}
+         * }
+         */
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.add("RequestInfo", createJsonObject("context", requestContext));
+        jsonObject.add("Body", createJsonObject("ServiceComponentInfo", createJsonObject("state", componentState.toString())));
+        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/servicecomponenthost/AddServiceComponentHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/AddServiceComponentHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/AddServiceComponentHostWebRequest.java
new file mode 100644
index 0000000..2bd3960
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/AddServiceComponentHostWebRequest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicecomponenthost;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Adds a service component to a host.
+ */
+public class AddServiceComponentHostWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String hostName;
+    private String componentName;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts/%s/host_components/%s";
+
+    /**
+     * Adds the specified service component to the specified host.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster.
+     * @param hostName - Existing host.
+     * @param componentName - Component to be added to hostName.
+     */
+    public AddServiceComponentHostWebRequest(ConnectionParams params, String clusterName, String hostName,
+                                             String componentName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostName = hostName;
+        this.componentName = componentName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.hostName; }
+
+    public String getComponentName() { return this.componentName; }
+
+    @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, hostName, componentName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkAddServiceComponentHostsWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkAddServiceComponentHostsWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkAddServiceComponentHostsWebRequest.java
new file mode 100644
index 0000000..82b4b93
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkAddServiceComponentHostsWebRequest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.servicecomponenthost;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Bulk add a set of components on multiple hosts.
+ * Replaces multiple calls to AddServiceComponentHostWebRequest
+ */
+public class BulkAddServiceComponentHostsWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private List<String> hostNames;
+    private List<String> componentNames;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts";
+
+    /**
+     * Adds multiple componenents to multiple hosts.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster.
+     * @param hostNames - Hosts on which components are to be added.
+     * @param componentNames - Components to be added.
+     */
+    public BulkAddServiceComponentHostsWebRequest(ConnectionParams params, String clusterName, List<String> hostNames,
+                                                  List<String> componentNames) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostNames = new ArrayList<>(hostNames);
+        this.componentNames = new ArrayList<>(componentNames);
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public List<String> getHostNames() { return Collections.unmodifiableList(this.hostNames); }
+
+    public List<String> getComponentNames() { return Collections.unmodifiableList(this.componentNames); }
+
+    @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);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * {
+         *   "RequestInfo" : {
+         *     "query":"Hosts/host_name.in(host1,host2)"
+         *   },
+         *   "Body" : {
+         *     "host_components": [
+         *     {
+         *       "HostRoles" : { "component_name" : "HIVE_CLIENT" }
+         *     },
+         *     {
+         *       "HostRoles" : { "component_name" : "TEZ_CLIENT" }
+         *     }
+         *     ]
+         * }
+         */
+        JsonObject jsonObject =  new JsonObject();
+        JsonArray hostRoles = new JsonArray();
+
+        jsonObject.add("RequestInfo", createJsonObject("query", String.format("Hosts/host_name.in(%s)", toCsv(hostNames))));
+
+        for (String componentName : componentNames) {
+            hostRoles.add(createJsonObject("HostRoles", createJsonObject("component_name", componentName)));
+        }
+
+        jsonObject.add("Body", createJsonObject("host_components", hostRoles));
+
+        Gson gson = new Gson();
+        return gson.toJson(jsonObject);
+    }
+
+    private static String toCsv(List<String> list) {
+        StringBuilder sb = new StringBuilder();
+
+        for (String item : list) {
+            sb.append(String.format("%s,", item));
+        }
+
+        sb.deleteCharAt(sb.length() - 1);
+
+        return sb.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkSetServiceComponentHostStateWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkSetServiceComponentHostStateWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkSetServiceComponentHostStateWebRequest.java
new file mode 100644
index 0000000..81b920a
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/BulkSetServiceComponentHostStateWebRequest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.servicecomponenthost;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+/**
+ * Updates the state of the specified set of components.
+ */
+public class BulkSetServiceComponentHostStateWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private State currentState;
+    private State desiredState;
+
+    private static String pathFormat = "/api/v1/clusters/%s/host_components?HostRoles/state=%s";
+
+    /**
+     * Updates the state of multiple components in a cluster.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster name.
+     * @param currentState - Desired state.
+     * @param desiredState - Current state.
+     */
+    public BulkSetServiceComponentHostStateWebRequest(ConnectionParams params, String clusterName, State currentState,
+                                                      State desiredState) {
+        super(params);
+        this.clusterName = clusterName;
+        this.currentState = currentState;
+        this.desiredState = desiredState;
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return "PUT";
+    }
+
+    public State getCurrentState() { return this. currentState; }
+
+    public State getDesiredState() { return this.desiredState; }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, this.currentState);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         *     {
+         *       "HostRoles" : { "state" : "INSTALLED" }
+         *     }
+         */
+        JsonObject jsonObject =  new JsonObject();
+
+        jsonObject.add("HostRoles", createJsonObject("state", desiredState.toString()));
+
+        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/servicecomponenthost/GetServiceComponentHostWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/GetServiceComponentHostWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/GetServiceComponentHostWebRequest.java
new file mode 100644
index 0000000..b9a126e
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/GetServiceComponentHostWebRequest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.servicecomponenthost;
+
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+
+/**
+ * Gets a service component to a host.
+ */
+public class GetServiceComponentHostWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String hostName;
+    private String componentName;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts/%s/host_components/%s";
+
+    /**
+     * Gets the specified service component to the specified host.
+     *
+     * @param params - Ambari server connection information.
+     * @param clusterName - Existing cluster.
+     * @param hostName - Existing host.
+     * @param componentName - Component to be added to hostName.
+     */
+    public GetServiceComponentHostWebRequest(ConnectionParams params, String clusterName, String hostName,
+                                             String componentName) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostName = hostName;
+        this.componentName = componentName;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.hostName; }
+
+    public String getComponentName() { return this.componentName; }
+
+    @Override
+    public String getHttpMethod() {
+        return "GET";
+    }
+
+    /**
+     * Get REST API path fragment for construction full URI.
+     *
+     * @return - REST API path
+     */
+    @Override
+    protected String getApiPath() {
+        return String.format(pathFormat, clusterName, hostName, componentName);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/SetServiceComponentHostStateWebRequest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/SetServiceComponentHostStateWebRequest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/SetServiceComponentHostStateWebRequest.java
new file mode 100644
index 0000000..e758904
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/api/servicecomponenthost/SetServiceComponentHostStateWebRequest.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.api.servicecomponenthost;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.AmbariHttpWebRequest;
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.server.state.State;
+
+public class SetServiceComponentHostStateWebRequest extends AmbariHttpWebRequest {
+    private String clusterName;
+    private String hostName;
+    private String componentName;
+    private State componentState;
+    private String requestContext;
+    private static String pathFormat = "/api/v1/clusters/%s/hosts/%s/host_components/%s";
+
+    public SetServiceComponentHostStateWebRequest(ConnectionParams params, String clusterName, String hostName,
+                                                  String componentName, State componentState, String requestContext) {
+        super(params);
+        this.clusterName = clusterName;
+        this.hostName = hostName;
+        this.componentName = componentName;
+        this.componentState = componentState;
+        this.requestContext = requestContext;
+    }
+
+    public String getClusterName() { return this.clusterName; }
+
+    public String getHostName() { return this.hostName; }
+
+    public State getComponentState() { return this.componentState; }
+
+    public String getRequestContext() { return this.requestContext; }
+
+    @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, hostName, componentName);
+    }
+
+    /**
+     * Constructs the request data.
+     *
+     * @return - Request data.
+     */
+    @Override
+    protected String getRequestData() {
+        /**
+         * {
+         * "RequestInfo" : {"context" : requestContext},
+         * "Body" : {"HostRoles" : {"state" : componentState}}
+         * }
+         */
+        String content;
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.add("RequestInfo", createJsonObject("context", requestContext));
+        jsonObject.add("Body", createJsonObject("HostRoles", createJsonObject("state", componentState.toString())));
+        Gson gson = new Gson();
+        content = gson.toJson(jsonObject);
+        return content;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/orm/InMemoryDefaultTestModule.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/orm/InMemoryDefaultTestModule.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/orm/InMemoryDefaultTestModule.java
new file mode 100644
index 0000000..7b49611
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/orm/InMemoryDefaultTestModule.java
@@ -0,0 +1,88 @@
+package org.apache.ambari.funtest.server.orm;
+
+/**
+ * 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.
+ */
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.ControllerModule;
+import org.springframework.beans.factory.config.BeanDefinition;
+
+import com.google.inject.AbstractModule;
+
+public class InMemoryDefaultTestModule extends AbstractModule {
+
+  /**
+   * Saves all {@link ControllerModule} logic, but changes bean discovery mechanism.
+   * In this implementation scan for {@link org.apache.ambari.server.EagerSingleton}
+   * and {@link org.apache.ambari.server.StaticallyInject} and
+   * {@link org.apache.ambari.server.AmbariService} annotations will not be run for every test.
+   */
+  private static class BeanDefinitionsCachingTestControllerModule extends ControllerModule {
+
+    // Access should be synchronised to allow concurrent test runs.
+    private static final AtomicReference<Set<BeanDefinition>> foundBeanDefinitions
+        = new AtomicReference<Set<BeanDefinition>>(null);
+
+    public BeanDefinitionsCachingTestControllerModule(Properties properties) throws Exception {
+      super(properties);
+    }
+
+    @Override
+    protected Set<BeanDefinition> bindByAnnotation(Set<BeanDefinition> beanDefinitions) {
+      Set<BeanDefinition> newBeanDefinitions = super.bindByAnnotation(foundBeanDefinitions.get());
+      foundBeanDefinitions.compareAndSet(null, Collections.unmodifiableSet(newBeanDefinitions));
+      return null;
+    }
+  }
+
+  Properties properties = new Properties();
+
+  @Override
+  protected void configure() {
+    String stacks = "src/test/resources/stacks";
+    String version = "src/test/resources/version";
+    String sharedResourcesDir = "src/test/resources/";
+    if (System.getProperty("os.name").contains("Windows")) {
+      stacks = ClassLoader.getSystemClassLoader().getResource("stacks").getPath();
+      version = new File(new File(ClassLoader.getSystemClassLoader().getResource("").getPath()).getParent(), "version").getPath();
+      sharedResourcesDir = ClassLoader.getSystemClassLoader().getResource("").getPath();
+    }
+
+    properties.setProperty(Configuration.SERVER_PERSISTENCE_TYPE_KEY, "in-memory");
+    properties.setProperty(Configuration.METADATA_DIR_PATH, stacks);
+    properties.setProperty(Configuration.SERVER_VERSION_FILE, version);
+    properties.setProperty(Configuration.OS_VERSION_KEY, "centos6");
+    properties.setProperty(Configuration.SHARED_RESOURCES_DIR_KEY, sharedResourcesDir);
+
+    try {
+      install(new BeanDefinitionsCachingTestControllerModule(properties));
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public Properties getProperties() {
+    return properties;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ffb4d3b8/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
new file mode 100644
index 0000000..3f38acf
--- /dev/null
+++ b/ambari-funtest/src/test/java/org/apache/ambari/funtest/server/tests/DeleteServiceTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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.tests;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import org.apache.ambari.funtest.server.ConnectionParams;
+import org.apache.ambari.funtest.server.WebResponse;
+import org.apache.ambari.funtest.server.api.service.DeleteServiceWebRequest;
+import org.apache.ambari.funtest.server.api.service.GetServiceWebRequest;
+import org.apache.ambari.funtest.server.api.service.StopServiceWebRequest;
+import org.apache.ambari.funtest.server.utils.ClusterUtils;
+import org.apache.ambari.funtest.server.utils.RestApiUtils;
+import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
+import org.apache.ambari.server.orm.dao.ServiceDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
+import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
+import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
+import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
+import org.apache.ambari.server.state.State;
+
+import org.apache.commons.httpclient.HttpStatus;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * Simple test that starts the local ambari server,
+ * tests it's status and shuts down the server.
+ */
+@Ignore
+public class DeleteServiceTest extends ServerTestBase {
+    /**
+     * Set up a test cluster with a service, a host and a few components.
+     * Attempt to delete the service. Verify the state of the DB.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testDeleteService() throws Exception {
+        String clusterName = "c1";
+        String serviceName = "HDFS";
+        ConnectionParams params = new ConnectionParams();
+
+        params.setServerName("localhost");
+        params.setServerApiPort(serverPort);
+        params.setServerAgentPort(serverAgentPort);
+        params.setUserName("admin");
+        params.setPassword("admin");
+
+        ClusterUtils clusterUtils = injector.getInstance(ClusterUtils.class);
+        clusterUtils.createSampleCluster(params);
+
+        /**
+         * Verify the status of the service
+         */
+        JsonElement jsonResponse = RestApiUtils.executeRequest(new GetServiceWebRequest(params, clusterName, serviceName));
+        assertTrue(!jsonResponse.isJsonNull());
+        JsonObject jsonServiceInfoObj = jsonResponse.getAsJsonObject().get("ServiceInfo").getAsJsonObject();
+        String cluster_name = jsonServiceInfoObj.get("cluster_name").getAsString();
+        assertEquals(cluster_name, clusterName);
+
+        String service_name = jsonServiceInfoObj.get("service_name").getAsString();
+        assertEquals(service_name, serviceName);
+
+        /**
+         * Check the following:
+         * ClusterServiceDAO
+         * ServiceDesiredStateDAO
+         * ServiceComponentDesiredStateDAO
+         * HostComponentStateDAO
+         * HostComponentDesiredStateDAO
+         */
+
+        /**
+         * Stop the service
+         */
+
+        jsonResponse = RestApiUtils.executeRequest(new StopServiceWebRequest(params, clusterName, serviceName));
+
+        /**
+         * clusterservice table
+         */
+        ClusterServiceDAO clusterServiceDAO = injector.getInstance(ClusterServiceDAO.class);
+        List<ClusterServiceEntity> clusterServiceEntities = clusterServiceDAO.findAll();
+        assertEquals(clusterServiceEntities.size(), 1); // Only one service in the sample cluster (HDFS)
+        assertEquals(clusterServiceEntities.get(0).getServiceName(), serviceName); // Verify the only service name
+
+        ClusterServiceEntity clusterServiceEntity = clusterServiceEntities.get(0);
+        long clusterId = clusterServiceEntity.getClusterId();
+
+        /**
+         * servicedesiredstate table
+         */
+        ServiceDesiredStateDAO serviceDesiredStateDAO = injector.getInstance(ServiceDesiredStateDAO.class);
+        List<ServiceDesiredStateEntity> serviceDesiredStateEntities = serviceDesiredStateDAO.findAll();
+        assertEquals(serviceDesiredStateEntities.size(), 1);
+        ServiceDesiredStateEntity serviceDesiredStateEntity = serviceDesiredStateEntities.get(0);
+        assertEquals(serviceDesiredStateEntity.getServiceName(), serviceName);
+        assertEquals(serviceDesiredStateEntity.getDesiredState(), State.INSTALLED);
+
+        /**
+         * servicecomponentdesiredstate table
+         */
+        ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class);
+        List<ServiceComponentDesiredStateEntity>  serviceComponentDesiredStateEntities =  serviceComponentDesiredStateDAO.findAll();
+        assertEquals(serviceComponentDesiredStateEntities.size(), 3); // NAMENODE, SECONDARY_NAMENODE, DATANODE.
+        for (ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity : serviceComponentDesiredStateEntities) {
+            assertEquals(serviceComponentDesiredStateEntity.getDesiredState(), State.INSTALLED);
+        }
+
+        /**
+         * hostcomponentstate table
+         */
+        HostComponentStateDAO hostComponentStateDAO = injector.getInstance(HostComponentStateDAO.class);
+        List<HostComponentStateEntity> hostComponentStateEntities = hostComponentStateDAO.findAll();
+        assertEquals(hostComponentStateEntities.size(), 3);
+
+        /**
+         * hostcomponentdesiredstate table
+         */
+        HostComponentDesiredStateDAO hostComponentDesiredStateDAO = injector.getInstance(HostComponentDesiredStateDAO.class);
+        List<HostComponentDesiredStateEntity> hostComponentDesiredStateEntities = hostComponentDesiredStateDAO.findAll();
+        assertEquals(hostComponentDesiredStateEntities.size(), 3);
+
+        /**
+         * Delete the service
+         */
+        jsonResponse = RestApiUtils.executeRequest(new DeleteServiceWebRequest(params, clusterName, serviceName));
+
+        WebResponse webResponse = new GetServiceWebRequest(params, clusterName, serviceName).getResponse();
+        assertEquals(webResponse.getStatusCode(), HttpStatus.SC_NOT_FOUND);
+
+        /**
+         * ClusterServiceDAO - the service entry should have been removed.
+         */
+        clusterServiceEntity = clusterServiceDAO.findByClusterAndServiceNames(clusterName, serviceName);
+        assertTrue(clusterServiceEntity == null);
+
+        /**
+         * ServiceDesiredStateDAO - the service entry should have been removed.
+         */
+        ServiceDesiredStateEntityPK serviceDesiredStateEntityPK = injector.getInstance(ServiceDesiredStateEntityPK.class);
+        serviceDesiredStateEntityPK.setClusterId(clusterId);
+        serviceDesiredStateEntityPK.setServiceName(serviceName);
+        serviceDesiredStateEntity =  serviceDesiredStateDAO.findByPK(serviceDesiredStateEntityPK);
+        assertTrue(serviceDesiredStateEntity == null);
+
+        /**
+         * ServiceComponentDesiredStateDAO
+         */
+        ServiceComponentDesiredStateEntityPK serviceComponentDesiredStateEntityPK = injector.getInstance(ServiceComponentDesiredStateEntityPK.class);
+        ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByPK(serviceComponentDesiredStateEntityPK);
+        assertTrue(serviceComponentDesiredStateEntity == null);
+
+        /**
+         * HostComponentStateDAO
+         */
+        hostComponentStateEntities = hostComponentStateDAO.findByService(serviceName);
+        assertEquals(hostComponentStateEntities.size(), 0);
+
+
+        /**
+         * HostComponentDesiredStateDAO
+         */
+        hostComponentDesiredStateEntities = hostComponentDesiredStateDAO.findAll();
+        assertEquals(hostComponentDesiredStateEntities.size(), 0);
+    }
+}
\ No newline at end of file