コード例 #1
0
    def test_list_triggers(self):
        p = Project('p')
        db.session.add(p)
        db.session.flush()
        db.session.add(ProjectTrigger('user', 1, p, 'repo', 'file', {}))
        db.session.add(ProjectTrigger('use4', 2, p, 'rep0', 'fil3', {}))
        db.session.commit()
        triggers = self.get_signed_json('/project-triggers/')
        self.assertEqual(2, len(triggers))
        self.assertIn('id', triggers[0])
        self.assertEqual('p', triggers[0]['project'])
        self.assertEqual('user', triggers[0]['user'])
        self.assertEqual('repo', triggers[0]['definition_repo'])
        self.assertEqual('git_poller', triggers[0]['type'])
        self.assertEqual({}, triggers[0]['secrets'])

        self.assertEqual('p', triggers[1]['project'])
        self.assertEqual('use4', triggers[1]['user'])
        self.assertEqual('rep0', triggers[1]['definition_repo'])
        self.assertEqual('github_pr', triggers[1]['type'])

        triggers = self.get_signed_json('/project-triggers/',
                                        query_string='type=git_poller')
        self.assertEqual(1, len(triggers))
        self.assertEqual('git_poller', triggers[0]['type'])
        self.assertEqual('file', triggers[0]['definition_file'])

        triggers = self.get_signed_json('/projects/p/triggers/',
                                        query_string='type=github_pr')
        self.assertEqual(1, len(triggers))
        self.assertEqual('rep0', triggers[0]['definition_repo'])

        r = self.client.get('/projects/p/triggers/')
        self.assertEqual(401, r.status_code)
コード例 #2
0
    def test_list_triggers(self):
        p = Project("p")
        db.session.add(p)
        db.session.flush()
        db.session.add(ProjectTrigger("user", 1, p, "repo", "file", {}))
        db.session.add(ProjectTrigger("use4", 2, p, "rep0", "fil3", {}))
        db.session.commit()
        triggers = self.get_signed_json("/project-triggers/")
        self.assertEqual(2, len(triggers))
        self.assertIn("id", triggers[0])
        self.assertEqual("p", triggers[0]["project"])
        self.assertEqual("user", triggers[0]["user"])
        self.assertEqual("repo", triggers[0]["definition_repo"])
        self.assertEqual("git_poller", triggers[0]["type"])
        self.assertEqual({}, triggers[0]["secrets"])

        self.assertEqual("p", triggers[1]["project"])
        self.assertEqual("use4", triggers[1]["user"])
        self.assertEqual("rep0", triggers[1]["definition_repo"])
        self.assertEqual("github_pr", triggers[1]["type"])

        triggers = self.get_signed_json("/project-triggers/",
                                        query_string="type=git_poller")
        self.assertEqual(1, len(triggers))
        self.assertEqual("git_poller", triggers[0]["type"])
        self.assertEqual("file", triggers[0]["definition_file"])

        triggers = self.get_signed_json("/projects/p/triggers/",
                                        query_string="type=github_pr")
        self.assertEqual(1, len(triggers))
        self.assertEqual("rep0", triggers[0]["definition_repo"])

        r = self.client.get("/projects/p/triggers/")
        self.assertEqual(401, r.status_code)
コード例 #3
0
    def test_build_trigger_with_secrets(self, trigger_build):
        """Assert we honor the trigger-type and trigger-id params."""
        # create two triggers to choose from
        trigger_build.return_value.build_id = 1
        pt = ProjectTrigger('user', TriggerTypes.simple.value, self.project,
                            None, None, {'foo': 'simple'})
        db.session.add(pt)
        pt = ProjectTrigger('user', TriggerTypes.lava.value, self.project,
                            None, None, {'foo': 'lava'})
        db.session.add(pt)
        db.session.commit()

        # try first trigger type
        headers = {'Content-type': 'application/json'}
        data = {'trigger-type': 'simple'}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({'foo': 'simple'}, trigger_build.call_args[0][4])

        # try second trigger type
        data = {'trigger-type': 'lava'}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({'foo': 'lava'}, trigger_build.call_args[0][4])

        # try "optional" trigger type (when there is no "optional")
        data = {'trigger-type': 'git-poller-optional'}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({}, trigger_build.call_args[0][4])

        # try "optional" trigger type
        data = {'trigger-type': 'lava-optional'}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({'foo': 'lava'}, trigger_build.call_args[0][4])

        # try override
        data = {'trigger-type': 'lava', 'secrets': {'foo': 'override'}}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({'foo': 'override'}, trigger_build.call_args[0][4])

        # try by trigger-id
        data = {'trigger-id': 1}
        _sign('http://localhost/projects/proj-1/builds/', headers, 'POST')
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({'foo': 'simple'}, trigger_build.call_args[0][4])
コード例 #4
0
def create_webhook(proj):
    u = permissions.assert_internal_user()
    p = get_or_404(Project.query.filter_by(name=proj))

    d = request.get_json() or {}
    required = ('githubtok', 'owner', 'project')
    missing = []
    for x in required:
        if x not in d:
            missing.append(x)
    if missing:
        raise ApiError(401, 'Missing parameters: %s' % ','.join(missing))

    owner = d.pop('owner')
    hook_url = 'https://api.github.com/repos/%s/%s/hooks'
    hook_url = hook_url % (owner, d.pop('project'))

    d['webhook-key'] = secrets.token_urlsafe()
    dr = df = None
    try:
        dr = d.pop('definition_repo')
        df = d.pop('definition_file')
    except KeyError:
        pass

    user = owner
    if u:
        user = str(u)

    db.session.add(ProjectTrigger(
        user, TriggerTypes.github_pr.value, p, dr, df, d))

    _register_github_hook(p, hook_url, d['githubtok'], d['webhook-key'])
    db.session.commit()
    return jsendify({}, 201)
コード例 #5
0
ファイル: project.py プロジェクト: marcstreeter/jobserv
def project_create_trigger(proj):
    u = permissions.assert_internal_user()
    p = get_or_404(Project.query.filter_by(name=proj))

    d = request.get_json() or {}
    ttype = d.pop('type')
    if not ttype:
        raise ApiError(401, 'Missing parameter: type')
    ttype = TriggerTypes[ttype].value

    try:
        owner = d.pop('owner')
    except KeyError:
        owner = 'unknown-internal'
    if u:
        owner = str(u)
    dr = df = None
    try:
        dr = d.pop('definition_repo')
        df = d.pop('definition_file')
    except KeyError:
        pass

    try:
        secrets = d.pop('secrets')
        # convert array of [{'name': <name>, 'value': <value>}, ...] dicts
        # into dictionary of {<name>: <value>, ...}
        secrets = {x['name']: x['value'] for x in secrets}
    except KeyError:
        secrets = d

    db.session.add(ProjectTrigger(owner, ttype, p, dr, df, secrets))

    db.session.commit()
    return jsendify({}, 201)
コード例 #6
0
def add_trigger(project, user, type, secrets, definition_repo, definition_file,
                hook_url, server_name):
    key = ''.join(
        random.SystemRandom().choice(string.ascii_lowercase +
                                     string.ascii_uppercase + string.digits)
        for _ in range(32))
    secret_map = {}
    for secret in (secrets or []):
        k, v = secret.split('=', 1)
        secret_map[k.strip()] = v.strip()

    type = TriggerTypes[type].value
    p = Project.query.filter(Project.name == project).first()
    if not p:
        click.echo('No such project: %s' % project)
        return
    db.session.add(
        ProjectTrigger(user, type, p, definition_repo, definition_file,
                       secret_map))

    if type == TriggerTypes.gitlab_mr.value:
        secret_map['webhook-key'] = key
        if 'gitlabtok' not in secret_map or 'gitlabuser' not in secret_map:
            raise ValueError(
                '"gitlabtok" and "gitlabuser" are required secrets')
        _register_gitlab_hook(project, hook_url, secret_map['gitlabtok'], key,
                              server_name)
    elif type == TriggerTypes.github_pr.value:
        secret_map['webhook-key'] = key
        if 'githubtok' not in secret_map:
            raise ValueError('"githubtok" is required in secrets')
        _register_github_hook(project, hook_url, secret_map['githubtok'], key,
                              server_name)

    db.session.commit()
コード例 #7
0
    def test_build_trigger_with_secrets(self, trigger_build):
        """Assert we honor the trigger-type and trigger-id params."""
        trigger_build.return_value.build_id = 1
        pt = ProjectTrigger(
            "user",
            TriggerTypes.simple.value,
            self.project,
            None,
            None,
            {"foo": "simple"},
        )
        db.session.add(pt)
        db.session.commit()

        # try first trigger type
        headers = {"Content-type": "application/json"}
        data = {"trigger-type": "simple"}
        _sign("http://localhost/projects/proj-1/builds/", headers, "POST")
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({"foo": "simple"}, trigger_build.call_args[0][4])

        # try "optional" trigger type (when there is no "optional")
        data = {"trigger-type": "git-poller-optional"}
        _sign("http://localhost/projects/proj-1/builds/", headers, "POST")
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({}, trigger_build.call_args[0][4])

        # try override
        data = {"trigger-type": "simple", "secrets": {"foo": "override"}}
        _sign("http://localhost/projects/proj-1/builds/", headers, "POST")
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({"foo": "override"}, trigger_build.call_args[0][4])

        # try by trigger-id
        data = {"trigger-id": pt.id}
        _sign("http://localhost/projects/proj-1/builds/", headers, "POST")
        self._post(self.urlbase, json.dumps(data), headers, 201)
        self.assertEqual({"foo": "simple"}, trigger_build.call_args[0][4])