This is an automated email from the ASF dual-hosted git repository.
jonathanhurley pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push:
new 8c02209 [AMBARI-25023] Admin View cannot be Deployed Due to META-INF
Ordering (#2703)
8c02209 is described below
commit 8c0220908f01c71aab28ca9f1788ab0869e6c3cb
Author: Jonathan Hurley <[email protected]>
AuthorDate: Mon Dec 10 07:58:27 2018 -0500
[AMBARI-25023] Admin View cannot be Deployed Due to META-INF Ordering
(#2703)
---
.../apache/ambari/server/view/ViewExtractor.java | 25 +++++---
.../ambari/server/view/ViewExtractorTest.java | 73 +++++++++++-----------
2 files changed, 53 insertions(+), 45 deletions(-)
diff --git
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExtractor.java
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExtractor.java
index b9e95eb..ad99950 100644
---
a/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExtractor.java
+++
b/ambari-server/src/main/java/org/apache/ambari/server/view/ViewExtractor.java
@@ -95,7 +95,14 @@ public class ViewExtractor {
view.setStatusDetail(msg);
LOG.info(msg);
- // create the META-INF directory
+ // pre-create the META-INF directory since JAR compression ordering
+ // can sometimes cause problems with creation of the files inside
of
+ // META-INF if the directory appears after
+ //
+ // 473 12-07-2018 11:37 META-INF/MANIFEST.MF
+ // 0 12-07-2018 11:37 META-INF/
+ // 0 12-07-2018 11:37 META-INF/maven/
+ //
File metaInfDir = archiveUtility.getFile(archivePath +
File.separator + "META-INF");
if (!metaInfDir.mkdir()) {
msg = "Could not create archive META-INF directory.";
@@ -116,14 +123,18 @@ public class ViewExtractor {
if (jarEntry.isDirectory()) {
- LOG.debug("Making directory {}", entryPath);
+ // only try to create the directory if it doesn't already
+ // exist (like META-INFO might)
+ if (!entryFile.exists()) {
+ LOG.debug("Making directory {}", entryPath);
- if (!entryFile.mkdir()) {
- msg = "Could not create archive entry directory " +
entryPath + ".";
+ if (!entryFile.mkdir()) {
+ msg = "Could not create archive entry directory " +
entryPath + ".";
- view.setStatusDetail(msg);
- LOG.error(msg);
- throw new ExtractionException(msg);
+ view.setStatusDetail(msg);
+ LOG.error(msg);
+ throw new ExtractionException(msg);
+ }
}
} else {
diff --git
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewExtractorTest.java
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewExtractorTest.java
index d06eca0..ea61319 100644
---
a/ambari-server/src/test/java/org/apache/ambari/server/view/ViewExtractorTest.java
+++
b/ambari-server/src/test/java/org/apache/ambari/server/view/ViewExtractorTest.java
@@ -19,8 +19,6 @@
package org.apache.ambari.server.view;
import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
@@ -49,6 +47,7 @@ import
org.apache.ambari.server.orm.entities.ResourceTypeEntity;
import org.apache.ambari.server.orm.entities.ViewEntity;
import org.apache.ambari.server.orm.entities.ViewEntityTest;
import org.apache.ambari.server.view.configuration.ViewConfig;
+import org.easymock.EasyMockSupport;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -56,27 +55,27 @@ import org.junit.Test;
/**
* ViewExtractor tests.
*/
-public class ViewExtractorTest {
-
- private static final File extractedArchiveDir = createNiceMock(File.class);
- private static final File viewArchive = createNiceMock(File.class);
- private static final File archiveDir = createNiceMock(File.class);
- private static final File entryFile = createNiceMock(File.class);
- private static final File classesDir = createNiceMock(File.class);
- private static final File libDir = createNiceMock(File.class);
- private static final File metaInfDir = createNiceMock(File.class);
- private static final JarInputStream viewJarFile =
createNiceMock(JarInputStream.class);
- private static final JarEntry jarEntry = createNiceMock(JarEntry.class);
- private static final FileOutputStream fos =
createMock(FileOutputStream.class);
- private static final Configuration configuration =
createNiceMock(Configuration.class);
- private static final File viewDir = createNiceMock(File.class);
- private static final File fileEntry = createNiceMock(File.class);
- private static final ViewDAO viewDAO = createMock(ViewDAO.class);
+public class ViewExtractorTest extends EasyMockSupport {
+
+ private final File extractedArchiveDir = createNiceMock(File.class);
+ private final File viewArchive = createNiceMock(File.class);
+ private final File archiveDir = createNiceMock(File.class);
+ private final File entryFile = createNiceMock(File.class);
+ private final File classesDir = createNiceMock(File.class);
+ private final File libDir = createNiceMock(File.class);
+ private final File metaInfDir = createNiceMock(File.class);
+ private final File metaInfManifest = createNiceMock(File.class);
+ private final JarInputStream viewJarFile =
createNiceMock(JarInputStream.class);
+ private final JarEntry jarEntry = createNiceMock(JarEntry.class);
+ private final FileOutputStream fos = createMock(FileOutputStream.class);
+ private final Configuration configuration =
createNiceMock(Configuration.class);
+ private final File viewDir = createNiceMock(File.class);
+ private final File fileEntry = createNiceMock(File.class);
+ private final ViewDAO viewDAO = createMock(ViewDAO.class);
@Before
public void resetGlobalMocks() {
- reset(extractedArchiveDir, viewArchive,archiveDir,entryFile, classesDir,
libDir, metaInfDir, viewJarFile,
- jarEntry, fos, configuration, viewDir, fileEntry, viewDAO);
+ resetAll();
}
@Test
@@ -100,20 +99,20 @@ public class ViewExtractorTest {
expect(configuration.getViewExtractionThreadPoolCoreSize()).andReturn(2).anyTimes();
expect(configuration.getViewExtractionThreadPoolMaxSize()).andReturn(3).anyTimes();
expect(configuration.getViewExtractionThreadPoolTimeout()).andReturn(10000L).anyTimes();
+
if (System.getProperty("os.name").contains("Windows")) {
expect(viewArchive.getAbsolutePath()).andReturn("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}").anyTimes();
+
expect(metaInfManifest.getAbsolutePath()).andReturn("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\META-INF\\MANIFEST.MF").anyTimes();
+
expect(archiveDir.getAbsolutePath()).andReturn("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}").anyTimes();
}
else {
expect(viewArchive.getAbsolutePath()).andReturn("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}").anyTimes();
+
expect(metaInfManifest.getAbsolutePath()).andReturn("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/META-INF/MANIFEST.MF").anyTimes();
+
expect(archiveDir.getAbsolutePath()).andReturn("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}").anyTimes();
}
expect(archiveDir.exists()).andReturn(false);
- if (System.getProperty("os.name").contains("Windows")) {
-
expect(archiveDir.getAbsolutePath()).andReturn("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}").anyTimes();
- }
- else {
-
expect(archiveDir.getAbsolutePath()).andReturn("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}").anyTimes();
- }
+
expect(archiveDir.mkdir()).andReturn(true);
expect(archiveDir.toURI()).andReturn(new URI("file:./"));
@@ -157,16 +156,12 @@ public class ViewExtractorTest {
expect(addFilePath.isFile()).andReturn(true);
expect(addFilePath.toURI()).andReturn(new URI("file://file3"));
- replay(extractedArchiveDir, viewArchive, archiveDir, entryFile,
classesDir, libDir, metaInfDir, viewJarFile,
- jarEntry, fos, configuration, viewDir, fileEntry, viewDAO,
- addDirPath, addDirPathFile1, addDirPathFile2, addDirPath2,
addFilePath);
+ replayAll();
ViewExtractor viewExtractor = getViewExtractor(viewDefinition);
viewExtractor.extractViewArchive(viewDefinition, viewArchive, archiveDir,
viewsAdditionalClasspath);
- verify(extractedArchiveDir, viewArchive, archiveDir, entryFile,
classesDir, libDir, metaInfDir, viewJarFile,
- jarEntry, fos, configuration, viewDir, fileEntry, viewDAO,
- addDirPath, addDirPathFile1, addDirPathFile2, addDirPath2,
addFilePath);
+ verifyAll();
}
@Test
@@ -181,8 +176,7 @@ public class ViewExtractorTest {
expect(extractedArchiveDir.exists()).andReturn(true);
- replay(extractedArchiveDir, viewArchive, archiveDir, entryFile,
classesDir, libDir, metaInfDir, viewJarFile,
- jarEntry, fos, configuration, viewDir, fileEntry, viewDAO);
+ replayAll();
ViewExtractor viewExtractor = getViewExtractor(viewDefinition);
@@ -193,8 +187,7 @@ public class ViewExtractorTest {
Assert.assertTrue(viewExtractor.ensureExtractedArchiveDirectory("/var/lib/ambari-server/resources/views/work"));
}
- verify(extractedArchiveDir, viewArchive, archiveDir, entryFile,
classesDir, libDir, metaInfDir, viewJarFile,
- jarEntry, fos, configuration, viewDir, fileEntry, viewDAO);
+ verifyAll();
reset(extractedArchiveDir);
@@ -240,20 +233,24 @@ public class ViewExtractorTest {
Map<String, File> files = new HashMap<>();
if (System.getProperty("os.name").contains("Windows")) {
+ // sometimes JARs have odd orderings for the MANIFEST.MF, so put it
before the META-INF directory
+
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\META-INF\\MANIFEST.MF",
metaInfManifest);
+
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\META-INF",
metaInfDir);
files.put("\\var\\lib\\ambari-server\\resources\\views\\work",
extractedArchiveDir);
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}",
archiveDir);
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\view.xml",
entryFile);
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\WEB-INF/classes",
classesDir);
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\WEB-INF/lib",
libDir);
-
files.put("\\var\\lib\\ambari-server\\resources\\views\\work\\MY_VIEW{1.0.0}\\META-INF",
metaInfDir);
}
else {
+ // sometimes JARs have odd orderings for the MANIFEST.MF, so put it
before the META-INF directory
+
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/META-INF/MANIFEST.MF",
metaInfManifest);
+
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/META-INF",
metaInfDir);
files.put("/var/lib/ambari-server/resources/views/work",
extractedArchiveDir);
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}",
archiveDir);
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/view.xml",
entryFile);
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/WEB-INF/classes",
classesDir);
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/WEB-INF/lib",
libDir);
-
files.put("/var/lib/ambari-server/resources/views/work/MY_VIEW{1.0.0}/META-INF",
metaInfDir);
}
Map<File, FileOutputStream> outputStreams = new HashMap<>();