Example #1
0
 def test_urlcheck(self):
     good = [
         "git://server/foo.git#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "git+ssh://server2/other/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "svn://server/path/to/code#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "svn+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "cvs://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "cvs+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         ]
     bad = [
         "http://localhost/foo.html",
         "foo-1.1-1.src.rpm",
         "https://server/foo-1.1-1.src.rpm",
         "git:foobar",
         "https:foo/bar",
         "https://",
         ]
     for url in good:
         self.assertTrue(SCM.is_scm_url(url))
     for url in bad:
         self.assertFalse(SCM.is_scm_url(url))
Example #2
0
 def test_urlcheck(self):
     good = [
         "git://server/foo.git#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "git+ssh://server2/other/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "svn://server/path/to/code#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "svn+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "cvs://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
         "cvs+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67",
     ]
     bad = [
         "http://localhost/foo.html",
         "foo-1.1-1.src.rpm",
         "https://server/foo-1.1-1.src.rpm",
         "git:foobar",
         "https:foo/bar",
         "https://",
     ]
     for url in good:
         self.assertTrue(SCM.is_scm_url(url))
     for url in bad:
         self.assertFalse(SCM.is_scm_url(url))
Example #3
0
    def handler(self, src, target, opts=None):
        jsonschema.validate([src, target, opts], self.PARAMS_SCHEMA)
        self.opts = opts
        component = None

        if not opts.get('git_branch'):
            raise koji.BuildError("Git branch must be specified")

        if opts.get('scratch') and opts.get('isolated'):
            raise koji.BuildError("Build cannot be both isolated and scratch")

        self.event_id = self.session.getLastEvent()['id']
        target_info = self.session.getBuildTarget(target, event=self.event_id)
        if not target_info:
            raise koji.BuildError("Target `%s` not found" % target)

        build_tag = target_info['build_tag']
        archlist = self.getArchList(build_tag)

        flatpak = opts.get('flatpak', False)
        if flatpak:
            if not osbs_flatpak_support:
                raise koji.BuildError("osbs-client on koji builder doesn't have Flatpak support")
            release_overwrite = None
        else:
            label_overwrites = {}
            release_overwrite = opts.get('release')
            if release_overwrite:
                label_overwrites = {LABEL_NAME_MAP['RELEASE'][0]: release_overwrite}
            component, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites,
                                                       build_tag=build_tag)

        # scratch builds do not get imported, and consequently not tagged
        if not self.opts.get('scratch') and not flatpak:
            self.check_whitelist(component, target_info)

        if flatpak:
            expected_nvr = None

        if not SCM.is_scm_url(src):
            raise koji.BuildError('Invalid source specification: %s' % src)

        # don't check build nvr for autorebuild (has triggered_after_koji_task)
        # as they might be using add_timestamp_to_release
        # and don't check it for skipped build, which might be enabling/disabling
        # autorebuilds which use add_timestamp_to_release
        triggered_after_koji_task = opts.get('triggered_after_koji_task', None)
        skip_build = opts.get('skip_build', False)
        if triggered_after_koji_task or skip_build:
            expected_nvr = None

        # Scratch and auto release builds shouldn't be checked for nvr
        if not self.opts.get('scratch') and expected_nvr:
            try:
                build = self.session.getBuild(expected_nvr)
                build_id = build['id']
            except Exception:
                self.logger.info("No build for %s found", expected_nvr, exc_info=True)
            else:
                if build['state'] in (koji.BUILD_STATES['FAILED'], koji.BUILD_STATES['CANCELED']):
                    self.logger.info("Build for %s found, but with reusable state %s",
                                     expected_nvr, build['state'], exc_info=True)
                else:
                    raise koji.BuildError("Build for %s already exists, id %s" %
                                          (expected_nvr, build_id))

        self.logger.debug("Spawning jobs for arches: %r", archlist)

        kwargs = dict(
            src=src,
            target_info=target_info,
            scratch=opts.get('scratch', False),
            isolated=opts.get('isolated', False),
            dependency_replacements=opts.get('dependency_replacements', None),
            yum_repourls=opts.get('yum_repourls', None),
            branch=opts.get('git_branch', None),
            push_url=opts.get('push_url', None),
            arches=archlist,
            koji_parent_build=opts.get('koji_parent_build'),
            release=release_overwrite,
            flatpak=flatpak,
            signing_intent=opts.get('signing_intent', None),
            compose_ids=opts.get('compose_ids', None),
            skip_build=skip_build,
            triggered_after_koji_task=triggered_after_koji_task,
        )

        results = []
        semi_results = self.createContainer(**kwargs)
        if semi_results is not None:
            results = [semi_results]

        self.logger.debug("Results: %r", results)

        all_repositories = []
        all_koji_builds = []

        if not results:
            return {
                'repositories': all_repositories,
                'koji_builds': all_koji_builds,
                'build': 'skipped',
            }

        for result in results:
            try:
                repository = result.get('repositories')
                all_repositories.extend(repository)
            except Exception as error:
                self.logger.error("Failed to merge list of repositories "
                                  "%r. Reason (%s): %s", repository,
                                  type(error), error)
            koji_build_id = result.get('koji_build_id')
            if koji_build_id:
                all_koji_builds.append(koji_build_id)

        return {
            'repositories': all_repositories,
            'koji_builds': all_koji_builds,
        }
Example #4
0
    def handler(self, src, target, opts=None):
        if not opts:
            opts = {}
        self.opts = opts
        data = {}

        self.event_id = self.session.getLastEvent()['id']
        target_info = self.session.getBuildTarget(target, event=self.event_id)
        build_tag = target_info['build_tag']
        archlist = self.getArchList(build_tag)

        flatpak = opts.get('flatpak', False)
        if flatpak:
            if not osbs_flatpak_support:
                raise koji.BuildError(
                    "osbs-client on koji builder doesn't have Flatpak support")
            module = opts.get('module', None)
            if not module:
                raise koji.BuildError(
                    "Module must be specified for a Flatpak build")

            module_name, module_stream, module_version = split_module_spec(
                module)

            data = {
                'name': module_name,
                'version': module_stream,
            }

            if module_version is not None:
                data['release'] = module_version
            release_overwrite = None
        else:
            label_overwrites = {}
            release_overwrite = opts.get('release')
            if release_overwrite:
                label_overwrites = {
                    LABEL_DATA_MAP['RELEASE']: release_overwrite
                }
            data, expected_nvr = self.checkLabels(
                src, label_overwrites=label_overwrites, build_tag=build_tag)
        admin_opts = self._get_admin_opts(opts)
        data.update(admin_opts)

        # scratch builds do not get imported, and consequently not tagged
        if not self.opts.get('scratch'):
            self.check_whitelist(data[LABEL_DATA_MAP['COMPONENT']],
                                 target_info)

        try:
            # Flatpak builds append .<N> to the release generated from module version
            if flatpak:
                auto_release = True
            else:
                auto_release = (data[LABEL_DATA_MAP['RELEASE']] ==
                                LABEL_DEFAULT_VALUES['RELEASE'])
                if auto_release:
                    # Do not expose default release value
                    del data[LABEL_DATA_MAP['RELEASE']]

            self.extra_information = {
                "src": src,
                "data": data,
                "target": target
            }

            if not SCM.is_scm_url(src):
                raise koji.BuildError('Invalid source specification: %s' % src)

            # Scratch and auto release builds shouldn't be checked for nvr
            if not self.opts.get('scratch') and not auto_release:
                try:
                    build_id = self.session.getBuild(expected_nvr)['id']
                except:
                    self.logger.info("No build for %s found",
                                     expected_nvr,
                                     exc_info=True)
                else:
                    raise koji.BuildError(
                        "Build for %s already exists, id %s" %
                        (expected_nvr, build_id))

            results = self.runBuilds(
                src,
                target_info,
                archlist,
                scratch=opts.get('scratch', False),
                isolated=opts.get('isolated', False),
                yum_repourls=opts.get('yum_repourls', None),
                branch=opts.get('git_branch', None),
                push_url=opts.get('push_url', None),
                koji_parent_build=opts.get('koji_parent_build'),
                release=release_overwrite,
                flatpak=flatpak,
                module=opts.get('module', None),
                compose_ids=opts.get('compose_ids', None),
                signing_intent=opts.get('signing_intent', None),
            )
            all_repositories = []
            all_koji_builds = []
            for result in results:
                try:
                    repository = result.get('repositories')
                    all_repositories.extend(repository)
                except Exception, error:
                    self.logger.error(
                        "Failed to merge list of repositories "
                        "%r. Reason (%s): %s", repository, type(error), error)
                koji_build_id = result.get('koji_build_id')
                if koji_build_id:
                    all_koji_builds.append(koji_build_id)

        except (SystemExit, ServerExit, KeyboardInterrupt):
            # we do not trap these
            raise
        except:
            # reraise the exception
            raise

        return {
            'repositories': all_repositories,
            'koji_builds': all_koji_builds,
        }
    def handler(self, src, target, opts=None):
        if not opts:
            opts = {}
        self.opts = opts
        data = {}

        self.event_id = self.session.getLastEvent()['id']
        target_info = self.session.getBuildTarget(target, event=self.event_id)
        if not target_info:
            raise koji.BuildError("Target `%s` not found" % target)

        build_tag = target_info['build_tag']
        archlist = self.getArchList(build_tag)

        flatpak = opts.get('flatpak', False)
        if flatpak:
            if not osbs_flatpak_support:
                raise koji.BuildError("osbs-client on koji builder doesn't have Flatpak support")
            release_overwrite = None
        else:
            label_overwrites = {}
            release_overwrite = opts.get('release')
            if release_overwrite:
                label_overwrites = {LABEL_DATA_MAP['RELEASE']: release_overwrite}
            data, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites,
                                                  build_tag=build_tag)
        admin_opts = self._get_admin_opts(opts)
        data.update(admin_opts)

        # scratch builds do not get imported, and consequently not tagged
        if not self.opts.get('scratch') and not flatpak:
            self.check_whitelist(data[LABEL_DATA_MAP['COMPONENT']], target_info)

        try:
            # Flatpak builds append .<N> to the release generated from module version
            if flatpak:
                auto_release = True
            else:
                auto_release = (data[LABEL_DATA_MAP['RELEASE']] ==
                                LABEL_DEFAULT_VALUES['RELEASE'])
                if auto_release:
                    # Do not expose default release value
                    del data[LABEL_DATA_MAP['RELEASE']]

            self.extra_information = {"src": src, "data": data,
                                      "target": target}

            if not SCM.is_scm_url(src):
                raise koji.BuildError('Invalid source specification: %s' % src)

            # Scratch and auto release builds shouldn't be checked for nvr
            if not self.opts.get('scratch') and not auto_release:
                try:
                    build_id = self.session.getBuild(expected_nvr)['id']
                except:
                    self.logger.info("No build for %s found", expected_nvr, exc_info=True)
                else:
                    raise koji.BuildError(
                        "Build for %s already exists, id %s" % (expected_nvr, build_id))

            results = self.runBuilds(src, target_info, archlist,
                                     scratch=opts.get('scratch', False),
                                     isolated=opts.get('isolated', False),
                                     yum_repourls=opts.get('yum_repourls', None),
                                     branch=opts.get('git_branch', None),
                                     push_url=opts.get('push_url', None),
                                     koji_parent_build=opts.get('koji_parent_build'),
                                     release=release_overwrite,
                                     flatpak=flatpak,
                                     compose_ids=opts.get('compose_ids', None),
                                     signing_intent=opts.get('signing_intent', None),
                                     )
            all_repositories = []
            all_koji_builds = []
            for result in results:
                try:
                    repository = result.get('repositories')
                    all_repositories.extend(repository)
                except Exception as error:
                    self.logger.error("Failed to merge list of repositories "
                                      "%r. Reason (%s): %s", repository,
                                      type(error), error)
                koji_build_id = result.get('koji_build_id')
                if koji_build_id:
                    all_koji_builds.append(koji_build_id)

        except (SystemExit, ServerExit, KeyboardInterrupt):
            # we do not trap these
            raise
        except:
            # reraise the exception
            raise

        return {
            'repositories': all_repositories,
            'koji_builds': all_koji_builds,
        }