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)
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)
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