예제 #1
0
def test_get_latest_release():
    """
    Gets the latest release when the object's Version ID is not specified.
    """
    s3 = boto3.resource("s3")
    client = boto3.client("s3")

    s3.create_bucket(Bucket="test")
    bucket = s3.BucketVersioning("test")
    bucket.enable()

    with freeze_time("2018-01-01T12:00:00"):
        client.put_object(
            Bucket="test",
            Key="test-app",
            Body=json.dumps({
                "version": 1,
                "commit": "0123456789abcdef",
                "changelog": "some changes",
                "image":
                "sha256:eb1494dee949e52c20084672700c9961d7fc99d1be1c07b5492bc61c3b22a460",
                "author": "*****@*****.**",
            }),
        )

    with freeze_time("2018-02-02T00:00:00"):
        new = client.put_object(
            Bucket="test",
            Key="test-app",
            Body=json.dumps({
                "version": 2,
                "commit": "abcdef0123456789",
                "changelog": "some other changes to fix version 1",
                "image":
                "sha256:000dd6d0c34dd4bb2ec51316ec41f723dd546ef79b30e551ec8390d032707351",
                "author": "*****@*****.**",
            }),
        )

    expected = release.Release(
        version=2,
        commit="abcdef0123456789",
        changelog="some other changes to fix version 1",
        version_id=new["VersionId"],
        image=
        "sha256:000dd6d0c34dd4bb2ec51316ec41f723dd546ef79b30e551ec8390d032707351",
        timestamp=datetime(2018, 2, 2, 0, 0, 0, tzinfo=pytz.utc),
        author="*****@*****.**",
    )

    r = release.fetch_release(client, "test", "test-app", None)

    compare(expected, r)
예제 #2
0
def test_get_release_from_bucket():
    """
    Gets the release from an object stored in a S3 bucket.
    """
    s3 = boto3.resource("s3")
    client = boto3.client("s3")

    s3.create_bucket(Bucket="test")
    bucket = s3.BucketVersioning("test")
    bucket.enable()

    resp = client.put_object(
        Bucket="test",
        Key="test-app",
        Body=json.dumps({
            "version": 2,
            "commit": "0123456789abcdef",
            "changelog": "some changes",
            "image":
            "sha256:eb1494dee949e52c20084672700c9961d7fc99d1be1c07b5492bc61c3b22a460",
            "author": "*****@*****.**",
        }),
    )

    expected = release.Release(
        version=2,
        commit="0123456789abcdef",
        changelog="some changes",
        version_id=resp["VersionId"],
        image=
        "sha256:eb1494dee949e52c20084672700c9961d7fc99d1be1c07b5492bc61c3b22a460",
        timestamp=datetime(2018, 1, 1, 12, 0, 0, tzinfo=pytz.utc),
        author="*****@*****.**",
    )

    r = release.fetch_release(client, "test", "test-app", None)

    compare(expected, r)
예제 #3
0
def list_projects(
    contains, only, permissions, utc, env, releases_only, profile
) -> List[Project]:

    contains_oid = None
    repo = None

    if contains:
        repo = utils.git_repo()
        contains_oid = utils.revparse(repo, contains)
        if contains_oid not in repo:
            raise Exception(f"Commit {contains_oid} does not exist in repo")

    if only is not None:
        only = re.compile(only)

    if env is not None:
        env = set(env.split(","))

    client = utils.s3_client(profile)
    config = utils.get_config()
    release_bucket = config["release"]["s3_bucket"]
    deploys = config["deploy"]

    resp = client.list_objects_v2(Bucket=release_bucket)

    project_names = sorted(data["Key"] for data in resp.get("Contents", []))

    can_release = {}
    can_deploy = {}

    if permissions:
        iam_client = utils.iam_client(profile)

        can_release = check_perms(iam_client, release_bucket, project_names, profile)
        can_deploy = {
            env_name: check_perms(iam_client, cfg["s3_bucket"], project_names, profile)
            for env_name, cfg in deploys.items()
        }

    _projects = []

    now = datetime.now(tz=timezone.utc)
    localzone = get_localzone()

    for name in project_names:
        if only and only.search(name) is None:
            continue

        try:
            release = fetch_release(client, release_bucket, name)
        except InvalidRelease:
            continue

        timestamp_utc = release.timestamp
        timestamp = timestamp_utc if utc else timestamp_utc.astimezone(localzone)

        if releases_only or env is None:
            _projects.append(
                Project(
                    name=name,
                    version=release.version,
                    behind=0,
                    commit=release.commit,
                    timestamp=timestamp,
                    age=now - timestamp_utc,
                    type=ProjectType.release,
                    contains=(
                        release_contains(repo, release, contains_oid, name)
                        if contains
                        else None
                    ),
                    env_name="",
                    permission=can_release.get(name),
                    action_type=release.action_type,
                    author=release.author,
                )
            )

        if releases_only:
            continue

        for env_name, cfg in deploys.items():
            try:
                deploy = fetch_release(client, cfg["s3_bucket"], name)
            except InvalidRelease:
                continue

            timestamp_utc = deploy.timestamp
            timestamp = timestamp_utc if utc else timestamp_utc.astimezone(localzone)

            if not env or env_name in env:
                _projects.append(
                    Project(
                        name=name,
                        version=deploy.version,
                        behind=release.version - deploy.version,
                        commit=deploy.commit,
                        timestamp=timestamp,
                        age=now - timestamp_utc,
                        type=ProjectType.deploy,
                        env_name=env_name,
                        contains=(
                            release_contains(repo, deploy, contains_oid, name)
                            if contains
                            else None
                        ),
                        permission=can_deploy.get(env_name, {}).get(name),
                        action_type=deploy.action_type,
                        author=deploy.author,
                    )
                )

    return _projects