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);