def test_translate_obsrepositories_outside_buildservice( self, mock_buildservice ): mock_buildservice.return_value = False uri = Uri('obsrepositories:/') with raises(KiwiUriStyleUnknown): uri.translate()
def test_translate_obs_project(self, mock_request_get): uri = Uri('obs://openSUSE:Leap:42.2/standard', 'yast2') uri.runtime_config = self.runtime_config uri.translate() mock_request_get.assert_called_once_with( 'obs_server/openSUSE:/Leap:/42.2/standard' )
def test_translate_obs_project(self, mock_is_buildservice_worker, mock_request_get): mock_is_buildservice_worker.return_value = False uri = Uri('obs://openSUSE:Leap:42.2/standard', 'yast2') uri.runtime_config = self.runtime_config uri.translate() mock_request_get.assert_called_once_with( 'obs_server/openSUSE:/Leap:/42.2/standard')
def test_destructor(self, mock_wipe, mock_mkdtemp, mock_manager): mock_mkdtemp.return_value = 'tmpdir' manager = mock.Mock() manager.mountpoint = mock_mkdtemp.return_value manager.is_mounted = mock.Mock(return_value=True) mock_manager.return_value = manager uri = Uri('iso:///image/CDs/openSUSE-13.2-DVD-x86_64.iso', 'yast2') uri.translate() uri.__del__() manager.umount.assert_called_once_with() mock_wipe.assert_called_once_with(manager.mountpoint)
def test_translate_obs_uri_not_found(mock_buildservice, mock_request_get, self): mock_buildservice.return_value = False mock_request_get.side_effect = Exception('error') uri = Uri('obs://openSUSE:Leap:42.2/standard', 'yast2') self.runtime_config.get_obs_download_server_url = mock.Mock( return_value='http://obs_server') uri.runtime_config = self.runtime_config with raises(KiwiUriOpenError) as exception_info: uri.translate(check_build_environment=False) assert f'{exception_info.value}' == \ 'http://obs_server/openSUSE:/Leap:/42.2/standard: error'
def test_destructor(self, mock_wipe, mock_mkdtemp, mock_manager): mock_mkdtemp.return_value = 'tmpdir' manager = mock.Mock() manager.mountpoint = mock_mkdtemp.return_value manager.is_mounted = mock.Mock( return_value=True ) mock_manager.return_value = manager uri = Uri('iso:///image/CDs/openSUSE-13.2-DVD-x86_64.iso', 'yast2') uri.translate() uri.__del__() manager.umount.assert_called_once_with() mock_wipe.assert_called_once_with(manager.mountpoint)
def test_translate_obs_uri_inside_buildservice(self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obs://openSUSE:Leap:42.2/standard', 'rpm-md') uri.runtime_config = self.runtime_config with self._caplog.at_level(logging.WARNING): assert uri.translate(False) == \ 'obs_server/openSUSE:/Leap:/42.2/standard'
def setup_repositories(self, clear_cache=False, signing_keys=None): """ Set up repositories for software installation and return a package manager for performing software installation tasks :return: Instance of PackageManager :rtype: PackageManager """ repository_options = [] repository_sections = \ self.xml_state.get_repository_sections_used_for_build() package_manager = self.xml_state.get_package_manager() if self.xml_state.get_rpm_check_signatures(): repository_options.append('check_signatures') if self.xml_state.get_rpm_excludedocs(): repository_options.append('exclude_docs') repo = Repository(self.root_bind, package_manager, repository_options) if signing_keys: repo.import_trusted_keys(signing_keys) for xml_repo in repository_sections: repo_type = xml_repo.get_type() repo_source = xml_repo.get_source().get_path() repo_user = xml_repo.get_username() repo_secret = xml_repo.get_password() repo_alias = xml_repo.get_alias() repo_priority = xml_repo.get_priority() repo_dist = xml_repo.get_distribution() repo_components = xml_repo.get_components() repo_repository_gpgcheck = xml_repo.get_repository_gpgcheck() repo_package_gpgcheck = xml_repo.get_package_gpgcheck() log.info('Setting up repository %s', repo_source) log.info('--> Type: %s', repo_type) if repo_priority: log.info('--> Priority: %s', repo_priority) uri = Uri(repo_source, repo_type) repo_source_translated = uri.translate() log.info('--> Translated: %s', repo_source_translated) if not repo_alias: repo_alias = uri.alias() log.info('--> Alias: %s', repo_alias) if not uri.is_remote() and not os.path.exists( repo_source_translated): log.warning('repository %s does not exist and will be skipped', repo_source) continue if not uri.is_remote(): self.root_bind.mount_shared_directory(repo_source_translated) repo.add_repo(repo_alias, repo_source_translated, repo_type, repo_priority, repo_dist, repo_components, repo_user, repo_secret, uri.credentials_file_name(), repo_repository_gpgcheck, repo_package_gpgcheck) if clear_cache: repo.delete_repo_cache(repo_alias) self.uri_list.append(uri) repo.cleanup_unused_repos() return PackageManager(repo, package_manager)
def import_repositories_marked_as_imageinclude(self): """ Those <repository> sections which are marked with the imageinclude attribute should be permanently added to the image repository configuration """ repository_sections = \ self.xml_state.get_repository_sections_used_in_image() root = RootInit(root_dir=self.root_dir, allow_existing=True) repo = Repository(RootBind(root), self.xml_state.get_package_manager()) repo.use_default_location() for xml_repo in repository_sections: repo_type = xml_repo.get_type() repo_source = xml_repo.get_source().get_path() repo_user = xml_repo.get_username() repo_secret = xml_repo.get_password() repo_alias = xml_repo.get_alias() repo_priority = xml_repo.get_priority() repo_dist = xml_repo.get_distribution() repo_components = xml_repo.get_components() repo_repository_gpgcheck = xml_repo.get_repository_gpgcheck() repo_package_gpgcheck = xml_repo.get_package_gpgcheck() uri = Uri(repo_source, repo_type) repo_source_translated = uri.translate( check_build_environment=False) if not repo_alias: repo_alias = uri.alias() log.info('Setting up image repository %s', repo_source) log.info('--> Type: %s', repo_type) log.info('--> Translated: %s', repo_source_translated) log.info('--> Alias: %s', repo_alias) repo.add_repo(repo_alias, repo_source_translated, repo_type, repo_priority, repo_dist, repo_components, repo_user, repo_secret, uri.credentials_file_name(), repo_repository_gpgcheck, repo_package_gpgcheck)
def test_translate_obs_uri_inside_buildservice(self, mock_buildservice, mock_warn): mock_buildservice.return_value = True uri = Uri('obs://openSUSE:Leap:42.2/standard', 'rpm-md') uri.runtime_config = self.runtime_config assert uri.translate(False) == \ 'obs_server/openSUSE:/Leap:/42.2/standard' assert mock_warn.called
def test_translate_buildservice_obsrepositories_container_path( self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obsrepositories:/container#latest', 'container') assert uri.translate() == ''.join([ '/usr/src/packages/SOURCES/containers/', '_obsrepositories/container#latest' ])
def test_translate_obs_uri_inside_buildservice( self, mock_buildservice, mock_warn ): mock_buildservice.return_value = True uri = Uri('obs://openSUSE:Leap:42.2/standard', 'rpm-md') uri.runtime_config = self.runtime_config assert uri.translate(False) == \ 'obs_server/openSUSE:/Leap:/42.2/standard' assert mock_warn.called
def test_translate_metalink_uri(self, mock_Request, mock_urlopen): with open('../data/metalink') as metalink: mock_urlopen.return_value = metalink uri = Uri('https://metalink.com/foo', source_type='metalink') assert uri.translate() == \ 'https://ftp.plusline.net/fedora/linux/releases/34/Everything/' \ 'x86_64/os/' mock_urlopen.side_effect = Exception with raises(KiwiUriOpenError): uri = Uri('https://metalink.com/foo', source_type='metalink')
def test_translate_buildservice_obsrepositories_container_path( self, mock_buildservice ): mock_buildservice.return_value = True uri = Uri('obsrepositories:/container#latest', 'container') assert uri.translate() == ''.join( [ '/usr/src/packages/SOURCES/containers/', '_obsrepositories/container#latest' ] )
def test_translate_iso_path(self, mock_mkdtemp, mock_manager): mock_mkdtemp.return_value = 'tmpdir' manager = mock.Mock() manager.mountpoint = mock_mkdtemp.return_value mock_manager.return_value = manager uri = Uri('iso:///image/CDs/openSUSE-13.2-DVD-x86_64.iso', 'yast2') result = uri.translate() mock_manager.assert_called_once_with( device='/image/CDs/openSUSE-13.2-DVD-x86_64.iso', mountpoint='tmpdir') manager.mount.assert_called_once_with() assert result == 'tmpdir' uri.mount_stack = []
def test_translate_iso_path(self, mock_mkdtemp, mock_manager): mock_mkdtemp.return_value = 'tmpdir' manager = mock.Mock() manager.mountpoint = mock_mkdtemp.return_value mock_manager.return_value = manager uri = Uri('iso:///image/CDs/openSUSE-13.2-DVD-x86_64.iso', 'yast2') result = uri.translate() mock_manager.assert_called_once_with( device='/image/CDs/openSUSE-13.2-DVD-x86_64.iso', mountpoint='tmpdir' ) manager.mount.assert_called_once_with() assert result == 'tmpdir' uri.mount_stack = []
def import_repositories_marked_as_imageinclude(self): """ Those <repository> sections which are marked with the imageinclude attribute should be permanently added to the image repository configuration """ repository_sections = \ self.xml_state.get_repository_sections_used_in_image() root = RootInit( root_dir=self.root_dir, allow_existing=True ) repo = Repository( RootBind(root), self.xml_state.get_package_manager() ) repo.use_default_location() for xml_repo in repository_sections: repo_type = xml_repo.get_type() repo_source = xml_repo.get_source().get_path() repo_user = xml_repo.get_username() repo_secret = xml_repo.get_password() repo_alias = xml_repo.get_alias() repo_priority = xml_repo.get_priority() repo_dist = xml_repo.get_distribution() repo_components = xml_repo.get_components() repo_repository_gpgcheck = xml_repo.get_repository_gpgcheck() repo_package_gpgcheck = xml_repo.get_package_gpgcheck() uri = Uri(repo_source, repo_type) repo_source_translated = uri.translate( check_build_environment=False ) if not repo_alias: repo_alias = uri.alias() log.info('Setting up image repository %s', repo_source) log.info('--> Type: %s', repo_type) log.info('--> Translated: %s', repo_source_translated) log.info('--> Alias: %s', repo_alias) repo.add_repo( repo_alias, repo_source_translated, repo_type, repo_priority, repo_dist, repo_components, repo_user, repo_secret, uri.credentials_file_name(), repo_repository_gpgcheck, repo_package_gpgcheck )
def test_translate_unknown_style(self): uri = Uri('xxx', 'rpm-md') with raises(KiwiUriStyleUnknown): uri.translate()
def test_translate_buildservice_container_path(self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obs://project/repo/container#latest', 'container') assert uri.translate() == \ '/usr/src/packages/SOURCES/containers/project/repo/container#latest'
def test_translate_buildservice_obsrepositories(self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obsrepositories:/') assert uri.translate() == '/usr/src/packages/SOURCES/repos'
def test_translate_ftp_path(self): uri = Uri('ftp://example.com/foo', 'rpm-md') assert uri.translate() == 'ftp://example.com/foo'
def test_translate_buildservice_path(self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obs://openSUSE:13.2/standard', 'yast2') assert uri.translate() == \ '/usr/src/packages/SOURCES/repos/openSUSE:13.2/standard'
def test_translate_http_path_with_token(self): uri = Uri('http://foo.bar/baz?asdf', 'rpm-md') assert uri.translate() == 'http://foo.bar/baz?asdf'
def test_translate_dir_path(self): uri = Uri('dir:///some/path', 'rpm-md') assert uri.translate() == '/some/path'
def test_translate_unknown_style(self): uri = Uri('xxx', 'rpm-md') uri.translate()
def test_translate_http_path_with_credentials(self): uri = Uri( 'http://example.com/foo?credentials=kiwiRepoCredentials', 'rpm-md' ) assert uri.translate() == 'http://example.com/foo'
def test_translate_suse_buildservice_path(self): uri = Uri('suse://openSUSE:13.2/standard', 'yast2') assert uri.translate() == \ '/usr/src/packages/SOURCES/repos/openSUSE:13.2/standard'
def test_translate_unsupported_style(self): uri = Uri('ms://foo', 'rpm-md') uri.translate()
def test_translate_ibs_project(self): uri = Uri('ibs://Devel:PubCloud/SLE_12_GA', 'rpm-md') assert uri.translate() == \ 'http://download.suse.de/ibs/Devel:/PubCloud/SLE_12_GA'
def test_translate_http_path(self): uri = Uri('http://example.com/foo', 'rpm-md') assert uri.translate() == 'http://example.com/foo'
def test_translate_obs_uri_not_found(mock_request_get, self): mock_request_get.side_effect = Exception uri = Uri('obs://openSUSE:Leap:42.2/standard', 'yast2') uri.runtime_config = self.runtime_config with raises(KiwiUriOpenError): uri.translate()
def test_translate_obs_project(self): uri = Uri('obs://Virt:Appliances/SLE_12', 'rpm-md') assert uri.translate() == \ 'http://download.opensuse.org/repositories/Virt:Appliances/SLE_12'
def test_translate_http_path_with_credentials(self): uri = Uri('http://example.com/foo?credentials=kiwiRepoCredentials', 'rpm-md') assert uri.translate() == 'http://example.com/foo'
def setup_repositories(self, clear_cache=False, signing_keys=None): """ Set up repositories for software installation and return a package manager for performing software installation tasks :param bool clear_cache: flag the clear cache before configure anything :param list signing_keys: keys imported to the package manager :return: instance of :class:`PackageManager` :rtype: PackageManager """ repository_options = [] repository_sections = \ self.xml_state.get_repository_sections_used_for_build() package_manager = self.xml_state.get_package_manager() rpm_locale_list = self.xml_state.get_rpm_locale() if self.xml_state.get_rpm_check_signatures(): repository_options.append('check_signatures') if self.xml_state.get_rpm_excludedocs(): repository_options.append('exclude_docs') if rpm_locale_list: repository_options.append( '_install_langs%{0}'.format(':'.join(rpm_locale_list)) ) repo = Repository.new( self.root_bind, package_manager, repository_options ) repo.setup_package_database_configuration() if signing_keys: repo.import_trusted_keys(signing_keys) for xml_repo in repository_sections: repo_type = xml_repo.get_type() repo_source = xml_repo.get_source().get_path() repo_user = xml_repo.get_username() repo_secret = xml_repo.get_password() repo_alias = xml_repo.get_alias() repo_priority = xml_repo.get_priority() repo_dist = xml_repo.get_distribution() repo_components = xml_repo.get_components() repo_repository_gpgcheck = xml_repo.get_repository_gpgcheck() repo_package_gpgcheck = xml_repo.get_package_gpgcheck() repo_sourcetype = xml_repo.get_sourcetype() repo_use_for_bootstrap = \ True if xml_repo.get_use_for_bootstrap() else False log.info('Setting up repository %s', repo_source) log.info('--> Type: {0}'.format(repo_type)) if repo_sourcetype: log.info('--> SourceType: {0}'.format(repo_sourcetype)) if repo_priority: log.info('--> Priority: {0}'.format(repo_priority)) uri = Uri(repo_source, repo_type) repo_source_translated = uri.translate() log.info('--> Translated: {0}'.format(repo_source_translated)) if not repo_alias: repo_alias = uri.alias() log.info('--> Alias: {0}'.format(repo_alias)) if not uri.is_remote() and not os.path.exists( repo_source_translated ): log.warning( 'repository %s does not exist and will be skipped', repo_source ) continue if not uri.is_remote(): self.root_bind.mount_shared_directory(repo_source_translated) repo.add_repo( repo_alias, repo_source_translated, repo_type, repo_priority, repo_dist, repo_components, repo_user, repo_secret, uri.credentials_file_name(), repo_repository_gpgcheck, repo_package_gpgcheck, repo_sourcetype, repo_use_for_bootstrap ) if clear_cache: repo.delete_repo_cache(repo_alias) self.uri_list.append(uri) repo.cleanup_unused_repos() return PackageManager.new( repo, package_manager )
def test_translate_https_path(self): uri = Uri('https://example.com/foo', 'rpm-md') assert uri.translate() == 'https://example.com/foo'
def test_translate_dir_relative_path(self, mock_abspath): mock_abspath.side_effect = lambda path: os.sep.join( ['/current/dir', path]) uri = Uri('dir:some/path', 'rpm-md') assert uri.translate() == '/current/dir/some/path'
def setup_repositories(self, clear_cache=False, signing_keys=None): """ Set up repositories for software installation and return a package manager for performing software installation tasks :param bool clear_cache: flag the clear cache before configure anything :param list signing_keys: keys imported to the package manager :return: instance of :class:`PackageManager` :rtype: PackageManager """ repository_options = [] repository_sections = \ self.xml_state.get_repository_sections_used_for_build() package_manager = self.xml_state.get_package_manager() if self.xml_state.get_rpm_check_signatures(): repository_options.append('check_signatures') if self.xml_state.get_rpm_excludedocs(): repository_options.append('exclude_docs') repo = Repository( self.root_bind, package_manager, repository_options ) if signing_keys: repo.import_trusted_keys(signing_keys) for xml_repo in repository_sections: repo_type = xml_repo.get_type() repo_source = xml_repo.get_source().get_path() repo_user = xml_repo.get_username() repo_secret = xml_repo.get_password() repo_alias = xml_repo.get_alias() repo_priority = xml_repo.get_priority() repo_dist = xml_repo.get_distribution() repo_components = xml_repo.get_components() repo_repository_gpgcheck = xml_repo.get_repository_gpgcheck() repo_package_gpgcheck = xml_repo.get_package_gpgcheck() log.info('Setting up repository %s', repo_source) log.info('--> Type: %s', repo_type) if repo_priority: log.info('--> Priority: %s', repo_priority) uri = Uri(repo_source, repo_type) repo_source_translated = uri.translate() log.info('--> Translated: %s', repo_source_translated) if not repo_alias: repo_alias = uri.alias() log.info('--> Alias: %s', repo_alias) if not uri.is_remote() and not os.path.exists( repo_source_translated ): log.warning( 'repository %s does not exist and will be skipped', repo_source ) continue if not uri.is_remote(): self.root_bind.mount_shared_directory(repo_source_translated) repo.add_repo( repo_alias, repo_source_translated, repo_type, repo_priority, repo_dist, repo_components, repo_user, repo_secret, uri.credentials_file_name(), repo_repository_gpgcheck, repo_package_gpgcheck ) if clear_cache: repo.delete_repo_cache(repo_alias) self.uri_list.append(uri) repo.cleanup_unused_repos() return PackageManager( repo, package_manager )
def test_translate_buildservice_project(self, mock_buildservice): mock_buildservice.return_value = True uri = Uri('obs://Virtualization:/Appliances/CentOS_7', 'rpm-md') assert uri.translate() == \ '/usr/src/packages/SOURCES/repos/Virtualization:Appliances/CentOS_7'
def test_translate_obs_uri_not_found(mock_request_get, self): mock_request_get.side_effect = Exception uri = Uri('obs://openSUSE:Leap:42.2/standard', 'yast2') uri.runtime_config = self.runtime_config assert uri.translate()
def test_translate_obsrepositories_outside_buildservice( self, mock_buildservice ): mock_buildservice.return_value = False uri = Uri('obsrepositories:/') uri.translate()
def test_translate_unsupported_style(self): uri = Uri('ms://foo', 'rpm-md') with raises(KiwiUriStyleUnknown): uri.translate()
def add_obs_repositories( self, xml_state: XMLState, profile: Optional[str] = None, arch: str = 'x86_64', repo: str = 'images') -> Dict[str, obs_repo_status_type]: """ Add repositories from the obs project to the provided XMLState :param XMLState xml_state: XMLState object reference :param str arch: OBS architecture, defaults to: 'x86_64' :param str repo: OBS image package build repository name, defaults to: 'images' """ repository_status_report: Dict[str, obs_repo_status_type] = {} if not OBS._delete_obsrepositories_placeholder_repo(xml_state): # The repo list does not contain the obsrepositories flag # Therefore it's not needed to look for repos in the OBS # project configuration return repository_status_report package_name = self.package if not profile \ else f'{self.package}:{profile}' log.info(f'Using OBS repositories from {self.project}/{package_name}') buildinfo_link = os.sep.join([ self.api_server, 'build', self.project, repo, arch, package_name, '_buildinfo' ]) request = self._create_request(buildinfo_link) buildinfo_xml_tree = OBS._import_xml_request(request) repo_paths = buildinfo_xml_tree.getroot().xpath('/buildinfo/path') if not repo_paths: raise KiwiOBSPluginBuildInfoError( f'OBS buildinfo for {package_name} has no repo paths') repo_prio_ascending = 0 repo_prio_descending = 501 repo_alias = None for repo_path in repo_paths: repo_url = repo_path.get('url') if not repo_url: repo_url = 'obs://{0}/{1}'.format(repo_path.get('project'), repo_path.get('repository')) if repo_url: try: repo_uri = Uri(repo_url) repo_url = repo_uri.translate( check_build_environment=False) request = requests.get(repo_url) request.raise_for_status() except Exception as issue: repository_status_report[repo_url] = obs_repo_status_type( flag='unreachable', message=f'ignored:{issue}') continue repo_check = SolverRepositoryBase(repo_uri) repo_type = repo_check.get_repo_type() if not repo_type: repository_status_report[repo_url] = obs_repo_status_type( flag='repo_type_unknown', message='ignored:Unknown repository type') continue if repo_type == 'rpm-md': repo_prio_ascending += 1 repo_prio = repo_prio_ascending else: repo_prio_descending -= 1 repo_prio = repo_prio_descending repository_status_report[repo_url] = obs_repo_status_type( flag='ok', message='imported') xml_state.add_repository(repo_url, repo_type, repo_alias, f'{repo_prio}') return repository_status_report
def test_translate_obs_distro(self): uri = Uri('obs://13.2/repo/oss', 'yast2') assert uri.translate() == \ 'http://download.opensuse.org/distribution/13.2/repo/oss'