You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2014/05/06 23:03:04 UTC

git commit: AMBARI-5677 - Ambari Views : Ability to handle name + version views and view instances

Repository: ambari
Updated Branches:
  refs/heads/trunk 32210667d -> 6d33c3240


AMBARI-5677 - Ambari Views : Ability to handle name + version views and view instances


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

Branch: refs/heads/trunk
Commit: 6d33c324070206a188d456d37b4addb1607521ce
Parents: 3221066
Author: tbeerbower <tb...@hortonworks.com>
Authored: Tue May 6 12:24:05 2014 -0400
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Tue May 6 16:50:46 2014 -0400

----------------------------------------------------------------------
 .../resources/ResourceInstanceFactoryImpl.java  |   8 +-
 .../api/resources/ViewResourceDefinition.java   |   2 +-
 .../ViewVersionResourceDefinition.java          |  58 ++++++
 .../ViewExternalSubResourceService.java         |  16 +-
 .../api/services/ViewInstanceService.java       |  39 ++--
 .../ambari/server/api/services/ViewService.java |   8 +-
 .../api/services/ViewSubResourceService.java    |  17 +-
 .../server/api/services/ViewVersionService.java | 185 +++++++++++++++++++
 .../internal/DefaultProviderModule.java         |   2 +
 .../internal/ViewInstanceResourceProvider.java  |  33 +++-
 .../internal/ViewResourceProvider.java          |  21 +--
 .../internal/ViewVersionResourceProvider.java   | 159 ++++++++++++++++
 .../ambari/server/controller/spi/Resource.java  |   2 +
 .../ambari/server/orm/entities/ViewEntity.java  |  41 +++-
 .../server/orm/entities/ViewInstanceEntity.java |   8 +-
 .../ambari/server/view/ViewContextImpl.java     |   2 +-
 .../view/ViewExternalSubResourceProvider.java   |   6 +-
 .../apache/ambari/server/view/ViewRegistry.java |  62 ++++---
 .../server/view/ViewSubResourceProvider.java    |  15 +-
 .../resources/ViewResourceDefinitionTest.java   |   2 +-
 .../ViewVersionResourceDefinitionTest.java      |  51 +++++
 .../server/orm/entities/ViewEntityTest.java     |   8 +-
 .../orm/entities/ViewInstanceEntityTest.java    |   4 +-
 .../ambari/server/view/ViewContextImplTest.java |   2 +-
 .../ambari/server/view/ViewRegistryTest.java    |   6 +-
 .../view/ViewSubResourceDefinitionTest.java     |   6 +-
 26 files changed, 667 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
index 49ed8ab..e1428d8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ResourceInstanceFactoryImpl.java
@@ -201,9 +201,15 @@ public class ResourceInstanceFactoryImpl implements ResourceInstanceFactory {
         resourceDefinition = new ViewResourceDefinition();
         break;
 
+      case ViewVersion:
+        resourceDefinition = new ViewVersionResourceDefinition();
+        break;
+
       case ViewInstance:
         Set<SubResourceDefinition> subResourceDefinitions =
-            ViewRegistry.getInstance().getSubResourceDefinitions(mapIds.get(Resource.Type.View));
+            ViewRegistry.getInstance().getSubResourceDefinitions(
+                mapIds.get(Resource.Type.View),
+                mapIds.get(Resource.Type.ViewVersion));
 
         resourceDefinition = new ViewInstanceResourceDefinition(subResourceDefinitions);
         break;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java
index a068183..4951b03 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewResourceDefinition.java
@@ -53,6 +53,6 @@ public class ViewResourceDefinition extends BaseResourceDefinition {
 
   @Override
   public Set<SubResourceDefinition> getSubResourceDefinitions() {
-    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewInstance));
+    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewVersion));
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java
new file mode 100644
index 0000000..e67a50b
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinition.java
@@ -0,0 +1,58 @@
+/**
+ * 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.resources;
+
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.Collections;
+import java.util.Set;
+
+
+/**
+ * View version resource definition.
+ */
+public class ViewVersionResourceDefinition extends BaseResourceDefinition {
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view version resource definition.
+   */
+  public ViewVersionResourceDefinition() {
+    super(Resource.Type.ViewVersion);
+  }
+
+
+  // ----- ResourceDefinition ------------------------------------------------
+
+  @Override
+  public String getPluralName() {
+    return "versions";
+  }
+
+  @Override
+  public String getSingularName() {
+    return "version";
+  }
+
+  @Override
+  public Set<SubResourceDefinition> getSubResourceDefinitions() {
+    return Collections.singleton(new SubResourceDefinition(Resource.Type.ViewInstance));
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/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 3617a63..28912f4 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
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 
 import javax.ws.rs.GET;
@@ -50,6 +51,11 @@ public class ViewExternalSubResourceService  extends BaseService {
   private final String viewName;
 
   /**
+   * The view version.
+   */
+  private final String version;
+
+  /**
    * The instance name.
    */
   private final String instanceName;
@@ -63,8 +69,11 @@ public class ViewExternalSubResourceService  extends BaseService {
   // ----- Constructors ------------------------------------------------------
 
   public ViewExternalSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
+
     this.type         = type;
-    this.viewName     = viewInstanceDefinition.getViewName();
+    this.viewName     = viewEntity.getCommonName();
+    this.version      = viewEntity.getVersion();
     this.instanceName = viewInstanceDefinition.getName();
   }
 
@@ -81,7 +90,7 @@ public class ViewExternalSubResourceService  extends BaseService {
   @Produces("text/plain")
   public Response getResources(@Context HttpHeaders headers, @Context UriInfo ui) {
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(viewName, instanceName));
+        createResource(viewName, instanceName));
   }
 
   /**
@@ -126,9 +135,10 @@ public class ViewExternalSubResourceService  extends BaseService {
    *
    * @return a view instance resource
    */
-  private ResourceInstance createServiceResource(String viewName, String instanceName) {
+  private ResourceInstance createResource(String viewName, String instanceName) {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     return createResource(type, mapIds);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/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 0b0acad..5d4ae97 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
@@ -44,7 +44,12 @@ public class ViewInstanceService extends BaseService {
   /**
    * Parent view name.
    */
-  private String m_viewName;
+  private final String viewName;
+
+  /**
+   * The view version.
+   */
+  private final String version;
 
 
   // ----- Constructors ------------------------------------------------------
@@ -53,11 +58,16 @@ public class ViewInstanceService extends BaseService {
    * Construct a view instance service.
    *
    * @param viewName  the view id
+   * @param version   the version
    */
-  public ViewInstanceService(String viewName) {
-    m_viewName = viewName;
+  public ViewInstanceService(String viewName, String version) {
+    this.viewName = viewName;
+    this.version  = version;
   }
 
+
+  // ----- ViewInstanceService -----------------------------------------------
+
   /**
    * Handles URL: /views/{viewID}/instances/{instanceID}
    * Get a specific instance.
@@ -75,7 +85,7 @@ public class ViewInstanceService extends BaseService {
                              @PathParam("instanceName") String instanceName) {
 
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(m_viewName, instanceName));
+        createResource(viewName, version, instanceName));
   }
 
   /**
@@ -91,7 +101,7 @@ public class ViewInstanceService extends BaseService {
   @Produces("text/plain")
   public Response getServices(@Context HttpHeaders headers, @Context UriInfo ui) {
     return handleRequest(headers, null, ui, Request.Type.GET,
-        createServiceResource(m_viewName, null));
+        createResource(viewName, version,  null));
   }
 
   /**
@@ -111,7 +121,7 @@ public class ViewInstanceService extends BaseService {
   public Response createService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
     return handleRequest(headers, body, ui, Request.Type.POST,
-        createServiceResource(m_viewName, instanceName));
+        createResource(viewName, version,  instanceName));
   }
 
   /**
@@ -129,7 +139,7 @@ public class ViewInstanceService extends BaseService {
   public Response createServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 
     return handleRequest(headers, body, ui, Request.Type.POST,
-        createServiceResource(m_viewName, null));
+        createResource(viewName, version,  null));
   }
 
   /**
@@ -149,7 +159,7 @@ public class ViewInstanceService extends BaseService {
   public Response updateService(String body, @Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
 
-    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceResource(m_viewName, instanceName));
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version,  instanceName));
   }
 
   /**
@@ -166,7 +176,7 @@ public class ViewInstanceService extends BaseService {
   @Produces("text/plain")
   public Response updateServices(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
 
-    return handleRequest(headers, body, ui, Request.Type.PUT, createServiceResource(m_viewName, null));
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version,  null));
   }
 
   /**
@@ -185,7 +195,7 @@ public class ViewInstanceService extends BaseService {
   public Response deleteService(@Context HttpHeaders headers, @Context UriInfo ui,
                                 @PathParam("instanceName") String instanceName) {
 
-    return handleRequest(headers, null, ui, Request.Type.DELETE, createServiceResource(m_viewName, instanceName));
+    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version,  instanceName));
   }
 
   /**
@@ -200,18 +210,18 @@ public class ViewInstanceService extends BaseService {
                                             @PathParam("resources") String resources) {
 
     ViewInstanceEntity instanceDefinition =
-        ViewRegistry.getInstance().getInstanceDefinition(m_viewName, instanceName);
+        ViewRegistry.getInstance().getInstanceDefinition(viewName, version, instanceName);
 
     if (instanceDefinition == null) {
       throw new IllegalArgumentException("A view instance " +
-          m_viewName + "/" + instanceName + " can not be found.");
+          viewName + "/" + instanceName + " can not be found.");
     }
 
     Object service = instanceDefinition.getService(resources);
 
     if (service == null) {
       throw new IllegalArgumentException("A resource type " + resources + " for view instance " +
-          m_viewName + "/" + instanceName + " can not be found.");
+          viewName + "/" + instanceName + " can not be found.");
     }
     return service;
   }
@@ -227,9 +237,10 @@ public class ViewInstanceService extends BaseService {
    *
    * @return a view instance resource
    */
-  private ResourceInstance createServiceResource(String viewName, String instanceName) {
+  private ResourceInstance createResource(String viewName, String viewVersion, String instanceName) {
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, viewVersion);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
     return createResource(Resource.Type.ViewInstance, mapIds);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/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 45d7d2f..b177ec9 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
@@ -137,11 +137,11 @@ public class ViewService extends BaseService {
    *
    * @param viewName  view id
    *
-   * @return the hosts service
+   * @return the versions service
    */
-  @Path("{viewName}/instances")
-  public ViewInstanceService getInstanceHandler(@PathParam("viewName") String viewName) {
-    return new ViewInstanceService(viewName);
+  @Path("{viewName}/versions")
+  public ViewVersionService getInstanceHandler(@PathParam("viewName") String viewName) {
+    return new ViewVersionService(viewName);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/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 52dd608..d5434ea 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
@@ -20,6 +20,8 @@ package org.apache.ambari.server.api.services;
 
 import org.apache.ambari.server.api.resources.ResourceInstance;
 import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.orm.entities.ViewEntity;
+import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.view.ViewResourceHandler;
 
 import javax.ws.rs.core.HttpHeaders;
@@ -43,6 +45,11 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
   private final String viewName;
 
   /**
+   * The view version.
+   */
+  private final String version;
+
+  /**
    * The associated view instance name.
    */
   private final String instanceName;
@@ -53,10 +60,13 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
   /**
    * Construct a view sub-resource service.
    */
-  public ViewSubResourceService(Resource.Type type, String viewName, String instanceName) {
+  public ViewSubResourceService(Resource.Type type, ViewInstanceEntity viewInstanceDefinition) {
+    ViewEntity viewEntity = viewInstanceDefinition.getViewEntity();
+
     this.type         = type;
-    this.viewName     = viewName;
-    this.instanceName = instanceName;
+    this.viewName     = viewEntity.getCommonName();
+    this.version      = viewEntity.getVersion();
+    this.instanceName = viewInstanceDefinition.getName();
   }
 
 
@@ -76,6 +86,7 @@ public class ViewSubResourceService extends BaseService implements ViewResourceH
     Map<Resource.Type,String> mapIds = new HashMap<Resource.Type,String>();
 
     mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
     mapIds.put(Resource.Type.ViewInstance, instanceName);
 
     if (resourceId != null) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/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
new file mode 100644
index 0000000..a3bde5e
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/ViewVersionService.java
@@ -0,0 +1,185 @@
+/**
+ * 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.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.HashMap;
+import java.util.Map;
+
+
+/**
+ * Service responsible for view version resource requests.
+ */
+public class ViewVersionService extends BaseService {
+
+  /**
+   * Parent view name.
+   */
+  private final String viewName;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view version service.
+   *
+   * @param viewName  the view name
+   */
+  public ViewVersionService(String viewName) {
+    this.viewName = viewName;
+  }
+
+
+  // ----- ViewVersionService ------------------------------------------------
+
+  /**
+   * Handles: GET /versions/{version}
+   * Get a specific view version.
+   *
+   * @param headers  http headers
+   * @param ui       uri info
+   * @param version  version id
+   *
+   * @return view instance representation
+   */
+  @GET
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response getVersions(@Context HttpHeaders headers, @Context UriInfo ui,
+                          @PathParam("version") String version) {
+
+    return handleRequest(headers, null, ui, Request.Type.GET, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: GET  /versions
+   * Get all views versions.
+   *
+   * @param headers  http headers
+   * @param ui       uri info
+   *
+   * @return view collection resource representation
+   */
+  @GET
+  @Produces("text/plain")
+  public Response getVersions(@Context HttpHeaders headers, @Context UriInfo ui) {
+
+    return handleRequest(headers, null, ui, Request.Type.GET, createResource(viewName, null));
+  }
+
+  /**
+   * Handles: POST /versions/{version}
+   * Create a specific view version.
+   *
+   * @param headers    http headers
+   * @param ui         uri info
+   * @param version    the version
+   *
+   * @return information regarding the created view
+   */
+  @POST
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response createVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, body, ui, Request.Type.POST, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: PUT /versions/{version}
+   * Update a specific view version.
+   *
+   * @param headers   http headers
+   * @param ui        uri info
+   * @param version   the version
+   *
+   * @return information regarding the updated view
+   */
+  @PUT
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response updateVersions(String body, @Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, body, ui, Request.Type.PUT, createResource(viewName, version));
+  }
+
+  /**
+   * Handles: DELETE /versions/{version}
+   * Delete a specific view version.
+   *
+   * @param headers   http headers
+   * @param ui        uri info
+   * @param version   version id
+   *
+   * @return information regarding the deleted view version
+   */
+  @DELETE
+  @Path("{version}")
+  @Produces("text/plain")
+  public Response deleteVersions(@Context HttpHeaders headers, @Context UriInfo ui,
+                             @PathParam("version") String version) {
+
+    return handleRequest(headers, null, ui, Request.Type.DELETE, createResource(viewName, version));
+  }
+
+  /**
+   * Get the instances sub-resource
+   *
+   * @param version  the version
+   *
+   * @return the instance service
+   */
+  @Path("{version}/instances")
+  public ViewInstanceService getInstanceHandler(@PathParam("version") String version) {
+
+    return new ViewInstanceService(viewName, version);
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Create a view resource.
+   *
+   * @param viewName view name
+   *
+   * @return a view resource instance
+   */
+  private ResourceInstance createResource(String viewName, String version) {
+    Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.View, viewName);
+    mapIds.put(Resource.Type.ViewVersion, version);
+    return createResource(Resource.Type.ViewVersion, mapIds);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
index c7e54c6..cdc30d2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
@@ -63,6 +63,8 @@ public class DefaultProviderModule extends AbstractProviderModule {
         return new TaskAttemptResourceProvider(propertyIds, keyPropertyIds);
       case View:
         return new ViewResourceProvider();
+      case ViewVersion:
+        return new ViewVersionResourceProvider();
       case ViewInstance:
         return new ViewInstanceResourceProvider();
       case Blueprint:

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
index bc93e7b..49298b0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
@@ -52,6 +52,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
    * View instance property id constants.
    */
   public static final String VIEW_NAME_PROPERTY_ID     = "ViewInstanceInfo/view_name";
+  public static final String VIEW_VERSION_PROPERTY_ID  = "ViewInstanceInfo/version";
   public static final String INSTANCE_NAME_PROPERTY_ID = "ViewInstanceInfo/instance_name";
   public static final String PROPERTIES_PROPERTY_ID    = "ViewInstanceInfo/properties";
   public static final String DATA_PROPERTY_ID          = "ViewInstanceInfo/instance_data";
@@ -69,6 +70,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
   static {
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
   }
 
@@ -78,6 +80,7 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
   private static Set<String> propertyIds = new HashSet<String>();
   static {
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(PROPERTIES_PROPERTY_ID);
     propertyIds.add(DATA_PROPERTY_ID);
@@ -123,15 +126,18 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
 
     for (Map<String, Object> propertyMap : propertyMaps) {
 
-      String viewName = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewName     = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewVersion  = (String) propertyMap.get(VIEW_VERSION_PROPERTY_ID);
       String instanceName = (String) propertyMap.get(INSTANCE_NAME_PROPERTY_ID);
 
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
-        if (viewName == null || viewName.equals(viewDefinition.getName())) {
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
           for (ViewInstanceEntity viewInstanceDefinition : viewRegistry.getInstanceDefinitions(viewDefinition)) {
             if (instanceName == null || instanceName.equals(viewInstanceDefinition.getName())) {
-              Resource resource = toResource(viewInstanceDefinition, requestedIds);
-              resources.add(resource);
+              if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
+                Resource resource = toResource(viewInstanceDefinition, requestedIds);
+                resources.add(resource);
+              }
             }
           }
         }
@@ -182,12 +188,15 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
 
   // Convert an instance entity to a resource
   private Resource toResource(ViewInstanceEntity viewInstanceEntity, Set<String> requestedIds) {
-    Resource resource = new ResourceImpl(Resource.Type.ViewInstance);
+    Resource   resource   = new ResourceImpl(Resource.Type.ViewInstance);
+    ViewEntity viewEntity = viewInstanceEntity.getViewEntity();
 
-    String viewName = viewInstanceEntity.getViewName();
+    String viewName = viewEntity.getCommonName();
+    String version  = viewEntity.getVersion();
     String name     = viewInstanceEntity.getName();
 
     setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewName, requestedIds);
+    setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, version, requestedIds);
     setResourceProperty(resource, INSTANCE_NAME_PROPERTY_ID, name, requestedIds);
     Map<String, String> properties = new HashMap<String, String>();
 
@@ -204,30 +213,36 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
     setResourceProperty(resource, DATA_PROPERTY_ID,
         applicationData, requestedIds);
     setResourceProperty(resource, CONTEXT_PATH_PROPERTY_ID,
-        ViewInstanceEntity.getContextPath(viewName, name), requestedIds);
+        ViewInstanceEntity.getContextPath(viewName, version, name), requestedIds);
 
     return resource;
   }
 
   // Convert a map of properties to a view instance entity.
   private ViewInstanceEntity toEntity(Map<String, Object> properties) {
-    String name     = (String) properties.get(INSTANCE_NAME_PROPERTY_ID);
+    String name = (String) properties.get(INSTANCE_NAME_PROPERTY_ID);
     if (name == null || name.isEmpty()) {
       throw new IllegalArgumentException("View instance name must be provided");
     }
 
+    String version = (String) properties.get(VIEW_VERSION_PROPERTY_ID);
+    if (version == null || version.isEmpty()) {
+      throw new IllegalArgumentException("View version must be provided");
+    }
+
     String viewName = (String) properties.get(VIEW_NAME_PROPERTY_ID);
     if (viewName == null || viewName.isEmpty()) {
       throw new IllegalArgumentException("View name must be provided");
     }
+    viewName = ViewEntity.getViewName(viewName, version);
 
     ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
     viewInstanceEntity.setName(name);
     viewInstanceEntity.setViewName(viewName);
 
-
     ViewEntity viewEntity = new ViewEntity();
     viewEntity.setName(viewName);
+    viewEntity.setVersion(version);
 
     viewInstanceEntity.setViewEntity(viewEntity);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
index a71ab70..b76c8e0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
@@ -44,11 +44,7 @@ public class ViewResourceProvider extends AbstractResourceProvider {
   /**
    * View property id constants.
    */
-  public static final String VIEW_NAME_PROPERTY_ID  = "ViewInfo/view_name";
-  public static final String LABEL_PROPERTY_ID      = "ViewInfo/label";
-  public static final String VERSION_PROPERTY_ID    = "ViewInfo/version";
-  public static final String PARAMETERS_PROPERTY_ID = "ViewInfo/parameters";
-  public static final String ARCHIVE_PROPERTY_ID    = "ViewInfo/archive";
+  public static final String VIEW_NAME_PROPERTY_ID    = "ViewInfo/view_name";
 
 
   /**
@@ -65,10 +61,6 @@ public class ViewResourceProvider extends AbstractResourceProvider {
   private static Set<String> propertyIds = new HashSet<String>();
   static {
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(LABEL_PROPERTY_ID);
-    propertyIds.add(VERSION_PROPERTY_ID);
-    propertyIds.add(PARAMETERS_PROPERTY_ID);
-    propertyIds.add(ARCHIVE_PROPERTY_ID);
   }
 
   
@@ -106,18 +98,13 @@ public class ViewResourceProvider extends AbstractResourceProvider {
 
     for (Map<String, Object> propertyMap : propertyMaps) {
 
-      String viewName = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewName    = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
 
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
-        if (viewName == null || viewName.equals(viewDefinition.getName())) {
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
           Resource resource = new ResourceImpl(Resource.Type.View);
 
-          setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getName(), requestedIds);
-          setResourceProperty(resource, LABEL_PROPERTY_ID, viewDefinition.getLabel(), requestedIds);
-          setResourceProperty(resource, VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
-          setResourceProperty(resource, PARAMETERS_PROPERTY_ID,
-              viewDefinition.getConfiguration().getParameters(), requestedIds);
-          setResourceProperty(resource, ARCHIVE_PROPERTY_ID, viewDefinition.getArchive(), requestedIds);
+          setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName(), requestedIds);
 
           resources.add(resource);
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
new file mode 100644
index 0000000..485eb04
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
@@ -0,0 +1,159 @@
+/**
+ * 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.controller.internal;
+
+import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
+import org.apache.ambari.server.controller.spi.NoSuchResourceException;
+import org.apache.ambari.server.controller.spi.Predicate;
+import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.RequestStatus;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.spi.SystemException;
+import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.orm.entities.ViewEntity;
+import org.apache.ambari.server.view.ViewRegistry;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for view versions.
+ */
+public class ViewVersionResourceProvider extends AbstractResourceProvider {
+
+  /**
+   * View property id constants.
+   */
+  public static final String VIEW_NAME_PROPERTY_ID    = "ViewVersionInfo/view_name";
+  public static final String VIEW_VERSION_PROPERTY_ID = "ViewVersionInfo/version";
+  public static final String LABEL_PROPERTY_ID        = "ViewVersionInfo/label";
+  public static final String VERSION_PROPERTY_ID      = "ViewVersionInfo/version";
+  public static final String PARAMETERS_PROPERTY_ID   = "ViewVersionInfo/parameters";
+  public static final String ARCHIVE_PROPERTY_ID      = "ViewVersionInfo/archive";
+
+  /**
+   * The key property ids for a view resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
+  static {
+    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
+  }
+
+  /**
+   * The property ids for a view resource.
+   */
+  private static Set<String> propertyIds = new HashSet<String>();
+  static {
+    propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
+    propertyIds.add(LABEL_PROPERTY_ID);
+    propertyIds.add(VERSION_PROPERTY_ID);
+    propertyIds.add(PARAMETERS_PROPERTY_ID);
+    propertyIds.add(ARCHIVE_PROPERTY_ID);
+  }
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a view resource provider.
+   */
+  public ViewVersionResourceProvider() {
+    super(propertyIds, keyPropertyIds);
+  }
+
+
+  // ----- ResourceProvider --------------------------------------------------
+
+  @Override
+  public RequestStatus createResources(Request request)
+      throws SystemException, UnsupportedPropertyException,
+      ResourceAlreadyExistsException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public Set<Resource> getResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    Set<Resource> resources    = new HashSet<Resource>();
+    ViewRegistry  viewRegistry = ViewRegistry.getInstance();
+    Set<String>   requestedIds = getRequestPropertyIds(request, predicate);
+
+    Set<Map<String, Object>> propertyMaps = getPropertyMaps(predicate);
+
+    if (propertyMaps.isEmpty()) {
+      propertyMaps.add(Collections.<String, Object>emptyMap());
+    }
+
+    for (Map<String, Object> propertyMap : propertyMaps) {
+
+      String viewName    = (String) propertyMap.get(VIEW_NAME_PROPERTY_ID);
+      String viewVersion = (String) propertyMap.get(VIEW_VERSION_PROPERTY_ID);
+
+      for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
+        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
+          if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
+            Resource resource = new ResourceImpl(Resource.Type.ViewVersion);
+
+            setResourceProperty(resource, VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName(), requestedIds);
+            setResourceProperty(resource, VIEW_VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
+            setResourceProperty(resource, LABEL_PROPERTY_ID, viewDefinition.getLabel(), requestedIds);
+            setResourceProperty(resource, VERSION_PROPERTY_ID, viewDefinition.getVersion(), requestedIds);
+            setResourceProperty(resource, PARAMETERS_PROPERTY_ID,
+                viewDefinition.getConfiguration().getParameters(), requestedIds);
+            setResourceProperty(resource, ARCHIVE_PROPERTY_ID, viewDefinition.getArchive(), requestedIds);
+
+            resources.add(resource);
+          }
+        }
+      }
+    }
+    return resources;
+  }
+
+  @Override
+  public RequestStatus updateResources(Request request, Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public RequestStatus deleteResources(Predicate predicate)
+      throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
+    throw new UnsupportedOperationException("Not yet supported.");
+  }
+
+  @Override
+  public Map<Resource.Type, String> getKeyPropertyIds() {
+    return keyPropertyIds;
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  protected Set<String> getPKPropertyIds() {
+    return new HashSet<String>(keyPropertyIds.values());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
index d47f003..13e7c77 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/spi/Resource.java
@@ -104,6 +104,7 @@ public interface Resource {
     RootServiceComponent,
     RootServiceHostComponent,
     View,
+    ViewVersion,
     ViewInstance,
     Blueprint,
     HostComponentProcess;
@@ -171,6 +172,7 @@ public interface Resource {
     public static final Type RootServiceComponent = InternalType.RootServiceComponent.getType();
     public static final Type RootServiceHostComponent = InternalType.RootServiceHostComponent.getType();
     public static final Type View = InternalType.View.getType();
+    public static final Type ViewVersion = InternalType.ViewVersion.getType();
     public static final Type ViewInstance = InternalType.ViewInstance.getType();
     public static final Type Blueprint = InternalType.Blueprint.getType();
     public static final Type HostComponentProcess = InternalType.HostComponentProcess.getType();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
index a133ad2..84724c8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
@@ -140,6 +140,12 @@ public class ViewEntity {
   @Transient
   private final Map<Resource.Type, ResourceConfig> resourceConfigurations = new HashMap<Resource.Type, ResourceConfig>();
 
+  /**
+   * The name of the view shared across versions.
+   */
+  @Transient
+  private String commonName = null;
+
 
   // ----- Constructors ------------------------------------------------------
 
@@ -169,9 +175,11 @@ public class ViewEntity {
     this.classLoader         = classLoader;
     this.archive             = archivePath;
 
-    this.name    = configuration.getName();
+    String version = configuration.getVersion();
+
+    this.name    = getViewName(configuration.getName(), version);
     this.label   = configuration.getLabel();
-    this.version = configuration.getVersion();
+    this.version = version;
 
     this.externalResourceType =
         new Resource.Type(getQualifiedResourceTypeName(ResourceConfig.EXTERNAL_RESOURCE_PLURAL_NAME));
@@ -199,6 +207,20 @@ public class ViewEntity {
   }
 
   /**
+   * Get the common name of the view.
+   * This name is shared across versions of the view.
+   *
+   * @return the common name
+   */
+  public synchronized String getCommonName() {
+    if (commonName == null) {
+      // Strip version from the internal name
+      commonName = name.replaceAll("\\{(.+)\\}", "");
+    }
+    return commonName;
+  }
+
+  /**
    * Get the view label (display name).
    *
    * @return the view label
@@ -479,4 +501,19 @@ public class ViewEntity {
   public ViewConfig getConfiguration() {
     return configuration;
   }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  /**
+   * Get the internal view name from the given common name and version.
+   *
+   * @param name     the view common name
+   * @param version  the version
+   *
+   * @return the view name
+   */
+  public static String getViewName(String name, String version) {
+    return name + "{" + version + "}";
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
index c6557f2..7b29098 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
@@ -408,7 +408,7 @@ public class ViewInstanceEntity {
    * @return the resource provider
    */
   public ResourceProvider getResourceProvider(String type) {
-    String typeName = view.getName() + "/" + type;
+    String typeName = view.getQualifiedResourceTypeName(type);
     return resourceProviders.get(Resource.Type.valueOf(typeName));
   }
 
@@ -439,7 +439,7 @@ public class ViewInstanceEntity {
    * @return the context path
    */
   public String getContextPath() {
-    return getContextPath(view.getName(), getName());
+    return getContextPath(view.getCommonName(), view.getVersion(), getName());
   }
 
   /**
@@ -450,7 +450,7 @@ public class ViewInstanceEntity {
    *
    * @return the context path
    */
-  public static String getContextPath(String viewName, String viewInstanceName) {
-    return VIEWS_CONTEXT_PATH_PREFIX + viewName + "/" + viewInstanceName;
+  public static String getContextPath(String viewName, String version, String viewInstanceName) {
+    return VIEWS_CONTEXT_PATH_PREFIX + viewName + "/" + version + "/" + viewInstanceName;
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
index 862e2e1..1f936e7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewContextImpl.java
@@ -85,7 +85,7 @@ public class ViewContextImpl implements ViewContext {
 
   @Override
   public String getViewName() {
-    return viewInstanceEntity.getViewName();
+    return viewInstanceEntity.getViewEntity().getCommonName();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java
index e0af2ef..f669e49 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExternalSubResourceProvider.java
@@ -48,6 +48,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
    * View external sub resource property id constants.
    */
   private static final String VIEW_NAME_PROPERTY_ID     = "view_name";
+  private static final String VIEW_VERSION_PROPERTY_ID  = "version";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
   private static final String RESOURCE_NAME_PROPERTY_ID = "name";
 
@@ -125,7 +126,8 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     for (ViewInstanceEntity viewInstanceDefinition : instanceDefinitions) {
       for (String resourceName : resourceNames) {
         ResourceImpl resource = new ResourceImpl(type);
-        resource.setProperty(VIEW_NAME_PROPERTY_ID, viewDefinition.getName());
+        resource.setProperty(VIEW_NAME_PROPERTY_ID, viewDefinition.getCommonName());
+        resource.setProperty(VIEW_VERSION_PROPERTY_ID, viewDefinition.getVersion());
         resource.setProperty(INSTANCE_NAME_PROPERTY_ID, viewInstanceDefinition.getName());
         resource.setProperty("name", resourceName);
         resourceSet.add(resource);
@@ -177,6 +179,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(type, RESOURCE_NAME_PROPERTY_ID);
 
@@ -188,6 +191,7 @@ public class ViewExternalSubResourceProvider extends AbstractResourceProvider {
     Set<String> propertyIds = new HashSet<String>();
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
     propertyIds.add(RESOURCE_NAME_PROPERTY_ID);
 
     return propertyIds;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
index a45cb39..532259b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
@@ -147,11 +147,12 @@ public class ViewRegistry {
    * Get a view definition for the given name.
    *
    * @param viewName  the view name
+   * @param version   the version
    *
    * @return the view definition for the given name
    */
-  public ViewEntity getDefinition(String viewName) {
-    return viewDefinitions.get(viewName);
+  public ViewEntity getDefinition(String viewName, String version) {
+    return getDefinition(ViewEntity.getViewName(viewName, version));
   }
 
   /**
@@ -184,13 +185,14 @@ public class ViewRegistry {
    * Get the instance definition for the given view nam,e and instance name.
    *
    * @param viewName      the view name
+   * @param version       the version
    * @param instanceName  the instance name
    *
    * @return the view instance definition for the given view and instance name
    */
-  public ViewInstanceEntity getInstanceDefinition(String viewName, String instanceName) {
+  public ViewInstanceEntity getInstanceDefinition(String viewName, String version, String instanceName) {
     Map<String, ViewInstanceEntity> viewInstanceDefinitionMap =
-        viewInstanceDefinitions.get(getDefinition(viewName));
+        viewInstanceDefinitions.get(getDefinition(viewName, version));
 
     return viewInstanceDefinitionMap == null ? null : viewInstanceDefinitionMap.get(instanceName);
   }
@@ -236,12 +238,17 @@ public class ViewRegistry {
    * Get the sub-resource definitions for the given view name.
    *
    * @param viewName  the instance name
+   * @param version   the version
    *
    * @return the set of sub-resource definitions
    */
-  public synchronized Set<SubResourceDefinition> getSubResourceDefinitions(String viewName) {
+  public synchronized Set<SubResourceDefinition> getSubResourceDefinitions(
+      String viewName, String version) {
+
+    viewName = ViewEntity.getViewName(viewName, version);
 
-    Set<SubResourceDefinition> subResourceDefinitions = subResourceDefinitionsMap.get(viewName);
+    Set<SubResourceDefinition> subResourceDefinitions =
+        subResourceDefinitionsMap.get(viewName);
 
     if (subResourceDefinitions == null) {
       subResourceDefinitions = new HashSet<SubResourceDefinition>();
@@ -310,15 +317,17 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    */
   public void installViewInstance(ViewInstanceEntity instanceEntity){
-    String viewName       = instanceEntity.getViewName();
-    ViewEntity viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
 
-      if (getInstanceDefinition(viewName, instanceName) == null) {
+      if (getInstanceDefinition(viewName, version, instanceName) == null) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Creating view instance " + viewName + "/" + instanceName);
+          LOG.debug("Creating view instance " + viewName + "/" +
+              version + "/" + instanceName);
         }
         instanceDAO.create(instanceEntity);
         try {
@@ -336,15 +345,19 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    */
   public void updateViewInstance(ViewInstanceEntity instanceEntity) {
-    String       viewName   = instanceEntity.getViewName();
-    ViewEntity   viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
-      ViewInstanceEntity entity = getInstanceDefinition(viewName, instanceName);
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
+
+      ViewInstanceEntity entity = getInstanceDefinition(viewName, version, instanceName);
+
       if (entity != null) {
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Updating view instance " + viewName + "/" + instanceName);
+          LOG.debug("Updating view instance " + viewName + "/" +
+              version + "/" + instanceName);
         }
 
         entity.setProperties(instanceEntity.getProperties());
@@ -376,16 +389,18 @@ public class ViewRegistry {
    * @param instanceEntity  the view instance entity
    */
   public void uninstallViewInstance(ViewInstanceEntity instanceEntity) {
-
-    String       viewName   = instanceEntity.getViewName();
-    ViewEntity   viewEntity = getDefinition(viewName);
+    ViewEntity viewEntity = getDefinition(instanceEntity.getViewName());
 
     if (viewEntity != null) {
       String instanceName = instanceEntity.getName();
-      if (getInstanceDefinition(viewName, instanceName) != null) {
+      String viewName     = viewEntity.getCommonName();
+      String version      = viewEntity.getVersion();
+
+      if (getInstanceDefinition(viewName, version, instanceName) != null) {
 
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Deleting view instance " + viewName + "/" + instanceName);
+          LOG.debug("Deleting view instance " + viewName + "/" +
+              version + "/" +instanceName);
         }
         instanceDAO.remove(instanceEntity);
         viewEntity.removeInstanceDefinition(instanceName);
@@ -422,6 +437,11 @@ public class ViewRegistry {
     subResourceDefinitionsMap.clear();
   }
 
+  // get a view entity for the given internal view name
+  private ViewEntity getDefinition(String viewName) {
+    return viewDefinitions.get(viewName);
+  }
+
   // install a new view definition
   private ViewEntity installView(ViewConfig viewConfig, Configuration ambariConfig,
                                             ClassLoader cl, String archivePath)
@@ -497,6 +517,7 @@ public class ViewRegistry {
   private void installViewInstance(ViewEntity viewDefinition,
                                    ViewInstanceEntity viewInstanceDefinition)
       throws ClassNotFoundException {
+    viewInstanceDefinition.setViewEntity(viewDefinition);
 
     ViewContext viewInstanceContext = new ViewContextImpl(viewInstanceDefinition, this);
 
@@ -511,8 +532,7 @@ public class ViewRegistry {
       Resource.Type  type           = resourceDefinition.getType();
       ResourceConfig resourceConfig = resourceDefinition.getResourceConfiguration();
 
-      ViewResourceHandler viewResourceService =
-          new ViewSubResourceService(type, viewDefinition.getName(), viewInstanceDefinition.getName());
+      ViewResourceHandler viewResourceService = new ViewSubResourceService(type, viewInstanceDefinition);
 
       ClassLoader cl = viewDefinition.getClassLoader();
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
index 08c0c1d..e9d2a4c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewSubResourceProvider.java
@@ -54,7 +54,8 @@ import java.util.Set;
  */
 public class ViewSubResourceProvider extends AbstractResourceProvider {
 
-  private static final String VIEW_NAME_PROPERTY_ID = "view_name";
+  private static final String VIEW_NAME_PROPERTY_ID     = "view_name";
+  private static final String VIEW_VERSION_PROPERTY_ID  = "version";
   private static final String INSTANCE_NAME_PROPERTY_ID = "instance_name";
 
   private final ViewEntity viewDefinition;
@@ -139,7 +140,8 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
             String resourceId = (String) propertyMap.get(pkField);
             if (resourceId != null) {
               Object bean = getResourceProvider(instanceName).getResource(resourceId, requestedIds);
-              return Collections.singleton(getResource(bean, viewDefinition.getName(), instanceName, requestedIds));
+              return Collections.singleton(getResource(bean, viewDefinition.getCommonName(),
+                  viewDefinition.getVersion(), instanceName, requestedIds));
             }
           }
           if (instanceName == null) {
@@ -161,7 +163,8 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
         Set<?> beans = instanceDefinition.getResourceProvider(type).getResources(readRequest);
 
         for (Object bean : beans) {
-          Resource resource = getResource(bean, viewDefinition.getName(), instanceDefinition.getName(), requestedIds);
+          Resource resource = getResource(bean, viewDefinition.getCommonName(),
+              viewDefinition.getVersion(), instanceDefinition.getName(), requestedIds);
           if (predicate.evaluate(resource)) {
             results.add(resource);
           }
@@ -235,12 +238,14 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
   // ----- helper methods ----------------------------------------------------
 
   // get a Resource from the bean
-  private Resource getResource(Object bean, String viewName, String instanceName, Set<String> requestedIds)
+  private Resource getResource(Object bean, String viewName, String viewVersion,
+                               String instanceName, Set<String> requestedIds)
       throws InvocationTargetException, IllegalAccessException {
 
     Resource resource = new ResourceImpl(type);
 
     resource.setProperty(VIEW_NAME_PROPERTY_ID, viewName);
+    resource.setProperty(VIEW_VERSION_PROPERTY_ID, viewVersion);
     resource.setProperty(INSTANCE_NAME_PROPERTY_ID, instanceName);
 
     for (Map.Entry<String, PropertyDescriptor> entry : descriptorMap.entrySet()) {
@@ -267,6 +272,7 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
     Set<String> propertyIds = new HashSet<String>(getDescriptorMap(clazz).keySet());
     propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
     propertyIds.add(VIEW_NAME_PROPERTY_ID);
+    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
 
     return propertyIds;
   }
@@ -290,6 +296,7 @@ public class ViewSubResourceProvider extends AbstractResourceProvider {
     Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
 
     keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
     keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
     keyPropertyIds.put(type, pkField);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java
index 4da48d6..c848bfa 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewResourceDefinitionTest.java
@@ -46,6 +46,6 @@ public class ViewResourceDefinitionTest {
 
     Assert.assertEquals(1, subResourceDefinitions.size());
 
-    Assert.assertEquals("ViewInstance", subResourceDefinitions.iterator().next().getType().name());
+    Assert.assertEquals("ViewVersion", subResourceDefinitions.iterator().next().getType().name());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java
new file mode 100644
index 0000000..32c13b3
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/resources/ViewVersionResourceDefinitionTest.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.resources;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Set;
+
+/**
+ * ViewVersionResourceDefinition tests.
+ */
+public class ViewVersionResourceDefinitionTest {
+  @Test
+  public void testGetPluralName() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Assert.assertEquals("versions", viewVersionResourceDefinition.getPluralName());
+  }
+
+  @Test
+  public void testGetSingularName() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Assert.assertEquals("version", viewVersionResourceDefinition.getSingularName());
+  }
+
+  @Test
+  public void testGetSubResourceDefinitions() throws Exception {
+    ViewVersionResourceDefinition viewVersionResourceDefinition = new ViewVersionResourceDefinition();
+    Set<SubResourceDefinition> subResourceDefinitions = viewVersionResourceDefinition.getSubResourceDefinitions ();
+
+    Assert.assertEquals(1, subResourceDefinitions.size());
+
+    Assert.assertEquals("ViewInstance", subResourceDefinitions.iterator().next().getType().name());
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
index b2dac99..1618b64 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
@@ -61,7 +61,13 @@ public class ViewEntityTest {
   @Test
   public void testGetName() throws Exception {
     ViewEntity viewDefinition = getViewEntity();
-    Assert.assertEquals("MY_VIEW", viewDefinition.getName());
+    Assert.assertEquals("MY_VIEW{1.0.0}", viewDefinition.getName());
+  }
+
+  @Test
+  public void testGetCommonName() throws Exception {
+    ViewEntity viewDefinition = getViewEntity();
+    Assert.assertEquals("MY_VIEW", viewDefinition.getCommonName());
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java
index 6029ee5..32b7993 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewInstanceEntityTest.java
@@ -97,7 +97,7 @@ public class ViewInstanceEntityTest {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
 
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
-    Resource.Type type = new Resource.Type("MY_VIEW/myType");
+    Resource.Type type = new Resource.Type("MY_VIEW{1.0.0}/myType");
 
     viewInstanceDefinition.addResourceProvider(type, provider);
 
@@ -109,7 +109,7 @@ public class ViewInstanceEntityTest {
   public void testContextPath() throws Exception {
     ViewInstanceEntity viewInstanceDefinition = getViewInstanceEntity();
 
-    Assert.assertEquals(ViewInstanceEntity.VIEWS_CONTEXT_PATH_PREFIX + "MY_VIEW/INSTANCE1",
+    Assert.assertEquals(ViewInstanceEntity.VIEWS_CONTEXT_PATH_PREFIX + "MY_VIEW/1.0.0/INSTANCE1",
         viewInstanceDefinition.getContextPath());
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
index 0003ac8..92608c6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewContextImplTest.java
@@ -97,7 +97,7 @@ public class ViewContextImplTest {
     ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
 
     ResourceProvider provider = createNiceMock(ResourceProvider.class);
-    Resource.Type type = new Resource.Type("MY_VIEW/myType");
+    Resource.Type type = new Resource.Type("MY_VIEW{1.0.0}/myType");
 
     viewInstanceDefinition.addResourceProvider(type, provider);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
index daedbca..37862f0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewRegistryTest.java
@@ -57,7 +57,7 @@ public class ViewRegistryTest {
 
     registry.addDefinition(viewDefinition);
 
-    Assert.assertEquals(viewDefinition, registry.getDefinition("MY_VIEW"));
+    Assert.assertEquals(viewDefinition, registry.getDefinition("MY_VIEW", "1.0.0"));
 
     Collection<ViewEntity> viewDefinitions = registry.getDefinitions();
 
@@ -77,7 +77,7 @@ public class ViewRegistryTest {
 
     registry.addInstanceDefinition(viewDefinition, viewInstanceDefinition);
 
-    Assert.assertEquals(viewInstanceDefinition, registry.getInstanceDefinition("MY_VIEW", "INSTANCE1"));
+    Assert.assertEquals(viewInstanceDefinition, registry.getInstanceDefinition("MY_VIEW", "1.0.0", "INSTANCE1"));
 
     Collection<ViewInstanceEntity> viewInstanceDefinitions = registry.getInstanceDefinitions(viewDefinition);
 
@@ -99,7 +99,7 @@ public class ViewRegistryTest {
 
     viewDefinition.addResourceConfiguration(type1, config);
     registry.addDefinition(viewDefinition);
-    Set<SubResourceDefinition> subResourceDefinitions = registry.getSubResourceDefinitions("MY_VIEW");
+    Set<SubResourceDefinition> subResourceDefinitions = registry.getSubResourceDefinitions("MY_VIEW", "1.0.0");
 
     Assert.assertEquals(1, subResourceDefinitions.size());
     Assert.assertEquals("myType", subResourceDefinitions.iterator().next().getType().name());

http://git-wip-us.apache.org/repos/asf/ambari/blob/6d33c324/ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java
index befb7fe..b0de66f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewSubResourceDefinitionTest.java
@@ -51,14 +51,14 @@ public class ViewSubResourceDefinitionTest {
   public void testGetSubResourceDefinitions() throws Exception {
     ViewSubResourceDefinition viewSubResourceDefinition = getViewSubResourceDefinition();
 
-    new Resource.Type("MY_VIEW/resource");
-    new Resource.Type("MY_VIEW/subresource");
+    new Resource.Type("MY_VIEW{1.0.0}/resource");
+    new Resource.Type("MY_VIEW{1.0.0}/subresource");
 
     Set<SubResourceDefinition> subResourceDefinitions = viewSubResourceDefinition.getSubResourceDefinitions ();
 
     Assert.assertEquals(1, subResourceDefinitions.size());
 
-    Assert.assertEquals("MY_VIEW/subresource", subResourceDefinitions.iterator().next().getType().name());
+    Assert.assertEquals("MY_VIEW{1.0.0}/subresource", subResourceDefinitions.iterator().next().getType().name());
   }
 
   public static ViewSubResourceDefinition getViewSubResourceDefinition() throws Exception {