You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2015/09/01 07:13:46 UTC
ambari git commit: AMBARI-12909: Existence of empty package folder in
stack definition breaks the service (Nahappan Somasundaram via jluniya)
Repository: ambari
Updated Branches:
refs/heads/trunk 8631fdce4 -> d145dd6dc
AMBARI-12909: Existence of empty package folder in stack definition breaks the service (Nahappan Somasundaram via jluniya)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d145dd6d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d145dd6d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d145dd6d
Branch: refs/heads/trunk
Commit: d145dd6dcaf354ba053ab36220d3271f1a9ca81e
Parents: 8631fdc
Author: Jayush Luniya <jl...@hortonworks.com>
Authored: Mon Aug 31 22:13:40 2015 -0700
Committer: Jayush Luniya <jl...@hortonworks.com>
Committed: Mon Aug 31 22:13:40 2015 -0700
----------------------------------------------------------------------
.../src/main/python/ambari_agent/FileCache.py | 12 ++++++---
.../test/python/ambari_agent/TestFileCache.py | 26 ++++++++++++++++++++
.../python/ambari_server/resourceFilesKeeper.py | 12 ++++++---
.../src/test/python/TestResourceFilesKeeper.py | 10 ++++++++
4 files changed, 53 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/d145dd6d/ambari-agent/src/main/python/ambari_agent/FileCache.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/FileCache.py b/ambari-agent/src/main/python/ambari_agent/FileCache.py
index fa960e1..4869e51 100644
--- a/ambari-agent/src/main/python/ambari_agent/FileCache.py
+++ b/ambari-agent/src/main/python/ambari_agent/FileCache.py
@@ -145,9 +145,15 @@ class FileCache():
download_url = self.build_download_url(server_url_prefix,
subdirectory, self.ARCHIVE_NAME)
membuffer = self.fetch_url(download_url)
- self.invalidate_directory(full_path)
- self.unpack_archive(membuffer, full_path)
- self.write_hash_sum(full_path, remote_hash)
+ # extract only when the archive is not zero sized
+ if (membuffer.getvalue().strip()):
+ self.invalidate_directory(full_path)
+ self.unpack_archive(membuffer, full_path)
+ self.write_hash_sum(full_path, remote_hash)
+ else:
+ logger.warn("Skipping empty archive: {0}. "
+ "Expected archive was not found. Cached copy will be used.".format(download_url))
+ pass
# Finally consider cache directory up-to-date
self.uptodate_paths.append(full_path)
except CachingException, e:
http://git-wip-us.apache.org/repos/asf/ambari/blob/d145dd6d/ambari-agent/src/test/python/ambari_agent/TestFileCache.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestFileCache.py b/ambari-agent/src/test/python/ambari_agent/TestFileCache.py
index d0c987b..5933daa 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestFileCache.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestFileCache.py
@@ -233,6 +233,32 @@ class TestFileCache(TestCase):
"server_url_prefix")
self.assertEquals(res, path)
+ # Test empty archive
+ fetch_url_mock.reset_mock()
+ build_download_url_mock.reset_mock()
+ read_hash_sum_mock.reset_mock()
+ invalidate_directory_mock.reset_mock()
+ unpack_archive_mock.reset_mock()
+ fileCache.reset()
+
+ fetch_url_mock.side_effect = None
+ membuffer_empty = MagicMock()
+ membuffer_empty.getvalue.return_value.strip.return_value = ""
+ fetch_url_mock.return_value = membuffer_empty # Remote hash and content
+ read_hash_sum_mock.return_value = "hash2" # Local hash
+
+ res = fileCache.provide_directory("cache_path", "subdirectory",
+ "server_url_prefix")
+ self.assertTrue(fetch_url_mock.return_value.strip() != read_hash_sum_mock.return_value.strip())
+ self.assertEquals(build_download_url_mock.call_count, 2)
+ self.assertEquals(fetch_url_mock.call_count, 2)
+ self.assertFalse(invalidate_directory_mock.called)
+ self.assertFalse(unpack_archive_mock.called)
+ self.assertFalse(write_hash_sum_mock.called)
+ self.assertEquals(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path]))
+ self.assertEquals(res, path)
+ pass
+
def test_build_download_url(self):
fileCache = FileCache(self.config)
http://git-wip-us.apache.org/repos/asf/ambari/blob/d145dd6d/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py b/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py
index fe80723..c9bca73 100644
--- a/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py
+++ b/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py
@@ -141,17 +141,17 @@ class ResourceFilesKeeper():
except Exception, err:
raise KeeperException("Can not list common services: {0}".format(str(err)))
-
def update_directory_archive(self, directory):
"""
If hash sum for directory is not present or differs from saved value,
recalculates hash sum and creates directory archive
"""
+ skip_empty_directory = True
cur_hash = self.count_hash_sum(directory)
saved_hash = self.read_hash_sum(directory)
if cur_hash != saved_hash:
if not self.nozip:
- self.zip_directory(directory)
+ self.zip_directory(directory, skip_empty_directory)
self.write_hash_sum(directory, cur_hash)
@@ -216,14 +216,18 @@ class ResourceFilesKeeper():
raise KeeperException("Can not write to file {0} : {1}".format(hash_file,
str(err)))
-
- def zip_directory(self, directory):
+ def zip_directory(self, directory, skip_if_empty = False):
"""
Packs entire directory into zip file. Hash file is also packaged
into archive
"""
self.dbg_out("creating archive for directory {0}".format(directory))
try:
+ if skip_if_empty:
+ if not os.listdir(directory):
+ self.dbg_out("Empty directory. Skipping archive creation for {0}".format(directory))
+ return
+
zf = zipfile.ZipFile(os.path.join(directory, self.ARCHIVE_NAME), "w")
abs_src = os.path.abspath(directory)
for root, dirs, files in os.walk(directory):
http://git-wip-us.apache.org/repos/asf/ambari/blob/d145dd6d/ambari-server/src/test/python/TestResourceFilesKeeper.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestResourceFilesKeeper.py b/ambari-server/src/test/python/TestResourceFilesKeeper.py
index 6856124..1fefa7a 100644
--- a/ambari-server/src/test/python/TestResourceFilesKeeper.py
+++ b/ambari-server/src/test/python/TestResourceFilesKeeper.py
@@ -349,6 +349,16 @@ class TestResourceFilesKeeper(TestCase):
except Exception, e:
self.fail('Unexpected exception thrown:' + str(e))
+ # Test skip zipping of an empty directory
+ with patch("os.listdir") as os_listdir_mock:
+ os_listdir_mock.return_value = False # Empty dir
+ try:
+ skip_empty_directory = True
+ resource_files_keeper.zip_directory("empty-to-directory", skip_empty_directory)
+ self.assertTrue(os_listdir_mock.called)
+ except Exception, e:
+ self.fail('Unexpected exception thrown: ' + str(e))
+ pass
def test_is_ignored(self):
resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)