class TestRepoContentService(TestCase): def setUp(self): self.service = RepoContentService() def tearDown(self): unstub() def test_should_return_empty_dictionary_when_no_architectures_in_repository(self): when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn([]) when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn("/path/to/repository") actual_architectures = self.service.list_architectures("testrepo") self.assertEqual([], actual_architectures) verify(RepoConfigService).getStaticRepoDir("testrepo") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository") def test_should_return_empty_dictionary_when_no_packages_in_architecture_directories(self): when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn("/path/to/repository") when(yum_repo_server.api.services.repoContentService.os.path).isdir(any_value()).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn(["architecture1"]).thenReturn([]) actual_architectures = self.service.list_architectures("testrepo") self.assertEqual([], actual_architectures) verify(RepoConfigService).getStaticRepoDir("testrepo") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture1") def test_should_return_empty_dictionary_when_repository_is_empty_but_directory_contains_file(self): repository_path="/path/to/repository" repository = "testrepo" architecture1 = "arch1" architecture2 = "arch2" architecture3 = "arch3" tags_file = "tags.txt" when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn(repository_path) when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn([architecture1, architecture2, architecture3, tags_file]).thenReturn([]) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture1)).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture2)).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture3)).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os.path).isdir(tags_file).thenReturn(False) actual_architectures = self.service.list_architectures(repository) self.assertEqual([], actual_architectures) verify(RepoConfigService).getStaticRepoDir(repository) verify(yum_repo_server.api.services.repoContentService.os).listdir(repository_path) verify(yum_repo_server.api.services.repoContentService.os).listdir(os.path.join(repository_path, architecture1)) verify(yum_repo_server.api.services.repoContentService.os).listdir(os.path.join(repository_path, architecture2)) verify(yum_repo_server.api.services.repoContentService.os).listdir(os.path.join(repository_path, architecture3)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture1)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture2)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture3)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, tags_file)) verify(yum_repo_server.api.services.repoContentService.os, never).listdir(os.path.join(repository_path, tags_file)) def test_should_return_empty_dictionary_even_if_meta_data_has_been_generated(self): repository_path="/path/to/repository" repository = "testrepo" architecture1 = "arch1" architecture2 = "arch2" repodata_directory = "repodata" metadata_xml_file = "repomd.xml" when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn(repository_path) when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn([architecture1, architecture2, repodata_directory, metadata_xml_file]).thenReturn([]) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture1)).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture2)).thenReturn(True) when(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, repodata_directory)).thenReturn(True) actual_architectures = self.service.list_architectures(repository) self.assertEqual([], actual_architectures) verify(RepoConfigService).getStaticRepoDir(repository) verify(yum_repo_server.api.services.repoContentService.os).listdir(repository_path) verify(yum_repo_server.api.services.repoContentService.os).listdir(os.path.join(repository_path, architecture1)) verify(yum_repo_server.api.services.repoContentService.os).listdir(os.path.join(repository_path, architecture2)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture1)) verify(yum_repo_server.api.services.repoContentService.os.path).isdir(os.path.join(repository_path, architecture2)) verify(yum_repo_server.api.services.repoContentService.os.path, never).isdir(os.path.join(repository_path, repodata_directory)) def test_should_return_dictionary_with_one_architecture_when_second_directory_is_empty(self): when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn("/path/to/repository") when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn(["architecture"]).thenReturn(["spam.rpm", "egg.rpm"]) when(yum_repo_server.api.services.repoContentService.os.path).isdir(any_value()).thenReturn(True) actual_architectures = self.service.list_architectures("testrepo") self.assertEqual(["/path/to/repository/architecture"], actual_architectures) verify(RepoConfigService).getStaticRepoDir("testrepo") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture") def test_should_return_dictionary_with_two_architectures(self): when(RepoConfigService).getStaticRepoDir(any_value()).thenReturn("/path/to/repository") when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn(["architecture1", "architecture2"]).thenReturn(["spam1.rpm", "egg1.rpm"]).thenReturn(["spam2.rpm", "egg2.rpm"]) when(yum_repo_server.api.services.repoContentService.os.path).isdir(any_value()).thenReturn(True) actual_architectures = self.service.list_architectures("testrepo") self.assertEqual(["/path/to/repository/architecture1", "/path/to/repository/architecture2"], actual_architectures) verify(RepoConfigService).getStaticRepoDir("testrepo") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture1") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture2") def test_should_return_empty_list_when_no_packages_in_repository(self): when(RepoContentService).list_architectures(any_value()).thenReturn([]) actual_packages = self.service.list_packages("testrepo") self.assertEqual([], actual_packages) verify(RepoContentService).list_architectures(any_value()) def test_should_return_one_package_from_architecture_directory(self): when(RepoContentService).list_architectures(any_value()).thenReturn(["/path/to/repository/architecture"]) when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn(["spam.rpm"]) actual_packages = self.service.list_packages("testrepo") self.assertEqual(["/path/to/repository/architecture/spam.rpm"], actual_packages) verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture") def test_should_return_two_packages_from_one_architecture_directory(self): when(RepoContentService).list_architectures(any_value()).thenReturn(["/path/to/repository/architecture"]) when(yum_repo_server.api.services.repoContentService.os).listdir(any_value()).thenReturn(["spam.rpm", "egg.rpm"]) actual_packages = self.service.list_packages("testrepo") self.assertEqual(["/path/to/repository/architecture/spam.rpm", "/path/to/repository/architecture/egg.rpm"], actual_packages) verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture") def test_should_return_two_packages_from_multiple_architecture_directories(self): when(RepoContentService).list_architectures(any_value()).thenReturn(["/path/to/repository/architecture1", "/path/to/repository/architecture2"]) when(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture1").thenReturn(["spam.rpm"]) when(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture2").thenReturn(["egg.rpm"]) actual_packages = self.service.list_packages("testrepo") self.assertEqual(["/path/to/repository/architecture1/spam.rpm", "/path/to/repository/architecture2/egg.rpm"], actual_packages) verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture1") verify(yum_repo_server.api.services.repoContentService.os).listdir("/path/to/repository/architecture2")
class RepoPropagationService(object): repoConfigService = RepoConfigService() repoContentService = RepoContentService() rpmService = RpmService() def propagatePackage(self, package_name, source_repository, destination_repository, architecture): source_repo_path = self.determine_repository_path(source_repository) destination_repo_path = self.determine_repository_path(destination_repository) source_architecture_path = os.path.join(source_repo_path, architecture) file_name = self._determine_rpm_file_name(source_architecture_path, package_name) source_rpm_path = os.path.join(source_repo_path, architecture, file_name) destination_rpm_parent_dir = os.path.join(destination_repo_path, architecture) destination_rpm_path = os.path.join(destination_rpm_parent_dir, file_name) if not os.path.exists(source_rpm_path): raise PropagationException("Package '{0}' could not be found.".format(source_rpm_path)) if not os.path.exists(destination_rpm_parent_dir): os.mkdir(destination_rpm_parent_dir) shutil.move(source_rpm_path, destination_rpm_path) return file_name def _determine_rpm_file_name(self, directory, rpm): if create_rpm_file_object(rpm) is None: latest_rpm = self.rpmService.get_latest_rpm(rpm, directory) if latest_rpm is None: raise PropagationException("Package for {0} could not be found in {1}".format(rpm, directory)) return latest_rpm return rpm def propagate_repository(self, source_repository, destination_repository): destination_repository_path = self.determine_repository_path(destination_repository) packages_to_propagate = self.repoContentService.list_packages(source_repository) propagated_packages = [] for package_path in packages_to_propagate: architecture_path = os.path.dirname(package_path) architecture = os.path.basename(architecture_path) destination_path = os.path.join(destination_repository_path, architecture) if not os.path.exists(destination_path): os.makedirs(destination_path) shutil.move(package_path, destination_path) propagated_packages.append(package_path) return propagated_packages def determine_repository_path(self, repository_name): repository_path = self.repoConfigService.getStaticRepoDir(repository_name) if not os.path.exists(repository_path): raise PropagationException("Static repository '{0}' does not exist.".format(repository_name)) return repository_path
def setUp(self): self.service = RepoContentService()