Modified the fetcher to use libarchive for extraction. This replaces the fetcher's behavior of shelling out to `tar -C <destination> -xf <source>` to extract most archive types. The end result should be identical.
This patch enables the extraction of these formats on Windows. Review: https://reviews.apache.org/r/67066/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2198b961 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2198b961 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2198b961 Branch: refs/heads/master Commit: 2198b961d24b788564d36490cf52f78d7ec07655 Parents: 894d06e Author: John Kordich <[email protected]> Authored: Mon Jun 4 14:12:00 2018 -0700 Committer: Joseph Wu <[email protected]> Committed: Mon Jun 4 15:50:56 2018 -0700 ---------------------------------------------------------------------- src/launcher/fetcher.cpp | 28 ++++++++++++---------------- src/tests/fetcher_tests.cpp | 26 -------------------------- 2 files changed, 12 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/2198b961/src/launcher/fetcher.cpp ---------------------------------------------------------------------- diff --git a/src/launcher/fetcher.cpp b/src/launcher/fetcher.cpp index 4cff727..ef8d7eb 100644 --- a/src/launcher/fetcher.cpp +++ b/src/launcher/fetcher.cpp @@ -20,6 +20,7 @@ #include <process/owned.hpp> #include <process/subprocess.hpp> +#include <stout/archiver.hpp> #include <stout/json.hpp> #include <stout/net.hpp> #include <stout/option.hpp> @@ -80,9 +81,18 @@ static Try<bool> extract( strings::endsWith(sourcePath, ".tbz2") || strings::endsWith(sourcePath, ".tar.bz2") || strings::endsWith(sourcePath, ".txz") || - strings::endsWith(sourcePath, ".tar.xz")) { - command = {"tar", "-C", destinationDirectory, "-xf", sourcePath}; + strings::endsWith(sourcePath, ".tar.xz") || + strings::endsWith(sourcePath, ".zip")) { + Try<Nothing> result = archiver::extract(sourcePath, destinationDirectory); + if (result.isError()) { + return Error( + "Failed to extract archive '" + sourcePath + + "' to '" + destinationDirectory + "': " + result.error()); + } + return true; } else if (strings::endsWith(sourcePath, ".gz")) { + // Unfortunately, libarchive can't extract bare files, so leave this to + // the 'gunzip' program, if it exists. string pathWithoutExtension = sourcePath.substr(0, sourcePath.length() - 3); string filename = Path(pathWithoutExtension).basename(); string destinationPath = path::join(destinationDirectory, filename); @@ -90,20 +100,6 @@ static Try<bool> extract( command = {"gunzip", "-d", "-c"}; in = Subprocess::PATH(sourcePath); out = Subprocess::PATH(destinationPath); - } else if (strings::endsWith(sourcePath, ".zip")) { -#ifdef __WINDOWS__ - command = {"powershell", - "-NoProfile", - "-Command", - "Expand-Archive", - "-Force", - "-Path", - sourcePath, - "-DestinationPath", - destinationDirectory}; -#else - command = {"unzip", "-o", "-d", destinationDirectory, sourcePath}; -#endif // __WINDOWS__ } else { return false; } http://git-wip-us.apache.org/repos/asf/mesos/blob/2198b961/src/tests/fetcher_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/fetcher_tests.cpp b/src/tests/fetcher_tests.cpp index 8c353f2..5e6a1c3 100644 --- a/src/tests/fetcher_tests.cpp +++ b/src/tests/fetcher_tests.cpp @@ -1000,33 +1000,7 @@ TEST_F(FetcherTest, UNZIP_ExtractInvalidFile) os::getcwd(), None()); -#ifdef __WINDOWS__ - // On Windows, PowerShell doesn't consider a CRC error to be an error, - // so it succeeds, whereas the zip utility errors. - // - // TODO(coffler): When we move to programmatically dealing with various - // data files (tar, gzip, zip, etc), we should be able to resolve this. - // See MESOS-7740 for further details. - AWAIT_READY(fetch); -#else AWAIT_FAILED(fetch); -#endif // __WINDOWS__ - - string extractedFile = path::join(os::getcwd(), "world"); - ASSERT_TRUE(os::exists(extractedFile)); - - ASSERT_SOME_EQ("hello hello\n", os::read(extractedFile)); - -#ifdef __WINDOWS__ - // TODO(coffler): Eliminate with programmatic decoding of container files. - // See MESOS-7740 for further details. - // - // On Windows, PowerShell doesn't consider a CRC error to be an error. - // Adjust metrics appropriately to not expect an error back. - verifyMetrics(1, 0); -#else - verifyMetrics(0, 1); -#endif // __WINDOWS__ }
