Beispiel #1
0
    def _create_package(cls,
                        release_id,
                        name='test-package',
                        version='1.2.3',
                        diff_url=None,
                        rollback=False,
                        ):
        """
        Create a package using internal methods

        :param release_id:
        :param name:
        :param version:
        :param diff_url:
        :param rollback:
        :return:
        """
        p = Package(
            release_id=release_id,
            name=name,
            version=version,
            diff_url=diff_url,
            rollback=rollback,
        )
        db.session.add(p)
        db.session.commit()

        return p.id
Beispiel #2
0
    def create_release(self, normal, successful, user='******', team='test_team',
                       platform='test_platform'):
        release = Release(
                platforms=append_or_create_platforms([platform]),
                user=user,
                team=team,
                # references=list_to_string(['test_reference'])
        )
        release.stime = self.time_cursor
        db.session.add(release)

        for package in self.package_list:
            package = Package(
                release_id=release.id,
                name=package,
                version='0.0.0'
            )
            # which take 10 mins each...
            package.stime = self.time_cursor
            package.ftime = self.time_cursor = self.time_cursor + timedelta(minutes=10)
            if normal:
                package.rollback = False
            else:
                package.rollback = True
            if successful:
                package.status = 'SUCCESSFUL'
            else:
                package.status = 'FAILED'
            db.session.add(package)

        release.ftime = self.time_cursor
        release.duration = release.ftime - release.stime
        self.releases += 1
Beispiel #3
0
def create_package(release_id, request):
    """
    Create a package object for a release
    """

    return Package(
        release_id,
        request.json.get('name'),
        request.json.get('version'),
        diff_url=request.json.get('diff_url', None),
        rollback=request.json.get('rollback', False),
    )
Beispiel #4
0
    def create_release(self, normal, successful, user='******', team='test_team',
                       platform='test_platform'):
        release = Release(
                platforms=append_or_create_platforms([platform]),
                user=user,
                team=team,
                # references=list_to_string(['test_reference'])
        )
        release.stime = self.time_cursor
        db.session.add(release)

        for package in self.package_list:
            package = Package(
                release_id=release.id,
                name=package,
                version='0.0.0'
            )
            # which take 10 mins each...
            package.stime = self.time_cursor
            package.ftime = self.time_cursor = self.time_cursor + timedelta(minutes=10)
            if normal:
                package.rollback = False
            else:
                package.rollback = True
            if successful:
                package.status = 'SUCCESSFUL'
            else:
                package.status = 'FAILED'
            db.session.add(package)

        release.ftime = self.time_cursor
        release.duration = release.ftime - release.stime
        self.releases += 1
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
Beispiel #6
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