AMBARI-22562 Remove stack metainfo.xml from management pack (dsen)

Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c52d8a79
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c52d8a79
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c52d8a79

Branch: refs/heads/branch-feature-AMBARI-14714-blueprintv2
Commit: c52d8a79f043578c82795d00b0e2598100ca461f
Parents: f541d05
Author: Dmytro Sen <[email protected]>
Authored: Fri Dec 1 11:31:50 2017 +0200
Committer: Dmytro Sen <[email protected]>
Committed: Fri Dec 1 11:31:50 2017 +0200

----------------------------------------------------------------------
 .../ambari/server/mpack/MpackGenerator.java     | 20 +------
 .../ambari/server/mpack/MpackManager.java       | 61 ++++++++++++++++++++
 2 files changed, 63 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c52d8a79/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
index 130ff62..491d7dc 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
@@ -56,7 +56,6 @@ import 
org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.ConfigurationXml;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.ServiceMetainfoXml;
-import org.apache.ambari.server.state.stack.StackMetainfoXml;
 import org.apache.ambari.server.state.stack.StackRoleCommandOrder;
 import org.apache.ambari.server.state.theme.Theme;
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
@@ -187,23 +186,6 @@ public class MpackGenerator {
       currentStackVersion = currentStackInfo.getParentStackVersion();
     }
 
-    // Export stack metainfo.xml
-    String parentStackVersion = srcStackInfo.getParentStackVersion();
-    StackMetainfoXml stackMetainfoXml = new StackMetainfoXml();
-    stackMetainfoXml.setMinJdk(srcStackInfo.getMinJdk());
-    stackMetainfoXml.setMaxJdk(srcStackInfo.getMaxJdk());
-    StackMetainfoXml.Version ver = new StackMetainfoXml.Version();
-    ver.setActive(srcStackInfo.isActive());
-    stackMetainfoXml.setVersion(ver);
-    ctx = JAXBContext.newInstance(StackMetainfoXml.class);
-    marshaller = ctx.createMarshaller();
-    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
-    FileOutputStream stackMetainfoFileStream = new FileOutputStream(
-      mpackRootDir.getAbsolutePath() + File.separator + "metainfo.xml");
-    marshaller.marshal(stackMetainfoXml, stackMetainfoFileStream);
-    stackMetainfoFileStream.flush();
-    stackMetainfoFileStream.close();
-
     // Export stack advisors
     File stackAdvisorsDir = new File(mpackRootDir.getAbsolutePath() + 
File.separator + "stack-advisor");
     if(!stackAdvisorsDir.exists()) {
@@ -266,6 +248,8 @@ public class MpackGenerator {
     mpack.setDescription(dstStackName + " Ambari Management Pack");
     Map<String, String> prereqs = new HashMap<>();
     prereqs.put("min-ambari-version", "3.0.0.0");
+    prereqs.put("min-jdk", srcStackInfo.getMinJdk());
+    prereqs.put("max-jdk", srcStackInfo.getMaxJdk());
     mpack.setPrerequisites(prereqs);
     List<Packlet> packlets = new ArrayList<>();
     mpack.setPacklets(packlets);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c52d8a79/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
----------------------------------------------------------------------
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 1036926..5ad0d9e 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
@@ -32,6 +32,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+
 import org.apache.ambari.server.controller.MpackRequest;
 import org.apache.ambari.server.controller.MpackResponse;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
@@ -41,6 +45,7 @@ import org.apache.ambari.server.orm.entities.MpackEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Mpack;
 import org.apache.ambari.server.state.Packlet;
+import org.apache.ambari.server.state.stack.StackMetainfoXml;
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
@@ -59,9 +64,13 @@ import com.google.inject.assistedinject.AssistedInject;
  */
 public class MpackManager {
   private static final String MPACK_METADATA = "mpack.json";
+  private static final String METAINFO_FILE_NAME = "metainfo.xml";
   private static final String MPACK_TAR_LOCATION = "staging";
   private static final String SERVICES_DIRECTORY = "services";
   private static final String PACKLETS_DIRECTORY = "packlets";
+  private static final String MIN_JDK_PROPERTY = "min-jdk";
+  private static final String MAX_JDK_PROPERTY = "max-jdk";
+  private static final String DEFAULT_JDK_VALUE = "1.8";
   private final static Logger LOG = 
LoggerFactory.getLogger(MpackManager.class);
   protected Map<Long, Mpack> mpackMap = new ConcurrentHashMap<>();
   private File mpacksStaging;
@@ -245,9 +254,61 @@ public class MpackManager {
         Paths.get(mpackDirectory), StandardCopyOption.REPLACE_EXISTING);
 
     createServicesDirectory(extractedMpackDirectory, mpack);
+
+    File metainfoFile = new File(extractedMpackDirectory + File.separator + 
METAINFO_FILE_NAME);
+    // if metainfo.xml doesn't exist in mpack generate it
+    if (!metainfoFile.exists()) {
+      generateMetainfo(metainfoFile, mpack);
+    }
+
     createSymLinks(mpack);
   }
 
+  /**
+   * Generate metainfo.xml based on prerequisites of mpack and write it to the 
mpack directory.
+   * If required properties are missing in prerequisites fill them with 
default values.
+   *
+   * @param metainfoFile
+   * @param mpack
+   * @throws IOException
+   */
+  private void generateMetainfo(File metainfoFile, Mpack mpack) throws 
IOException {
+    LOG.info("Generating {} for mpack {}", metainfoFile, mpack.getName());
+    StackMetainfoXml generatedMetainfo = new StackMetainfoXml();
+    StackMetainfoXml.Version version = new StackMetainfoXml.Version();
+    version.setActive(true);
+    generatedMetainfo.setVersion(version);
+
+    Map<String, String> prerequisites = mpack.getPrerequisites();
+    if (prerequisites != null && prerequisites.containsKey(MIN_JDK_PROPERTY)) {
+      
generatedMetainfo.setMinJdk(mpack.getPrerequisites().get(MIN_JDK_PROPERTY));
+    } else {
+      //this should not happen if mpack was configured correctly
+      LOG.warn("Couldn't detect {} for mpack {}. Using default value {}", 
MIN_JDK_PROPERTY, mpack.getName(), DEFAULT_JDK_VALUE);
+      generatedMetainfo.setMinJdk(DEFAULT_JDK_VALUE);
+    }
+    if (prerequisites != null && prerequisites.containsKey(MAX_JDK_PROPERTY)) {
+      
generatedMetainfo.setMaxJdk(mpack.getPrerequisites().get(MAX_JDK_PROPERTY));
+    } else {
+      //this should not happen if mpack was configured correctly
+      LOG.warn("Couldn't detect {} for mpack {}. Using default value {}", 
MAX_JDK_PROPERTY, mpack.getName(), DEFAULT_JDK_VALUE);
+      generatedMetainfo.setMaxJdk(DEFAULT_JDK_VALUE);
+    }
+
+    // Export generatedMetainfo to metainfo.xml
+    try {
+      JAXBContext ctx = JAXBContext.newInstance(StackMetainfoXml.class);
+      Marshaller marshaller = ctx.createMarshaller();
+      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+      FileOutputStream stackMetainfoFileStream = new 
FileOutputStream(metainfoFile);
+      marshaller.marshal(generatedMetainfo, stackMetainfoFileStream);
+      stackMetainfoFileStream.flush();
+      stackMetainfoFileStream.close();
+    } catch (JAXBException e) {
+      e.printStackTrace();
+    }
+  }
+
   /***
    * Create a services directory and extract all the services tar file inside 
it. This readies it for cluster deployment
    *

Reply via email to