123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- '''
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- '''
- import os, sys
- import tempfile
- from unittest import TestCase
- from mock.mock import patch, MagicMock
- from resource_management import *
- from resource_management.libraries.providers import repository
- class DummyTemplate(object):
- def __init__(self, name, extra_imports=[], **kwargs):
- self._template = InlineTemplate(DummyTemplate._inline_text, extra_imports, **kwargs)
- self.context = self._template.context
- self.name = name
- def get_content(self):
- self.content = self._template.get_content()
- return self.content
- @classmethod
- def create(cls, text):
- cls._inline_text = text
- return cls
- DEBIAN_DEFAUTL_TEMPLATE = "{{package_type}} {{base_url}} {{components}}\n"
- RHEL_SUSE_DEFAULT_TEMPLATE ="""[{{repo_id}}]
- name={{repo_file_name}}
- {% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}
- path=/
- enabled=1
- gpgcheck=0
- """
- class TestRepositoryResource(TestCase):
- @patch.object(System, "os_family", new='redhat')
- @patch("resource_management.libraries.providers.repository.File")
- def test_create_repo_redhat(self, file_mock):
- with Environment('/') as env:
- with patch.object(repository,"Template", new=DummyTemplate.create(RHEL_SUSE_DEFAULT_TEMPLATE)):
- Repository('hadoop',
- base_url='http://download.base_url.org/rpm/',
- mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- repo_file_name='Repository',
- repo_template='dummy.j2')
- self.assertTrue('hadoop' in env.resources['Repository'])
- defined_arguments = env.resources['Repository']['hadoop'].arguments
- expected_arguments = {'repo_template': 'dummy.j2',
- 'base_url': 'http://download.base_url.org/rpm/',
- 'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'repo_file_name': 'Repository'}
- expected_template_arguments = {'base_url': 'http://download.base_url.org/rpm/',
- 'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'repo_file_name': 'Repository'}
- self.assertEqual(defined_arguments, expected_arguments)
- self.assertEqual(file_mock.call_args[0][0], '/etc/yum.repos.d/Repository.repo')
- template_item = file_mock.call_args[1]['content']
- template = str(template_item.name)
- expected_template_arguments.update({'repo_id': 'hadoop'})
- self.assertEqual(expected_template_arguments, template_item.context._dict)
- self.assertEqual('dummy.j2', template)
- @patch.object(System, "os_family", new='suse')
- @patch("resource_management.libraries.providers.repository.File")
- def test_create_repo_suse(self, file_mock):
- with Environment('/') as env:
- with patch.object(repository,"Template", new=DummyTemplate.create(RHEL_SUSE_DEFAULT_TEMPLATE)):
- Repository('hadoop',
- base_url='http://download.base_url.org/rpm/',
- mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- repo_template = "dummy.j2",
- repo_file_name='Repository')
- self.assertTrue('hadoop' in env.resources['Repository'])
- defined_arguments = env.resources['Repository']['hadoop'].arguments
- expected_arguments = {'repo_template': 'dummy.j2',
- 'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'base_url': 'http://download.base_url.org/rpm/',
- 'repo_file_name': 'Repository'}
- expected_template_arguments = {'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'base_url': 'http://download.base_url.org/rpm/',
- 'repo_file_name': 'Repository'}
- self.assertEqual(defined_arguments, expected_arguments)
- self.assertEqual(file_mock.call_args[0][0], '/etc/zypp/repos.d/Repository.repo')
- template_item = file_mock.call_args[1]['content']
- template = str(template_item.name)
- expected_template_arguments.update({'repo_id': 'hadoop'})
- self.assertEqual(expected_template_arguments, template_item.context._dict)
- self.assertEqual('dummy.j2', template)
-
- @patch("resource_management.libraries.providers.repository.checked_call")
- @patch.object(tempfile, "NamedTemporaryFile")
- @patch("resource_management.libraries.providers.repository.Execute")
- @patch("resource_management.libraries.providers.repository.File")
- @patch("os.path.isfile", new=MagicMock(return_value=True))
- @patch("filecmp.cmp", new=MagicMock(return_value=False))
- @patch.object(System, "os_release_name", new='precise')
- @patch.object(System, "os_family", new='ubuntu')
- def test_create_repo_ubuntu_repo_exists(self, file_mock, execute_mock,
- tempfile_mock, checked_call_mock):
- tempfile_mock.return_value = MagicMock(spec=file)
- tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt"
- checked_call_mock.return_value = 0, "The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 123ABCD"
-
- with Environment('/') as env:
- with patch.object(repository,"Template", new=DummyTemplate.create(DEBIAN_DEFAUTL_TEMPLATE)):
- Repository('HDP',
- base_url='http://download.base_url.org/rpm/',
- repo_file_name='HDP',
- repo_template = "dummy.j2",
- components = ['a','b','c']
- )
-
- template_item = file_mock.call_args_list[0]
- template_name = template_item[0][0]
- template_content = template_item[1]['content'].get_content()
-
- self.assertEquals(template_name, '/tmp/1.txt')
- self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c\n')
-
- 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'))")
- #'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', 'APT::Get::List-Cleanup=0'])
- 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")
- @patch("resource_management.libraries.providers.repository.File")
- @patch("os.path.isfile", new=MagicMock(return_value=True))
- @patch("filecmp.cmp", new=MagicMock(return_value=True))
- @patch.object(System, "os_release_name", new='precise')
- @patch.object(System, "os_family", new='ubuntu')
- def test_create_repo_ubuntu_doesnt_repo_exist(self, file_mock, execute_mock, tempfile_mock):
- tempfile_mock.return_value = MagicMock(spec=file)
- tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt"
-
- with Environment('/') as env:
- with patch.object(repository,"Template", new=DummyTemplate.create(DEBIAN_DEFAUTL_TEMPLATE)):
- Repository('HDP',
- base_url='http://download.base_url.org/rpm/',
- repo_file_name='HDP',
- repo_template = "dummy.j2",
- components = ['a','b','c']
- )
-
- template_item = file_mock.call_args_list[0]
- template_name = template_item[0][0]
- template_content = template_item[1]['content'].get_content()
-
- self.assertEquals(template_name, '/tmp/1.txt')
- self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c\n')
-
- self.assertEqual(file_mock.call_count, 1)
- self.assertEqual(execute_mock.call_count, 0)
-
-
- @patch("os.path.isfile", new=MagicMock(return_value=True))
- @patch.object(System, "os_family", new='ubuntu')
- @patch("resource_management.libraries.providers.repository.Execute")
- @patch("resource_management.libraries.providers.repository.File")
- def test_remove_repo_ubuntu_repo_exist(self, file_mock, execute_mock):
- with Environment('/') as env:
- Repository('HDP',
- action = "remove",
- repo_file_name='HDP'
- )
-
- self.assertEqual(str(file_mock.call_args), "call('/etc/apt/sources.list.d/HDP.list', action='delete')")
- self.assertEqual(execute_mock.call_args[0][0], ['apt-get', 'update', '-qq', '-o', 'Dir::Etc::sourcelist=sources.list.d/HDP.list', '-o', 'APT::Get::List-Cleanup=0'])
- @patch("os.path.isfile", new=MagicMock(return_value=False))
- @patch.object(System, "os_family", new='ubuntu')
- @patch("resource_management.libraries.providers.repository.Execute")
- @patch("resource_management.libraries.providers.repository.File")
- def test_remove_repo_ubuntu_repo_doenst_exist(self, file_mock, execute_mock):
- with Environment('/') as env:
- Repository('HDP',
- action = "remove",
- repo_file_name='HDP'
- )
-
- self.assertEqual(file_mock.call_count, 0)
- self.assertEqual(execute_mock.call_count, 0)
- @patch.object(System, "os_family", new='redhat')
- @patch("resource_management.libraries.providers.repository.File")
- def test_remove_repo_redhat(self, file_mock):
- with Environment('/') as env:
- Repository('hadoop',
- action='remove',
- base_url='http://download.base_url.org/rpm/',
- mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- repo_file_name='Repository')
- self.assertTrue('hadoop' in env.resources['Repository'])
- defined_arguments = env.resources['Repository']['hadoop'].arguments
- expected_arguments = {'action': ['remove'],
- 'base_url': 'http://download.base_url.org/rpm/',
- 'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'repo_file_name': 'Repository'}
- self.assertEqual(defined_arguments, expected_arguments)
- self.assertEqual(file_mock.call_args[1]['action'], 'delete')
- self.assertEqual(file_mock.call_args[0][0], '/etc/yum.repos.d/Repository.repo')
- @patch.object(System, "os_family", new='suse')
- @patch("resource_management.libraries.providers.repository.File")
- def test_remove_repo_suse(self, file_mock):
- with Environment('/') as env:
- Repository('hadoop',
- action='remove',
- base_url='http://download.base_url.org/rpm/',
- mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- repo_file_name='Repository')
- self.assertTrue('hadoop' in env.resources['Repository'])
- defined_arguments = env.resources['Repository']['hadoop'].arguments
- expected_arguments = {'action': ['remove'],
- 'base_url': 'http://download.base_url.org/rpm/',
- 'mirror_list': 'https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
- 'repo_file_name': 'Repository'}
- self.assertEqual(defined_arguments, expected_arguments)
- self.assertEqual(file_mock.call_args[1]['action'], 'delete')
- self.assertEqual(file_mock.call_args[0][0], '/etc/zypp/repos.d/Repository.repo')
|