This is an automated email from the ASF dual-hosted git repository.

mradhakrishnan pushed a commit to branch AMBARI-24711
in repository https://gitbox.apache.org/repos/asf/ambari.git

commit aaa56f26c351df0170d4931c21f3ac80aa37f414
Author: Madhuvanthi Radhakrishnan <mradhakrish...@hortonworks.com>
AuthorDate: Tue Oct 24 14:44:07 2017 -0700

    AMBARI-22283 : Add stack name and version to mpack API (mradhakrishnan)
---
 .../api/resources/MpackResourceDefinition.java     |  16 ++-
 .../resources/StackVersionResourceDefinition.java  |  50 ++++++++
 .../internal/AbstractResourceProvider.java         |   2 +-
 .../internal/StackVersionResourceProvider.java     | 134 +++++++++++++--------
 .../apache/ambari/server/mpack/MpackManager.java   |   2 +-
 5 files changed, 152 insertions(+), 52 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
index 26972d8..167e773 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
@@ -17,6 +17,12 @@
  */
 package org.apache.ambari.server.api.resources;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.ambari.server.api.services.Request;
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
@@ -25,9 +31,6 @@ import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Map;
-import java.util.List;
-import java.util.ArrayList;
 
 /**
  * Resource Definition for Mpack Resource types.
@@ -56,6 +59,13 @@ public class MpackResourceDefinition extends 
BaseResourceDefinition {
   }
 
   @Override
+  public Set<SubResourceDefinition> getSubResourceDefinitions() {
+    Set<SubResourceDefinition> setChildren = new HashSet<>();
+    setChildren.add(new SubResourceDefinition(Resource.Type.StackVersion, 
null, false));
+    return setChildren;
+  }
+
+  @Override
   public List<PostProcessor> getPostProcessors() {
     List<PostProcessor> listProcessors = new ArrayList<>();
     listProcessors.add(new MpackHrefProcessor());
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
index 14f8b4f..b0786e1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java
@@ -18,8 +18,14 @@
 
 package org.apache.ambari.server.api.resources;
 
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import org.apache.ambari.server.api.services.Request;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.spi.Resource;
 
 public class StackVersionResourceDefinition extends BaseResourceDefinition {
@@ -53,4 +59,48 @@ public class StackVersionResourceDefinition extends 
BaseResourceDefinition {
     return children;
   }
 
+  @Override
+  public List<PostProcessor> getPostProcessors() {
+    List<PostProcessor> listProcessors = new ArrayList<>();
+    listProcessors.add(new StackVersionHrefProcessor());
+    listProcessors.add(new StackVersionPostProcessor());
+    return listProcessors;
+  }
+
+  /**
+   * Post Processing the mpack href when the call comes from stack endpoint to 
ensure that the
+   * href is a backreference to the mpacks end point
+   */
+  private class StackVersionHrefProcessor extends BaseHrefPostProcessor {
+    @Override
+    public void process(Request request, TreeNode<Resource> resultNode, String 
href) {
+      if (href.contains("/mpacks/")) {
+        ResourceImpl mpack = (ResourceImpl) resultNode.getObject();
+        Map<String, Map<String, Object>> mapInfo = mpack.getPropertiesMap();
+        Map<String, Object> versionInfo = mapInfo.get("Versions");
+
+        int idx = href.indexOf("mpacks/");
+        String stackName = (String)versionInfo.get("stack_name");
+        String stackVersion = (String)versionInfo.get("stack_version");
+        href = href.substring(0, idx) + "stacks/" + stackName + "/versions/" + 
stackVersion;
+        resultNode.setProperty("href", href);
+      } else {
+        super.process(request, resultNode, href);
+      }
+    }
+  }
+
+  /***
+   * Post processing to change the name of the result node to current_mpack
+   */
+  private class StackVersionPostProcessor implements PostProcessor {
+    @Override
+    public void process(Request request, TreeNode<Resource> resultNode, String 
href) {
+      if (href.contains("/mpacks/")) {
+        resultNode.setName("stack");
+
+      }
+    }
+  }
+
  }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java
index 21a70ca..810f191 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java
@@ -61,7 +61,7 @@ public abstract class AbstractResourceProvider extends 
BaseProvider implements R
   /**
    * Key property mapping by resource type.
    */
-  private final Map<Resource.Type, String> keyPropertyIds;
+  protected final Map<Resource.Type, String> keyPropertyIds;
 
   /**
    * Observers of this observable resource provider.
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
index f2e6d1a..86a994a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
@@ -19,7 +19,9 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -34,71 +36,108 @@ 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.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
+import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.orm.entities.StackEntity;
+
+import com.google.inject.Inject;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 
 @StaticallyInject
 public class StackVersionResourceProvider extends ReadOnlyResourceProvider {
-
-  public static final String STACK_VERSION_PROPERTY_ID     = 
PropertyHelper.getPropertyId("Versions", "stack_version");
-  public static final String STACK_NAME_PROPERTY_ID        = 
PropertyHelper.getPropertyId("Versions", "stack_name");
-  public static final String STACK_MIN_VERSION_PROPERTY_ID = 
PropertyHelper.getPropertyId("Versions", "min_upgrade_version");
-  public static final String STACK_ACTIVE_PROPERTY_ID      = 
PropertyHelper.getPropertyId("Versions", "active");
-  public static final String STACK_VALID_PROPERTY_ID      = 
PropertyHelper.getPropertyId("Versions", "valid");
-  public static final String STACK_ERROR_SET      = 
PropertyHelper.getPropertyId("Versions", "stack-errors");
-  public static final String STACK_CONFIG_TYPES            = 
PropertyHelper.getPropertyId("Versions", "config_types");
-  public static final String STACK_PARENT_PROPERTY_ID      = 
PropertyHelper.getPropertyId("Versions", "parent_stack_version");
-  public static final String UPGRADE_PACKS_PROPERTY_ID = 
PropertyHelper.getPropertyId("Versions", "upgrade_packs");
-  public static final String STACK_MIN_JDK     = 
PropertyHelper.getPropertyId("Versions", "min_jdk");
-  public static final String STACK_MAX_JDK     = 
PropertyHelper.getPropertyId("Versions", "max_jdk");
+  public static final String RESPONSE_KEY = "Versions";
+  public static final String ALL_PROPERTIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "*";
+  public static final String STACK_VERSION_PROPERTY_ID     = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "stack_version";
+  public static final String STACK_NAME_PROPERTY_ID        = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "stack_name";
+  public static final String STACK_MIN_VERSION_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "min_upgrade_version";
+  public static final String STACK_ACTIVE_PROPERTY_ID      = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "active";
+  public static final String STACK_VALID_PROPERTY_ID      = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "valid";
+  public static final String STACK_ERROR_SET      = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP +"stack-errors";
+  public static final String STACK_CONFIG_TYPES            = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "config_types";
+  public static final String STACK_PARENT_PROPERTY_ID      = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "parent_stack_version";
+  public static final String UPGRADE_PACKS_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "upgrade_packs";
+  public static final String STACK_MIN_JDK     = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "min_jdk";
+  public static final String STACK_MAX_JDK     = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "max_jdk";
+  public static final String MPACK_ID     = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
+
+  public static final Set<String> PROPERTY_IDS = new HashSet<>();
+
+  @Inject
+  protected static StackDAO stackDAO;
+
+
+  private static Set<String> pkPropertyIds = new HashSet<>(
+    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID, 
STACK_VERSION_PROPERTY_ID, MPACK_ID}));
 
   /**
-   * The key property ids for a StackVersion resource.
+   * The key property ids for a mpack resource.
    */
-  protected static Map<Resource.Type, String> keyPropertyIds = 
ImmutableMap.<Resource.Type, String>builder()
-      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
-      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
-      .build();
+  public static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new 
HashMap<>();
+
+  static {
+    // properties
+    PROPERTY_IDS.add(MPACK_ID);
+    PROPERTY_IDS.add(STACK_VERSION_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_NAME_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_MIN_VERSION_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_ACTIVE_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_VALID_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_ERROR_SET);
+    PROPERTY_IDS.add(STACK_CONFIG_TYPES);
+    PROPERTY_IDS.add(STACK_PARENT_PROPERTY_ID);
+    PROPERTY_IDS.add(UPGRADE_PACKS_PROPERTY_ID);
+    PROPERTY_IDS.add(STACK_MIN_JDK);
+    PROPERTY_IDS.add(STACK_MAX_JDK);
+
+    // keys
+    KEY_PROPERTY_IDS.put(Resource.Type.Mpack, MPACK_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.Stack, STACK_NAME_PROPERTY_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.StackVersion, 
STACK_VERSION_PROPERTY_ID);
 
-  /**
-   * The property ids for a StackVersion resource.
-   */
-  protected static Set<String> propertyIds = Sets.newHashSet(
-      STACK_VERSION_PROPERTY_ID,
-      STACK_NAME_PROPERTY_ID,
-      STACK_MIN_VERSION_PROPERTY_ID,
-      STACK_ACTIVE_PROPERTY_ID,
-      STACK_VALID_PROPERTY_ID,
-      STACK_ERROR_SET,
-      STACK_CONFIG_TYPES,
-      STACK_PARENT_PROPERTY_ID,
-      UPGRADE_PACKS_PROPERTY_ID,
-      STACK_MIN_JDK,
-      STACK_MAX_JDK);
-
-  protected StackVersionResourceProvider(AmbariManagementController 
managementController) {
-    super(Type.StackVersion, propertyIds, keyPropertyIds, 
managementController);
   }
 
+  StackVersionResourceProvider(AmbariManagementController controller) {
+    super(Resource.Type.StackVersion, PROPERTY_IDS, KEY_PROPERTY_IDS, 
controller);
+  }
+
+
   @Override
   public Set<Resource> getResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException,
       NoSuchResourceException, NoSuchParentResourceException {
 
     final Set<StackVersionRequest> requests = new HashSet<>();
+    Set<Resource> resources = new HashSet<>();
 
     if (predicate == null) {
       requests.add(getRequest(Collections.emptyMap()));
     } else {
-      for (Map<String, Object> propertyMap : getPropertyMaps(predicate)) {
-        requests.add(getRequest(propertyMap));
-      }
-    }
+      Map<String, Object> propertyMap = new 
HashMap<>(PredicateHelper.getProperties(predicate));
+      if (propertyMap.containsKey(MPACK_ID)) {
+        Resource resource = new ResourceImpl(Resource.Type.StackVersion);
+        Long mpackId = Long.valueOf((String) propertyMap.get(MPACK_ID));
+        StackEntity stackEntity = stackDAO.findByMpack(mpackId);
+        requests.add(new StackVersionRequest(stackEntity.getStackName(), 
stackEntity.getStackVersion()));
+        resource.setProperty(STACK_NAME_PROPERTY_ID,
+                (String)stackEntity.getStackName());
+
+        resource.setProperty(STACK_VERSION_PROPERTY_ID,
+                (String)stackEntity.getStackVersion());
+
+        resource.setProperty(MPACK_ID, mpackId);
+
+        resources.add(resource);
+
+      } else {
+        for (Map<String, Object> propertyMap1:
+             getPropertyMaps(predicate)) {
+          requests.add(getRequest(propertyMap1));
+        }
 
     Set<String> requestedIds = getRequestPropertyIds(request, predicate);
 
@@ -109,7 +148,6 @@ public class StackVersionResourceProvider extends 
ReadOnlyResourceProvider {
       }
     });
 
-    Set<Resource> resources = new HashSet<>();
 
     for (StackVersionResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.StackVersion);
@@ -128,16 +166,16 @@ public class StackVersionResourceProvider extends 
ReadOnlyResourceProvider {
 
       setResourceProperty(resource, STACK_VALID_PROPERTY_ID,
           response.isValid(), requestedIds);
-      
+
       setResourceProperty(resource, STACK_ERROR_SET,
           response.getErrors(), requestedIds);
-      
+
       setResourceProperty(resource, STACK_PARENT_PROPERTY_ID,
         response.getParentVersion(), requestedIds);
 
       setResourceProperty(resource, STACK_CONFIG_TYPES,
           response.getConfigTypes(), requestedIds);
-      
+
       setResourceProperty(resource, UPGRADE_PACKS_PROPERTY_ID,
           response.getUpgradePacks(), requestedIds);
 
@@ -147,11 +185,13 @@ public class StackVersionResourceProvider extends 
ReadOnlyResourceProvider {
       setResourceProperty(resource, STACK_MAX_JDK,
               response.getMaxJdk(), requestedIds);
 
-      resources.add(resource);
+        resources.add(resource);
+      }
+      }
     }
 
-    return resources;
-  }
+      return resources;
+    }
 
   private StackVersionRequest getRequest(Map<String, Object> properties) {
     return new StackVersionRequest(
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
index 5ae7e1d..6b19b3c 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
@@ -273,7 +273,7 @@ public class MpackManager {
           serviceTargetDir.toPath(), StandardCopyOption.REPLACE_EXISTING);
       }
     }
-  
+
 
   /**
    * Reads the mpack.json file within the {mpack-name}.tar.gz file and 
populates Mpack object.

Reply via email to