Пример #1
0
def post_packages_stop(release_id, package_id):
    """
    Indicate that a package has finished deploying

    **Example curl**:

    .. sourcecode:: shell

        curl -H "Content-Type: application/json" \\
        -X POST \\
        http://127.0.0.1/releases/${RELEASE_ID}/packages/${PACKAGE_ID}/stop \\
        -d '{"success": "true"}'

    :param string package_id: Package UUID
    :param string release_id: Release UUID
    """
    validate_request_json(request)
    success = request.json.get('success') in [True, 'True', 'true', '1']

    package = fetch_package(release_id, package_id)
    app.logger.info("Package stop, release {}, package {}, success {}".format(
        release_id, package_id, success))
    package.stop(success=success)

    db.session.add(package)
    db.session.commit()
    return '', 204
Пример #2
0
def post_packages_stop(release_id, package_id):
    """
    Indicate that a package has finished deploying

    **Example curl**:

    .. sourcecode:: shell

        curl -H "Content-Type: application/json" \\
        -X POST http://127.0.0.1/releases/${RELEASE_ID}/packages/${PACKAGE_ID}/stop \\
        -d '{"success": "true"}'

    :param string package_id: Package UUID
    :param string release_id: Release UUID
    """
    validate_request_json(request)
    success = request.json.get('success') in [True, 'True', 'true', '1']

    package = fetch_package(release_id, package_id)
    app.logger.info("Package stop, release {}, package {}, success {}".format(
            release_id, package_id, success))
    package.stop(success=success)

    db.session.add(package)
    db.session.commit()
    return '', 204
Пример #3
0
def post_releases_notes(release_id):
    """
    Add a note to a release

    :param string release_id: Release UUID
    :query string text: Text
    :return:
    """
    validate_request_json(request)
    text = request.json.get('text')
    if not text:
        raise InvalidUsage("Must include text in posted document")

    note = ReleaseNote(release_id, text)
    app.logger.info("Adding note to release {}".format(release_id))
    db.session.add(note)
    db.session.commit()
    return '', 204
Пример #4
0
def post_releases_notes(release_id):
    """
    Add a note to a release

    :param string release_id: Release UUID
    :query string text: Text
    :return:
    """
    validate_request_json(request)
    text = request.json.get('text')
    if not text:
        raise InvalidUsage("Must include text in posted document")

    note = ReleaseNote(release_id, text)
    app.logger.info("Adding note to release {}".format(release_id))
    db.session.add(note)
    db.session.commit()
    return '', 204
Пример #5
0
def post_releases_metadata(release_id):
    """
    Add metadata to a release

    :param string release_id: Release UUID
    :query string text: Text
    :return:
    """
    validate_request_json(request)
    meta = request
    if not meta:
        raise InvalidUsage("Must include metadata in posted document: es {\"key\" : \"value\"}")

    for key, value in request.json.items():
        app.logger.info("Adding Metadata to release {}".format(release_id))
        metadata = ReleaseMetadata(release_id, key, value)
        db.session.add(metadata)

    db.session.commit()
    return '', 204
Пример #6
0
def post_releases_metadata(release_id):
    """
    Add metadata to a release

    :param string release_id: Release UUID
    :query string text: Text
    :return:
    """
    validate_request_json(request)
    meta = request
    if not meta:
        raise InvalidUsage(
            "Must include metadata in posted document: es {\"key\" : "
            "\"value\"}")

    for key, value in request.json.items():
        app.logger.info("Adding Metadata to release {}".format(release_id))
        metadata = ReleaseMetadata(release_id, key, value)
        db.session.add(metadata)

    db.session.commit()
    return '', 204
Пример #7
0
def post_import():
    """
    Import a release.

    This endpoint is designed to created releases in bulk. It bypasses the normal workflow,
    and may be an option for those who wish to "publish" a release after the fact rather than step
    through as it happens.

    The document must contain a list of full releases, in json format. Example:

    .. code-block:: python

        [
            {
                "platforms": [
                  "GumtreeUK"
                ],
                "stime": "2015-12-17T17:02:04Z",
                "ftime": "2015-12-17T17:02:24Z",
                "team": "Gumtree UK Site Operations",
                "references": [
                  "TICKET-1"
                ],
                "notes": [
                  "Imported from other_system"
                ],
                "packages": [
                    {
                        "name": "",
                        "diff_url": null,
                        "stime": "2015-12-17T17:02:22Z"
                        "ftime": 1450371742,
                        "rollback": false,
                        "status": "SUCCESSFUL",
                        "version": "1.0.1",
                    }
                ],
                "user": "******"
            },
            {...}
        ]

    Timestamps can be any format understood by Arrow (note mix of unix time and ISO timestamps
    above).

    Status must be one of the enums accepted by `orlo.orm.Package.status`, i.e.:
    NOT_STARTED, IN_PROGRESS, SUCCESSFUL, FAILED

    A json null value is acceptable for non-required fields, or it can be omitted entirely.
    See `orlo.orm.Release` and `orlo.orm.Package`.

    **Example curl**:

    .. sourcecode:: shell

        curl -v -X POST -d @releases.json 'http://127.0.0.1:5000/releases/import' -H \
        "Content-Type: application/json"

    :status 200: The document was accepted
    """

    validate_request_json(request)

    releases = []
    for r in request.json:
        # Get the platform, create if it doesn't exist
        platforms = []
        for p in r['platforms']:
            try:
                query = db.session.query(Platform).filter(Platform.name == p)
                platform = query.one()
            except exc.NoResultFound:
                app.logger.info("Creating platform {}".format(p))
                platform = Platform(p)
                db.session.add(platform)
            platforms.append(platform)

        release = Release(
                platforms=platforms,
                user=r['user'],
                team=r.get('team'),
                references=json.dumps(r.get('references')),
        )

        release.stime = arrow.get(r['stime']) if r.get('stime') else None
        release.ftime = arrow.get(r['ftime']) if r.get('ftime') else None
        if release.ftime and release.stime:
            release.duration = release.ftime - release.stime

        notes = r.get('notes')
        if notes:
            for n in notes:
                note = ReleaseNote(release.id, n)
                db.session.add(note)

        for p in r['packages']:
            package = Package(
                    release_id=release.id,
                    name=p['name'],
                    version=p['version'],
            )

            package.rollback = p.get('rollback')
            package.status = p.get('status')
            package.diff_url = p.get('diff_url')

            if p.get('stime'):
                package.stime = arrow.get(p['stime'])
            else:
                package.stime = arrow.get(r['stime'])
            package.ftime = arrow.get(p['ftime']) if p.get('ftime') else None
            if package.stime and package.ftime:
                package.duration = package.ftime - package.stime

            db.session.add(package)

        db.session.add(release)
        db.session.commit()

        releases.append(release.id)

    return jsonify({'releases': [str(x) for x in releases]}), 200
Пример #8
0
def post_import():
    """
    Import a release.

    This endpoint is designed to created releases in bulk. It bypasses the normal workflow,
    and may be an option for those who wish to "publish" a release after the fact rather than step
    through as it happens.

    The document must contain a list of full releases, in json format. Example:

    .. code-block:: python

        [
            {
                "platforms": [
                  "GumtreeUK"
                ],
                "stime": "2015-12-17T17:02:04Z",
                "ftime": "2015-12-17T17:02:24Z",
                "team": "Gumtree UK Site Operations",
                "references": [
                  "TICKET-1"
                ],
                "notes": [
                  "Imported from other_system"
                ],
                "packages": [
                    {
                        "name": "",
                        "diff_url": null,
                        "stime": "2015-12-17T17:02:22Z"
                        "ftime": 1450371742,
                        "rollback": false,
                        "status": "SUCCESSFUL",
                        "version": "1.0.1",
                    }
                ],
                "user": "******"
            },
            {...}
        ]

    Timestamps can be any format understood by Arrow (note mix of unix time and ISO timestamps
    above).

    Status must be one of the enums accepted by `orlo.orm.Package.status`, i.e.:
    NOT_STARTED, IN_PROGRESS, SUCCESSFUL, FAILED

    A json null value is acceptable for non-required fields, or it can be omitted entirely.
    See `orlo.orm.Release` and `orlo.orm.Package`.

    **Example curl**:

    .. sourcecode:: shell

        curl -v -X POST -d @releases.json 'http://127.0.0.1:5000/releases/import' -H \
        "Content-Type: application/json"

    :status 200: The document was accepted
    """

    validate_request_json(request)

    releases = []
    for r in request.json:
        # Get the platform, create if it doesn't exist
        platforms = []
        for p in r['platforms']:
            try:
                query = db.session.query(Platform).filter(Platform.name == p)
                platform = query.one()
            except exc.NoResultFound:
                app.logger.info("Creating platform {}".format(p))
                platform = Platform(p)
                db.session.add(platform)
            platforms.append(platform)

        release = Release(
                platforms=platforms,
                user=r['user'],
                team=r.get('team'),
                references=json.dumps(r.get('references')),
        )

        release.stime = arrow.get(r['stime']) if r.get('stime') else None
        release.ftime = arrow.get(r['ftime']) if r.get('ftime') else None
        if release.ftime and release.stime:
            release.duration = release.ftime - release.stime

        notes = r.get('notes')
        if notes:
            for n in notes:
                note = ReleaseNote(release.id, n)
                db.session.add(note)

        for p in r['packages']:
            package = Package(
                    release_id=release.id,
                    name=p['name'],
                    version=p['version'],
            )

            package.rollback = p.get('rollback')
            package.status = p.get('status')
            package.diff_url = p.get('diff_url')

            if p.get('stime'):
                package.stime = arrow.get(p['stime'])
            else:
                package.stime = arrow.get(r['stime'])
            package.ftime = arrow.get(p['ftime']) if p.get('ftime') else None
            if package.stime and package.ftime:
                package.duration = package.ftime - package.stime

            db.session.add(package)

        db.session.add(release)
        db.session.commit()

        releases.append(release.id)

    return jsonify({'releases': [str(x) for x in releases]}), 200