def __skip_import_test(self, options, session, arguments, **kwargs):
        expected = kwargs.get('expected', None)
        rpm_header = kwargs.get('rpm_header', {})

        with mock.patch('koji.get_header_fields') as get_header_fields_mock:
            with mock.patch('koji_cli.commands.activate_session'
                            ) as activate_session_mock:
                with mock.patch('sys.stdout',
                                new_callable=six.StringIO) as stdout:
                    get_header_fields_mock.return_value = rpm_header
                    handle_import(options, session, arguments)

        # check output message
        self.assert_console_message(stdout, expected)

        # check mock calls
        activate_session_mock.assert_called_with(session, options)
        get_header_fields_mock.assert_called_with(
            arguments[0], ('name', 'version', 'release', 'epoch', 'arch',
                           'sigmd5', 'sourcepackage', 'sourcerpm'))

        session.getRPM.assert_called_with(
            dict((k, rpm_header.get(k, ''))
                 for k in ['release', 'version', 'arch', 'name']))

        session.uploadWrapper.assert_not_called()
        session.importRPM.assert_not_called()
    def test_handle_import_with_test_option(self, activate_session_mock,
                                            unique_path_mock,
                                            get_header_fields_mock, stdout):
        """Test handle_import RPM with --test option"""
        options = mock.MagicMock()
        session = mock.MagicMock()

        nvr = lambda: '%(name)s-%(version)s-%(release)s' % get_header_fields_mock.return_value

        # Case 1. SRPM case
        # result: skip because of --test
        get_header_fields_mock.return_value = self.srpm_header

        session.getBuild.return_value = {}
        session.getRPM.return_value = {}

        arguments = ['/path/to/bash-4.4.12-5.fc26.src.rpm', '--test']
        expected = "Test mode -- skipping import for %s\n" % arguments[0]

        handle_import(options, session, arguments)
        self.assert_console_message(stdout, expected)
        unique_path_mock.assert_not_called()
        session.importRPM.assert_not_called()

        # Case 2. Binary RPM case (need --create-build option)
        # result: skip because of --test
        session.getBuild.side_effect = [
            # binary rpm case,
            # getBuild is called to check build.
            {
                'state': self.bstate['FAILED']
            },

            # simulate build fail case
            {
                'name': 'bash',
                'version': '4.4.12',
                'release': '5.fc26',
                'state': self.bstate['FAILED']
            },
        ]

        get_header_fields_mock.return_value = self.rpm_header

        arguments = [
            '/path/to/bash-4.4.12-5.fc26.rpm', '--test', '--create-build'
        ]
        expected = "Test mode -- would have created empty build: %s\n" % nvr()
        expected += "Test mode -- skipping import for %s\n" % arguments[0]

        with mock.patch('koji_cli.commands.unique_path') as unique_path_mock:
            handle_import(options, session, arguments)
        self.assert_console_message(stdout, expected)
        unique_path_mock.assert_not_called()
        session.createEmptyBuild.assert_not_called()
        session.importRPM.assert_not_called()
示例#3
0
    def test_handle_import_has_build_states_test(
            self,
            activate_session_mock,
            get_header_fields_mock,
            stderr,
            stdout):
        """Test handle_import RPM with existing build but status not COMPLETE case"""
        arguments = ['/path/to/bash-4.4.12-5.fc26.src.rpm']
        options = mock.MagicMock()
        session = mock.MagicMock()

        get_header_fields_mock.return_value = self.srpm_header

        test_cases = [
            {
                'state': 'FAILED',
                'msg': "Build %s state is %s. Skipping import"
            },
            {
                'state': 'CANCELED',
                'msg': "Build %s state is %s. Skipping import"
            },
            {
                'state': 'DELETED',
                'msg': 'Build %s exists with state=%s. Skipping import'
            },
            {
                'state': 'BUILDING',
                'msg': 'Build %s exists with state=%s. Skipping import'
            }
        ]

        nvr = '%(name)s-%(version)s-%(release)s' % \
            get_header_fields_mock.return_value
        # build failed cases
        for case in test_cases:
            session.getBuild.return_value = {
                'state': self.bstate[case['state']]}

            handle_import(options, session, arguments)
            expected = case['msg'] % (nvr, case['state']) + "\n"
            self.assert_console_message(stdout, expected)
            get_header_fields_mock.assert_called_with(
                arguments[0],
                ('name', 'version', 'release', 'epoch',
                 'arch', 'sigmd5', 'sourcepackage', 'sourcerpm')
            )
            activate_session_mock.assert_called_with(session, options)
            session.getRPM.assert_not_called()
            session.importRPM.assert_not_called()
    def __do_import_test(self, options, session, arguments, **kwargs):
        expected = kwargs.get('expected', None)
        rpm_header = kwargs.get('rpm_header', {})
        fake_srv_path = kwargs.get('srv_path', '/path/to/server/import')
        upload_rpm_mock = kwargs.get('upload_rpm_mock', session.uploadWrapper)

        with mock.patch('koji.get_header_fields') as get_header_fields_mock:
            with mock.patch(
                    'koji_cli.commands.unique_path') as unique_path_mock:
                with mock.patch('koji_cli.commands.activate_session'
                                ) as activate_session_mock:
                    with mock.patch('sys.stdout',
                                    new_callable=six.StringIO) as stdout:
                        with upload_rpm_mock:
                            get_header_fields_mock.return_value = rpm_header
                            unique_path_mock.return_value = fake_srv_path
                            handle_import(options, session, arguments)

        # check output message
        self.assert_console_message(stdout, expected)

        # check mock calls
        activate_session_mock.assert_called_with(session, options)
        get_header_fields_mock.assert_called_with(
            arguments[0], ('name', 'version', 'release', 'epoch', 'arch',
                           'sigmd5', 'sourcepackage', 'sourcerpm'))

        session.getRPM.assert_called_with(
            dict((k, rpm_header.get(k, ''))
                 for k in ['release', 'version', 'arch', 'name']))

        unique_path_mock.assert_called_with('cli-import')
        upload_rpm_mock.assert_called_with(arguments[0], self.fake_srv_dir)
        session.importRPM.assert_called_with(self.fake_srv_dir,
                                             os.path.basename(arguments[0]))

        # reset for next test
        activate_session_mock.reset_mock()
        get_header_fields_mock.reset_mock()
        unique_path_mock.reset_mock()
        upload_rpm_mock.reset_mock()
        session.getRPM.reset_mock()
        session.importRPM.reset_mock()
示例#5
0
    def test_handle_import_binary_rpm_import_with_no_build_exist(
            self,
            activate_session_mock,
            get_header_fields_mock,
            stderr,
            stdout):
        """Test handle_import binary RPM import with no exist build case."""
        arguments = ['/path/to/bash-4.4.12-5.fc26.rpm']
        options = mock.MagicMock()
        session = mock.MagicMock()

        get_header_fields_mock.return_value = self.rpm_header

        nvr = '%(name)s-%(version)s-%(release)s' % get_header_fields_mock.return_value

        # Case 1. without exist build on server
        # result: abort
        session.getBuild.return_value = None
        handle_import(options, session, arguments)
        expected = "Missing build or srpm: %s\n" % nvr
        expected += "Aborting import\n"
        self.assert_console_message(stdout, expected)

        # Case 2. without exist build on server,
        #         with --create-build option
        # result: import will be performed
        session.getBuild.return_value = None
        session.getRPM.return_value = None

        expected = "Missing build or srpm: %s\n" % nvr
        expected += "Creating empty build: %s\n" % nvr
        expected += "uploading %s... done\n" % arguments[0]
        expected += "importing %s... done\n" % arguments[0]

        self.__do_import_test(
            options, session, arguments + ['--create-build'],
            rpm_header=self.rpm_header,
            expected=expected)

        kwarg = dict((k, self.rpm_header.get(k, None))
                     for k in ['name', 'version', 'release', 'epoch'])
        session.createEmptyBuild.assert_called_with(**kwarg)
    def test_handle_import_src_rpm_import_with_exist_build(self):
        """Test handle_import source RPM import with exist build case."""
        arguments = ['/path/to/bash-4.4.12-5.fc26.src.rpm']
        options = mock.MagicMock()
        session = mock.MagicMock()
        false_md5 = 'ffeeddccbbaa99887766554433221100'

        #
        # getBuild return example (bash-4.4.12-5.fc26.src.rpm)
        # {
        #   'package_name': 'bash',
        #   'extra': None,
        #   'creation_time': '2017-11-08 18:56:31.359440',
        #   'completion_time': '2017-11-08 18:56:31.359440',
        #   'package_id': 1,
        #   'id': 1,
        #   'build_id': 1,
        #   'state': 1,
        #   'source': None,
        #   'epoch': None,
        #   'version': '4.4.12',
        #   'completion_ts': 1510167391.35944,
        #   'owner_id': 1,
        #   'owner_name': 'kojiadmin',
        #   'nvr': 'bash-4.4.12-5.fc26',
        #   'start_time': '2017-11-08 18:56:31.359440',
        #   'creation_event_id': 81,
        #   'start_ts': 1510167391.35944,
        #   'volume_id': 0,
        #   'creation_ts': 1510167391.35944,
        #   'name': 'bash',
        #   'task_id': None,
        #   'volume_name': 'DEFAULT',
        #   'release': '5.fc26'
        # }
        #

        #
        # getRPM return example:
        # {
        #   'build_id': 1,
        #   'name': 'bash',
        #   'extra': None,
        #   'external_repo_id': 0,
        #   'buildtime': 1496119944,
        #   'id': 1,
        #   'epoch': None,
        #   'version': '4.4.12',
        #   'buildroot_id': None,
        #   'metadata_only': False,
        #   'release': '5.fc26',
        #   'arch': 'src',
        #   'payloadhash': '8a1705e86bef1516565b029c73ab7fdd',
        #   'external_repo_name': 'INTERNAL',
        #   'size': 9462614
        # }
        #

        # Case 1: build exists and status is 'COMPLETE', md5 matched
        # reseult: import skipped
        session.getBuild.return_value = {'state': self.bstate['COMPLETE']}
        session.getRPM.return_value = {
            'external_repo_id': 0,
            'external_repo_name': 'INTERNAL',
            'payloadhash': self.md5
        }
        expected = "RPM already imported: %s\n" % arguments[0]
        expected += "Skipping import\n"
        self.__skip_import_test(options,
                                session,
                                arguments,
                                rpm_header=self.srpm_header,
                                expected=expected)

        # Case 2: build exists and status is 'COMPLETE', md5 mismatched
        # reseult: import skipped
        session.getRPM.return_value['payloadhash'] = false_md5
        expected = "WARNING: md5sum mismatch for %s\n" % arguments[0]
        expected += "  A different rpm with the same name has already been imported\n"
        expected += "  Existing sigmd5 is %r, your import has %r\n" % (
            false_md5, self.md5)
        expected += "Skipping import\n"
        self.__skip_import_test(options,
                                session,
                                arguments,
                                rpm_header=self.srpm_header,
                                expected=expected)

        # Case 3: build exists and status is 'COMPLETE', has external_repo_id
        # reseult: import will be performed
        session.getRPM.return_value['external_repo_id'] = 1
        expected = "uploading %s... done\n" % arguments[0]
        expected += "importing %s... done\n" % arguments[0]
        self.__do_import_test(options,
                              session,
                              arguments,
                              rpm_header=self.srpm_header,
                              expected=expected)

        nvr = '%(name)s-%(version)s-%(release)s' % self.srpm_header

        # Case 4: build exists and the status is FAILED or CANCELED
        #         without --create-build option.
        # result: import skipped
        session.getBuild.return_value = {
            'name': 'bash',
            'version': '4.4.12',
            'release': '5.fc26',
            'state': self.bstate['FAILED']
        }
        session.getRPM.return_value = {
            'external_repo_name': 'INTERNAL',
            'payloadhash': self.md5
        }
        expected = "Build %s state is %s. Skipping import\n" % (nvr, 'FAILED')
        with mock.patch('koji.get_header_fields') as get_header_fields_mock:
            with mock.patch('koji_cli.commands.activate_session'
                            ) as activate_session_mock:
                with mock.patch('sys.stdout',
                                new_callable=six.StringIO) as stdout:
                    get_header_fields_mock.return_value = self.srpm_header
                    handle_import(options, session, arguments)
        activate_session_mock.assert_called_with(session, options)
        self.assert_console_message(stdout, expected)

        # Case 5: build exists and the status is FAILED or CANCELED
        #         with --create-build option.
        # result: empty build will be created,
        #         import will be performed.
        expected = "Creating empty build: %s\n" % nvr
        expected += "uploading %s... done\n" % arguments[0]
        expected += "importing %s... done\n" % arguments[0]

        session.getBuild.side_effect = [
            # simulate build fail case
            {
                'name': 'bash',
                'version': '4.4.12',
                'release': '5.fc26',
                'state': self.bstate['FAILED']
            },

            # after calling createEmptyBuild, getBuild should return:
            {
                'name': 'bash',
                'version': '4.4.12',
                'release': '5.fc26',
                'state': self.bstate['COMPLETE']
            },
        ]

        # no RPM info is returned
        session.getRPM.return_value = {}
        self.__do_import_test(options,
                              session,
                              arguments + ['--create-build'],
                              rpm_header=self.srpm_header,
                              expected=expected)

        kwarg = dict((k, self.rpm_header.get(k, None))
                     for k in ['name', 'version', 'release', 'epoch'])
        session.createEmptyBuild.assert_called_with(**kwarg)