You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mr...@apache.org on 2018/09/28 21:20:38 UTC

[ambari] 07/20: AMBARI-21849 : Clean up repo_version table during mpack delete, add create validation for mpacks (mradhakrishnan)

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 4ae922209f7173f492aa4a58b9e9c5c3fc34437b
Author: Madhuvanthi Radhakrishnan <mr...@hortonworks.com>
AuthorDate: Wed Aug 30 11:37:24 2017 -0700

    AMBARI-21849 : Clean up repo_version table during mpack delete, add create validation for mpacks (mradhakrishnan)
---
 .../ambari/server/api/services/AmbariMetaInfo.java |  4 +-
 .../controller/internal/MpackResourceProvider.java | 53 +++++++++++++++++-
 .../server/orm/dao/RepositoryVersionDAO.java       | 15 ++++-
 .../internal/MpackResourceProviderTest.java        | 65 ++++++++++++----------
 4 files changed, 104 insertions(+), 33 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index 6812bf2..6ae0e1c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -1554,7 +1554,9 @@ public class AmbariMetaInfo {
    * @throws IOException
    */
   public void removeMpack(MpackEntity mpackEntity, StackEntity stackEntity) throws IOException {
-    versionDefinitions.clear();
+    if(versionDefinitions != null) {
+      versionDefinitions.clear();
+    }
     boolean stackDelete = mpackManager.removeMpack(mpackEntity, stackEntity);
 
     if(stackDelete) {
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
index 7366390..c4833d1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
@@ -18,8 +18,12 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.io.IOException;
+
 import java.util.HashSet;
 import java.util.Set;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.HashMap;
@@ -47,11 +51,16 @@ import org.apache.ambari.server.controller.MpackRequest;
 import org.apache.ambari.server.controller.utilities.PredicateHelper;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.dao.MpackDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.MpackEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Packlet;
 
+import org.apache.ambari.server.state.StackId;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.Validate;
+
 /**
  * ResourceProvider for Mpack instances
  */
@@ -88,6 +97,9 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
   @Inject
   protected static StackDAO stackDAO;
 
+  @Inject
+  protected static RepositoryVersionDAO repositoryVersionDAO;
+
   static {
     // properties
     PROPERTY_IDS.add(MPACK_ID);
@@ -122,8 +134,10 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     Set<Resource> associatedResources = new HashSet<>();
     try {
       MpackRequest mpackRequest = getRequest(request);
-      if (mpackRequest == null)
+      if (mpackRequest == null) {
         throw new BodyParseException("Please provide " + MPACK_NAME + " ," + MPACK_VERSION + " ," + MPACK_URI);
+      }
+      validateCreateRequest(mpackRequest);
       MpackResponse response = getManagementController().registerMpack(mpackRequest);
       if (response != null) {
         notifyCreate(Resource.Type.Mpack, request);
@@ -145,8 +159,39 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
     return null;
   }
 
-  public MpackRequest getRequest(Request request) {
-    MpackRequest mpackRequest = new MpackRequest();
+  /***
+   * Validates the request body for the required properties in order to create an Mpack resource.
+   * @param mpackRequest
+   */
+  private void validateCreateRequest(MpackRequest mpackRequest) {
+    final String mpackName = mpackRequest.getMpackName();
+    final String mpackUrl = mpackRequest.getMpackUri();
+    final Long registryId = mpackRequest.getRegistryId();
+    final String mpackVersion = mpackRequest.getMpackVersion();
+
+    if(registryId == null) {
+      Validate.isTrue(mpackUrl != null);
+      LOG.info("Received a createMpack request"
+              + ", mpackUrl=" + mpackUrl);
+    } else {
+      Validate.notNull(mpackName, "MpackName should not be null");
+      Validate.notNull(mpackVersion, "MpackVersion should not be null");
+      LOG.info("Received a createMpack request"
+              + ", mpackName=" + mpackName
+              + ", mpackVersion=" + mpackVersion
+              + ", registryId=" + registryId);
+    }
+    try {
+      URI uri = new URI(mpackUrl);
+      URL url = uri.toURL();
+      String jsonString = IOUtils.toString(url);
+    }catch(Exception e){
+      Validate.isTrue(e == null, e.getMessage() + " is an invalid mpack uri. Please check the download link for the mpack again.");
+    }
+  }
+
+  public MpackRequest getRequest(Request request) throws AmbariException {
+     MpackRequest mpackRequest = new MpackRequest();
     Set<Map<String, Object>> properties = request.getProperties();
     for (Map propertyMap : properties) {
       //Mpack Download url is either given in the request body or is fetched using the registry id
@@ -260,6 +305,7 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
 
           MpackEntity mpackEntity = mpackDAO.findById(mpackId);
           StackEntity stackEntity = stackDAO.findByMpack(mpackId);
+
           try {
             getManagementController().removeMpack(mpackEntity, stackEntity);
             if (mpackEntity != null) {
@@ -267,6 +313,7 @@ public class MpackResourceProvider extends AbstractControllerResourceProvider {
                 @Override
                 public DeleteStatusMetaData invoke() throws AmbariException {
                   if (stackEntity != null) {
+                    repositoryVersionDAO.removeByStack(new StackId(stackEntity.getStackName() + "-" + stackEntity.getStackVersion()));
                     stackDAO.removeByMpack(mpackId);
                     notifyDelete(Resource.Type.Stack, predicate);
                   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java
index eaccdb0..30b7adf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java
@@ -255,8 +255,21 @@ public class RepositoryVersionDAO extends CrudDAO<RepositoryVersionEntity, Long>
   @RequiresSession
   public List<RepositoryVersionEntity> findByServiceDesiredVersion(List<RepositoryVersionEntity> matching) {
     TypedQuery<RepositoryVersionEntity> query = entityManagerProvider.get().
-          createNamedQuery("findByServiceDesiredVersion", RepositoryVersionEntity.class);
+            createNamedQuery("findByServiceDesiredVersion", RepositoryVersionEntity.class);
 
     return daoUtils.selectList(query, matching);
   }
+   /**
+   * Removes the specified repoversion entry based on stackid.
+   *
+   * @param stackId
+   *
+   */
+  @Transactional
+  public void removeByStack(StackId stackId) {
+    List<RepositoryVersionEntity> repoVersionDeleteCandidates = findByStack(stackId);
+    for(RepositoryVersionEntity repositoryVersionEntity : repoVersionDeleteCandidates) {
+      entityManagerProvider.get().remove(repositoryVersionEntity);
+    }
+  }
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
index d6638c6..0e38b08 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
@@ -17,6 +17,20 @@
  */
 package org.apache.ambari.server.controller.internal;
 
+import org.apache.commons.io.IOUtils;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 import com.google.inject.Injector;
@@ -110,10 +124,8 @@ public class MpackResourceProviderTest {
     replay(m_dao);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-            type,
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type),
-            m_amc);
+            type
+    );
 
     // create the request
     Request request = PropertyHelper.getReadRequest();
@@ -183,10 +195,7 @@ public class MpackResourceProviderTest {
     replay(m_dao,m_amc);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-            type,
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type),
-            m_amc);
+            type);
 
     // create the request
     Request request = PropertyHelper.getReadRequest();
@@ -210,12 +219,13 @@ public class MpackResourceProviderTest {
   @Test
   public void testCreateResources() throws Exception {
     MpackRequest mpackRequest = new MpackRequest();
-    mpackRequest.setMpackUri("abc.tar.gz");
+    String mpackUri = Paths.get("src/test/resources/mpacks-v2/abc.tar.gz").toUri().toURL().toString();
+    mpackRequest.setMpackUri(mpackUri);
     Request request = createMock(Request.class);
-    MpackResponse response = new MpackResponse(setupMpacks());
+    MpackResponse response = new MpackResponse(setupMpack());
     Set<Map<String, Object>> properties = new HashSet<>();
     Map propertyMap = new HashMap();
-    propertyMap.put(MpackResourceProvider.MPACK_URI,"abc.tar.gz");
+    propertyMap.put(MpackResourceProvider.MPACK_URI,mpackUri);
     properties.add(propertyMap);
 
     // set expectations
@@ -225,10 +235,8 @@ public class MpackResourceProviderTest {
     // end expectations
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-            Resource.Type.Mpack,
-            PropertyHelper.getPropertyIds(Resource.Type.Mpack),
-            PropertyHelper.getKeyPropertyIds(Resource.Type.Mpack),
-            m_amc);
+            Resource.Type.Mpack 
+            );
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
     ((ObservableResourceProvider)provider).addObserver(observer);
@@ -241,7 +249,7 @@ public class MpackResourceProviderTest {
       Assert.assertEquals((long)100,r.getPropertyValue(MpackResourceProvider.MPACK_ID));
       Assert.assertEquals("testMpack",r.getPropertyValue(MpackResourceProvider.MPACK_NAME));
       Assert.assertEquals("3.0",r.getPropertyValue(MpackResourceProvider.MPACK_VERSION));
-      Assert.assertEquals("abc.tar.gz",r.getPropertyValue(MpackResourceProvider.MPACK_URI));
+      Assert.assertEquals("../../../../../../../resources/mpacks-v2/abc.tar.gz",r.getPropertyValue(MpackResourceProvider.MPACK_URI));
     }
     ResourceProviderEvent lastEvent = observer.getLastEvent();
     Assert.assertNotNull(lastEvent);
@@ -253,18 +261,19 @@ public class MpackResourceProviderTest {
     verify(m_amc,request);
   }
 
-  public Mpacks setupMpacks(){
-    Mpacks mpacks = new Mpacks();
-    mpacks.setMpackId((long)100);
-    mpacks.setPacklets(new ArrayList<Packlet>());
-    mpacks.setPrerequisites(new HashMap<String, String>());
-    mpacks.setRegistryId(new Long(100));
-    mpacks.setVersion("3.0");
-    mpacks.setMpacksUri("abc.tar.gz");
-    mpacks.setDescription("Test mpacks");
-    mpacks.setName("testMpack");
-
-    return mpacks;
+
+  public Mpacks setupMpack() {
+    Mpacks mpack = new Mpacks();
+    mpack.setMpackId((long)100);
+    mpack.setPacklets(new ArrayList<Packlet>());
+    mpack.setPrerequisites(new HashMap<String, String>());
+    mpack.setRegistryId(new Long(100));
+    mpack.setVersion("3.0");
+    mpack.setMpacksUri("../../../../../../../resources/mpacks-v2/abc.tar.gz");
+    mpack.setDescription("Test mpack");
+    mpack.setName("testMpack");
+
+    return mpack;
   }
 
   /**