Beispiel #1
0
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)
Beispiel #2
0
def results():
    payload = flask.request.json

    if 'devel' == payload['tower']:
        tower_query = 'SELECT id FROM tower_versions WHERE code = "devel"'
    else:
        tower_query = 'SELECT id FROM tower_versions WHERE code = "%s"' % payload[
            'tower'][0:3]
    ansible_query = 'SELECT id FROM ansible_versions WHERE version = "%s"' % payload[
        'ansible']
    os_query = 'SELECT id FROM os_versions WHERE version = "%s"' % payload['os']

    db_access = db.get_db()

    db_access.execute(
        'DELETE FROM results WHERE tower_id = (%s) AND ansible_id = (%s) AND os_id = (%s)'
        % (tower_query, ansible_query, os_query))
    db_access.commit()

    db_access.execute(
        'INSERT INTO results (tower_id, ansible_id, os_id, status, url) VALUES ((%s), (%s), (%s), "%s", "%s")'
        % (tower_query, ansible_query, os_query, payload['status'],
           payload['url']))
    db_access.commit()

    return flask.Response(json.dumps({'Inserted': 'ok'}),
                          status=201,
                          content_type='application/json')
Beispiel #3
0
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
    )
Beispiel #4
0
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")
Beispiel #5
0
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')
Beispiel #6
0
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,
    )
Beispiel #7
0
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)
Beispiel #8
0
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
    )
Beispiel #9
0
def results(flask):
    payload = flask.request.json

    if "devel" == payload["tower"]:
        tower_query = 'SELECT id FROM tower_versions WHERE code = "devel"'
    else:
        tower_query = ('SELECT id FROM tower_versions WHERE code = "%s"' %
                       payload["tower"][0:3])
    if "ansible" in payload:
        ansible_query = (
            'SELECT id FROM ansible_versions WHERE version = "%s"' %
            payload["ansible"])
    os_query = 'SELECT id FROM os_versions WHERE version = "%s"' % payload["os"]

    db_access = db.get_db(flask.current_app)

    if "ansible" in payload:
        _del_query = (
            "DELETE FROM results WHERE tower_id = (%s) AND ansible_id = (%s) AND os_id = (%s)"
            % (tower_query, ansible_query, os_query))
        _ins_query = (
            'INSERT INTO results (tower_id, ansible_id, os_id, status, url) VALUES ((%s), (%s), (%s), "%s", "%s")'
            % (tower_query, ansible_query, os_query, payload["status"],
               payload["url"]))
    else:
        _del_query = "DELETE FROM results WHERE tower_id = (%s) AND os_id = (%s)" % (
            tower_query,
            os_query,
        )
        _ins_query = (
            'INSERT INTO results (tower_id, os_id, status, url) VALUES ((%s), (%s), "%s", "%s")'
            % (tower_query, os_query, payload["status"], payload["url"]))

    db_access.execute(_del_query)
    db_access.commit()
    db_access.execute(_ins_query)
    db_access.commit()

    return flask.Response(json.dumps({"Inserted": "ok"}),
                          status=201,
                          content_type="application/json")
Beispiel #10
0
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")
Beispiel #11
0
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')
Beispiel #12
0
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")
Beispiel #13
0
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",
            )
Beispiel #14
0
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'
            )
Beispiel #15
0
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
    )
Beispiel #16
0
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,
    )
Beispiel #17
0
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'
            )
Beispiel #18
0
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'
            )