blob: 0f113aee37229bfb4efdd44032290b3465304688 [file] [log] [blame]
Mohammed Naser8613c862023-04-24 17:26:51 -04001#!/usr/bin/env python3
2
3import argparse
4import functools
5
6from docker_image import reference
7from oslo_config import cfg
8from oslo_log import log as logging
9from ruyaml import YAML
10import requests
11
12LOG = logging.getLogger(__name__)
13CONF = cfg.CONF
14
15
16@functools.cache
17def get_pinned_image(image_src):
18 image_ref = reference.Reference.parse(image_src)
19
20 if image_ref.domain() == "quay.io":
21 r = requests.get(
22 f"https://quay.io/api/v1/repository/{image_ref.path()}/tag/",
23 params={"specificTag": image_ref["tag"]},
24 )
25 r.raise_for_status()
26 digest = r.json()["tags"][0]["manifest_digest"]
27
28 return f"{image_ref.domain()}/{image_ref.path()}@{digest}"
29
30
31def main():
32 logging.register_options(CONF)
33 logging.setup(CONF, "atmosphere-bump-images")
34
35 parser = argparse.ArgumentParser("bump-images")
36 parser.add_argument(
37 "src", help="Path for default values file", type=argparse.FileType("r")
38 )
39 parser.add_argument("dst", help="Path for output file", type=argparse.FileType("w"))
40
41 args = parser.parse_args()
42
43 yaml = YAML(typ="rt")
44 data = yaml.load(args.src)
45
ricolinb8ab0172023-06-01 15:41:02 +080046 for image in data["_atmosphere_images"].ca.items:
47 token = data["_atmosphere_images"].ca.get(image, 2).value
Mohammed Naser8613c862023-04-24 17:26:51 -040048 if not token.startswith("# image-source: "):
49 LOG.info("Skipping image %s", image)
50 continue
51
52 image_src = token.replace("# image-source: ", "").strip()
53 pinned_image = get_pinned_image(image_src)
54
55 LOG.info("Pinning image %s from %s to %s", image, image_src, pinned_image)
ricolinb8ab0172023-06-01 15:41:02 +080056 data["_atmosphere_images"][image] = pinned_image
Mohammed Naser8613c862023-04-24 17:26:51 -040057
58 yaml.dump(data, args.dst)
59
60
61if __name__ == "__main__":
62 main()