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.