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 *
