You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2016/06/27 23:36:58 UTC

[32/34] ambari git commit: AMBARI-17355 & AMBARI-17354: POC: FE & BE changes for first class support for Yarn hosted services

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RemoteClustersService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RemoteClustersService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RemoteClustersService.java
index d7c7a20..ccfafd6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RemoteClustersService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RemoteClustersService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 import com.google.common.base.Optional;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
 
@@ -40,9 +41,12 @@ import java.util.Collections;
 /**
  * Service responsible for Remote Cluster resource requests.
  */
-@Path("/remoteclusters")
 public class RemoteClustersService extends BaseService {
 
+  public RemoteClustersService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Get the list of all Remote Clusters
    * @param headers

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryService.java
index e366ad5..cdbb00e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryService.java
@@ -49,6 +49,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -66,7 +67,8 @@ public class RepositoryService extends BaseService {
    *
    * @param parentKeyProperties extra properties to be inserted into created resource
    */
-  public RepositoryService(Map<Resource.Type, String> parentKeyProperties) {
+  public RepositoryService(ApiVersion apiVersion, Map<Resource.Type, String> parentKeyProperties) {
+    super(apiVersion);
     this.parentKeyProperties = parentKeyProperties;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryVersionService.java
index 0a21762..c2ad906 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RepositoryVersionService.java
@@ -33,6 +33,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -50,7 +51,8 @@ public class RepositoryVersionService extends BaseService {
    *
    * @param parentKeyProperties extra properties to be inserted into created resource
    */
-  public RepositoryVersionService(Map<Resource.Type, String> parentKeyProperties) {
+  public RepositoryVersionService(ApiVersion apiVersion, Map<Resource.Type, String> parentKeyProperties) {
+    super(apiVersion);
     this.parentKeyProperties = parentKeyProperties;
   }
 
@@ -141,7 +143,7 @@ public class RepositoryVersionService extends BaseService {
     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.putAll(parentKeyProperties);
     mapIds.put(Resource.Type.RepositoryVersion, repositoryVersionId);
-    return new OperatingSystemService(mapIds);
+    return new OperatingSystemService(m_apiVersion, mapIds);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestScheduleService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestScheduleService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestScheduleService.java
index 3ad589c..a3fd472 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestScheduleService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestScheduleService.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.DELETE;
@@ -48,7 +49,8 @@ public class RequestScheduleService extends BaseService {
    * Constructor
    * @param m_clusterName
    */
-  public RequestScheduleService(String m_clusterName) {
+  public RequestScheduleService(ApiVersion apiVersion, String m_clusterName) {
+    super(apiVersion);
     this.m_clusterName = m_clusterName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestService.java
index e1bccec..4b2d0cc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RequestService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -39,7 +40,6 @@ import java.util.Map;
 /**
  * Service responsible for request resource requests.
  */
-@Path("/requests/")
 public class RequestService extends BaseService {
   /**
    * Parent cluster name.
@@ -47,7 +47,8 @@ public class RequestService extends BaseService {
   private String m_clusterName;
 
 
-  public RequestService() {
+  public RequestService(ApiVersion apiVersion) {
+    super(apiVersion);
   }
   
   /**
@@ -55,7 +56,8 @@ public class RequestService extends BaseService {
    *
    * @param clusterName cluster id
    */
-  public RequestService(String clusterName) {
+  public RequestService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 
@@ -101,7 +103,7 @@ public class RequestService extends BaseService {
    */
   @Path("{requestId}/stages")
   public StageService getStageHandler(@PathParam("requestId") String requestId) {
-    return new StageService(m_clusterName, requestId);
+    return new StageService(m_apiVersion, m_clusterName, requestId);
   }
 
   /**
@@ -109,7 +111,7 @@ public class RequestService extends BaseService {
    */
   @Path("{requestId}/tasks")
   public TaskService getTaskHandler(@PathParam("requestId") String requestId) {
-    return new TaskService(m_clusterName, requestId, null);
+    return new TaskService(m_apiVersion, m_clusterName, requestId, null);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RoleAuthorizationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RoleAuthorizationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RoleAuthorizationService.java
index 60f8a36..ad1c544 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RoleAuthorizationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RoleAuthorizationService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -38,15 +39,14 @@ import java.util.Map;
  * The result sets returned by this service are either the full set of available authorizations or
  * those related to a particular permission.
  */
-@Path("/authorizations/")
 public class RoleAuthorizationService extends BaseService {
   private String permissionId;
 
   /**
    * Constructs a new RoleAuthorizationService that is not linked to any role (or permission)
    */
-  public RoleAuthorizationService() {
-    this(null);
+  public RoleAuthorizationService(ApiVersion apiVersion) {
+    this(apiVersion, null);
   }
 
   /**
@@ -54,7 +54,8 @@ public class RoleAuthorizationService extends BaseService {
    *
    * @param permissionId the permission id of a permission (or role)
    */
-  public RoleAuthorizationService(String permissionId) {
+  public RoleAuthorizationService(ApiVersion apiVersion, String permissionId) {
+    super(apiVersion);
     this.permissionId = permissionId;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
index 79b266f..1f70cf8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootServiceService.java
@@ -32,11 +32,15 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
-@Path("/services/")
 public class RootServiceService extends BaseService {
-  
+
+  public RootServiceService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   @GET
   @Produces("text/plain")
   public Response getServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceConfigVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceConfigVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceConfigVersionService.java
index 03a64e2..51f5b42 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceConfigVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceConfigVersionService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -36,7 +37,8 @@ public class ServiceConfigVersionService extends BaseService {
    */
   private String m_clusterName;
 
-  public ServiceConfigVersionService(String m_clusterName) {
+  public ServiceConfigVersionService(ApiVersion apiVersion, String m_clusterName) {
+    super(apiVersion);
     this.m_clusterName = m_clusterName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceGroupService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceGroupService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceGroupService.java
new file mode 100644
index 0000000..b85aa97
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceGroupService.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.server.api.services;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Service responsible for service groups resource requests.
+ */
+public class ServiceGroupService extends BaseService {
+  /**
+   * Parent cluster name.
+   */
+  private String m_clusterName;
+
+  /**
+   * Constructor.
+   *
+   * @param clusterName cluster id
+   */
+  public ServiceGroupService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
+    m_clusterName = clusterName;
+  }
+
+  /**
+   * Handles URL: /clusters/{clusterID}/servicegroups/{serviceGroupId}
+   * Get a specific service group.
+   *
+   * @param headers     http headers
+   * @param ui          uri info
+   * @param serviceGroupName service group id
+   * @return service group resource representation
+   */
+  @GET
+  @Path("{serviceGroupName}")
+  @Produces("text/plain")
+  public Response getServiceGroup(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("serviceGroupName") String serviceGroupName) {
+
+    return handleRequest(headers, body, ui, Request.Type.GET,
+        createServiceGroupResource(m_clusterName, serviceGroupName));
+  }
+
+  /**
+   * Handles URL: /clusters/{clusterId}/servicegroups
+   * Get all service groups for a cluster.
+   *
+   * @param headers http headers
+   * @param ui      uri info
+   * @return service collection resource representation
+   */
+  @GET
+  @Produces("text/plain")
+  public Response getServiceGroups(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+    return handleRequest(headers, body, ui, Request.Type.GET,
+        createServiceGroupResource(m_clusterName, null));
+  }
+
+  /**
+   * Handles: POST /clusters/{clusterId}/servicegroups/{serviceGroupId}
+   * Create a specific service group.
+   *
+   * @param body        http body
+   * @param headers     http headers
+   * @param ui          uri info
+   * @param serviceGroupName service group id
+   * @return information regarding the created service
+   */
+  @POST
+  @Path("{serviceGroupName}")
+  @Produces("text/plain")
+  public Response createService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                                @PathParam("serviceGroupName") String serviceGroupName) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST,
+        createServiceGroupResource(m_clusterName, serviceGroupName));
+  }
+
+  /**
+   * Handles: POST /clusters/{clusterId}/servicegroups
+   * Create multiple service groups.
+   *
+   * @param body        http body
+   * @param headers     http headers
+   * @param ui          uri info
+   * @return information regarding the created service groups
+   */
+  @POST
+  @Produces("text/plain")
+  public Response createServiceGroups(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST,
+        createServiceGroupResource(m_clusterName, null));
+  }
+
+  /**
+   * Handles: PUT /clusters/{clusterId}/servicegroups/{serviceGroupId}
+   * Update a specific service group.
+   *
+   * @param body        http body
+   * @param headers     http headers
+   * @param ui          uri info
+   * @param serviceGroupName service group id
+   * @return information regarding the updated service group
+   */
+  @PUT
+  @Path("{serviceGroupName}")
+  @Produces("text/plain")
+  public Response updateServiceGroup(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                                @PathParam("serviceGroupName") String serviceGroupName) {
+
+    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceGroupResource(m_clusterName, serviceGroupName));
+  }
+
+  /**
+   * Handles: PUT /clusters/{clusterId}/servicegroups
+   * Update multiple service groups.
+   *
+   * @param body        http body
+   * @param headers     http headers
+   * @param ui          uri info
+   * @return information regarding the updated service groups
+   */
+  @PUT
+  @Produces("text/plain")
+  public Response updateServiceGroups(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+
+    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceGroupResource(m_clusterName, null));
+  }
+
+  /**
+   * Handles: DELETE /clusters/{clusterId}/servicegroups/{serviceGroupId}
+   * Delete a specific service group.
+   *
+   * @param headers     http headers
+   * @param ui          uri info
+   * @param serviceGroupName service group id
+   * @return information regarding the deleted service group
+   */
+  @DELETE
+  @Path("{serviceGroupName}")
+  @Produces("text/plain")
+  public Response deleteService(@Context HttpHeaders headers, @Context UriInfo ui,
+                                @PathParam("serviceGroupName") String serviceGroupName) {
+
+    return handleRequest(headers, null, ui, Request.Type.DELETE, createServiceGroupResource(m_clusterName, serviceGroupName));
+  }
+
+
+  /**
+   * Create a service resource instance.
+   *
+   * @param clusterName  cluster name
+   * @param serviceGroupName  service group name
+   *
+   * @return a service resource instance
+   */
+  ResourceInstance createServiceGroupResource(String clusterName, String serviceGroupName) {
+    Map<Resource.Type,String> mapIds = new HashMap<>();
+    mapIds.put(Resource.Type.Cluster, clusterName);
+    mapIds.put(Resource.Type.ServiceGroup, serviceGroupName);
+
+    return createResource(Resource.Type.ServiceGroup, mapIds);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java
index ad6d68c..adbd31d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ServiceService.java
@@ -34,6 +34,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -50,7 +51,8 @@ public class ServiceService extends BaseService {
    *
    * @param clusterName cluster id
    */
-  public ServiceService(String clusterName) {
+  public ServiceService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 
@@ -187,7 +189,7 @@ public class ServiceService extends BaseService {
   @Path("{serviceName}/components")
   public ComponentService getComponentHandler(@PathParam("serviceName") String serviceName) {
 
-    return new ComponentService(m_clusterName, serviceName);
+    return new ComponentService(m_apiVersion, m_clusterName, serviceName);
   }
 
   /**
@@ -196,7 +198,7 @@ public class ServiceService extends BaseService {
   @Path("{serviceName}/alerts")
   public AlertService getAlertHandler(
       @PathParam("serviceName") String serviceName) {
-    return new AlertService(m_clusterName, serviceName, null);
+    return new AlertService(m_apiVersion, m_clusterName, serviceName, null);
   }
 
   /**
@@ -379,7 +381,7 @@ public class ServiceService extends BaseService {
       @Context javax.ws.rs.core.Request request,
       @PathParam("serviceName") String serviceName) {
 
-    return new AlertHistoryService(m_clusterName, serviceName, null);
+    return new AlertHistoryService(m_apiVersion, m_clusterName, serviceName, null);
   }
 
   /**
@@ -391,7 +393,7 @@ public class ServiceService extends BaseService {
    * @return a service resource instance
    */
   ResourceInstance createServiceResource(String clusterName, String serviceName) {
-    Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
+    Map<Resource.Type,String> mapIds = new HashMap<>();
     mapIds.put(Resource.Type.Cluster, clusterName);
     mapIds.put(Resource.Type.Service, serviceName);
 
@@ -408,7 +410,7 @@ public class ServiceService extends BaseService {
    * @return an artifact resource instance
    */
   ResourceInstance createArtifactResource(String clusterName, String serviceName, String artifactName) {
-    Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
+    Map<Resource.Type,String> mapIds = new HashMap<>();
     mapIds.put(Resource.Type.Cluster, clusterName);
     mapIds.put(Resource.Type.Service, serviceName);
     mapIds.put(Resource.Type.Artifact, artifactName);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/SettingService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/SettingService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/SettingService.java
index db6f002..c8ac1a6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/SettingService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/SettingService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 
@@ -38,14 +39,13 @@ import java.util.Collections;
 /**
  * Service responsible for setting resource requests.
  */
-@Path("/settings/")
 public class SettingService extends BaseService {
 
   /**
    * Construct a SettingService.
    */
-  public SettingService() {
-
+  public SettingService(ApiVersion apiVersion) {
+    super(apiVersion);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
index 557ce98..1187167 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StacksService.java
@@ -22,24 +22,22 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
  * Service for stacks management.
  */
-@Path("/stacks/")
 public class StacksService extends BaseService {
 
+  public StacksService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   @GET
   @Produces("text/plain")
   public Response getStacks(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
@@ -333,7 +331,48 @@ public class StacksService extends BaseService {
     final Map<Resource.Type, String> stackProperties = new HashMap<Resource.Type, String>();
     stackProperties.put(Resource.Type.Stack, stackName);
     stackProperties.put(Resource.Type.StackVersion, stackVersion);
-    return new OperatingSystemService(stackProperties);
+    return new OperatingSystemService(m_apiVersion, stackProperties);
+  }
+
+  /**
+   * Returns host-layout recommendations for list of hosts and services.
+   *
+   * @param body http body
+   * @param headers http headers
+   * @param ui uri info
+   * @param stackName stack name
+   * @param stackVersion stack version
+   * @return recommendations for host-layout
+   */
+  @POST
+  @Path("{stackName}/versions/{stackVersion}/recommendations")
+  @Produces(MediaType.TEXT_PLAIN)
+  public Response getRecommendation(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                                    @PathParam("stackName") String stackName,
+                                    @PathParam("stackVersion") String stackVersion) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST,
+        createRecommendationResource(stackName, stackVersion));
+  }
+
+  /**
+   * Returns validation of host-layout.
+   *
+   * @param body http body
+   * @param headers http headers
+   * @param ui uri info
+   * @param stackName stack name
+   * @param stackVersion stack version
+   * @return validation items if any
+   */
+  @POST
+  @Path("{stackName}/versions/{stackVersion}/validations")
+  @Produces(MediaType.TEXT_PLAIN)
+  public Response getValidation(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                                @PathParam("stackName") String stackName, @PathParam("stackVersion") String stackVersion) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST,
+        createValidationResource(stackName, stackVersion));
   }
 
   /**
@@ -348,7 +387,7 @@ public class StacksService extends BaseService {
     final Map<Resource.Type, String> stackProperties = new HashMap<Resource.Type, String>();
     stackProperties.put(Resource.Type.Stack, stackName);
     stackProperties.put(Resource.Type.StackVersion, stackVersion);
-    return new RepositoryVersionService(stackProperties);
+    return new RepositoryVersionService(m_apiVersion, stackProperties);
   }
 
   /**
@@ -365,7 +404,7 @@ public class StacksService extends BaseService {
     final Map<Resource.Type, String> stackProperties = new HashMap<Resource.Type, String>();
     stackProperties.put(Resource.Type.Stack, stackName);
     stackProperties.put(Resource.Type.StackVersion, stackVersion);
-    return new CompatibleRepositoryVersionService(stackProperties);
+    return new CompatibleRepositoryVersionService(m_apiVersion, stackProperties);
   }
 
   ResourceInstance createStackServiceComponentResource(
@@ -497,5 +536,21 @@ public class StacksService extends BaseService {
         Collections.singletonMap(Resource.Type.Stack, stackName));
 
   }
+
+  ResourceInstance createRecommendationResource(String stackName, String stackVersion) {
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Stack, stackName);
+    mapIds.put(Resource.Type.StackVersion, stackVersion);
+
+    return createResource(Resource.Type.Recommendation, mapIds);
+  }
+
+  ResourceInstance createValidationResource(String stackName, String stackVersion) {
+    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Stack, stackName);
+    mapIds.put(Resource.Type.StackVersion, stackVersion);
+
+    return createResource(Resource.Type.Validation, mapIds);
+  }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/StageService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StageService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StageService.java
index 6c24d4d..e82223e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/StageService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/StageService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -59,7 +60,8 @@ public class StageService extends BaseService {
    * @param clusterName  cluster id
    * @param requestId    request id
    */
-  public StageService(String clusterName, String requestId) {
+  public StageService(ApiVersion apiVersion, String clusterName, String requestId) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_requestId = requestId;
   }
@@ -109,7 +111,7 @@ public class StageService extends BaseService {
    */
   @Path("{stageId}/tasks")
   public TaskService getTaskHandler(@PathParam("stageId") String stageId) {
-    return new TaskService(m_clusterName, m_requestId, stageId);
+    return new TaskService(m_apiVersion, m_clusterName, m_requestId, stageId);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/TargetClusterService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TargetClusterService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TargetClusterService.java
index 34c8c26..dbb8bbc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TargetClusterService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TargetClusterService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.DELETE;
@@ -37,9 +38,12 @@ import java.util.Collections;
 /**
  * DR target cluster service.
  */
-@Path("/targets/")
 public class TargetClusterService extends BaseService {
 
+  public TargetClusterService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /targets/{targetName}
    * Get a specific target.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskAttemptService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskAttemptService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskAttemptService.java
index 532a5a4..d501b14 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskAttemptService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskAttemptService.java
@@ -31,6 +31,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -51,7 +52,8 @@ public class TaskAttemptService extends BaseService {
    * @param jobId
    *          job id
    */
-  public TaskAttemptService(String clusterName, String workflowId, String jobId) {
+  public TaskAttemptService(ApiVersion apiVersion, String clusterName, String workflowId, String jobId) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.workflowId = workflowId;
     this.jobId = jobId;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskService.java
index 9151415..e67cab7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/TaskService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -57,7 +58,8 @@ public class TaskService extends BaseService {
    * @param requestId    request id
    * @param stageId      stage id
    */
-  public TaskService(String clusterName, String requestId, String stageId) {
+  public TaskService(ApiVersion apiVersion, String clusterName, String requestId, String stageId) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_requestId = requestId;
     m_stageId = stageId;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeGroupService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeGroupService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeGroupService.java
index a9aa500..6e16ab3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeGroupService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeGroupService.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -40,7 +41,8 @@ public class UpgradeGroupService extends BaseService {
   private String m_clusterName = null;
   private String m_upgradeId = null;
 
-  UpgradeGroupService(String clusterName, String upgradeId) {
+  UpgradeGroupService(ApiVersion apiVersion, String clusterName, String upgradeId) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_upgradeId = upgradeId;
   }
@@ -68,7 +70,7 @@ public class UpgradeGroupService extends BaseService {
   public UpgradeItemService getUpgradeItemService(
       @Context HttpHeaders headers,
       @PathParam("upgradeGroupId") Long groupId) {
-    return new UpgradeItemService(m_clusterName, m_upgradeId, groupId.toString());
+    return new UpgradeItemService(m_apiVersion, m_clusterName, m_upgradeId, groupId.toString());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeItemService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeItemService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeItemService.java
index ab7e125..8e74336 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeItemService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeItemService.java
@@ -31,6 +31,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -42,7 +43,8 @@ public class UpgradeItemService extends BaseService {
   private String m_upgradeId = null;
   private String m_upgradeGroupId = null;
 
-  UpgradeItemService(String clusterName, String upgradeId, String upgradeGroupId) {
+  UpgradeItemService(ApiVersion apiVersion, String clusterName, String upgradeId, String upgradeGroupId) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_upgradeId = upgradeId;
     m_upgradeGroupId = upgradeGroupId;
@@ -94,7 +96,7 @@ public class UpgradeItemService extends BaseService {
       @Context HttpHeaders headers,
       @Context UriInfo ui,
       @PathParam("upgradeItemId") Long id) {
-    return new TaskService(m_clusterName, m_upgradeId, id.toString());
+    return new TaskService(m_apiVersion, m_clusterName, m_upgradeId, id.toString());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeService.java
index 8b66491..31f1c79 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeService.java
@@ -32,6 +32,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -46,7 +47,8 @@ public class UpgradeService extends BaseService {
    *
    * @param clusterName the cluster name (not {@code null}).
    */
-  UpgradeService(String clusterName) {
+  UpgradeService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 
@@ -93,7 +95,7 @@ public class UpgradeService extends BaseService {
    */
   @Path("{upgradeId}/upgrade_groups")
   public UpgradeGroupService getUpgradeGroupHandler(@PathParam("upgradeId") String upgradeId) {
-    return new UpgradeGroupService(m_clusterName, upgradeId);
+    return new UpgradeGroupService(m_apiVersion, m_clusterName, upgradeId);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeSummaryService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeSummaryService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeSummaryService.java
index b8b3e86..dda4e86 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeSummaryService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UpgradeSummaryService.java
@@ -18,6 +18,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -44,7 +45,8 @@ public class UpgradeSummaryService extends BaseService {
    *
    * @param clusterName the cluster name (not {@code null}).
    */
-  UpgradeSummaryService(String clusterName) {
+  UpgradeSummaryService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserAuthorizationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserAuthorizationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserAuthorizationService.java
index c288fdb..71125ad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserAuthorizationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserAuthorizationService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.GET;
@@ -53,7 +54,8 @@ public class UserAuthorizationService extends BaseService {
    *
    * @param username the username of the user to link thi UserAuthorizationService to
    */
-  public UserAuthorizationService(String username) {
+  public UserAuthorizationService(ApiVersion apiVersion, String username) {
+    super(apiVersion);
     this.username = username;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserPrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserPrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserPrivilegeService.java
index 86c4995..2cf5941 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserPrivilegeService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import java.util.HashMap;
@@ -37,7 +38,8 @@ public class UserPrivilegeService extends PrivilegeService {
 
   private final String userName;
 
-  public UserPrivilegeService(String userName) {
+  public UserPrivilegeService(ApiVersion apiVersion, String userName) {
+    super(apiVersion);
     this.userName = userName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserService.java
index c46c373..ec58f93 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/UserService.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import org.apache.commons.lang.StringUtils;
@@ -39,9 +40,12 @@ import java.util.Collections;
 /**
  * Service responsible for user requests.
  */
-@Path("/users/")
 public class UserService extends BaseService {
 
+  public UserService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Gets all users.
    * Handles: GET /users requests.
@@ -137,7 +141,7 @@ public class UserService extends BaseService {
   public PrivilegeService getPrivilegeService(@Context javax.ws.rs.core.Request request,
                                               @PathParam ("userName") String userName) {
 
-    return new UserPrivilegeService(userName);
+    return new UserPrivilegeService(m_apiVersion, userName);
   }
 
   /**
@@ -147,7 +151,7 @@ public class UserService extends BaseService {
   public ActiveWidgetLayoutService getWidgetLayoutService(@Context javax.ws.rs.core.Request request,
                                                     @PathParam ("userName") String userName) {
 
-    return new ActiveWidgetLayoutService(userName);
+    return new ActiveWidgetLayoutService(m_apiVersion, userName);
   }
 
   /**
@@ -160,7 +164,7 @@ public class UserService extends BaseService {
   @Path("{userName}/authorizations")
   public UserAuthorizationService getUserAuthorizations(
       @Context javax.ws.rs.core.Request request, @PathParam("userName") String username) {
-    return new UserAuthorizationService(username);
+    return new UserAuthorizationService(m_apiVersion, username);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/V1Service.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/V1Service.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/V1Service.java
new file mode 100644
index 0000000..dd2f088
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/V1Service.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.services;
+
+import org.apache.ambari.eventdb.webservice.WorkflowJsonService;
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Path("/{apiVersion : v1}")
+public class V1Service extends AbstractVersionService {
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/V2Service.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/V2Service.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/V2Service.java
new file mode 100644
index 0000000..6260a88
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/V2Service.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.services;
+
+import org.apache.ambari.eventdb.webservice.WorkflowJsonService;
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Path("/{apiVersion : v2}")
+public class V2Service extends AbstractVersionService {
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ValidationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ValidationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ValidationService.java
deleted file mode 100644
index 87cb6ac..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ValidationService.java
+++ /dev/null
@@ -1,70 +0,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.
- */
-
-package org.apache.ambari.server.api.services;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-
-import org.apache.ambari.server.api.resources.ResourceInstance;
-import org.apache.ambari.server.controller.spi.Resource;
-
-/**
- * Service responsible for validation of host-layout and configurations.
- */
-@Path("/stacks/{stackName}/versions/{stackVersion}/validations")
-public class ValidationService extends BaseService {
-
-  /**
-   * Returns validation of host-layout.
-   * 
-   * @param body http body
-   * @param headers http headers
-   * @param ui uri info
-   * @param stackName stack name
-   * @param stackVersion stack version
-   * @return validation items if any
-   */
-  @POST
-  @Produces(MediaType.TEXT_PLAIN)
-  public Response getValidation(String body, @Context HttpHeaders headers, @Context UriInfo ui,
-      @PathParam("stackName") String stackName, @PathParam("stackVersion") String stackVersion) {
-
-    return handleRequest(headers, body, ui, Request.Type.POST,
-        createValidationResource(stackName, stackVersion));
-  }
-
-  ResourceInstance createValidationResource(String stackName, String stackVersion) {
-    Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
-    mapIds.put(Resource.Type.Stack, stackName);
-    mapIds.put(Resource.Type.StackVersion, stackVersion);
-
-    return createResource(Resource.Type.Validation, mapIds);
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
index 6410bd8..215e2e1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
@@ -35,15 +35,19 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.internal.VersionDefinitionResourceProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.commons.codec.binary.Base64;
 
 import com.google.gson.JsonObject;
 
-@Path("/version_definitions/")
 public class VersionDefinitionService extends BaseService {
 
+  public VersionDefinitionService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public Response getServices(@Context HttpHeaders headers, @Context UriInfo ui) {
@@ -72,7 +76,7 @@ public class VersionDefinitionService extends BaseService {
   public OperatingSystemService getOperatingSystemsHandler(@PathParam("versionNumber") String versionNumber) {
     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.VersionDefinition, versionNumber);
-    return new OperatingSystemService(mapIds);
+    return new OperatingSystemService(m_apiVersion, mapIds);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewDataMigrationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewDataMigrationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewDataMigrationService.java
index c6846ce..3ce4310 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewDataMigrationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewDataMigrationService.java
@@ -17,6 +17,7 @@
  */
 package org.apache.ambari.server.api.services;
 
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.server.view.ViewDataMigrationContextImpl;
 import org.apache.ambari.server.view.ViewRegistry;
@@ -66,7 +67,8 @@ public class ViewDataMigrationService extends BaseService {
    * @param viewVersion    the current view version
    * @param instanceName   the current view instance name
    */
-  public ViewDataMigrationService(String viewName, String viewVersion, String instanceName) {
+  public ViewDataMigrationService(ApiVersion apiVersion, String viewName, String viewVersion, String instanceName) {
+    super(apiVersion);
     this.viewName = viewName;
     this.viewVersion = viewVersion;
     this.instanceName = instanceName;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java
index 47ac0df..db136b3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewExternalSubResourceService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
@@ -68,7 +69,8 @@ public class ViewExternalSubResourceService  extends BaseService {
 
   // ----- Constructors ------------------------------------------------------
 
-  public ViewExternalSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+  public ViewExternalSubResourceService(ApiVersion apiVersion, Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    super(apiVersion);
     ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
 
     this.type         = type;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java
index fa0850e..00de534 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewInstanceService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
@@ -66,7 +67,8 @@ public class ViewInstanceService extends BaseService {
    * @param viewName  the view id
    * @param version   the version
    */
-  public ViewInstanceService(String viewName, String version) {
+  public ViewInstanceService(ApiVersion apiVersion, String viewName, String version) {
+    super(apiVersion);
     this.viewName = viewName;
     this.version = version;
 
@@ -237,13 +239,13 @@ public class ViewInstanceService extends BaseService {
 
     hasPermission(Request.Type.valueOf(request.getMethod()), instanceName);
 
-    return new ViewPrivilegeService(viewName, version, instanceName);
+    return new ViewPrivilegeService(m_apiVersion, viewName, version, instanceName);
   }
 
   @Path("{instanceName}/migrate")
   public ViewDataMigrationService migrateData(@Context javax.ws.rs.core.Request request,
                                               @PathParam ("instanceName") String instanceName) {
-    return new ViewDataMigrationService(viewName, version, instanceName);
+    return new ViewDataMigrationService(m_apiVersion, viewName, version, instanceName);
   }
   // ----- helper methods ----------------------------------------------------
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPermissionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPermissionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPermissionService.java
index 711e85b..7ae7ca1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPermissionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPermissionService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.DELETE;
@@ -60,7 +61,8 @@ public class ViewPermissionService extends BaseService {
    * @param viewName  the view id
    * @param version   the version
    */
-  public ViewPermissionService(String viewName, String version) {
+  public ViewPermissionService(ApiVersion apiVersion, String viewName, String version) {
+    super(apiVersion);
     this.viewName = viewName;
     this.version  = version;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPrivilegeService.java
index 9181467..5f3ae1c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewPrivilegeService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import java.util.HashMap;
@@ -33,7 +34,8 @@ public class ViewPrivilegeService extends PrivilegeService {
   private final String viewVersion;
   private final String instanceName;
 
-  public ViewPrivilegeService(String viewName, String viewVersion, String instanceName) {
+  public ViewPrivilegeService(ApiVersion apiVersion, String viewName, String viewVersion, String instanceName) {
+    super(apiVersion);
     this.viewName = viewName;
     this.viewVersion = viewVersion;
     this.instanceName = instanceName;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java
index b7edbe3..f0b9c16 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.DELETE;
@@ -38,9 +39,12 @@ import java.util.Collections;
 /**
  * Service responsible for view resource requests.
  */
-@Path("/views/")
 public class ViewService extends BaseService {
 
+  public ViewService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /views/{viewID}
    * Get a specific view.
@@ -141,7 +145,7 @@ public class ViewService extends BaseService {
    */
   @Path("{viewName}/versions")
   public ViewVersionService getInstanceHandler(@PathParam("viewName") String viewName) {
-    return new ViewVersionService(viewName);
+    return new ViewVersionService(m_apiVersion, viewName);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java
index dae586b..f5fec97 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewSubResourceService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
@@ -60,7 +61,8 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
   /**
    * Construct a view sub-resource service.
    */
-  public ViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+  public ViewSubResourceService(ApiVersion apiVersion, Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    super(apiVersion);
     ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
 
     this.type         = type;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewUrlsService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewUrlsService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewUrlsService.java
index 3827c18..34400a9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewUrlsService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewUrlsService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 import com.google.common.base.Optional;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
 
@@ -40,9 +41,12 @@ import java.util.Collections;
 /**
  * Service responsible for view resource requests.
  */
-@Path("/view/urls")
 public class ViewUrlsService extends BaseService {
 
+  public ViewUrlsService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Get the list of all registered view URLs
    * @param headers

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
index 8152ae6..73d8b57 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.DELETE;
@@ -54,7 +55,8 @@ public class ViewVersionService extends BaseService {
    *
    * @param viewName  the view name
    */
-  public ViewVersionService(String viewName) {
+  public ViewVersionService(ApiVersion apiVersion, String viewName) {
+    super(apiVersion);
     this.viewName = viewName;
   }
 
@@ -163,7 +165,7 @@ public class ViewVersionService extends BaseService {
   @Path("{version}/instances")
   public ViewInstanceService getInstanceHandler(@PathParam("version") String version) {
 
-    return new ViewInstanceService(viewName, version);
+    return new ViewInstanceService(m_apiVersion, viewName, version);
   }
 
   /**
@@ -176,7 +178,7 @@ public class ViewVersionService extends BaseService {
   @Path("{version}/permissions")
   public ViewPermissionService getPermissionHandler(@PathParam("version") String version) {
 
-    return new ViewPermissionService(viewName, version);
+    return new ViewPermissionService(m_apiVersion, viewName, version);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetLayoutService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetLayoutService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetLayoutService.java
index 3902236..f356896 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetLayoutService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetLayoutService.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.api.services;
 
 import com.sun.jersey.core.util.Base64;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 import javax.ws.rs.*;
@@ -38,7 +39,8 @@ public class WidgetLayoutService extends BaseService {
   
   private final String clusterName;
 
-  public  WidgetLayoutService(String clusterName) {
+  public  WidgetLayoutService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     this.clusterName = clusterName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetService.java
index e6907db..29af366 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WidgetService.java
@@ -19,6 +19,7 @@ package org.apache.ambari.server.api.services;
 
 import com.sun.jersey.core.util.Base64;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.security.authorization.AuthorizationHelper;
 
@@ -39,7 +40,8 @@ public class WidgetService extends BaseService {
 
   private final String clusterName;
 
-  public WidgetService(String clusterName) {
+  public WidgetService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     this.clusterName = clusterName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/WorkflowService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WorkflowService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WorkflowService.java
index 53ad919..5bdb977 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/WorkflowService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/WorkflowService.java
@@ -31,6 +31,7 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 
 /**
@@ -45,7 +46,8 @@ public class WorkflowService extends BaseService {
    * @param clusterName
    *          cluster id
    */
-  public WorkflowService(String clusterName) {
+  public WorkflowService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     this.clusterName = clusterName;
   }
 
@@ -90,7 +92,7 @@ public class WorkflowService extends BaseService {
    */
   @Path("{workflowId}/jobs")
   public JobService getJobHandler(@PathParam("workflowId") String workflowId) {
-    return new JobService(clusterName, workflowId);
+    return new JobService(m_apiVersion, clusterName, workflowId);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorHelper.java
index a925d7d..8510d0c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/StackAdvisorHelper.java
@@ -31,6 +31,7 @@ import org.apache.ambari.server.api.services.stackadvisor.commands.Configuration
 import org.apache.ambari.server.api.services.stackadvisor.commands.StackAdvisorCommand;
 import org.apache.ambari.server.api.services.stackadvisor.recommendations.RecommendationResponse;
 import org.apache.ambari.server.api.services.stackadvisor.validations.ValidationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.configuration.Configuration;
 
 import com.google.inject.Inject;
@@ -78,10 +79,10 @@ public class StackAdvisorHelper {
       StackAdvisorRequestType requestType) throws StackAdvisorException {
     StackAdvisorCommand<ValidationResponse> command;
     if (requestType == StackAdvisorRequestType.HOST_GROUPS) {
-      command = new ComponentLayoutValidationCommand(recommendationsDir, stackAdvisorScript,
+      command = new ComponentLayoutValidationCommand(ApiVersion.v1, recommendationsDir, stackAdvisorScript,
           requestId, saRunner, metaInfo);
     } else if (requestType == StackAdvisorRequestType.CONFIGURATIONS) {
-      command = new ConfigurationValidationCommand(recommendationsDir, stackAdvisorScript,
+      command = new ConfigurationValidationCommand(ApiVersion.v1, recommendationsDir, stackAdvisorScript,
           requestId, saRunner, metaInfo);
     } else {
       throw new StackAdvisorRequestException(String.format("Unsupported request type, type=%s",
@@ -113,13 +114,13 @@ public class StackAdvisorHelper {
       StackAdvisorRequestType requestType) throws StackAdvisorException {
     StackAdvisorCommand<RecommendationResponse> command;
     if (requestType == StackAdvisorRequestType.HOST_GROUPS) {
-      command = new ComponentLayoutRecommendationCommand(recommendationsDir, stackAdvisorScript,
+      command = new ComponentLayoutRecommendationCommand(ApiVersion.v1, recommendationsDir, stackAdvisorScript,
           requestId, saRunner, metaInfo);
     } else if (requestType == StackAdvisorRequestType.CONFIGURATIONS) {
-      command = new ConfigurationRecommendationCommand(recommendationsDir, stackAdvisorScript,
+      command = new ConfigurationRecommendationCommand(ApiVersion.v1, recommendationsDir, stackAdvisorScript,
           requestId, saRunner, metaInfo);
     } else if (requestType == StackAdvisorRequestType.CONFIGURATION_DEPENDENCIES) {
-      command = new ConfigurationDependenciesRecommendationCommand(recommendationsDir, stackAdvisorScript,
+      command = new ConfigurationDependenciesRecommendationCommand(ApiVersion.v1, recommendationsDir, stackAdvisorScript,
           requestId, saRunner, metaInfo);
     } else {
       throw new StackAdvisorRequestException(String.format("Unsupported request type, type=%s",

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutRecommendationCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutRecommendationCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutRecommendationCommand.java
index 0dff92b..3284c5b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutRecommendationCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutRecommendationCommand.java
@@ -25,6 +25,7 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
 import org.apache.ambari.server.api.services.stackadvisor.recommendations.RecommendationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
 
 /**
  * {@link StackAdvisorCommand} implementation for component-layout
@@ -33,12 +34,12 @@ import org.apache.ambari.server.api.services.stackadvisor.recommendations.Recomm
 public class ComponentLayoutRecommendationCommand extends
     StackAdvisorCommand<RecommendationResponse> {
 
-  public ComponentLayoutRecommendationCommand(File recommendationsDir,
+  public ComponentLayoutRecommendationCommand(ApiVersion apiVersion, File recommendationsDir,
                                               String stackAdvisorScript,
                                               int requestId,
                                               StackAdvisorRunner saRunner,
                                               AmbariMetaInfo metaInfo) {
-    super(recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
+    super(apiVersion,recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutValidationCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutValidationCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutValidationCommand.java
index 757ebee..e836f70 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutValidationCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ComponentLayoutValidationCommand.java
@@ -25,15 +25,16 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
 import org.apache.ambari.server.api.services.stackadvisor.validations.ValidationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
 
 /**
  * {@link StackAdvisorCommand} implementation for component-layout validation.
  */
 public class ComponentLayoutValidationCommand extends StackAdvisorCommand<ValidationResponse> {
 
-  public ComponentLayoutValidationCommand(File recommendationsDir, String stackAdvisorScript,
+  public ComponentLayoutValidationCommand(ApiVersion apiVersion, File recommendationsDir, String stackAdvisorScript,
                                           int requestId, StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
-    super(recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
+    super(apiVersion, recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationDependenciesRecommendationCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationDependenciesRecommendationCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationDependenciesRecommendationCommand.java
index ae86548..d9f3083 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationDependenciesRecommendationCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationDependenciesRecommendationCommand.java
@@ -23,6 +23,7 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
 import org.apache.ambari.server.api.services.stackadvisor.recommendations.RecommendationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
 
 import java.io.File;
 import java.util.HashMap;
@@ -40,9 +41,9 @@ import static org.apache.ambari.server.api.services.stackadvisor.recommendations
 public class ConfigurationDependenciesRecommendationCommand extends
     StackAdvisorCommand<RecommendationResponse> {
 
-  public ConfigurationDependenciesRecommendationCommand(File recommendationsDir, String stackAdvisorScript, int requestId,
+  public ConfigurationDependenciesRecommendationCommand(ApiVersion apiVersion, File recommendationsDir, String stackAdvisorScript, int requestId,
                                                         StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
-    super(recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
+    super(apiVersion, recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationRecommendationCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationRecommendationCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationRecommendationCommand.java
index ad01b40..dd762ae 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationRecommendationCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationRecommendationCommand.java
@@ -23,6 +23,8 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
 import org.apache.ambari.server.api.services.stackadvisor.recommendations.RecommendationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
+
 import static org.apache.ambari.server.api.services.stackadvisor.recommendations.RecommendationResponse.*;
 
 import java.io.File;
@@ -38,9 +40,9 @@ import java.util.Set;
 public class ConfigurationRecommendationCommand extends
     StackAdvisorCommand<RecommendationResponse> {
 
-  public ConfigurationRecommendationCommand(File recommendationsDir, String stackAdvisorScript, int requestId,
+  public ConfigurationRecommendationCommand(ApiVersion apiVersion, File recommendationsDir, String stackAdvisorScript, int requestId,
                                             StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
-    super(recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
+    super(apiVersion, recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationValidationCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationValidationCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationValidationCommand.java
index c234947..c90cc1b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationValidationCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/ConfigurationValidationCommand.java
@@ -25,15 +25,16 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
 import org.apache.ambari.server.api.services.stackadvisor.validations.ValidationResponse;
+import org.apache.ambari.server.api.util.ApiVersion;
 
 /**
  * {@link StackAdvisorCommand} implementation for configuration validation.
  */
 public class ConfigurationValidationCommand extends StackAdvisorCommand<ValidationResponse> {
 
-  public ConfigurationValidationCommand(File recommendationsDir, String stackAdvisorScript,
+  public ConfigurationValidationCommand(ApiVersion apiVersion, File recommendationsDir, String stackAdvisorScript,
                                         int requestId, StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
-    super(recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
+    super(apiVersion, recommendationsDir, stackAdvisorScript, requestId, saRunner, metaInfo);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
index 3e20a09..b93ea27 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
@@ -43,6 +43,7 @@ import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorException;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRequest;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorResponse;
 import org.apache.ambari.server.api.services.stackadvisor.StackAdvisorRunner;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.commons.collections.CollectionUtils;
@@ -104,8 +105,9 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend
   private final AmbariMetaInfo metaInfo;
 
   @SuppressWarnings("unchecked")
-  public StackAdvisorCommand(File recommendationsDir, String stackAdvisorScript, int requestId,
-      StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
+  public StackAdvisorCommand(ApiVersion apiVersion, File recommendationsDir, String stackAdvisorScript, int requestId,
+                             StackAdvisorRunner saRunner, AmbariMetaInfo metaInfo) {
+    super(apiVersion);
     this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];