You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/04/08 01:36:56 UTC

ambari git commit: AMBARI-15764. Add services element to compatible_repository_versions endpoint (ncole)

Repository: ambari
Updated Branches:
  refs/heads/trunk 7c211e3ee -> 129041f54


AMBARI-15764. Add services element to compatible_repository_versions endpoint (ncole)


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

Branch: refs/heads/trunk
Commit: 129041f548923abab41191e63a892d23193a7d52
Parents: 7c211e3
Author: Nate Cole <nc...@hortonworks.com>
Authored: Thu Apr 7 12:35:15 2016 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Thu Apr 7 19:36:14 2016 -0400

----------------------------------------------------------------------
 .../ambari/server/api/query/QueryImpl.java      | 19 +++---
 .../AmbariManagementControllerImpl.java         |  2 +
 .../server/controller/RepositoryRequest.java    | 15 +++++
 .../server/controller/RepositoryResponse.java   | 16 +++++
 ...atibleRepositoryVersionResourceProvider.java | 43 ++++++++++++-
 .../internal/RepositoryResourceProvider.java    | 12 +++-
 .../ambari/server/api/query/QueryImplTest.java  |  2 -
 .../AmbariManagementControllerTest.java         |  3 +-
 ...leRepositoryVersionResourceProviderTest.java | 63 ++++++++++++++++++--
 .../RepositoryResourceProviderTest.java         | 33 +++++++++-
 10 files changed, 191 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
index ba3a774..18fd94b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java
@@ -367,11 +367,6 @@ public class QueryImpl implements Query, ResourceInstance {
     Resource.Type resourceType    = getResourceDefinition().getType();
     Predicate     queryPredicate  = createPredicate(getKeyValueMap(), processUserPredicate(userPredicate));
 
-    Predicate updated = clusterController.getAmendedPredicate(resourceType, queryPredicate);
-    if (null != updated) {
-      queryPredicate = updated;
-    }
-
     // must occur after processing user predicate and prior to creating request
     finalizeProperties();
 
@@ -900,13 +895,23 @@ public class QueryImpl implements Query, ResourceInstance {
       }
     }
 
+    Predicate p = null;
+
     if (setPredicates.size() == 1) {
-      return setPredicates.iterator().next();
+      p = setPredicates.iterator().next();
     } else if (setPredicates.size() > 1) {
-      return new AndPredicate(setPredicates.toArray(new Predicate[setPredicates.size()]));
+      p = new AndPredicate(setPredicates.toArray(new Predicate[setPredicates.size()]));
     } else {
       return null;
     }
+
+    Resource.Type type = getResourceDefinition().getType();
+    Predicate override = clusterController.getAmendedPredicate(type, p);
+    if (null != override) {
+      p = override;
+    }
+
+    return p;
   }
 
   private Predicate createPredicate() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 1793ef2..9870441 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -3743,6 +3743,8 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
           if (repositoryResponse.getStackVersion() == null) {
             repositoryResponse.setStackVersion(stackVersion);
           }
+
+          repositoryResponse.setClusterVersionId(request.getClusterVersionId());
         }
         response.addAll(repositories);
       } catch (StackAccessException e) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryRequest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryRequest.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryRequest.java
index b674e79..84929bf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryRequest.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryRequest.java
@@ -23,6 +23,7 @@ public class RepositoryRequest extends OperatingSystemRequest {
   private String repoId;
   private String baseUrl;
   private boolean verify = true;
+  private Long clusterVersionId = null;
 
   public RepositoryRequest(String stackName, String stackVersion, String osType, String repoId) {
     super(stackName, stackVersion, osType);
@@ -69,6 +70,20 @@ public class RepositoryRequest extends OperatingSystemRequest {
     verify = verifyUrl;
   }
 
+  /**
+   * @param id the cluster version id for the request
+   */
+  public void setClusterVersionId(Long id) {
+    clusterVersionId = id;
+  }
+
+  /**
+   * @return the cluster version id for the request
+   */
+  public Long getClusterVersionId() {
+    return clusterVersionId;
+  }
+
   @Override
   public String toString() {
     return "RepositoryRequest [repoId=" + repoId + ", baseUrl=" + baseUrl

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
index 6221826..30bd0db 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/RepositoryResponse.java
@@ -31,6 +31,7 @@ public class RepositoryResponse {
   private String latestBaseUrl;
   private Long repositoryVersionId;
   private String versionDefinitionId;
+  private Long clusterVersionId;
 
   public RepositoryResponse(String baseUrl, String osType, String repoId,
       String repoName, String mirrorsList, String defaultBaseUrl, String latestBaseUrl) {
@@ -142,4 +143,19 @@ public class RepositoryResponse {
   public String getVersionDefinitionId() {
     return versionDefinitionId;
   }
+
+  /**
+   * @param id the cluster version id for the response
+   */
+  public void setClusterVersionId(Long id) {
+    clusterVersionId = id;
+  }
+
+  /**
+   * @return the cluster version id for the response
+   */
+  public Long getClusterVersionId() {
+    return clusterVersionId;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
index 87e73c5..9303dcc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProvider.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -44,7 +45,11 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.repository.ManifestServiceInfo;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.UpgradePack;
 
 import com.google.common.collect.Sets;
@@ -66,6 +71,8 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc
   public static final String REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID = "CompatibleRepositoryVersions/repository_version";
   public static final String REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID       = "CompatibleRepositoryVersions/display_name";
   public static final String REPOSITORY_UPGRADES_SUPPORTED_TYPES_ID            = "CompatibleRepositoryVersions/upgrade_types";
+  public static final String REPOSITORY_VERSION_SERVICES                       = "CompatibleRepositoryVersions/services";
+  public static final String REPOSITORY_VERSION_STACK_SERVICES                 = "CompatibleRepositoryVersions/stack_services";
   public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID         = new OperatingSystemResourceDefinition().getPluralName();
   private static final String REPOSITORY_STACK_VALUE                           = "stack_value";
 
@@ -79,7 +86,9 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc
     REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
     REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
     SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
-    REPOSITORY_UPGRADES_SUPPORTED_TYPES_ID);
+    REPOSITORY_UPGRADES_SUPPORTED_TYPES_ID,
+    REPOSITORY_VERSION_SERVICES,
+    REPOSITORY_VERSION_STACK_SERVICES);
 
   static Map<Type, String> keyPropertyIds = new HashMap<Type, String>() {
     {
@@ -192,6 +201,38 @@ public class CompatibleRepositoryVersionResourceProvider extends ReadOnlyResourc
       setResourceProperty(resource, REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, repositoryVersionEntity.getDisplayName(), requestedIds);
       setResourceProperty(resource, REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID, repositoryVersionEntity.getVersion(), requestedIds);
       setResourceProperty(resource, REPOSITORY_UPGRADES_SUPPORTED_TYPES_ID, entity.getSupportedTypes(), requestedIds);
+
+      final VersionDefinitionXml xml;
+      try {
+        xml = repositoryVersionEntity.getRepositoryXml();
+      } catch (Exception e) {
+        throw new SystemException(String.format("Could not load xml for Repository %s", repositoryVersionEntity.getId()), e);
+      }
+
+      final StackInfo stack;
+      try {
+        stack = s_ambariMetaInfo.get().getStack(repositoryVersionEntity.getStackName(), repositoryVersionEntity.getStackVersion());
+      } catch (AmbariException e) {
+        throw new SystemException(String.format("Could not load stack %s for Repository %s",
+            repositoryVersionEntity.getStackId().toString(), repositoryVersionEntity.getId()));
+      }
+
+      final List<ManifestServiceInfo> stackServices;
+
+      if (null != xml) {
+        setResourceProperty(resource, REPOSITORY_VERSION_SERVICES, xml.getAvailableServices(stack), requestedIds);
+        stackServices = xml.getStackServices(stack);
+      } else {
+        stackServices = new ArrayList<>();
+
+        for (ServiceInfo si : stack.getServices()) {
+          stackServices.add(new ManifestServiceInfo(si.getName(), si.getDisplayName(), si.getComment(),
+              Collections.singleton(si.getVersion())));
+        }
+      }
+
+      setResourceProperty(resource, REPOSITORY_VERSION_STACK_SERVICES, stackServices, requestedIds);
+
       resources.add(resource);
     }
     return resources;

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
index 1622a4d..18d597e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryResourceProvider.java
@@ -49,6 +49,7 @@ public class RepositoryResourceProvider extends AbstractControllerResourceProvid
   public static final String REPOSITORY_REPO_NAME_PROPERTY_ID             = PropertyHelper.getPropertyId("Repositories", "repo_name");
   public static final String REPOSITORY_STACK_NAME_PROPERTY_ID            = PropertyHelper.getPropertyId("Repositories", "stack_name");
   public static final String REPOSITORY_STACK_VERSION_PROPERTY_ID         = PropertyHelper.getPropertyId("Repositories", "stack_version");
+  public static final String REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId("Repositories", "cluster_version_id");
   public static final String REPOSITORY_OS_TYPE_PROPERTY_ID               = PropertyHelper.getPropertyId("Repositories", "os_type");
   public static final String REPOSITORY_BASE_URL_PROPERTY_ID              = PropertyHelper.getPropertyId("Repositories", "base_url");
   public static final String REPOSITORY_REPO_ID_PROPERTY_ID               = PropertyHelper.getPropertyId("Repositories", "repo_id");
@@ -84,6 +85,7 @@ public class RepositoryResourceProvider extends AbstractControllerResourceProvid
       add(REPOSITORY_LATEST_BASE_URL_PROPERTY_ID);
       add(REPOSITORY_REPOSITORY_VERSION_ID_PROPERTY_ID);
       add(REPOSITORY_VERSION_DEFINITION_ID_PROPERTY_ID);
+      add(REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID);
     }
   };
 
@@ -92,7 +94,7 @@ public class RepositoryResourceProvider extends AbstractControllerResourceProvid
     {
       put(Resource.Type.Stack, REPOSITORY_STACK_NAME_PROPERTY_ID);
       put(Resource.Type.StackVersion, REPOSITORY_STACK_VERSION_PROPERTY_ID);
-      put(Resource.Type.ClusterStackVersion, REPOSITORY_STACK_VERSION_PROPERTY_ID);
+      put(Resource.Type.ClusterStackVersion, REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID);
       put(Resource.Type.OperatingSystem, REPOSITORY_OS_TYPE_PROPERTY_ID);
       put(Resource.Type.Repository, REPOSITORY_REPO_ID_PROPERTY_ID);
       put(Resource.Type.RepositoryVersion, REPOSITORY_REPOSITORY_VERSION_ID_PROPERTY_ID);
@@ -166,6 +168,10 @@ public class RepositoryResourceProvider extends AbstractControllerResourceProvid
         setResourceProperty(resource, REPOSITORY_MIRRORS_LIST_PROPERTY_ID, response.getMirrorsList(), requestedIds);
         setResourceProperty(resource, REPOSITORY_DEFAULT_BASE_URL_PROPERTY_ID, response.getDefaultBaseUrl(), requestedIds);
         setResourceProperty(resource, REPOSITORY_LATEST_BASE_URL_PROPERTY_ID, response.getLatestBaseUrl(), requestedIds);
+        if (null != response.getClusterVersionId()) {
+          setResourceProperty(resource, REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID, response.getClusterVersionId(), requestedIds);
+        }
+
         if (null != response.getRepositoryVersionId()) {
           setResourceProperty(resource, REPOSITORY_REPOSITORY_VERSION_ID_PROPERTY_ID, response.getRepositoryVersionId(), requestedIds);
         }
@@ -229,6 +235,10 @@ public class RepositoryResourceProvider extends AbstractControllerResourceProvid
       request.setVersionDefinitionId(properties.get(REPOSITORY_VERSION_DEFINITION_ID_PROPERTY_ID).toString());
     }
 
+    if (properties.containsKey(REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID)) {
+      request.setClusterVersionId(Long.parseLong(properties.get(REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID).toString()));
+    }
+
     if (properties.containsKey(REPOSITORY_BASE_URL_PROPERTY_ID)) {
       request.setBaseUrl((String) properties.get(REPOSITORY_BASE_URL_PROPERTY_ID));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
index 6bbb4bd..068e8d0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/QueryImplTest.java
@@ -977,7 +977,6 @@ public class QueryImplTest {
     expect(mockClusterController.getResources(eq(Resource.Type.Configuration), isA(Request.class), (Predicate)eq(null))).andReturn(mockSubQueryResponse).atLeastOnce();
     expect(mockClusterController.getIterable(eq(Resource.Type.Host), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce();
     expect(mockClusterController.getIterable(eq(Resource.Type.Configuration), isA(QueryResponse.class), isA(Request.class),(Predicate)eq(null), (PageRequest)eq(null), (SortRequest)eq(null))).andReturn(Collections.singleton(mockResource)).atLeastOnce();
-    expect(mockClusterController.getAmendedPredicate(eq(Resource.Type.Host), (Predicate)eq(null))).andReturn((Predicate)null).atLeastOnce();
 
     expect(mockQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce();
     expect(mockSubQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce();
@@ -1058,7 +1057,6 @@ public class QueryImplTest {
     expect(mockClusterController.populateResources(eq(Resource.Type.Host), eq(Collections.singleton(mockResource)), isA(Request.class), (Predicate)eq(null))).andReturn(Collections.<Resource>emptySet()).times(1);
     // expect call to activate property providers for Configuration sub-resource
     expect(mockClusterController.populateResources(eq(Resource.Type.Configuration), eq(Collections.singleton(mockResource)), isA(Request.class), (Predicate)eq(null))).andReturn(Collections.<Resource>emptySet()).times(1);
-    expect(mockClusterController.getAmendedPredicate(eq(Resource.Type.Host), (Predicate)eq(null))).andReturn((Predicate)null).atLeastOnce();
 
     expect(mockQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce();
     expect(mockSubQueryResponse.getResources()).andReturn(Collections.singleton(mockResource)).atLeastOnce();

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index c79f9d2..caaf6a9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -7232,11 +7232,12 @@ public class AmbariManagementControllerTest {
     Assert.assertEquals(REPOS_CNT, responses.size());
 
     RepositoryRequest requestWithParams = new RepositoryRequest(STACK_NAME, STACK_VERSION, OS_TYPE, REPO_ID);
+    requestWithParams.setClusterVersionId(525L);
     Set<RepositoryResponse> responsesWithParams = controller.getRepositories(Collections.singleton(requestWithParams));
     Assert.assertEquals(1, responsesWithParams.size());
     for (RepositoryResponse responseWithParams: responsesWithParams) {
       Assert.assertEquals(responseWithParams.getRepoId(), REPO_ID);
-
+      Assert.assertEquals(525L, responseWithParams.getClusterVersionId().longValue());
     }
 
     RepositoryRequest invalidRequest = new RepositoryRequest(STACK_NAME, STACK_VERSION, OS_TYPE, NON_EXT_VALUE);

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
index 40d9b0b..066e0d0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CompatibleRepositoryVersionResourceProviderTest.java
@@ -19,6 +19,9 @@
 package org.apache.ambari.server.controller.internal;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 
@@ -50,6 +53,9 @@ import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.repository.AvailableService;
+import org.apache.ambari.server.state.repository.ManifestServiceInfo;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.easymock.EasyMock;
@@ -70,6 +76,8 @@ public class CompatibleRepositoryVersionResourceProviderTest {
   private static Injector injector;
 
   private static String jsonStringRedhat6 = "[{\"OperatingSystems\":{\"os_type\":\"redhat6\"},\"repositories\":[]}]";
+  private static StackId stackId11 = new StackId("HDP", "1.1");
+  private static StackId stackId22 = new StackId("HDP", "2.2");
 
   @Before
   public void before() throws Exception {
@@ -91,7 +99,7 @@ public class CompatibleRepositoryVersionResourceProviderTest {
     hdp22Stack.setStackName("HDP");
     hdp22Stack.setStackVersion("2.2");
 
-    RepositoryVersionEntity entity2 = new RepositoryVersionEntity();
+    RepositoryVersionEntity entity2 = new ExtendedRepositoryVersionEntity();
     entity2.setDisplayName("name2");
     entity2.setOperatingSystems(jsonStringRedhat6);
     entity2.setStack(hdp22Stack);
@@ -100,9 +108,6 @@ public class CompatibleRepositoryVersionResourceProviderTest {
 
     final RepositoryVersionDAO repoVersionDAO = EasyMock.createMock(RepositoryVersionDAO.class);
 
-    StackId stackId11 = new StackId("HDP", "1.1");
-    StackId stackId22 = new StackId("HDP", "2.2");
-
     expect(repoVersionDAO.findByStack(stackId11)).andReturn(Collections.singletonList(entity1)).atLeastOnce();
     expect(repoVersionDAO.findByStack(stackId22)).andReturn(Collections.singletonList(entity2)).atLeastOnce();
     replay(repoVersionDAO);
@@ -277,6 +282,46 @@ public class CompatibleRepositoryVersionResourceProviderTest {
     versionToUpgradeTypesMap.put("1.1", Arrays.asList(UpgradeType.ROLLING));
     versionToUpgradeTypesMap.put("2.2", Arrays.asList(UpgradeType.NON_ROLLING, UpgradeType.ROLLING));
     assertEquals(versionToUpgradeTypesMap.size(), checkUpgradeTypes(resources, versionToUpgradeTypesMap));
+
+    // !!! verify we can get services
+    RepositoryVersionDAO dao = injector.getInstance(RepositoryVersionDAO.class);
+    List<RepositoryVersionEntity> entities = dao.findByStack(stackId22);
+    assertEquals(1, entities.size());
+    RepositoryVersionEntity entity = entities.get(0);
+    assertTrue(ExtendedRepositoryVersionEntity.class.isInstance(entity));
+
+    VersionDefinitionXml mockXml = EasyMock.createMock(VersionDefinitionXml.class);
+    AvailableService mockAvailable = EasyMock.createMock(AvailableService.class);
+    ManifestServiceInfo mockStackService = EasyMock.createMock(ManifestServiceInfo.class);
+
+    expect(mockXml.getAvailableServices((StackInfo)EasyMock.anyObject())).andReturn(Collections.singletonList(mockAvailable)).atLeastOnce();
+    expect(mockXml.getStackServices((StackInfo)EasyMock.anyObject())).andReturn(Collections.singletonList(mockStackService)).atLeastOnce();
+
+    replay(mockXml);
+
+    ((ExtendedRepositoryVersionEntity) entity).m_xml = mockXml;
+
+    getRequest = PropertyHelper.getReadRequest(
+        CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_ID_PROPERTY_ID,
+        CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+        CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
+        CompatibleRepositoryVersionResourceProvider.REPOSITORY_UPGRADES_SUPPORTED_TYPES_ID,
+        CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_SERVICES);
+    predicateStackName = new PredicateBuilder().property(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).equals("HDP").toPredicate();
+    predicateStackVersion = new PredicateBuilder().property(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).equals("1.1").toPredicate();
+
+    resources = compatibleProvider.getResources(getRequest, new AndPredicate(predicateStackName, predicateStackVersion));
+    assertEquals(2, resources.size());
+
+    for (Resource r : resources) {
+      Object stackId = r.getPropertyValue(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID);
+      assertNotNull(stackId);
+      if (stackId.toString().equals("2.2")) {
+        assertNotNull(r.getPropertyValue(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_SERVICES));
+      } else {
+        assertNull(r.getPropertyValue(CompatibleRepositoryVersionResourceProvider.REPOSITORY_VERSION_SERVICES));
+      }
+    }
   }
 
   @Test
@@ -351,4 +396,14 @@ public class CompatibleRepositoryVersionResourceProviderTest {
     return count;
   }
 
+  private static class ExtendedRepositoryVersionEntity extends RepositoryVersionEntity {
+    private VersionDefinitionXml m_xml = null;
+
+    @Override
+    public VersionDefinitionXml getRepositoryXml() throws Exception {
+      return m_xml;
+    }
+
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/129041f5/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
index 48eeaf8..3a7b19b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryResourceProviderTest.java
@@ -62,7 +62,7 @@ public class RepositoryResourceProviderTest {
     allResponse.add(rr);
 
     // set expectations
-    expect(managementController.getRepositories(EasyMock.<Set<RepositoryRequest>>anyObject())).andReturn(allResponse).times(1);
+    expect(managementController.getRepositories(EasyMock.<Set<RepositoryRequest>>anyObject())).andReturn(allResponse).times(2);
 
     // replay
     replay(managementController);
@@ -76,6 +76,7 @@ public class RepositoryResourceProviderTest {
     propertyIds.add(RepositoryResourceProvider.REPOSITORY_BASE_URL_PROPERTY_ID);
     propertyIds.add(RepositoryResourceProvider.REPOSITORY_OS_TYPE_PROPERTY_ID);
     propertyIds.add(RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID);
+    propertyIds.add(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID);
 
     Predicate predicate =
         new PredicateBuilder().property(RepositoryResourceProvider.REPOSITORY_STACK_NAME_PROPERTY_ID).equals(VAL_STACK_NAME)
@@ -109,6 +110,36 @@ public class RepositoryResourceProviderTest {
       o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID);
       Assert.assertEquals(o, VAL_REPO_ID);
 
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID);
+      Assert.assertNull(o);
+    }
+
+    // !!! check that the stack version id is returned
+    rr.setClusterVersionId(525L);
+    resources = provider.getResources(request, predicate);
+    Assert.assertEquals(allResponse.size(), resources.size());
+
+    for (Resource resource : resources) {
+      Object o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_STACK_NAME_PROPERTY_ID);
+      Assert.assertEquals(VAL_STACK_NAME, o);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_STACK_VERSION_PROPERTY_ID);
+      Assert.assertEquals(VAL_STACK_VERSION, o);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_REPO_NAME_PROPERTY_ID);
+      Assert.assertEquals(o, VAL_REPO_NAME);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_BASE_URL_PROPERTY_ID);
+      Assert.assertEquals(o, VAL_BASE_URL);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_OS_TYPE_PROPERTY_ID);
+      Assert.assertEquals(o, VAL_OS);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_REPO_ID_PROPERTY_ID);
+      Assert.assertEquals(o, VAL_REPO_ID);
+
+      o = resource.getPropertyValue(RepositoryResourceProvider.REPOSITORY_CLUSTER_STACK_VERSION_PROPERTY_ID);
+      Assert.assertEquals(525L, o);
     }
 
     // verify