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

[33/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/rest/BootStrapResource.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/BootStrapResource.java b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/BootStrapResource.java
index 5672598..f2f0a95 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/BootStrapResource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/BootStrapResource.java
@@ -45,7 +45,6 @@ import org.apache.commons.logging.LogFactory;
 
 import com.google.inject.Inject;
 
-@Path("/bootstrap")
 public class BootStrapResource {
 
   private static BootStrapImpl bsImpl;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/rest/HealthCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/HealthCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/HealthCheck.java
index 2f31611..802f7eb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/HealthCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/HealthCheck.java
@@ -28,7 +28,6 @@ import javax.ws.rs.core.MediaType;
  * or not
  */
 
-@Path("/check")
 public class HealthCheck {
   private static final String status = "RUNNING";
   // This method is called if TEXT_PLAIN is request

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/rest/KdcServerReachabilityCheck.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/KdcServerReachabilityCheck.java b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/KdcServerReachabilityCheck.java
index 898e7e6..bb08a0a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/rest/KdcServerReachabilityCheck.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/rest/KdcServerReachabilityCheck.java
@@ -36,7 +36,6 @@ import com.google.inject.Inject;
  * Service responsible for kerberos related resource requests.
  */
 @StaticallyInject
-@Path("/kdc_check/")
 public class KdcServerReachabilityCheck {
   private static final String REACHABLE = "REACHABLE";
   private static final String UNREACHABLE = "UNREACHABLE";

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AbstractVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AbstractVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AbstractVersionService.java
new file mode 100644
index 0000000..81df575
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AbstractVersionService.java
@@ -0,0 +1,352 @@
+/**
+ * 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;
+import org.apache.ambari.server.api.rest.BootStrapResource;
+import org.apache.ambari.server.api.rest.HealthCheck;
+import org.apache.ambari.server.api.rest.KdcServerReachabilityCheck;
+
+
+public abstract class AbstractVersionService {
+
+  /**
+   * Handles /actions request.
+   *
+   * @return action service
+   */
+  @Path("/actions")
+  public ActionService getActionService(@PathParam("apiVersion") String apiVersion) {
+    return new ActionService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /alert_targets request.
+   *
+   * @return alert targets service
+   */
+  @Path("/alert_targets")
+  public AlertTargetService getAlertTargetService(@PathParam("apiVersion") String apiVersion) {
+    return new AlertTargetService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /privileges request.
+   *
+   * @return privileges service
+   */
+  @Path("/privileges")
+  public AmbariPrivilegeService getAmbariPrivilegeService(@PathParam("apiVersion") String apiVersion) {
+    return new AmbariPrivilegeService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /blueprints request.
+   *
+   * @return blueprints service
+   */
+  @Path("/blueprints")
+  public BlueprintService getBlueprintService(@PathParam("apiVersion") String apiVersion) {
+    return new BlueprintService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /clusters request.
+   *
+   * @return cluster service
+   */
+  @Path("/clusters")
+  public ClusterService getClusterService(@PathParam("apiVersion") String apiVersion) {
+    return new ClusterService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /feeds request.
+   * TODO: Cleanup?
+   *
+   * @return feed service
+   */
+  @Path("/feeds")
+  public FeedService getFeedService(@PathParam("apiVersion") String apiVersion) {
+    return new FeedService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /groups request.
+   *
+   * @return group service
+   */
+  @Path("/groups")
+  public GroupService getGroupService(@PathParam("apiVersion") String apiVersion) {
+    return new GroupService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /hosts request.
+   *
+   * @return host service
+   */
+  @Path("/hosts")
+  public HostService getHostService(@PathParam("apiVersion") String apiVersion) {
+    return new HostService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /instances request.
+   * TODO: Cleanup?
+   *
+   * @return instance service
+   */
+  @Path("/instances")
+  public InstanceService getInstanceService(@PathParam("apiVersion") String apiVersion) {
+    return new InstanceService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /kerberos_descriptors request.
+   *
+   * @return kerberos descriptor service
+   */
+  @Path("/kerberos_descriptors")
+  public KerberosDescriptorService getKerberosDescriptorService(@PathParam("apiVersion") String apiVersion) {
+    return new KerberosDescriptorService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /keys request.
+   *
+   * @return key service
+   */
+  @Path("/keys")
+  public KeyService getKeyService(@PathParam("apiVersion") String apiVersion) {
+    return new KeyService();
+  }
+
+  /**
+   * Handles /ldap_sync_events request.
+   *
+   * @return Ldap sync event service
+   */
+  @Path("/ldap_sync_events")
+  public LdapSyncEventService getLdapSyncEventService(@PathParam("apiVersion") String apiVersion) {
+    return new LdapSyncEventService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /logout request.
+   *
+   * @return logout service
+   */
+  @Path("/logout")
+  public LogoutService getLogoutService(@PathParam("apiVersion") String apiVersion) {
+    return new LogoutService();
+  }
+
+  /**
+   * Handles /permissions request.
+   *
+   * @return permission service
+   */
+  @Path("/permissions")
+  public PermissionService getPermissionService(@PathParam("apiVersion") String apiVersion) {
+    return new PermissionService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /persist request.
+   *
+   * @return persist service
+   */
+  @Path("/persist")
+  public PersistKeyValueService getPersistKeyValueService(@PathParam("apiVersion") String apiVersion) {
+    return new PersistKeyValueService();
+  }
+
+  /**
+   * Handles /remoteclusters request
+   *
+   * @return remote clusters service
+   */
+  @Path("/remoteclusters")
+  public RemoteClustersService getRemoteClustersService(@PathParam("apiVersion") String apiVersion) {
+    return new RemoteClustersService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /requests request.
+   *
+   * @return request service
+   */
+  @Path("/requests")
+  public RequestService getRequestService(@PathParam("apiVersion") String apiVersion) {
+    return new RequestService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /settings request.
+   *
+   * @return request service
+   */
+  @Path("/settings")
+  public SettingService getSettingService(@PathParam("apiVersion") String apiVersion) {
+    return new SettingService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /authorizations request.
+   *
+   * @return role authorization service
+   */
+  @Path("/authorizations")
+  public RoleAuthorizationService getRoleAuthorizationService(@PathParam("apiVersion") String apiVersion) {
+    return new RoleAuthorizationService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /services request.
+   *
+   * @return root service service
+   */
+  @Path("/services")
+  public RootServiceService getRootServiceService(@PathParam("apiVersion") String apiVersion) {
+    return new RootServiceService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /targets request.
+   * TODO: Cleanup?
+   *
+   * @return target cluster service
+   */
+  @Path("/targets")
+  public TargetClusterService getTargetClusterService(@PathParam("apiVersion") String apiVersion) {
+    return new TargetClusterService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /users request.
+   *
+   * @return user service
+   */
+  @Path("/users")
+  public UserService getUserService(@PathParam("apiVersion") String apiVersion) {
+    return new UserService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /version_definitions request.
+   *
+   * @return version definition service
+   */
+  @Path("/version_definitions")
+  public VersionDefinitionService getVersionDefinitionService(@PathParam("apiVersion") String apiVersion) {
+    return new VersionDefinitionService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /views request.
+   *
+   * @return view service
+   */
+  @Path("/views")
+  public ViewService getViewService(@PathParam("apiVersion") String apiVersion) {
+    return new ViewService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /view/urls request.
+   *
+   * @return view urls service
+   */
+  @Path("/view/urls")
+  public ViewUrlsService getViewUrlsService(@PathParam("apiVersion") String apiVersion) {
+    return new ViewUrlsService(ApiVersion.valueOf(apiVersion));
+  }
+
+  /**
+   * Handles /stacks request.
+   *
+   * @return stacks service
+   */
+  @Path("/stacks")
+  public StacksService getStacksService(@PathParam("apiVersion") String apiVersion) {
+    return new StacksService(ApiVersion.valueOf(apiVersion));
+  }
+
+
+  /**
+   * Handles /bootstrap request.
+   *
+   * @return bootstrap service
+   */
+  @Path("/bootstrap")
+  public BootStrapResource getBootStrapResource(@PathParam("apiVersion") String apiVersion) {
+    return new BootStrapResource();
+  }
+
+
+  /**
+   * Handles /check request.
+   *
+   * @return health check service
+   */
+  @Path("/check")
+  public HealthCheck getHealthCheck(@PathParam("apiVersion") String apiVersion) {
+    return new HealthCheck();
+  }
+
+  /**
+   * Handles /kdc_check request.
+   *
+   * @return kdc server reachability service
+   */
+  @Path("/kdc_check")
+  public KdcServerReachabilityCheck getKdcServerReachabilityCheck(@PathParam("apiVersion") String apiVersion) {
+    return new KdcServerReachabilityCheck();
+  }
+
+  /**
+   * Handles /kdc_check request.
+   *
+   * @return kdc server reachability service
+   */
+  @Path("/jobhistory")
+  public WorkflowJsonService getWorkflowJsonService(@PathParam("apiVersion") String apiVersion) {
+    return new WorkflowJsonService();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActionService.java
index 0126d3f..70b95f2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActionService.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 action definition resource requests.
  */
-@Path("/actions/")
 public class ActionService extends BaseService {
 
+  public ActionService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /actions/{actionName}
    * Get a specific action definition.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActiveWidgetLayoutService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActiveWidgetLayoutService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActiveWidgetLayoutService.java
index a0c3386..a84a6c1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActiveWidgetLayoutService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ActiveWidgetLayoutService.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;
@@ -39,7 +40,8 @@ public class ActiveWidgetLayoutService extends BaseService {
 
   private final String userName;
 
-  public ActiveWidgetLayoutService(String userName) {
+  public ActiveWidgetLayoutService(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/AlertDefinitionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertDefinitionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertDefinitionService.java
index e002c38..3c9de2f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertDefinitionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertDefinitionService.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;
 
 /**
@@ -42,7 +43,8 @@ public class AlertDefinitionService extends BaseService {
 
   private String clusterName = null;
 
-  AlertDefinitionService(String clusterName) {
+  AlertDefinitionService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     this.clusterName = clusterName;
   }
 
@@ -100,7 +102,7 @@ public class AlertDefinitionService extends BaseService {
   /**
    * Create a request schedule resource instance
    * @param clusterName
-   * @param requestScheduleId
+   * @param definitionId
    * @return
    */
   private ResourceInstance createResourceInstance(String clusterName,

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertGroupService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertGroupService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertGroupService.java
index a4bfcf3..07d3a42 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertGroupService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertGroupService.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;
 
 /**
@@ -51,7 +52,8 @@ public class AlertGroupService extends BaseService {
    *
    * @param clusterName
    */
-  AlertGroupService(String clusterName) {
+  AlertGroupService(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/AlertHistoryService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertHistoryService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertHistoryService.java
index 4ebe1f6..9675e05 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertHistoryService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertHistoryService.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;
 
 /**
@@ -52,7 +53,8 @@ public class AlertHistoryService extends BaseService {
    * @param hostName
    *          the host name, or {@code null} to return history across all hosts.
    */
-  AlertHistoryService(String clusterName, String serviceName, String hostName) {
+  AlertHistoryService(ApiVersion apiVersion, String clusterName, String serviceName, String hostName) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.serviceName = serviceName;
     this.hostName = hostName;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertNoticeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertNoticeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertNoticeService.java
index 26731fb..e185443 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertNoticeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertNoticeService.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;
 
 /**
@@ -45,7 +46,8 @@ public class AlertNoticeService extends BaseService {
    * @param clusterName
    *          the cluster name (not {@code null}).
    */
-  AlertNoticeService(String clusterName) {
+  AlertNoticeService(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/AlertService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.java
index 184cbf1..541bed5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertService.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;
 
 /**
@@ -41,7 +42,8 @@ public class AlertService extends BaseService {
   private String serviceName = null;
   private String hostName = null;
 
-  AlertService(String clusterName, String serviceName, String hostName) {
+  AlertService(ApiVersion apiVersion, String clusterName, String serviceName, String hostName) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.serviceName = serviceName;
     this.hostName = hostName;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertTargetService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertTargetService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertTargetService.java
index 2e00491..ec7c295 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertTargetService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AlertTargetService.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;
 import org.apache.ambari.server.state.alert.AlertTarget;
 
@@ -40,9 +41,12 @@ import org.apache.ambari.server.state.alert.AlertTarget;
  * The {@link AlertTargetService} handles CRUD operation requests for alert
  * targets.
  */
-@Path("/alert_targets/")
 public class AlertTargetService extends BaseService {
 
+  public AlertTargetService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   @GET
   @Produces("text/plain")
   public Response getTargets(@Context HttpHeaders headers,

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index c54fe3f..54a1fe7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -44,6 +44,8 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ParentObjectNotFoundException;
 import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.AmbariManagementController;
+import org.apache.ambari.server.controller.AmbariServer;
 import org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.customactions.ActionDefinition;
@@ -55,6 +57,7 @@ import org.apache.ambari.server.metadata.AmbariServiceAlertDefinitions;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.dao.MetainfoDAO;
 import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
+import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.stack.StackDirectory;
 import org.apache.ambari.server.stack.StackManager;
@@ -218,6 +221,8 @@ public class AmbariMetaInfo {
    */
   private StackManager stackManager;
 
+  private AmbariManagementController controller;
+
   private Configuration conf;
 
   /**
@@ -241,6 +246,7 @@ public class AmbariMetaInfo {
     serverVersionFile = new File(serverVersionFilePath);
 
     customActionRoot = new File(conf.getCustomActionDefinitionPath());
+    controller = AmbariServer.getController();
   }
 
   /**
@@ -523,14 +529,15 @@ public class AmbariMetaInfo {
   }
 
   public ServiceInfo getService(String stackName, String version, String serviceName) throws AmbariException {
-    ServiceInfo service = getStack(stackName, version).getService(serviceName);
+    StackInfo stackInfo = getStack(stackName, version);
+    ServiceInfo serviceInfo = stackInfo.getService(serviceName);
 
-    if (service == null) {
+    if (serviceInfo == null) {
       throw new StackAccessException("stackName=" + stackName + ", stackVersion=" +
                                      version + ", serviceName=" + serviceName);
     }
 
-    return service;
+    return serviceInfo;
   }
 
   public Collection<String> getMonitoringServiceNames(String stackName, String version)

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariPrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariPrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariPrivilegeService.java
index db28f4f..9f8b0ba 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariPrivilegeService.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.Path;
@@ -27,8 +28,10 @@ import java.util.Collections;
 /**
  *  Service responsible for Ambari privilege resource requests.
  */
-@Path("/privileges/")
 public class AmbariPrivilegeService extends PrivilegeService {
+  public AmbariPrivilegeService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
 
   // ----- PrivilegeService --------------------------------------------------
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
index 139cf43..64263b5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BaseService.java
@@ -27,6 +27,7 @@ import org.apache.ambari.server.api.services.parsers.RequestBodyParser;
 import org.apache.ambari.server.api.services.serializers.CsvSerializer;
 import org.apache.ambari.server.api.services.serializers.JsonSerializer;
 import org.apache.ambari.server.api.services.serializers.ResultSerializer;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.audit.request.RequestAuditLogger;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.utils.RetryHelper;
@@ -41,6 +42,7 @@ import javax.ws.rs.core.UriInfo;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Pattern;
 
 import com.google.inject.Inject;
 
@@ -51,6 +53,12 @@ public abstract class BaseService {
   public final static MediaType MEDIA_TYPE_TEXT_CSV_TYPE = new MediaType("text", "csv");
 
   /**
+   * Regex for checking API version from the request URI
+   */
+  public static final Pattern API_VERSION_REGEX = Pattern.compile("^(/api/)(v[0-9\\.]+)");
+
+
+  /**
    * Logger instance.
    */
   protected final static Logger LOG = LoggerFactory.getLogger(BaseService.class);
@@ -67,6 +75,15 @@ public abstract class BaseService {
 
   protected static RequestAuditLogger requestAuditLogger;
 
+  /**
+   * Api version
+   */
+  protected ApiVersion m_apiVersion;
+
+  public BaseService(ApiVersion apiVersion) {
+    m_apiVersion = apiVersion;
+  }
+
   public static void init(RequestAuditLogger instance) {
     requestAuditLogger = instance;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/BlueprintService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BlueprintService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BlueprintService.java
index f40f858..c782311 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/BlueprintService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/BlueprintService.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;
@@ -39,9 +40,12 @@ import java.util.Collections;
  * any cluster specific information.  Updates are not permitted as blueprints are
  * immutable.
  */
-@Path("/blueprints/")
 public class BlueprintService extends BaseService {
 
+  public BlueprintService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET  /blueprints
    * Get all blueprints.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterKerberosDescriptorService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterKerberosDescriptorService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterKerberosDescriptorService.java
index 1452118..364a932 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterKerberosDescriptorService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterKerberosDescriptorService.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 ClusterKerberosDescriptorService extends BaseService {
    *
    * @param clusterName cluster id
    */
-  public ClusterKerberosDescriptorService(String clusterName) {
+  public ClusterKerberosDescriptorService(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/ClusterPrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.java
index 11b4a46..86debb9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.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;
@@ -42,7 +43,8 @@ public class ClusterPrivilegeService extends PrivilegeService {
    *
    * @param clusterName  the cluster name
    */
-  public ClusterPrivilegeService(String clusterName) {
+  public ClusterPrivilegeService(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/ClusterService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java
index 072c4a2..829efd8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java
@@ -35,6 +35,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.AmbariServer;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.state.Clusters;
@@ -43,7 +44,6 @@ import org.apache.ambari.server.state.Clusters;
 /**
  * Service responsible for cluster resource requests.
  */
-@Path("/clusters/")
 public class ClusterService extends BaseService {
 
   /**
@@ -57,7 +57,8 @@ public class ClusterService extends BaseService {
   /**
    * Construct a ClusterService.
    */
-  public ClusterService() {
+  public ClusterService(ApiVersion apiVersion) {
+    super(apiVersion);
     clusters = AmbariServer.getController().getClusters();
   }
 
@@ -66,7 +67,8 @@ public class ClusterService extends BaseService {
    *
    * @param clusters  the clusters utilities
    */
-  protected ClusterService(Clusters clusters) {
+  protected ClusterService(ApiVersion apiVersion, Clusters clusters) {
+    super(apiVersion);
     this.clusters = clusters;
   }
 
@@ -326,7 +328,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/hosts")
   public HostService getHostHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new HostService(clusterName);
+    return new HostService(m_apiVersion, clusterName);
   }
 
   /**
@@ -339,7 +341,20 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/services")
   public ServiceService getServiceHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new ServiceService(clusterName);
+    return new ServiceService(m_apiVersion, clusterName);
+  }
+
+  /**
+   * Get the service groups sub-resource
+   *
+   * @param request      the request
+   * @param clusterName  cluster id
+   *
+   * @return the service groups service
+   */
+  @Path("{clusterName}/servicegroups")
+  public ServiceGroupService getServiceGroupHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
+    return new ServiceGroupService(m_apiVersion, clusterName);
   }
 
   /**
@@ -352,7 +367,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/configurations")
   public ConfigurationService getConfigurationHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new ConfigurationService(clusterName);
+    return new ConfigurationService(m_apiVersion, clusterName);
   }
 
   /**
@@ -365,7 +380,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/requests")
   public RequestService getRequestHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new RequestService(clusterName);
+    return new RequestService(m_apiVersion, clusterName);
   }
 
   /**
@@ -379,7 +394,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/host_components")
   public HostComponentService getHostComponentHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new HostComponentService(clusterName, null);
+    return new HostComponentService(m_apiVersion, clusterName, null);
   }
 
   /**
@@ -393,7 +408,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/kerberos_identities")
   public HostKerberosIdentityService getHostKerberosIdentityHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new HostKerberosIdentityService(clusterName, null);
+    return new HostKerberosIdentityService(m_apiVersion, clusterName, null);
   }
 
   /**
@@ -407,7 +422,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/components")
   public ComponentService getComponentHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new ComponentService(clusterName, null);
+    return new ComponentService(m_apiVersion, clusterName, null);
   }
 
   /**
@@ -420,7 +435,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/workflows")
   public WorkflowService getWorkflowHandler(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new WorkflowService(clusterName);
+    return new WorkflowService(m_apiVersion, clusterName);
   }
 
   /**
@@ -433,7 +448,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/config_groups")
   public ConfigGroupService getConfigGroupService(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new ConfigGroupService(clusterName);
+    return new ConfigGroupService(m_apiVersion, clusterName);
   }
 
   /**
@@ -447,7 +462,7 @@ public class ClusterService extends BaseService {
   @Path("{clusterName}/request_schedules")
   public RequestScheduleService getRequestScheduleService
                              (@Context javax.ws.rs.core.Request request, @PathParam ("clusterName") String clusterName) {
-    return new RequestScheduleService(clusterName);
+    return new RequestScheduleService(m_apiVersion, clusterName);
   }
 
   /**
@@ -461,7 +476,7 @@ public class ClusterService extends BaseService {
   @Path("{clusterName}/alert_definitions")
   public AlertDefinitionService getAlertDefinitionService(
       @Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new AlertDefinitionService(clusterName);
+    return new AlertDefinitionService(m_apiVersion, clusterName);
   }
 
   /**
@@ -477,7 +492,7 @@ public class ClusterService extends BaseService {
   public AlertGroupService getAlertGroups(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new AlertGroupService(clusterName);
+    return new AlertGroupService(m_apiVersion, clusterName);
   }
 
   /**
@@ -492,7 +507,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/privileges")
   public PrivilegeService getPrivilegeService(@Context javax.ws.rs.core.Request request, @PathParam ("clusterName") String clusterName) {
-    return new ClusterPrivilegeService(clusterName);
+    return new ClusterPrivilegeService(m_apiVersion, clusterName);
   }
 
   /**
@@ -506,7 +521,7 @@ public class ClusterService extends BaseService {
   @Path("{clusterName}/alerts")
   public AlertService getAlertService(
       @Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new AlertService(clusterName, null, null);
+    return new AlertService(m_apiVersion, clusterName, null, null);
   }
 
   /**
@@ -523,7 +538,7 @@ public class ClusterService extends BaseService {
   public AlertHistoryService getAlertHistoryService(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new AlertHistoryService(clusterName, null, null);
+    return new AlertHistoryService(m_apiVersion, clusterName, null, null);
   }
 
   /**
@@ -540,7 +555,7 @@ public class ClusterService extends BaseService {
   public AlertNoticeService getAlertNoticeService(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new AlertNoticeService(clusterName);
+    return new AlertNoticeService(m_apiVersion, clusterName);
   }
 
   /**
@@ -556,7 +571,7 @@ public class ClusterService extends BaseService {
   @Path("{clusterName}/stack_versions")
   public ClusterStackVersionService getClusterStackVersionService(@Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new ClusterStackVersionService(clusterName);
+    return new ClusterStackVersionService(m_apiVersion, clusterName);
   }
 
   /**
@@ -571,7 +586,7 @@ public class ClusterService extends BaseService {
   public UpgradeService getUpgradeService(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new UpgradeService(clusterName);
+    return new UpgradeService(m_apiVersion, clusterName);
   }
 
   /**
@@ -586,7 +601,7 @@ public class ClusterService extends BaseService {
   public UpgradeSummaryService getUpgradeSummaryService(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new UpgradeSummaryService(clusterName);
+    return new UpgradeSummaryService(m_apiVersion, clusterName);
   }
   
   /**
@@ -599,7 +614,7 @@ public class ClusterService extends BaseService {
    */
   @Path("{clusterName}/rolling_upgrades_check")
   public PreUpgradeCheckService getPreUpgradeCheckService(@Context javax.ws.rs.core.Request request, @PathParam("clusterName") String clusterName) {
-    return new PreUpgradeCheckService(clusterName);
+    return new PreUpgradeCheckService(m_apiVersion, clusterName);
   }
 
   /**
@@ -609,7 +624,7 @@ public class ClusterService extends BaseService {
   public WidgetLayoutService getWidgetLayoutService(@Context javax.ws.rs.core.Request request,
                                                     @PathParam ("clusterName") String clusterName) {
 
-    return new WidgetLayoutService(clusterName);
+    return new WidgetLayoutService(m_apiVersion, clusterName);
   }
 
   /**
@@ -619,7 +634,7 @@ public class ClusterService extends BaseService {
   public WidgetService getWidgetService(@Context javax.ws.rs.core.Request request,
                                                     @PathParam ("clusterName") String clusterName) {
 
-    return new WidgetService(clusterName);
+    return new WidgetService(m_apiVersion, clusterName);
   }
 
   /**
@@ -633,7 +648,7 @@ public class ClusterService extends BaseService {
   public CredentialService getCredentials(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new CredentialService(clusterName);
+    return new CredentialService(m_apiVersion, clusterName);
   }
 
   /**
@@ -648,7 +663,7 @@ public class ClusterService extends BaseService {
   public ClusterKerberosDescriptorService getCompositeKerberosDescriptor(
       @Context javax.ws.rs.core.Request request,
       @PathParam("clusterName") String clusterName) {
-    return new ClusterKerberosDescriptorService(clusterName);
+    return new ClusterKerberosDescriptorService(m_apiVersion, clusterName);
   }
 
   /**
@@ -662,7 +677,7 @@ public class ClusterService extends BaseService {
   @Path("{clusterName}/logging")
   public LoggingService getLogging(@Context javax.ws.rs.core.Request request,
                                    @PathParam("clusterName") String clusterName) {
-    return new LoggingService(clusterName);
+    return new LoggingService(m_apiVersion, clusterName);
   }
 
   // ----- helper methods ----------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterStackVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterStackVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterStackVersionService.java
index e3150b0..3880bbc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterStackVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterStackVersionService.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;
 
 /**
@@ -48,7 +49,8 @@ public class ClusterStackVersionService extends BaseService {
    *
    * @param clusterName name of the cluster
    */
-  public ClusterStackVersionService(String clusterName) {
+  public ClusterStackVersionService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     this.clusterName = clusterName;
   }
 
@@ -102,7 +104,7 @@ public class ClusterStackVersionService extends BaseService {
     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.Cluster, clusterName);
     mapIds.put(Resource.Type.ClusterStackVersion, stackVersion);
-    return new RepositoryVersionService(mapIds);
+    return new RepositoryVersionService(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/CompatibleRepositoryVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java
index 12d6433..6e4d202 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CompatibleRepositoryVersionService.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;
 
 /**
@@ -47,7 +48,8 @@ public class CompatibleRepositoryVersionService extends BaseService {
    *
    * @param parentProperties extra properties to be inserted into created resource
    */
-  public CompatibleRepositoryVersionService(Map<Resource.Type, String> parentProperties) {
+  public CompatibleRepositoryVersionService(ApiVersion apiVersion, Map<Resource.Type, String> parentProperties) {
+    super(apiVersion);
     parentKeyProperties = parentProperties;
   }
 
@@ -94,7 +96,7 @@ public class CompatibleRepositoryVersionService extends BaseService {
     mapIds.putAll(parentKeyProperties);
     mapIds.put(Resource.Type.CompatibleRepositoryVersion, 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/ComponentService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ComponentService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ComponentService.java
index e7e0029..2fca698 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ComponentService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ComponentService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 import com.google.inject.Inject;
 import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.spi.ClusterController;
 import org.apache.ambari.server.controller.spi.Resource;
@@ -56,7 +57,8 @@ public class ComponentService extends BaseService {
    * @param clusterName cluster id
    * @param serviceName service id
    */
-  public ComponentService(String clusterName, String serviceName) {
+  public ComponentService(ApiVersion apiVersion, String clusterName, String serviceName) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_serviceName = serviceName;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigGroupService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigGroupService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigGroupService.java
index 39f1f55..46ce7c3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigGroupService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigGroupService.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;
@@ -47,7 +48,8 @@ public class ConfigGroupService extends BaseService {
    * Constructor
    * @param m_clusterName
    */
-  public ConfigGroupService(String m_clusterName) {
+  public ConfigGroupService(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/ConfigurationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigurationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigurationService.java
index cfbfc7f..83a12f9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigurationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ConfigurationService.java
@@ -28,6 +28,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 java.util.HashMap;
@@ -47,13 +48,14 @@ public class ConfigurationService extends BaseService {
    *
    * @param clusterName cluster id
    */
-  public ConfigurationService(String clusterName) {
+  public ConfigurationService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 
   @Path("service_config_versions")
   public ServiceConfigVersionService getServiceConfigVersionService() {
-    return new ServiceConfigVersionService(m_clusterName);
+    return new ServiceConfigVersionService(m_apiVersion, m_clusterName);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/CredentialService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/CredentialService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CredentialService.java
index 01f8e8f..7604397 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/CredentialService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/CredentialService.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;
@@ -42,7 +43,8 @@ public class CredentialService extends BaseService {
 
   private final String clusterName;
 
-  public CredentialService(String clusterName) {
+  public CredentialService(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/FeedService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/FeedService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/FeedService.java
index 6741303..5919f1d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/FeedService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/FeedService.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 feed service.
  */
-@Path("/feeds/")
 public class FeedService extends BaseService {
 
+  public FeedService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /feeds/{feedName}
    * Get a specific feed.
@@ -134,7 +138,7 @@ public class FeedService extends BaseService {
    */
   @Path("{feedName}/instances")
   public InstanceService getHostHandler(@PathParam("feedName") String feedName) {
-    return new InstanceService(feedName);
+    return new InstanceService(m_apiVersion, feedName);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupPrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupPrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupPrivilegeService.java
index 290d488..5afd459 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupPrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupPrivilegeService.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.servlet.http.HttpServletResponse;
@@ -35,7 +36,8 @@ public class GroupPrivilegeService extends PrivilegeService {
 
   private final String groupName;
 
-  public GroupPrivilegeService(String groupName) {
+  public GroupPrivilegeService(ApiVersion apiVersion, String groupName) {
+    super(apiVersion);
     this.groupName = groupName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupService.java
index 7ecd87f..bf24cf1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/GroupService.java
@@ -29,6 +29,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 java.util.Collections;
@@ -36,8 +37,11 @@ import java.util.Collections;
 /**
  * Service responsible for user groups requests.
  */
-@Path("/groups/")
 public class GroupService extends BaseService {
+  public GroupService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Gets all groups.
    * Handles: GET /groups requests.
@@ -127,7 +131,7 @@ public class GroupService extends BaseService {
    */
   @Path("{groupName}/members")
   public MemberService getMemberHandler(@PathParam("groupName") String groupName) {
-    return new MemberService(groupName);
+    return new MemberService(m_apiVersion, groupName);
   }
 
   /**
@@ -137,7 +141,7 @@ public class GroupService extends BaseService {
   public PrivilegeService getPrivilegeService(@Context javax.ws.rs.core.Request request,
                                               @PathParam ("groupName") String groupName) {
 
-    return new GroupPrivilegeService(groupName);
+    return new GroupPrivilegeService(m_apiVersion, groupName);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostComponentService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostComponentService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostComponentService.java
index 4990ad7..4631e63 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostComponentService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostComponentService.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.configuration.Configuration;
 import org.apache.ambari.server.controller.spi.Resource;
 
@@ -55,7 +56,8 @@ public class HostComponentService extends BaseService {
    * @param clusterName cluster id
    * @param hostName    host id
    */
-  public HostComponentService(String clusterName, String hostName) {
+  public HostComponentService(ApiVersion apiVersion, String clusterName, String hostName) {
+    super(apiVersion);
     m_clusterName = clusterName;
     m_hostName = hostName;
   }
@@ -249,6 +251,7 @@ public class HostComponentService extends BaseService {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.Cluster, clusterName);
     mapIds.put(Resource.Type.Host, hostName);
+    mapIds.put(Resource.Type.Service, null);
     mapIds.put(Resource.Type.HostComponent, hostComponentName);
 
     return createResource(Resource.Type.HostComponent, mapIds);
@@ -259,6 +262,7 @@ public class HostComponentService extends BaseService {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.Cluster, m_clusterName);
     mapIds.put(Resource.Type.Host, m_hostName);
+    mapIds.put(Resource.Type.Service, null);
     mapIds.put(Resource.Type.Component, hostComponentName);
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostKerberosIdentityService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostKerberosIdentityService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostKerberosIdentityService.java
index 624a335..5c0ffca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostKerberosIdentityService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostKerberosIdentityService.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;
@@ -55,7 +56,8 @@ public class HostKerberosIdentityService extends BaseService {
    * @param clusterName cluster name
    * @param hostName    host name
    */
-  public HostKerberosIdentityService(String clusterName, String hostName) {
+  public HostKerberosIdentityService(ApiVersion apiVersion, String clusterName, String hostName) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.hostName = hostName;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java
index 0ce29ae..c8225a8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostService.java
@@ -34,12 +34,12 @@ 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;
 
 /**
  * Service responsible for hosts resource requests.
  */
-@Path("/hosts/")
 public class HostService extends BaseService {
 
   /**
@@ -50,7 +50,8 @@ public class HostService extends BaseService {
   /**
    * Constructor.
    */
-  public HostService() {
+  public HostService(ApiVersion apiVersion) {
+    super(apiVersion);
   }
 
   /**
@@ -58,7 +59,8 @@ public class HostService extends BaseService {
    *
    * @param clusterName cluster id
    */
-  public HostService(String clusterName) {
+  public HostService(ApiVersion apiVersion, String clusterName) {
+    super(apiVersion);
     m_clusterName = clusterName;
   }
 
@@ -211,7 +213,7 @@ public class HostService extends BaseService {
    */
   @Path("{hostName}/host_components")
   public HostComponentService getHostComponentHandler(@PathParam("hostName") String hostName) {
-    return new HostComponentService(m_clusterName, hostName);
+    return new HostComponentService(m_apiVersion, m_clusterName, hostName);
   }
 
   /**
@@ -222,7 +224,7 @@ public class HostService extends BaseService {
    */
   @Path("{hostName}/kerberos_identities")
   public HostKerberosIdentityService getHostKerberosIdentityHandler(@PathParam("hostName") String hostName) {
-    return new HostKerberosIdentityService(m_clusterName, hostName);
+    return new HostKerberosIdentityService(m_apiVersion, m_clusterName, hostName);
   }
 
   /**
@@ -233,7 +235,7 @@ public class HostService extends BaseService {
    */
   @Path("{hostName}/alerts")
   public AlertService getAlertHandler(@PathParam("hostName") String hostName) {
-    return new AlertService(m_clusterName, null, hostName);
+    return new AlertService(m_apiVersion, m_clusterName, null, hostName);
   }
 
   /**
@@ -251,7 +253,7 @@ public class HostService extends BaseService {
       @Context javax.ws.rs.core.Request request,
       @PathParam("hostName") String hostName) {
 
-    return new AlertHistoryService(m_clusterName, null, hostName);
+    return new AlertHistoryService(m_apiVersion, m_clusterName, null, hostName);
   }
 
   /**
@@ -268,7 +270,7 @@ public class HostService extends BaseService {
   public HostStackVersionService getHostStackVersionService(@Context javax.ws.rs.core.Request request,
       @PathParam("hostName") String hostName) {
 
-    return new HostStackVersionService(hostName, m_clusterName);
+    return new HostStackVersionService(m_apiVersion, hostName, m_clusterName);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostStackVersionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostStackVersionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostStackVersionService.java
index f449052..331c920 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostStackVersionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/HostStackVersionService.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;
 
 /**
@@ -52,7 +53,8 @@ public class HostStackVersionService extends BaseService {
    *
    * @param hostName name of the host
    */
-  public HostStackVersionService(String hostName, String clusterName) {
+  public HostStackVersionService(ApiVersion apiVersion, String hostName, String clusterName) {
+    super(apiVersion);
     this.hostName = hostName;
     this.clusterName = clusterName;
   }
@@ -116,7 +118,7 @@ public class HostStackVersionService extends BaseService {
     final Map<Resource.Type, String> stackVersionProperties = new HashMap<Resource.Type, String>();
     stackVersionProperties.put(Resource.Type.Host, hostName);
     stackVersionProperties.put(Resource.Type.HostStackVersion, stackVersionId);
-    return new RepositoryVersionService(stackVersionProperties);
+    return new RepositoryVersionService(m_apiVersion, stackVersionProperties);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/InstanceService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/InstanceService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/InstanceService.java
index e771ccc..62531f1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/InstanceService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/InstanceService.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;
 
 import java.util.HashMap;
@@ -39,7 +40,6 @@ import java.util.Map;
 /**
  * Service responsible for instances resource requests.
  */
-@Path("/instances/")
 public class InstanceService extends BaseService {
 
   /**
@@ -50,7 +50,8 @@ public class InstanceService extends BaseService {
   /**
    * Constructor.
    */
-  public InstanceService() {
+  public InstanceService(ApiVersion apiVersion) {
+    super(apiVersion);
   }
 
   /**
@@ -58,7 +59,8 @@ public class InstanceService extends BaseService {
    *
    * @param feedName feed id
    */
-  public InstanceService(String feedName) {
+  public InstanceService(ApiVersion apiVersion, String feedName) {
+    super(apiVersion);
     m_feedName = feedName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/JobService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/JobService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/JobService.java
index ab4b635..94a21c3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/JobService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/JobService.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;
 
 /**
@@ -48,7 +49,8 @@ public class JobService extends BaseService {
    * @param workflowId
    *          workflow id
    */
-  public JobService(String clusterName, String workflowId) {
+  public JobService(ApiVersion apiVersion, String clusterName, String workflowId) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.workflowId = workflowId;
   }
@@ -95,7 +97,7 @@ public class JobService extends BaseService {
   @Path("{jobId}/taskattempts")
   public TaskAttemptService getTaskAttemptHandler(
       @PathParam("jobId") String jobId) {
-    return new TaskAttemptService(clusterName, workflowId, jobId);
+    return new TaskAttemptService(m_apiVersion, clusterName, workflowId, jobId);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/KerberosDescriptorService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/KerberosDescriptorService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/KerberosDescriptorService.java
index 91e1dc5..a14bb2c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/KerberosDescriptorService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/KerberosDescriptorService.java
@@ -1,6 +1,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;
@@ -33,9 +34,12 @@ import java.util.Collections;
  * limitations under the License.
  */
 
-@Path("/kerberos_descriptors/")
 public class KerberosDescriptorService extends BaseService {
 
+  public KerberosDescriptorService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET  /kerberos_descriptors
    * Get all kerberos descriptors.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/KeyService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/KeyService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/KeyService.java
index 6d2d22f..bd44374 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/KeyService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/KeyService.java
@@ -30,7 +30,6 @@ import javax.xml.bind.JAXBException;
 import java.io.IOException;
 import java.util.Collection;
 
-@Path("/keys/")
 public class KeyService {
   private static final Logger log = LoggerFactory.getLogger(KeyService.class);
   private static PersistKeyValueImpl persistKeyVal;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/LdapSyncEventService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LdapSyncEventService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LdapSyncEventService.java
index bf4bcff..3b50c42 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LdapSyncEventService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LdapSyncEventService.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,8 +38,11 @@ import java.util.Collections;
 /**
  * Service responsible for ldap sync event resource requests.
  */
-@Path("/ldap_sync_events/")
 public class LdapSyncEventService extends BaseService {
+  public LdapSyncEventService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /ldap_sync_events/{eventId}
    * Get a specific view.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java
index c93f7bd..75e5fb0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LoggingService.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.services.serializers.ResultSerializer;
+import org.apache.ambari.server.api.util.ApiVersion;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.AmbariServer;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
@@ -58,11 +59,13 @@ public class LoggingService extends BaseService {
 
   private final String clusterName;
 
-  public LoggingService(String clusterName) {
-    this(clusterName, new DefaultControllerFactory(), new LoggingRequestHelperFactoryImpl());
+  public LoggingService(ApiVersion apiVersion, String clusterName) {
+    this(apiVersion, clusterName, new DefaultControllerFactory(), new LoggingRequestHelperFactoryImpl());
   }
 
-  public LoggingService(String clusterName, ControllerFactory controllerFactory, LoggingRequestHelperFactory helperFactory) {
+  public LoggingService(ApiVersion apiVersion, String clusterName, ControllerFactory controllerFactory,
+                        LoggingRequestHelperFactory helperFactory) {
+    super(apiVersion);
     this.clusterName = clusterName;
     this.controllerFactory = controllerFactory;
     this.helperFactory = helperFactory;

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java
index 02403f9..4e1e831 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/LogoutService.java
@@ -37,7 +37,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
  * Service performing logout of current user
  */
 @StaticallyInject
-@Path("/logout")
 public class LogoutService {
 
   @Inject

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
index 28e53e6..8b01ea3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.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;
 
 /**
@@ -49,7 +50,8 @@ public class MemberService extends BaseService {
    *
    * @param groupName name of the group
    */
-  public MemberService(String groupName) {
+  public MemberService(ApiVersion apiVersion, String groupName) {
+    super(apiVersion);
     this.groupName = groupName;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/OperatingSystemService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/OperatingSystemService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/OperatingSystemService.java
index 531f964..0ea548d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/OperatingSystemService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/OperatingSystemService.java
@@ -47,6 +47,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;
 
 /**
@@ -64,7 +65,8 @@ public class OperatingSystemService extends BaseService {
    *
    * @param parentKeyProperties extra properties to be inserted into created resource
    */
-  public OperatingSystemService(Map<Resource.Type, String> parentKeyProperties) {
+  public OperatingSystemService(ApiVersion apiVersion, Map<Resource.Type, String> parentKeyProperties) {
+    super(apiVersion);
     this.parentKeyProperties = parentKeyProperties;
   }
 
@@ -108,7 +110,7 @@ public class OperatingSystemService extends BaseService {
     final Map<Resource.Type, String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.putAll(parentKeyProperties);
     mapIds.put(Resource.Type.OperatingSystem, osType);
-    return new RepositoryService(mapIds);
+    return new RepositoryService(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/PermissionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PermissionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PermissionService.java
index 3a1a875..3ddb53f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PermissionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PermissionService.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 permission resource requests.
  */
-@Path("/permissions/")
 public class PermissionService extends BaseService {
 
+  public PermissionService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /permissions/{permissionID}
    * Get a specific permission.
@@ -142,7 +146,7 @@ public class PermissionService extends BaseService {
   @Path("{permissionId}/authorizations")
   public RoleAuthorizationService getRoleAuthorizations(
       @Context javax.ws.rs.core.Request request, @PathParam("permissionId") String permissionId) {
-    return new RoleAuthorizationService(permissionId);
+    return new RoleAuthorizationService(m_apiVersion, permissionId);
   }
 
   // ----- helper methods ----------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/PersistKeyValueService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PersistKeyValueService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PersistKeyValueService.java
index 83217c5..fa12be6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PersistKeyValueService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PersistKeyValueService.java
@@ -40,7 +40,6 @@ import org.apache.commons.logging.LogFactory;
 
 import com.google.inject.Inject;
 
-@Path("/persist/")
 public class PersistKeyValueService {
   private static PersistKeyValueImpl persistKeyVal;
   private static Log LOG = LogFactory.getLog(PersistKeyValueService.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/PreUpgradeCheckService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PreUpgradeCheckService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PreUpgradeCheckService.java
index 0525b3a..d834227 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PreUpgradeCheckService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PreUpgradeCheckService.java
@@ -27,6 +27,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;
 
 /**
@@ -44,7 +45,8 @@ public class PreUpgradeCheckService extends BaseService {
    *
    * @param clusterName cluster name
    */
-  public PreUpgradeCheckService(String clusterName) {
+  public PreUpgradeCheckService(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/PrivilegeService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java
index 2caa5d2..2f52ae7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.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 javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
@@ -38,6 +39,10 @@ import javax.ws.rs.core.UriInfo;
  */
 public abstract class PrivilegeService extends BaseService {
 
+  public PrivilegeService(ApiVersion apiVersion) {
+    super(apiVersion);
+  }
+
   /**
    * Handles: GET /privileges/{privilegeID}
    * Get a specific privilege.

http://git-wip-us.apache.org/repos/asf/ambari/blob/b88db3cc/ambari-server/src/main/java/org/apache/ambari/server/api/services/RecommendationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RecommendationService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RecommendationService.java
deleted file mode 100644
index 23248b3..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RecommendationService.java
+++ /dev/null
@@ -1,71 +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 preparing recommendations for host-layout and
- * configurations.
- */
-@Path("/stacks/{stackName}/versions/{stackVersion}/recommendations")
-public class RecommendationService extends BaseService {
-
-  /**
-   * 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
-  @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));
-  }
-
-  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);
-  }
-
-}