def integration_test_results(): db_access = db.get_db() versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) branches = github.get_branches() for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [branch for branch in branches if branch.startswith(_version)] _res.sort() version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace('release_', '') else: version['next_release'] = current_app.config.get('DEVEL_VERSION_NAME', 'undef') fetch_querry = 'SELECT * FROM integration_tests' integration_test_results = db_access.execute(fetch_querry).fetchall() integration_test_results = db.format_fetchall(integration_test_results) integration_test_results = set_freshness(integration_test_results, 'created_at', duration = 1) integration_test_results = sorted(integration_test_results, key = lambda i: i['created_at'],reverse=True) return flask.render_template( 'jenkins/integration_test_results.html', versions=versions, integration_test_results=integration_test_results )
def releases(): db_access = db.get_db() versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) results_query = 'SELECT tv.id, tv.version, av.version as "ansible", ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND ov.version != "OpenShift" AND ov.version != "Artifacts" JOIN tower_ansible ta ON tv.id = ta.tower_id JOIN ansible_versions av ON av.id = ta.ansible_id LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id AND res.ansible_id = av.id) ORDER BY tv.version, ov.id, av.id' results = db_access.execute(results_query).fetchall() results = db.format_fetchall(results) misc_query = 'SELECT tv.id, tv.version, ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND (ov.version == "OpenShift" OR ov.version == "Artifacts") LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id) ORDER BY tv.version, ov.id' misc_results = db_access.execute(misc_query).fetchall() misc_results = db.format_fetchall(misc_results) branches = github.get_branches() milestones = github.get_milestones() for result in results: if result['res_created_at']: delta = datetime.now() - datetime.strptime( result['res_created_at'], '%Y-%m-%d %H:%M:%S') result['freshness'] = delta.days for result in misc_results: if result['res_created_at']: delta = datetime.now() - datetime.strptime( result['res_created_at'], '%Y-%m-%d %H:%M:%S') result['freshness'] = delta.days for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [ branch for branch in branches if branch.startswith(_version) ] _res.sort() milestone_name = _res[-1] version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace( 'release_', '') else: version['next_release'] = current_app.config.get( 'DEVEL_VERSION_NAME', 'undef') milestone_name = 'release_{}'.format(version['next_release']) milestone_number = milestones.get(milestone_name) version['issues'] = serialize_issue( milestone_number, milestone_name) if milestone_number else None version['next_release_test_plan'] = github.get_test_plan_url( version['next_release']) version[ 'project'] = 'https://github.com/orgs/ansible/projects/{}'.format( github.get_project_by_name('Ansible Tower {}'.format( version['next_release']))['number']) return flask.render_template('jenkins/releases.html', versions=versions, results=results, misc_results=misc_results)
def integration_test_results(): db_access = db.get_db(current_app) versions_query = "SELECT * FROM tower_versions" versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) branches = current_app.github.get_branches() for version in versions: print(version) if "devel" not in version["version"].lower(): _version = version["version"].lower().replace(" ", "_") _res = [ branch for branch in branches if branch.startswith(_version) ] _res.sort() version["next_release"] = _res[-1] version["next_release"] = version["next_release"].replace( "release_", "") else: version["next_release"] = current_app.config.get( "DEVEL_VERSION_NAME", "undef") failed_on = "" for arg in flask.request.args: if arg == "failed_on": failed_on = flask.request.args.get(arg) else: return flask.Response( json.dumps( {"Error": 'only able to filter on "failed on" field'}), status=400, content_type="application/json", ) fetch_query = "SELECT * FROM integration_tests" integration_test_results = db_access.execute(fetch_query).fetchall() integration_test_results = db.format_fetchall(integration_test_results) integration_test_results = set_freshness(integration_test_results, "created_at", duration=1) integration_test_results = sorted(integration_test_results, key=lambda i: i["created_at"], reverse=True) if failed_on == "today": integration_test_results = [ i for i in integration_test_results if i["freshness"] < 1 ] return flask.render_template( "jenkins/integration_test_results.html", versions=versions, integration_test_results=integration_test_results, )
def tower_versions(): db_access = db.get_db() versions = db_access.execute('SELECT * FROM tower_versions').fetchall() versions = db.format_fetchall(versions) return flask.Response(json.dumps(versions), status=200, content_type='application/json')
def os_versions(flask): db_access = db.get_db(flask.current_app) versions = db_access.execute("SELECT * FROM os_versions").fetchall() versions = db.format_fetchall(versions) return flask.Response(json.dumps(versions), status=200, content_type="application/json")
def releases(): db_access = db.get_db() versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) results_query = 'SELECT tv.id, tv.version, av.version as "ansible", ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id JOIN tower_ansible ta ON tv.id = ta.tower_id JOIN ansible_versions av ON av.id = ta.ansible_id LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id AND res.ansible_id = av.id) ORDER BY tv.version, ov.id, av.id' results = db_access.execute(results_query).fetchall() results = db.format_fetchall(results) url = 'https://api.github.com/repos/%s/branches' % current_app.config.get( 'TOWERQA_REPO') branches = requests.get(url, headers={ 'Authorization': 'token %s' % current_app.config.get('GITHUB_TOKEN') }).json() res = [branch['name'] for branch in branches] now = datetime.now() for result in results: if result['res_created_at']: delta = now - datetime.strptime(result['res_created_at'], '%Y-%m-%d %H:%M:%S') result['freshness'] = delta.days for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [r for r in res if r.startswith(_version)] _res.sort() version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace( 'release_', '') version['next_release_test_plan'] = retrieve_test_plan_url( version['next_release']) return flask.render_template('jenkins/releases.html', versions=versions, results=results)
def integration_test_results(): db_access = db.get_db(current_app) versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) branches = current_app.github.get_branches() for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [branch for branch in branches if branch.startswith(_version)] _res.sort() version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace('release_', '') else: version['next_release'] = current_app.config.get('DEVEL_VERSION_NAME', 'undef') failed_on = '' for arg in flask.request.args: if arg == 'failed_on': failed_on = flask.request.args.get(arg) else: return flask.Response( json.dumps({'Error': 'only able to filter on "failed on" field'}), status=400, content_type='application/json' ) fetch_query = 'SELECT * FROM integration_tests' integration_test_results = db_access.execute(fetch_query).fetchall() integration_test_results = db.format_fetchall(integration_test_results) integration_test_results = set_freshness(integration_test_results, 'created_at', duration = 1) integration_test_results = sorted(integration_test_results, key = lambda i: i['created_at'],reverse=True) if failed_on == 'today': integration_test_results = [i for i in integration_test_results if i['freshness']<1] return flask.render_template( 'jenkins/integration_test_results.html', versions=versions, integration_test_results=integration_test_results )
def refresh_github_branches(): print("Running refresh_github_branches()") app = APP.create_app() app.cache.delete_memoized(app.github.get_branches) app.cache.delete_memoized(app.github.get_test_plan_url) app.cache.delete_memoized(app.github.get_project_by_name) app.cache.delete_memoized(app.github.get_issues_information) branches = app.github.get_branches() db_access = db.get_db(app) versions_query = "SELECT * FROM tower_versions" versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) for version in versions: if "devel" not in version["version"].lower(): _version = version["version"].lower().replace(" ", "_") _res = [ branch for branch in branches if branch.startswith(_version) ] _res.sort() milestone_name = _res[-1] version["next_release"] = _res[-1] version["next_release"] = version["next_release"].replace( "release_", "") else: version["next_release"] = app.config.get("DEVEL_VERSION_NAME", "undef") milestone_name = "release_{}".format(version["next_release"]) app.github.get_test_plan_url(version["next_release"]) project_number = app.github.get_project_by_name( "Ansible Tower {}".format(version["next_release"]))["number"] if project_number: project = f"ansible/{project_number}" app.github.get_issues_information(project) app.github.get_issues_information(project, "label:state:needs_test")
def refresh_github_branches(): print("Running refresh_github_branches()") app = APP.create_app() app.cache.delete_memoized(app.github.get_branches) app.cache.delete_memoized(app.github.get_test_plan_url) app.cache.delete_memoized(app.github.get_project_by_name) app.cache.delete_memoized(app.github.get_issues_information) branches = app.github.get_branches() db_access = db.get_db(app) versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [ branch for branch in branches if branch.startswith(_version) ] _res.sort() milestone_name = _res[-1] version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace( 'release_', '') else: version['next_release'] = app.config.get('DEVEL_VERSION_NAME', 'undef') milestone_name = 'release_{}'.format(version['next_release']) app.github.get_test_plan_url(version['next_release']) project_number = app.github.get_project_by_name( 'Ansible Tower {}'.format(version['next_release']))['number'] project = f'ansible/{project_number}' app.github.get_issues_information(project) app.github.get_issues_information(project, 'label:state:needs_test')
def releases(): db_access = db.get_db(current_app) versions_query = 'SELECT * FROM tower_versions' versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) results_query = 'SELECT tv.id, tv.version, av.version as "ansible", ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND ov.version != "OpenShift" AND ov.version != "Artifacts" JOIN tower_ansible ta ON tv.id = ta.tower_id JOIN ansible_versions av ON av.id = ta.ansible_id LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id AND res.ansible_id = av.id) ORDER BY tv.version, ov.id, av.id' results = db_access.execute(results_query).fetchall() results = db.format_fetchall(results) misc_query = 'SELECT tv.id, tv.version, ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND (ov.version == "OpenShift" OR ov.version == "Artifacts") LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id) ORDER BY tv.version, ov.id' misc_results = db_access.execute(misc_query).fetchall() misc_results = db.format_fetchall(misc_results) sign_off_jobs_query = 'SELECT * from sign_off_jobs;' sign_off_jobs = db_access.execute(sign_off_jobs_query).fetchall() sign_off_jobs = db.format_fetchall(sign_off_jobs) unstable_jobs_query = 'SELECT * from sign_off_jobs WHERE status = "UNSTABLE";' unstable_jobs = db_access.execute(unstable_jobs_query).fetchall() unstable_jobs = db.format_fetchall(unstable_jobs) failed_jobs_query = 'SELECT * from sign_off_jobs WHERE status = "FAILURE";' failed_jobs = db_access.execute(failed_jobs_query).fetchall() failed_jobs = db.format_fetchall(failed_jobs) results = set_freshness(results, 'res_created_at') sign_off_jobs = set_freshness(sign_off_jobs, 'created_at') unstable_jobs = set_freshness(unstable_jobs, 'created_at', discard_old=True) failed_jobs = set_freshness(failed_jobs, 'created_at', discard_old=True) misc_results = set_freshness(misc_results, 'res_created_at') branches = current_app.github.get_branches() for version in versions: if 'devel' not in version['version'].lower(): _version = version['version'].lower().replace(' ', '_') _res = [branch for branch in branches if branch.startswith(_version)] _res.sort() milestone_name = _res[-1] version['next_release'] = _res[-1] version['next_release'] = version['next_release'].replace('release_', '') else: version['next_release'] = current_app.config.get('DEVEL_VERSION_NAME', 'undef') milestone_name = 'release_{}'.format(version['next_release']) version['next_release_test_plan'] = current_app.github.get_test_plan_url(version['next_release']) project_number = current_app.github.get_project_by_name('Ansible Tower {}'.format(version['next_release']))['number'] version['project'] = 'https://github.com/orgs/ansible/projects/{}'.format(project_number) version['issues'] = serialize_issues('ansible/{}'.format(project_number)) for issue in version['issues']['needs_test_issues']: issue['qe_or_not'] = any(item in issue['assignee'].split(", ") for item in base.QE_assignee) return flask.render_template( 'jenkins/releases.html', versions=versions, results=results, misc_results=misc_results, sign_off_jobs=sign_off_jobs, unstable_jobs=unstable_jobs, failed_jobs=failed_jobs )
def integration_tests(): if flask.request.method == 'GET': tower_query = '' for arg in flask.request.args: if arg == 'tower': tower_query = form_tower_query(flask.request.args.get(arg)) else: return flask.Response( json.dumps({'Error': 'only able to filter on tower versions'}), status=400, content_type='application/json' ) if tower_query: job_query = 'SELECT * FROM integration_tests WHERE tower_id = (%s)' % (tower_query) else: job_query = 'SELECT * FROM integration_tests' db_access = db.get_db(current_app) res = db_access.execute(job_query).fetchall() integration_tests = db.format_fetchall(res) return flask.Response( json.dumps(integration_tests), status=200, content_type='application/json' ) else: payload = flask.request.json required_keys = ['name', 'tower', 'deploy', 'platform', 'bundle', 'tls', 'fips', 'ansible', 'status', 'url'] check_payload(payload, required_keys) tower_query = form_tower_query(payload['tower']) tests = payload['name'] for test in tests: condition = 'test_name = "%s" AND tower_id = (%s) AND deploy = "%s" AND platform = "%s" AND' \ ' tls = "%s" AND fips = "%s" AND bundle = "%s" AND ansible = "%s"' % \ (test, tower_query, payload['deploy'], payload['platform'], payload['tls'], payload['fips'], payload['bundle'], payload['ansible']) job_query = 'SELECT * FROM integration_tests WHERE %s' % (condition) db_access = db.get_db(current_app) existing = db_access.execute(job_query).fetchall() existing = db.format_fetchall(existing) if existing: failing_since_query = 'SELECT failing_since FROM integration_tests WHERE %s' % (condition) failing_since = db_access.execute(failing_since_query).fetchall() failing_since = db.format_fetchall(failing_since) failing_since = failing_since[0]['failing_since'] delete_query = 'DELETE FROM integration_tests WHERE %s' % (condition) db_access.execute(delete_query) else: failing_since = date.today() insert_query = 'INSERT INTO integration_tests (test_name, tower_id, deploy, ' \ 'platform, bundle, tls, fips, ansible, status, url, failing_since) ' \ 'VALUES ("%s", (%s), "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")' % \ (test, tower_query, payload['deploy'], payload['platform'], payload['bundle'], payload['tls'], payload['fips'], payload['ansible'], payload['status'], payload['url'], failing_since) db_access.execute(insert_query) db_access.commit() return flask.Response( json.dumps({'Inserted': 'ok'}), status=201, content_type='application/json' )
def sign_off_jobs(): if flask.request.method == 'GET': tower_query = '' for arg in flask.request.args: if arg == 'tower': tower_query = form_tower_query(flask.request.args.get(arg)) else: return flask.Response( json.dumps({'Error': 'only able to filter on tower versions'}), status=400, content_type='application/json' ) if tower_query: job_query = 'SELECT * FROM sign_off_jobs WHERE tower_id = (%s)' % (tower_query) else: job_query = 'SELECT * FROM sign_off_jobs' db_access = db.get_db(current_app) res = db_access.execute(job_query).fetchall() sign_off_jobs = db.format_fetchall(res) return flask.Response( json.dumps(sign_off_jobs), status=200, content_type='application/json' ) else: payload = flask.request.json required_keys = ['tower', 'component', 'deploy', 'platform', 'tls', 'fips', 'bundle', 'ansible', 'url', 'status'] check_payload(payload, required_keys) tower_query = form_tower_query(payload['tower']) condition = 'tower_id = (%s) AND component = "%s" AND deploy = "%s" AND platform = "%s" AND' \ ' tls = "%s" AND fips = "%s" AND bundle = "%s" AND ansible = "%s"' \ % (tower_query, payload['component'], payload['deploy'], payload['platform'], payload['tls'], payload['fips'], payload['bundle'], payload['ansible']) job_query = 'SELECT id FROM sign_off_jobs WHERE %s' % (condition) db_access = db.get_db(current_app) existing = db_access.execute(job_query).fetchall() existing = db.format_fetchall(existing) if existing: _update_query = 'UPDATE sign_off_jobs SET status = "%s", url = "%s", created_at = "%s" WHERE id = (%s)'\ % (payload['status'], payload['url'], datetime.now(), job_query) db_access.execute(_update_query) return_info_query = 'SELECT display_name, created_at FROM sign_off_jobs WHERE id = (%s)' % (job_query) res = db_access.execute(return_info_query).fetchall() updated_job = db.format_fetchall(res) else: job = "component_{}_platform_{}_deploy_{}_tls_{}_fips_{}_bundle_{}_ansible_{}".format( payload["component"], payload["platform"], payload["deploy"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], ) tls_statement = "(TLS Enabled)" if payload["tls"] == "yes" else "" fips_statement = "(FIPS Enabled)" if payload["fips"] == "yes" else "" bundle_statement = ( "(Bundle installer)" if payload["bundle"] == "yes" else "" ) display_name = "{} {} {} {} {} {} w/ ansible {}".format( payload["platform"], payload["deploy"], payload["component"].replace("_", " "), tls_statement, fips_statement, bundle_statement, payload["ansible"], ) display_name = display_name.title() insert_query = ( "INSERT INTO sign_off_jobs (tower_id, job, display_name, component, platform, deploy, " 'tls, fips, bundle, ansible, status, url) VALUES ((%s), "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s");\n' % ( tower_query, job, display_name, payload["component"], payload["platform"], payload["deploy"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], payload["status"], payload["url"] ) ) db_access.execute(insert_query) db_access.commit() if existing: return flask.Response( json.dumps({'OK': 'Updated'}), status=200, content_type='application/json' ) else: return flask.Response( json.dumps({'OK': 'Inserted'}), status=200, content_type='application/json' )
def releases(): db_access = db.get_db(current_app) versions_query = "SELECT * FROM tower_versions" versions = db_access.execute(versions_query).fetchall() versions = db.format_fetchall(versions) results_query = 'SELECT tv.id, tv.version, av.version as "ansible", ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND ov.version != "OpenShift" AND ov.version != "Artifacts" JOIN tower_ansible ta ON tv.id = ta.tower_id JOIN ansible_versions av ON av.id = ta.ansible_id LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id AND res.ansible_id = av.id) ORDER BY tv.version, ov.id, av.id' results = db_access.execute(results_query).fetchall() results = db.format_fetchall(results) misc_query = 'SELECT tv.id, tv.version, ov.version as "os", ov.description as "os_description", res.status, res.created_at as "res_created_at", res.url FROM tower_versions tv JOIN tower_os toos ON tv.id = toos.tower_id JOIN os_versions ov on toos.os_id = ov.id AND (ov.version == "OpenShift" OR ov.version == "Artifacts") LEFT JOIN results res ON (res.tower_id = tv.id AND res.os_id = ov.id) ORDER BY tv.version, ov.id' misc_results = db_access.execute(misc_query).fetchall() misc_results = db.format_fetchall(misc_results) sign_off_jobs_query = "SELECT * from sign_off_jobs;" sign_off_jobs = db_access.execute(sign_off_jobs_query).fetchall() sign_off_jobs = db.format_fetchall(sign_off_jobs) unstable_jobs_query = 'SELECT * from sign_off_jobs WHERE status = "UNSTABLE";' unstable_jobs = db_access.execute(unstable_jobs_query).fetchall() unstable_jobs = db.format_fetchall(unstable_jobs) failed_jobs_query = 'SELECT * from sign_off_jobs WHERE status = "FAILURE";' failed_jobs = db_access.execute(failed_jobs_query).fetchall() failed_jobs = db.format_fetchall(failed_jobs) results = set_freshness(results, "res_created_at") sign_off_jobs = set_freshness(sign_off_jobs, "created_at") unstable_jobs = set_freshness(unstable_jobs, "created_at", discard_old=True) failed_jobs = set_freshness(failed_jobs, "created_at", discard_old=True) misc_results = set_freshness(misc_results, "res_created_at") branches = current_app.github.get_branches() for version in versions: if "devel" not in version["version"].lower(): _version = version["version"].lower().replace(" ", "_") _res = [ branch for branch in branches if branch.startswith(_version) ] _res.sort() milestone_name = _res[-1] version["next_release"] = _res[-1] version["next_release"] = version["next_release"].replace( "release_", "") else: version["next_release"] = current_app.config.get( "DEVEL_VERSION_NAME", "undef") milestone_name = "release_{}".format(version["next_release"]) version[ "next_release_test_plan"] = current_app.github.get_test_plan_url( version["next_release"]) project = current_app.github.get_project_by_name( "Ansible Tower {}".format(version["next_release"])) project_number = project["number"] if project_number: version[ "project"] = "https://github.com/orgs/ansible/projects/{}".format( project_number) version["issues"] = serialize_issues( "ansible/{}".format(project_number)) for issue in version["issues"]["needs_test_issues"]: issue["qe_or_not"] = any(item in issue["assignee"].split(", ") for item in base.QE_assignee) return flask.render_template( "jenkins/releases.html", versions=versions, results=results, misc_results=misc_results, sign_off_jobs=sign_off_jobs, unstable_jobs=unstable_jobs, failed_jobs=failed_jobs, )
def sign_off_jobs(): def form_tower_query(tower): if 'devel' == tower: return 'SELECT id FROM tower_versions WHERE code = "devel"' else: return 'SELECT id FROM tower_versions WHERE code = "%s"' % tower[0:3] if flask.request.method == 'GET': tower_query = '' for arg in flask.request.args: if arg == 'tower': tower_query = form_tower_query(flask.request.args.get(arg)) else: return flask.Response( json.dumps({'Error': 'only able to filter on tower versions'}), status=400, content_type='application/json' ) if tower_query: job_query = 'SELECT * FROM sign_off_jobs WHERE tower_id = (%s)' % (tower_query) else: job_query = 'SELECT * FROM sign_off_jobs' db_access = db.get_db() res = db_access.execute(job_query).fetchall() sign_off_jobs = db.format_fetchall(res) return flask.Response( json.dumps(sign_off_jobs), status=200, content_type='application/json' ) else: payload = flask.request.json required_keys = ['tower', 'component', 'deploy', 'platform', 'tls', 'fips', 'bundle', 'ansible'] missing_keys = [] for key in required_keys: if key not in payload: missing_keys.append(key) if missing_keys: return flask.Response( json.dumps({'Error': 'Missing required keys/value pairs for {}'.format(missing_keys)}), status=400, content_type='application/json' ) tower_query = form_tower_query(payload['tower']) job_query = 'SELECT id FROM sign_off_jobs WHERE tower_id = (%s) AND component = "%s" AND deploy = "%s" AND platform = "%s" AND tls = "%s" AND fips = "%s" AND bundle = "%s" AND ansible = "%s"' % (tower_query, payload['component'], payload['deploy'], payload['platform'], payload['tls'], payload['fips'], payload['bundle'], payload['ansible']) return_info_query = 'SELECT display_name, created_at FROM sign_off_jobs WHERE id = (%s)' % (job_query) db_access = db.get_db() _update_query = 'UPDATE sign_off_jobs SET status = "%s", url = "%s", created_at = "%s" WHERE id = (%s)' % (payload['status'], payload['url'], datetime.now(), job_query) db_access.execute(_update_query) res = db_access.execute(return_info_query).fetchall() updated_job = db.format_fetchall(res) db_access.commit() if updated_job: return flask.Response( json.dumps(updated_job), status=200, content_type='application/json' ) else: return flask.Response( json.dumps({'Error': 'No job found to update'}), status=400, content_type='application/json' )
def integration_tests(flask): if flask.request.method == "GET": db_access = db.get_db(flask.current_app) tower_query = "" failed_on = "2000-01-01" for arg in flask.request.args: if arg == "failed_on": failed_on = flask.request.args.get(arg) try: failed_on = str( datetime.strptime(failed_on, "%Y-%m-%d").date()) except ValueError: return flask.Response( json.dumps({ "Error": "Failed on should be a string like 2020-01-01" }), status=400, content_type="application/json", ) if arg == "tower": tower_query = form_tower_query(flask.request.args.get(arg)) if arg not in ["failed_on", "tower"]: return flask.Response( json.dumps({ "Error": 'only able to filter on "failed on" or "tower" field' }), status=400, content_type="application/json", ) if tower_query: fetch_query = ( 'SELECT * FROM integration_tests WHERE tower_id = (%s) AND created_at >= date("%s")' % (tower_query, failed_on)) else: fetch_query = ( 'SELECT * FROM integration_tests WHERE created_at >= date("%s")' % (failed_on)) print(fetch_query) test_results = db_access.execute(fetch_query).fetchall() test_results = db.format_fetchall(test_results) return flask.Response( json.dumps(test_results, default=str), status=200, content_type="application/json", ) else: payload = flask.request.json required_keys = [ "name", "tower", "deploy", "platform", "bundle", "tls", "fips", "ansible", "status", "url", ] error = check_payload_error(payload, required_keys) if error: return flask.Response(error, status=400, content_type="application/json") tower_query = form_tower_query(payload["tower"]) tests = payload["name"] for test in tests: condition = ( 'test_name = "%s" AND tower_id = (%s) AND deploy = "%s" AND platform = "%s" AND' ' tls = "%s" AND fips = "%s" AND bundle = "%s" AND ansible = "%s"' % ( test, tower_query, payload["deploy"], payload["platform"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], )) job_query = "SELECT * FROM integration_tests WHERE %s" % ( condition) db_access = db.get_db(flask.current_app) existing = db_access.execute(job_query).fetchall() existing = db.format_fetchall(existing) if existing: failing_since_query = ( "SELECT failing_since FROM integration_tests WHERE %s" % (condition)) failing_since = db_access.execute( failing_since_query).fetchall() failing_since = db.format_fetchall(failing_since) failing_since = failing_since[0]["failing_since"] delete_query = "DELETE FROM integration_tests WHERE %s" % ( condition) db_access.execute(delete_query) else: failing_since = date.today() insert_query = ( "INSERT INTO integration_tests (test_name, tower_id, deploy, " "platform, bundle, tls, fips, ansible, status, url, failing_since) " 'VALUES ("%s", (%s), "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")' % ( test, tower_query, payload["deploy"], payload["platform"], payload["bundle"], payload["tls"], payload["fips"], payload["ansible"], payload["status"], payload["url"], failing_since, )) db_access.execute(insert_query) db_access.commit() return flask.Response(json.dumps({"Inserted": "ok"}), status=201, content_type="application/json")
def sign_off_jobs(flask): if flask.request.method == "GET": tower_query = "" for arg in flask.request.args: if arg == "tower": tower_query = form_tower_query(flask.request.args.get(arg)) else: return flask.Response( json.dumps( {"Error": "only able to filter on tower versions"}), status=400, content_type="application/json", ) if tower_query: job_query = "SELECT * FROM sign_off_jobs WHERE tower_id = (%s)" % ( tower_query) else: job_query = "SELECT * FROM sign_off_jobs" db_access = db.get_db(flask.current_app) res = db_access.execute(job_query).fetchall() sign_off_jobs = db.format_fetchall(res) return flask.Response(json.dumps(sign_off_jobs), status=200, content_type="application/json") else: payload = flask.request.json required_keys = [ "tower", "component", "deploy", "platform", "tls", "fips", "bundle", "ansible", "url", "status", ] error = check_payload_error(payload, required_keys) if error: return flask.Response(error, status=400, content_type="application/json") tower_query = form_tower_query(payload["tower"]) condition = ( 'tower_id = (%s) AND component = "%s" AND deploy = "%s" AND platform = "%s" AND' ' tls = "%s" AND fips = "%s" AND bundle = "%s" AND ansible = "%s"' % ( tower_query, payload["component"], payload["deploy"], payload["platform"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], )) job_query = "SELECT id FROM sign_off_jobs WHERE %s" % (condition) db_access = db.get_db(flask.current_app) existing = db_access.execute(job_query).fetchall() existing = db.format_fetchall(existing) if existing: _update_query = ( 'UPDATE sign_off_jobs SET status = "%s", url = "%s", created_at = "%s" WHERE id = (%s)' % (payload["status"], payload["url"], datetime.now(), job_query)) db_access.execute(_update_query) return_info_query = ( "SELECT display_name, created_at FROM sign_off_jobs WHERE id = (%s)" % (job_query)) res = db_access.execute(return_info_query).fetchall() updated_job = db.format_fetchall(res) else: job = "component_{}_platform_{}_deploy_{}_tls_{}_fips_{}_bundle_{}_ansible_{}".format( payload["component"], payload["platform"], payload["deploy"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], ) tls_statement = "(TLS Enabled)" if payload["tls"] == "yes" else "" fips_statement = "(FIPS Enabled)" if payload[ "fips"] == "yes" else "" bundle_statement = ("(Bundle installer)" if payload["bundle"] == "yes" else "") display_name = "{} {} {} {} {} {} w/ ansible {}".format( payload["platform"], payload["deploy"], payload["component"].replace("_", " "), tls_statement, fips_statement, bundle_statement, payload["ansible"], ) display_name = display_name.title() insert_query = ( "INSERT INTO sign_off_jobs (tower_id, job, display_name, component, platform, deploy, " 'tls, fips, bundle, ansible, status, url) VALUES ((%s), "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s");\n' % ( tower_query, job, display_name, payload["component"], payload["platform"], payload["deploy"], payload["tls"], payload["fips"], payload["bundle"], payload["ansible"], payload["status"], payload["url"], )) db_access.execute(insert_query) db_access.commit() if existing: return flask.Response( json.dumps({"OK": "Updated"}), status=200, content_type="application/json", ) else: return flask.Response( json.dumps({"OK": "Inserted"}), status=200, content_type="application/json", )