Repository: ambari Updated Branches: refs/heads/branch-2.1 2b7583205 -> 5618e3312 refs/heads/trunk fb6ae2c19 -> 0e4d75406
AMBARI-12938. Accumulo Install failed on Ubuntu or Debian using non-root and umask 027 (aonishuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0e4d7540 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0e4d7540 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0e4d7540 Branch: refs/heads/trunk Commit: 0e4d7540668e8612403d6a5cbd97621a075e1432 Parents: fb6ae2c Author: Andrew Onishuk <aonis...@hortonworks.com> Authored: Mon Aug 31 16:40:23 2015 +0300 Committer: Andrew Onishuk <aonis...@hortonworks.com> Committed: Mon Aug 31 16:40:23 2015 +0300 ---------------------------------------------------------------------- .../TestRepositoryResource.py | 18 +++--- .../libraries/providers/repository.py | 62 ++++++++++++-------- 2 files changed, 47 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/0e4d7540/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py index ccc9ae0..b3e2291 100644 --- a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py +++ b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py @@ -173,13 +173,15 @@ class TestRepositoryResource(TestCase): self.assertEquals(template_name, '/tmp/1.txt') self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') - copy_item = str(file_mock.call_args_list[1]) - self.assertEqual(copy_item, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") + copy_item0 = str(file_mock.call_args_list[1]) + copy_item1 = str(file_mock.call_args_list[2]) + self.assertEqual(copy_item0, "call('/tmp/1.txt', content=StaticFile('/etc/apt/sources.list.d/HDP.list'))") + self.assertEqual(copy_item1, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") #'apt-get update -qq -o Dir::Etc::sourcelist="sources.list.d/HDP.list" -o APT::Get::List-Cleanup="0"') execute_command_item = execute_mock.call_args_list[0][0][0] self.assertEqual(checked_call_mock.call_args_list[0][0][0], ['apt-get', 'update', '-qq', '-o', 'Dir::Etc::sourcelist=sources.list.d/HDP.list', '-o', 'Dir::Etc::sourceparts=-', '-o', 'APT::Get::List-Cleanup=0']) - self.assertEqual(execute_command_item, 'apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 123ABCD') + self.assertEqual(execute_command_item, ('apt-key', 'adv', '--recv-keys', '--keyserver', 'keyserver.ubuntu.com', '123ABCD')) @patch("resource_management.libraries.providers.repository.checked_call") @patch.object(tempfile, "NamedTemporaryFile") @@ -214,12 +216,14 @@ class TestRepositoryResource(TestCase): self.assertEquals(template_name, '/tmp/1.txt') self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') - copy_item = str(file_mock.call_args_list[1]) - self.assertEqual(copy_item, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") + copy_item0 = str(file_mock.call_args_list[1]) + copy_item1 = str(file_mock.call_args_list[2]) + self.assertEqual(copy_item0, "call('/tmp/1.txt', content=StaticFile('/etc/apt/sources.list.d/HDP.list'))") + self.assertEqual(copy_item1, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") execute_command_item = execute_mock.call_args_list[0][0][0] self.assertEqual(checked_call_mock.call_args_list[0][0][0], ['apt-get', 'update', '-qq', '-o', 'Dir::Etc::sourcelist=sources.list.d/HDP.list', '-o', 'Dir::Etc::sourceparts=-', '-o', 'APT::Get::List-Cleanup=0']) - self.assertEqual(execute_command_item, 'apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 123ABCD') + self.assertEqual(execute_command_item, ('apt-key', 'adv', '--recv-keys', '--keyserver', 'keyserver.ubuntu.com', '123ABCD')) @patch.object(tempfile, "NamedTemporaryFile") @patch("resource_management.libraries.providers.repository.Execute") @@ -248,7 +252,7 @@ class TestRepositoryResource(TestCase): self.assertEquals(template_name, '/tmp/1.txt') self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') - self.assertEqual(file_mock.call_count, 1) + self.assertEqual(file_mock.call_count, 2) self.assertEqual(execute_mock.call_count, 0) http://git-wip-us.apache.org/repos/asf/ambari/blob/0e4d7540/ambari-common/src/main/python/resource_management/libraries/providers/repository.py ---------------------------------------------------------------------- diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py index 2faa7c1..11002cc 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py @@ -74,39 +74,49 @@ class UbuntuRepositoryProvider(Provider): repo_dir = "/etc/apt/sources.list.d" update_cmd = ['apt-get', 'update', '-qq', '-o', 'Dir::Etc::sourcelist=sources.list.d/{repo_file_name}', '-o', 'Dir::Etc::sourceparts=-', '-o', 'APT::Get::List-Cleanup=0'] missing_pkey_regex = "The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ([A-Z0-9]+)" - add_pkey_cmd = "apt-key adv --recv-keys --keyserver keyserver.ubuntu.com {pkey}" + app_pkey_cmd_prefix = ('apt-key', 'adv', '--recv-keys', '--keyserver', 'keyserver.ubuntu.com') def action_create(self): with Environment.get_instance_copy() as env: with tempfile.NamedTemporaryFile() as tmpf: - repo_file_name = format("{repo_file_name}.list",repo_file_name = self.resource.repo_file_name) - repo_file_path = format("{repo_dir}/{repo_file_name}", repo_dir = self.repo_dir) - - new_content = InlineTemplate(self.resource.repo_template, package_type=self.package_type, - base_url=self.resource.base_url, - components=' '.join(self.resource.components)).get_content() - old_content = '' - if self.resource.append_to_file and os.path.isfile(repo_file_path): - old_content = sudo.read_file(repo_file_path) + '\n' - - File(tmpf.name, content=old_content+new_content) - - if not os.path.isfile(repo_file_path) or not filecmp.cmp(tmpf.name, repo_file_path): - File(repo_file_path, - content = StaticFile(tmpf.name) + with tempfile.NamedTemporaryFile() as old_repo_tmpf: + repo_file_name = format("{repo_file_name}.list",repo_file_name = self.resource.repo_file_name) + repo_file_path = format("{repo_dir}/{repo_file_name}", repo_dir = self.repo_dir) + + new_content = InlineTemplate(self.resource.repo_template, package_type=self.package_type, + base_url=self.resource.base_url, + components=' '.join(self.resource.components)).get_content() + old_content = '' + if self.resource.append_to_file and os.path.isfile(repo_file_path): + old_content = sudo.read_file(repo_file_path) + '\n' + + File(tmpf.name, + content=old_content+new_content ) - update_cmd_formatted = [format(x) for x in self.update_cmd] - # this is time expensive - retcode, out = checked_call(update_cmd_formatted, sudo=True) - - # add public keys for new repos - missing_pkeys = set(re.findall(self.missing_pkey_regex, out)) - for pkey in missing_pkeys: - Execute(format(self.add_pkey_cmd), - timeout = 15, # in case we are on the host w/o internet (using localrepo), we should ignore hanging - ignore_failures = True + if os.path.isfile(repo_file_path): + # a copy of old repo file, which will be readable by current user + File(old_repo_tmpf.name, + content=StaticFile(repo_file_path), + ) + + if not os.path.isfile(repo_file_path) or not filecmp.cmp(tmpf.name, old_repo_tmpf.name): + File(repo_file_path, + content = StaticFile(tmpf.name) ) + + update_cmd_formatted = [format(x) for x in self.update_cmd] + # this is time expensive + retcode, out = checked_call(update_cmd_formatted, sudo=True, quiet=False) + + # add public keys for new repos + missing_pkeys = set(re.findall(self.missing_pkey_regex, out)) + for pkey in missing_pkeys: + Execute(self.app_pkey_cmd_prefix + (pkey,), + timeout = 15, # in case we are on the host w/o internet (using localrepo), we should ignore hanging + ignore_failures = True, + sudo = True, + ) def action_remove(self): with Environment.get_instance_copy() as env: