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/02/24 16:07:58 UTC
[11/50] [abbrv] ambari git commit: AMBARI-14870. Allow post of
Version Definition file directly (ncole)
AMBARI-14870. Allow post of Version Definition file directly (ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/77af8e54
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/77af8e54
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/77af8e54
Branch: refs/heads/trunk
Commit: 77af8e54fe4f793f9affa2a70e8ca52ccc90d0cb
Parents: c84da24
Author: Nate Cole <nc...@hortonworks.com>
Authored: Mon Feb 1 17:18:12 2016 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue Feb 2 07:36:29 2016 -0500
----------------------------------------------------------------------
.../api/services/VersionDefinitionService.java | 37 ++++++++-
.../VersionDefinitionResourceProvider.java | 59 +++++++++++++--
.../VersionDefinitionResourceProviderTest.java | 80 ++++++++++++++++++++
3 files changed, 167 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/77af8e54/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
index 43eb424..e637850 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/VersionDefinitionService.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.api.services;
import java.util.Collections;
+import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
@@ -27,17 +28,22 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.internal.VersionDefinitionResourceProvider;
import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.commons.codec.binary.Base64;
+
+import com.google.gson.JsonObject;
@Path("/version_definitions/")
public class VersionDefinitionService extends BaseService {
@GET
- @Produces("text/plain")
+ @Produces(MediaType.TEXT_PLAIN)
public Response getServices(@Context HttpHeaders headers, @Context UriInfo ui) {
return handleRequest(headers, null, ui, Request.Type.GET,
@@ -46,7 +52,7 @@ public class VersionDefinitionService extends BaseService {
@GET
@Path("{versionId}")
- @Produces("text/plain")
+ @Produces(MediaType.TEXT_PLAIN)
public Response getService(@Context HttpHeaders headers, @Context UriInfo ui,
@PathParam("versionId") Long versionId) {
@@ -55,12 +61,37 @@ public class VersionDefinitionService extends BaseService {
}
@POST
- @Produces("text/plain")
+ @Produces(MediaType.TEXT_PLAIN)
public Response createVersion(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
return handleRequest(headers, body, ui, Request.Type.POST,
createResource(null));
}
+ /**
+ * Creates a version by directly POSTing the XML body. Unfortunately the request processor
+ * uses JSON, so an appropriate JSON structure must be made to get to the ResourceProvider.
+ * @param body the XML
+ * @param headers the headers
+ * @param ui the URI info
+ */
+ @POST
+ @Consumes({MediaType.TEXT_XML})
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response createVersionByXml(String body, @Context HttpHeaders headers,
+ @Context UriInfo ui) throws Exception {
+
+ String encoded = Base64.encodeBase64String(body.getBytes("UTF-8"));
+
+ JsonObject obj = new JsonObject();
+ obj.addProperty(VersionDefinitionResourceProvider.VERSION_DEF_BASE64_PROPERTY, encoded);
+
+ JsonObject payload = new JsonObject();
+ payload.add(VersionDefinitionResourceProvider.VERSION_DEF, obj);
+
+ return handleRequest(headers, payload.toString(), ui, Request.Type.POST,
+ createResource(null));
+ }
+
protected ResourceInstance createResource(Long versionId) {
return createResource(Resource.Type.VersionDefinition,
Collections.singletonMap(Resource.Type.VersionDefinition,
http://git-wip-us.apache.org/repos/asf/ambari/blob/77af8e54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 3533293..ee99a1e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -18,6 +18,7 @@
package org.apache.ambari.server.controller.internal;
import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
@@ -42,6 +43,7 @@ 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.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
import org.apache.ambari.server.orm.dao.StackDAO;
import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
@@ -53,6 +55,7 @@ import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.StackInfo;
import org.apache.ambari.server.state.repository.VersionDefinitionXml;
import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
+import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
@@ -68,14 +71,15 @@ import com.google.inject.Provider;
public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourceProvider {
public static final String VERSION_DEF = "VersionDefinition";
- protected static final String VERSION_DEF_ID = "VersionDefinition/id";
-
+ public static final String VERSION_DEF_BASE64_PROPERTY = "version_base64";
public static final String VERSION_DEF_STACK_NAME = "VersionDefinition/stack_name";
public static final String VERSION_DEF_STACK_VERSION = "VersionDefinition/stack_version";
-
+ protected static final String VERSION_DEF_ID = "VersionDefinition/id";
protected static final String VERSION_DEF_TYPE_PROPERTY_ID = "VersionDefinition/type";
protected static final String VERSION_DEF_DEFINITION_URL = "VersionDefinition/version_url";
+
+ protected static final String VERSION_DEF_DEFINITION_BASE64 = PropertyHelper.getPropertyId(VERSION_DEF, VERSION_DEF_BASE64_PROPERTY);
protected static final String VERSION_DEF_FULL_VERSION = "VersionDefinition/repository_version";
protected static final String VERSION_DEF_RELEASE_VERSION = "VersionDefinition/release/version";
protected static final String VERSION_DEF_RELEASE_BUILD = "VersionDefinition/release/build";
@@ -114,6 +118,7 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
VERSION_DEF_ID,
VERSION_DEF_TYPE_PROPERTY_ID,
VERSION_DEF_DEFINITION_URL,
+ VERSION_DEF_DEFINITION_BASE64,
VERSION_DEF_FULL_VERSION,
VERSION_DEF_RELEASE_NOTES,
VERSION_DEF_RELEASE_COMPATIBLE_WITH,
@@ -156,8 +161,13 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
final Map<String, Object> properties = requestProperties.iterator().next();
- if (!properties.containsKey(VERSION_DEF_DEFINITION_URL)) {
- throw new IllegalArgumentException(String.format("%s is required", VERSION_DEF_DEFINITION_URL));
+ if (!properties.containsKey(VERSION_DEF_DEFINITION_URL) && !properties.containsKey(VERSION_DEF_DEFINITION_BASE64)) {
+ throw new IllegalArgumentException(String.format("%s is required or upload the file directly", VERSION_DEF_DEFINITION_URL));
+ }
+
+ if (properties.containsKey(VERSION_DEF_DEFINITION_URL) && properties.containsKey(VERSION_DEF_DEFINITION_BASE64)) {
+ throw new IllegalArgumentException(String.format("Specify ONLY the url with %s or upload the file directly",
+ VERSION_DEF_DEFINITION_URL));
}
RepositoryVersionEntity entity = createResources(new Command<RepositoryVersionEntity>() {
@@ -165,8 +175,14 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
public RepositoryVersionEntity invoke() throws AmbariException {
String definitionUrl = (String) properties.get(VERSION_DEF_DEFINITION_URL);
+ String definitionBase64 = (String) properties.get(VERSION_DEF_DEFINITION_BASE64);
- XmlHolder holder = loadXml(definitionUrl);
+ XmlHolder holder = null;
+ if (null != definitionUrl) {
+ holder = loadXml(definitionUrl);
+ } else {
+ holder = loadXml(Base64.decodeBase64(definitionBase64));
+ }
RepositoryVersionEntity entity = toRepositoryVersionEntity(holder);
@@ -301,6 +317,36 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
return ResourceType.AMBARI;
}
+ /**
+ * Load the xml data from a posted Base64 stream
+ * @param decoded the decoded Base64 data
+ * @return the XmlHolder instance
+ * @throws AmbariException
+ */
+ private XmlHolder loadXml(byte[] decoded) {
+ XmlHolder holder = new XmlHolder();
+
+ try {
+ holder.xmlString = new String(decoded, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ holder.xmlString = new String(decoded);
+ }
+
+ try {
+ holder.xml = VersionDefinitionXml.load(holder.xmlString);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ return holder;
+ }
+
+ /**
+ * Load the xml data from a url
+ * @param definitionUrl
+ * @return the XmlHolder instance
+ * @throws AmbariException
+ */
private XmlHolder loadXml(String definitionUrl) throws AmbariException {
XmlHolder holder = new XmlHolder();
holder.url = definitionUrl;
@@ -425,4 +471,5 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
VersionDefinitionXml xml = null;
}
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/77af8e54/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java
index dbac1b4..efdf84e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java
@@ -18,6 +18,7 @@
package org.apache.ambari.server.controller.internal;
import java.io.File;
+import java.io.FileInputStream;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -40,6 +41,8 @@ import org.apache.ambari.server.orm.dao.StackDAO;
import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
import org.apache.ambari.server.security.TestAuthenticationFactory;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -84,6 +87,83 @@ public class VersionDefinitionResourceProviderTest {
}
@Test
+ public void testWithParentFromBase64() throws Exception {
+ Authentication authentication = TestAuthenticationFactory.createAdministrator();
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+
+ File file = new File("src/test/resources/version_definition_resource_provider.xml");
+
+ byte[] bytes = IOUtils.toByteArray(new FileInputStream(file));
+ String base64Str = Base64.encodeBase64String(bytes);
+
+ final ResourceProvider versionProvider = new VersionDefinitionResourceProvider();
+ final ResourceProvider provider = injector.getInstance(ResourceProviderFactory.class)
+ .getRepositoryVersionResourceProvider();
+
+ final Set<Map<String, Object>> propertySet = new LinkedHashSet<Map<String, Object>>();
+ final Map<String, Object> properties = new LinkedHashMap<String, Object>();
+ properties.put(VersionDefinitionResourceProvider.VERSION_DEF_DEFINITION_BASE64, base64Str);
+ propertySet.add(properties);
+
+
+ final Request createRequest = PropertyHelper.getCreateRequest(propertySet, null);
+ RequestStatus status = versionProvider.createResources(createRequest);
+ Assert.assertEquals(1, status.getAssociatedResources().size());
+
+ Request getRequest = PropertyHelper.getReadRequest("VersionDefinition");
+ Set<Resource> results = versionProvider.getResources(getRequest, null);
+ Assert.assertEquals(1, results.size());
+
+ final Predicate predicateStackName = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).equals("HDP").toPredicate();
+ final Predicate predicateStackVersion = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).equals("2.2.0").toPredicate();
+
+ results = provider.getResources(getRequest,
+ new AndPredicate(predicateStackName, predicateStackVersion));
+ Assert.assertEquals(1, results.size());
+
+ getRequest = PropertyHelper.getReadRequest(
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_ID_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
+ RepositoryVersionResourceProvider.SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
+ RepositoryVersionResourceProvider.SUBRESOURCE_REPOSITORIES_PROPERTY_ID,
+ "RepositoryVersions/release", "RepositoryVersions/services",
+ "RepositoryVersions/has_children", "RepositoryVersions/parent_id");
+
+ results = provider.getResources(getRequest,
+ new AndPredicate(predicateStackName, predicateStackVersion));
+ Assert.assertEquals(2, results.size());
+
+ Resource r = null;
+ for (Resource result : results) {
+ if (result.getPropertyValue("RepositoryVersions/repository_version").equals("2.2.0.8-5678")) {
+ r = result;
+ break;
+ }
+ }
+
+ Assert.assertNotNull(r);
+ Map<String, Map<String, Object>> map = r.getPropertiesMap();
+ Assert.assertTrue(map.containsKey("RepositoryVersions"));
+
+ Map<String, Object> vals = map.get("RepositoryVersions");
+
+ Assert.assertEquals("2.2.0.8-5678", vals.get("repository_version"));
+ Assert.assertNotNull(vals.get("parent_id"));
+ Assert.assertEquals(Boolean.FALSE, vals.get("has_children"));
+
+
+ Assert.assertTrue(map.containsKey("RepositoryVersions/release"));
+ vals = map.get("RepositoryVersions/release");
+ Assert.assertEquals("5678", vals.get("build"));
+ Assert.assertEquals("2.3.4.[1-9]", vals.get("compatible_with"));
+ Assert.assertEquals("http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/",
+ vals.get("notes"));
+ }
+
+ @Test
public void testWithParent() throws Exception {
Authentication authentication = TestAuthenticationFactory.createAdministrator();
SecurityContextHolder.getContext().setAuthentication(authentication);