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)
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)
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])
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)
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)
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()
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])