feat: allow for custom registry

This patch adds a simple CLI which can mirror all the images needed
as well as allow for simple override for `atmosphere_image_repository`
for all images.
diff --git a/Dockerfile b/Dockerfile
index e89fbd4..d9468a7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,9 +14,9 @@
 ADD poetry.lock /app
 ADD pyproject.toml /app
 ENV POETRY_VIRTUALENVS_IN_PROJECT=true
-RUN poetry install --only main --no-root --no-interaction
+RUN poetry install --only main --extras operator --no-root --no-interaction
 ADD . /app
-RUN poetry install --only main --no-interaction
+RUN poetry install --only main --extras operator --no-interaction
 
 FROM python:3.10-slim AS kubectl
 ADD https://dl.k8s.io/release/v1.26.0/bin/linux/amd64/kubectl /kubectl
diff --git a/atmosphere/cmd/cli.py b/atmosphere/cmd/cli.py
new file mode 100644
index 0000000..93ef73f
--- /dev/null
+++ b/atmosphere/cmd/cli.py
@@ -0,0 +1,65 @@
+import shutil
+
+import click
+from oslo_concurrency import processutils
+from oslo_config import cfg
+from oslo_log import log as logging
+
+from atmosphere.operator import constants, utils
+
+CONF = cfg.CONF
+LOG = logging.getLogger(__name__)
+DOMAIN = "atmosphere"
+
+logging.register_options(CONF)
+logging.setup(CONF, DOMAIN)
+
+
+@click.group()
+def main():
+    pass
+
+
+@main.group()
+def image():
+    pass
+
+
+@image.command()
+@click.argument("destination")
+def mirror(destination):
+    crane_path = shutil.which("crane")
+
+    if crane_path is None:
+        raise click.UsageError(
+            "Crane is not installed. Please install it before running this command."
+        )
+
+    seen = []
+    for image in constants.IMAGE_LIST:
+        if constants.IMAGE_LIST[image] in seen:
+            continue
+
+        src = constants.IMAGE_LIST[image]
+        dst = utils.get_image_ref(image, override_registry=destination).string()
+
+        LOG.debug(f"Starting to mirror {src} to {dst}")
+
+        try:
+            processutils.execute(
+                crane_path,
+                "copy",
+                src,
+                dst,
+            )
+        except processutils.ProcessExecutionError as e:
+            if "401 Unauthorized" in e.stderr:
+                LOG.error(
+                    "Authentication failed. Please ensure you're logged in via Crane"
+                )
+                return
+
+            raise
+
+        seen.append(constants.IMAGE_LIST[image])
+        LOG.info(f"Successfully mirrored {src} to {dst}")
diff --git a/atmosphere/models/config.py b/atmosphere/models/config.py
index fada215..bb68d49 100644
--- a/atmosphere/models/config.py
+++ b/atmosphere/models/config.py
@@ -4,6 +4,7 @@
 from schematics import types
 from schematics.exceptions import ValidationError
 
+from atmosphere import utils
 from atmosphere.models import base
 
 CONFIG_FILE = os.environ.get("ATMOSPHERE_CONFIG", "/etc/atmosphere/config.toml")
@@ -88,8 +89,14 @@
 
 
 class MemcachedImagesConfig(base.Model):
-    memcached = types.StringType(default="docker.io/library/memcached:1.6.17")
-    exporter = types.StringType(default="quay.io/prometheus/memcached-exporter:v0.10.0")
+    memcached = types.StringType(
+        default=utils.get_image_ref_using_legacy_image_repository("memcached").string()
+    )
+    exporter = types.StringType(
+        default=utils.get_image_ref_using_legacy_image_repository(
+            "prometheus_memcached_exporter"
+        ).string()
+    )
 
 
 class MemcachedChartConfig(ChartConfig):
@@ -119,6 +126,7 @@
 
 
 class Config(base.Model):
+    image_repository = types.StringType()
     kube_prometheus_stack = types.ModelType(
         KubePrometheusStackChartConfig, default=KubePrometheusStackChartConfig()
     )
diff --git a/atmosphere/operator/constants.py b/atmosphere/operator/constants.py
new file mode 100644
index 0000000..19fc176
--- /dev/null
+++ b/atmosphere/operator/constants.py
@@ -0,0 +1,160 @@
+IMAGE_LIST = {
+    "alertmanager": "quay.io/prometheus/alertmanager:v0.24.0",
+    "atmosphere": "quay.io/vexxhost/atmosphere:0.12.0",  # x-release-please-version
+    "barbican_api": "quay.io/vexxhost/barbican:wallaby",
+    "barbican_db_sync": "quay.io/vexxhost/barbican:wallaby",
+    "bootstrap": "quay.io/vexxhost/heat:zed",
+    "ceph_config_helper": "quay.io/vexxhost/libvirtd:yoga-focal",
+    "cert_manager_cainjector": "quay.io/jetstack/cert-manager-cainjector:v1.7.1",
+    "cert_manager_cli": "quay.io/jetstack/cert-manager-ctl:v1.7.1",
+    "cert_manager_controller": "quay.io/jetstack/cert-manager-controller:v1.7.1",
+    "cert_manager_webhook": "quay.io/jetstack/cert-manager-webhook:v1.7.1",
+    "cilium_node": "quay.io/cilium/cilium:v1.10.7@sha256:e23f55e80e1988db083397987a89967aa204ad6fc32da243b9160fbcea29b0ca",  # noqa
+    "cilium_operator": "quay.io/cilium/operator-generic:v1.10.7@sha256:d0b491d8d8cb45862ed7f0410f65e7c141832f0f95262643fa5ff1edfcddcafe",  # noqa
+    "cinder_api": "quay.io/vexxhost/cinder:zed",
+    "cinder_backup_storage_init": "quay.io/vexxhost/cinder:zed",
+    "cinder_backup": "quay.io/vexxhost/cinder:zed",
+    "cinder_db_sync": "quay.io/vexxhost/cinder:zed",
+    "cinder_scheduler": "quay.io/vexxhost/cinder:zed",
+    "cinder_storage_init": "quay.io/vexxhost/cinder:zed",
+    "cinder_volume_usage_audit": "quay.io/vexxhost/cinder:zed",
+    "cinder_volume": "quay.io/vexxhost/cinder:zed",
+    "cluster_api_controller": "registry.k8s.io/cluster-api/cluster-api-controller:v1.3.0",
+    "cluster_api_kubeadm_bootstrap_controller": "registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:v1.3.0",
+    "cluster_api_kubeadm_control_plane_controller": "registry.k8s.io/cluster-api/kubeadm-control-plane-controller:v1.3.0",  # noqa
+    "cluster_api_openstack_controller": "gcr.io/k8s-staging-capi-openstack/capi-openstack-controller:nightly_main_20221109",  # noqa
+    "csi_node_driver_registrar": "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.4.0",
+    "csi_rbd_attacher": "k8s.gcr.io/sig-storage/csi-attacher:v3.4.0",
+    "csi_rbd_plugin": "quay.io/cephcsi/cephcsi:v3.5.1",
+    "csi_rbd_provisioner": "k8s.gcr.io/sig-storage/csi-provisioner:v3.1.0",
+    "csi_rbd_resizer": "k8s.gcr.io/sig-storage/csi-resizer:v1.3.0",
+    "csi_rbd_snapshotter": "k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.0",
+    "db_drop": "quay.io/vexxhost/heat:zed",
+    "db_init": "quay.io/vexxhost/heat:zed",
+    "dep_check": "quay.io/vexxhost/kubernetes-entrypoint:latest",
+    "designate_api": "quay.io/vexxhost/designate:zed",
+    "designate_central": "quay.io/vexxhost/designate:zed",
+    "designate_db_sync": "quay.io/vexxhost/designate:zed",
+    "designate_mdns": "quay.io/vexxhost/designate:zed",
+    "designate_producer": "quay.io/vexxhost/designate:zed",
+    "designate_sink": "quay.io/vexxhost/designate:zed",
+    "designate_worker": "quay.io/vexxhost/designate:zed",
+    "flux_helm_controller": "ghcr.io/fluxcd/helm-controller:v0.22.2",
+    "flux_kustomize_controller": "ghcr.io/fluxcd/kustomize-controller:v0.27.0",
+    "flux_notification_controller": "ghcr.io/fluxcd/notification-controller:v0.25.1",
+    "flux_source_controller": "ghcr.io/fluxcd/source-controller:v0.26.1",
+    "glance_api": "quay.io/vexxhost/glance:zed",
+    "glance_db_sync": "quay.io/vexxhost/glance:zed",
+    "glance_metadefs_load": "quay.io/vexxhost/glance:zed",
+    "glance_registry": "quay.io/vexxhost/glance:zed",
+    "glance_storage_init": "quay.io/vexxhost/glance:zed",
+    "grafana_sidecar": "quay.io/kiwigrid/k8s-sidecar:1.19.2",
+    "grafana": "docker.io/grafana/grafana:9.2.3",
+    "haproxy": "docker.io/library/haproxy:2.5",
+    "heat_api": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_cfn": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_cloudwatch": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_db_sync": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_engine_cleaner": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_engine": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "heat_purge_deleted": "us-docker.pkg.dev/vexxhost-infra/openstack/heat:wallaby",
+    "horizon_db_sync": "us-docker.pkg.dev/vexxhost-infra/openstack/horizon:wallaby",
+    "horizon": "us-docker.pkg.dev/vexxhost-infra/openstack/horizon:wallaby",
+    "ingress_nginx_controller": "k8s.gcr.io/ingress-nginx/controller:v1.1.1@sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de",  # noqa
+    "ingress_nginx_default_backend": "k8s.gcr.io/defaultbackend-amd64:1.5",
+    "ingress_nginx_kube_webhook_certgen": "k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660",  # noqa
+    "keepalived": "us-docker.pkg.dev/vexxhost-infra/openstack/keepalived:2.0.19",
+    "keystone_api": "quay.io/vexxhost/keystone:wallaby",
+    "keystone_credential_cleanup": "quay.io/vexxhost/heat:zed",
+    "keystone_credential_rotate": "quay.io/vexxhost/keystone:wallaby",
+    "keystone_credential_setup": "quay.io/vexxhost/keystone:wallaby",
+    "keystone_db_sync": "quay.io/vexxhost/keystone:wallaby",
+    "keystone_domain_manage": "quay.io/vexxhost/heat:zed",
+    "keystone_fernet_rotate": "quay.io/vexxhost/keystone:wallaby",
+    "keystone_fernet_setup": "quay.io/vexxhost/keystone:wallaby",
+    "ks_endpoints": "quay.io/vexxhost/heat:zed",
+    "ks_service": "quay.io/vexxhost/heat:zed",
+    "ks_user": "quay.io/vexxhost/heat:zed",
+    "kube_apiserver": "k8s.gcr.io/kube-apiserver:v1.22.17",
+    "kube_controller_manager": "k8s.gcr.io/kube-controller-manager:v1.22.17",
+    "kube_coredns": "k8s.gcr.io/coredns/coredns:v1.8.4",
+    "kube_etcd": "k8s.gcr.io/etcd:3.5.0-0",
+    "kube_proxy": "k8s.gcr.io/kube-proxy:v1.22.17",
+    "kube_scheduler": "k8s.gcr.io/kube-scheduler:v1.22.17",
+    "kube_state_metrics": "registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.6.0",
+    "libvirt": "quay.io/vexxhost/libvirtd:yoga-focal",
+    "magnum_api": "quay.io/vexxhost/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
+    "magnum_conductor": "quay.io/vexxhost/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
+    "magnum_db_sync": "quay.io/vexxhost/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
+    "magnum_registry": "docker.io/library/registry:2.7.1",
+    "memcached": "docker.io/library/memcached:1.6.17",
+    "neutron_bagpipe_bgp": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_coredns": "docker.io/coredns/coredns:1.9.3",
+    "neutron_db_sync": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_dhcp": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_ironic_agent": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_l2gw": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_l3": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_linuxbridge_agent": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_metadata": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_netns_cleanup_cron": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_openvswitch_agent": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_server": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_sriov_agent_init": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "neutron_sriov_agent": "us-docker.pkg.dev/vexxhost-infra/openstack/neutron:wallaby",
+    "node_feature_discovery": "k8s.gcr.io/nfd/node-feature-discovery:v0.11.2",
+    "nova_api": "quay.io/vexxhost/nova:wallaby",
+    "nova_archive_deleted_rows": "quay.io/vexxhost/nova:wallaby",
+    "nova_cell_setup_init": "quay.io/vexxhost/heat:zed",
+    "nova_cell_setup": "quay.io/vexxhost/nova:wallaby",
+    "nova_compute_ironic": "docker.io/kolla/ubuntu-source-nova-compute-ironic:wallaby",
+    "nova_compute_ssh": "quay.io/vexxhost/nova-ssh:wallaby",
+    "nova_compute": "quay.io/vexxhost/nova:wallaby",
+    "nova_conductor": "quay.io/vexxhost/nova:wallaby",
+    "nova_consoleauth": "quay.io/vexxhost/nova:wallaby",
+    "nova_db_sync": "quay.io/vexxhost/nova:wallaby",
+    "nova_novncproxy_assets": "quay.io/vexxhost/nova:wallaby",
+    "nova_novncproxy": "quay.io/vexxhost/nova:wallaby",
+    "nova_placement": "quay.io/vexxhost/nova:wallaby",
+    "nova_scheduler": "quay.io/vexxhost/nova:wallaby",
+    "nova_service_cleaner": "quay.io/vexxhost/cli:latest",
+    "nova_spiceproxy_assets": "quay.io/vexxhost/nova:wallaby",
+    "nova_spiceproxy": "quay.io/vexxhost/nova:wallaby",
+    "octavia_api": "quay.io/vexxhost/octavia:zed",
+    "octavia_db_sync": "quay.io/vexxhost/octavia:zed",
+    "octavia_health_manager_init": "quay.io/vexxhost/heat:zed",
+    "octavia_health_manager": "quay.io/vexxhost/octavia:zed",
+    "octavia_housekeeping": "quay.io/vexxhost/octavia:zed",
+    "octavia_worker": "quay.io/vexxhost/octavia:zed",
+    "openvswitch_db_server": "quay.io/vexxhost/openvswitch:2.17.3",
+    "openvswitch_vswitchd": "quay.io/vexxhost/openvswitch:2.17.3",
+    "percona_xtradb_cluster_haproxy": "docker.io/percona/percona-xtradb-cluster-operator:1.10.0-haproxy",
+    "percona_xtradb_cluster_operator": "docker.io/percona/percona-xtradb-cluster-operator:1.10.0",
+    "percona_xtradb_cluster": "docker.io/percona/percona-xtradb-cluster:5.7.39-31.61",
+    "placement_db_sync": "quay.io/vexxhost/placement:wallaby",
+    "placement": "quay.io/vexxhost/placement:wallaby",
+    "prometheus_config_reloader": "quay.io/prometheus-operator/prometheus-config-reloader:v0.60.1",
+    "prometheus_ethtool_exporter": "quay.io/vexxhost/ethtool-exporter:5f05120a743a71adcbceb9f8ee1d43ecc7c4183a",
+    "prometheus_ipmi_exporter": "us-docker.pkg.dev/vexxhost-infra/openstack/ipmi-exporter:1.4.0",
+    "prometheus_memcached_exporter": "quay.io/prometheus/memcached-exporter:v0.10.0",
+    "prometheus_mysqld_exporter": "quay.io/prometheus/mysqld-exporter:v0.14.0",
+    "prometheus_node_exporter": "quay.io/prometheus/node-exporter:v1.3.1",
+    "prometheus_openstack_exporter": "ghcr.io/openstack-exporter/openstack-exporter:1.6.0",
+    "prometheus_operator_kube_webhook_certgen": "k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.3.0",
+    "prometheus_operator": "quay.io/prometheus-operator/prometheus-operator:v0.60.1",
+    "prometheus_pushgateway": "docker.io/prom/pushgateway:v1.4.2",
+    "prometheus": "quay.io/prometheus/prometheus:v2.39.1",
+    "rabbit_init": "docker.io/library/rabbitmq:3.10.2-management",
+    "rabbitmq_cluster_operator": "docker.io/rabbitmqoperator/cluster-operator:1.13.1",
+    "rabbitmq_credential_updater": "docker.io/rabbitmqoperator/default-user-credential-updater:1.0.2",
+    "rabbitmq_server": "docker.io/library/rabbitmq:3.10.2-management",
+    "rabbitmq_topology_operator": "docker.io/rabbitmqoperator/messaging-topology-operator:1.6.0",
+    "senlin_api": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "senlin_conductor": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "senlin_db_sync": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "senlin_engine_cleaner": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "senlin_engine": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "senlin_health_manager": "us-docker.pkg.dev/vexxhost-infra/openstack/senlin:wallaby",
+    "skopeo": "quay.io/skopeo/stable:latest",
+    "tempest_run_tests": "us-docker.pkg.dev/vexxhost-infra/openstack/tempest:30.1.0-4",
+}
diff --git a/atmosphere/operator/tasks.py b/atmosphere/operator/tasks.py
index c9a5c6e..01710b3 100644
--- a/atmosphere/operator/tasks.py
+++ b/atmosphere/operator/tasks.py
@@ -13,6 +13,7 @@
 from tenacity import retry, retry_if_result, stop_after_delay, wait_fixed
 
 from atmosphere import clients
+from atmosphere.operator import constants, utils
 
 LOG = logging.getLogger(__name__)
 
@@ -56,21 +57,38 @@
 
 
 class InstallClusterApiTask(task.Task):
-    def execute(self):
+    def execute(self, spec: dict):
+        cluster_api_images = [
+            i for i in constants.IMAGE_LIST if i.startswith("cluster_api")
+        ]
+
         # TODO(mnaser): Move CAPI and CAPO to run on control plane
         manifests_path = pkg_resources.resource_filename(__name__, "manifests")
         manifest_files = glob.glob(os.path.join(manifests_path, "capi-*.yml"))
 
         for manifest in manifest_files:
             with open(manifest) as fd:
-                subprocess.check_call(
-                    "kubectl apply -f -",
-                    shell=True,
-                    stdin=fd,
-                    stdout=subprocess.DEVNULL,
-                    stderr=subprocess.DEVNULL,
+                data = fd.read()
+
+            # NOTE(mnaser): Replace all the images for Cluster API
+            for image in cluster_api_images:
+                data = data.replace(
+                    utils.get_image_ref(image).string(),
+                    utils.get_image_ref(
+                        image, override_registry=spec["imageRepository"]
+                    ).string(),
                 )
 
+            subprocess.run(
+                "kubectl apply -f -",
+                shell=True,
+                check=True,
+                input=data,
+                text=True,
+                stdout=subprocess.DEVNULL,
+                stderr=subprocess.DEVNULL,
+            )
+
 
 class RabbitmqCluster(pykube.objects.NamespacedAPIObject):
     version = "rabbitmq.com/v1beta1"
@@ -79,7 +97,9 @@
 
 
 class ApplyRabbitmqClusterTask(ApplyKubernetesObjectTask):
-    def execute(self, api: pykube.HTTPClient, namespace: str, chart_name: str) -> dict:
+    def execute(
+        self, api: pykube.HTTPClient, namespace: str, chart_name: str, spec: dict
+    ) -> dict:
         resource = RabbitmqCluster(
             api,
             {
@@ -90,6 +110,9 @@
                     "namespace": namespace,
                 },
                 "spec": {
+                    "image": utils.get_image_ref(
+                        "rabbitmq_server", override_registry=spec["imageRepository"]
+                    ).string(),
                     "affinity": {
                         "nodeAffinity": {
                             "requiredDuringSchedulingIgnoredDuringExecution": {
@@ -210,7 +233,6 @@
     def execute(
         self, api: pykube.HTTPClient, namespace: str, name: str, spec: dict
     ) -> pykube.ConfigMap:
-        image_repository = spec["imageRepository"]
         resource = pykube.ConfigMap(
             api,
             {
@@ -225,17 +247,11 @@
                         {
                             "images": {
                                 "tags": {
-                                    "bootstrap": f"{image_repository}/heat:zed",
-                                    "db_drop": f"{image_repository}/heat:zed",
-                                    "db_init": f"{image_repository}/heat:zed",
-                                    "dep_check": f"{image_repository}/kubernetes-entrypoint:latest",
-                                    "ks_endpoints": f"{image_repository}/heat:zed",
-                                    "ks_service": f"{image_repository}/heat:zed",
-                                    "ks_user": f"{image_repository}/heat:zed",
-                                    "magnum_api": f"{image_repository}/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
-                                    "magnum_conductor": f"{image_repository}/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
-                                    "magnum_db_sync": f"{image_repository}/magnum@sha256:46e7c910780864f4532ecc85574f159a36794f37aac6be65e4b48c46040ced17",  # noqa
-                                    "rabbit_init": f"{image_repository}/rabbitmq:3.8.23-management",
+                                    image_name: utils.get_image_ref(
+                                        image_name,
+                                        override_registry=spec["imageRepository"],
+                                    ).string()
+                                    for image_name in constants.IMAGE_LIST.keys()
                                 }
                             }
                         }
diff --git a/atmosphere/operator/utils.py b/atmosphere/operator/utils.py
new file mode 100644
index 0000000..fa8bf63
--- /dev/null
+++ b/atmosphere/operator/utils.py
@@ -0,0 +1,25 @@
+from docker_image import reference
+
+from atmosphere.operator import constants
+
+
+def get_image_ref(
+    image_name: str, override_registry: str = None
+) -> reference.Reference:
+    ref = reference.Reference.parse(constants.IMAGE_LIST[image_name])
+    if override_registry is None:
+        return ref
+
+    # NOTE(mnaser): We re-write the name of a few images to make sense of them
+    #               in the context of the override registry.
+    ref_name = ref.repository["path"].split("/")[-1]
+    if image_name == "skopeo":
+        ref_name = "skopeo-stable"
+
+    # NOTE(mnaser): Since the attributes inside of reference.Reference are not
+    #               determined during parse time, we need to re-parse the
+    #               string to get the correct attributes.
+    ref["name"] = "{}/{}".format(override_registry, ref_name)
+    ref = reference.Reference.parse(ref.string())
+
+    return ref
diff --git a/atmosphere/tasks/composite/openstack_helm.py b/atmosphere/tasks/composite/openstack_helm.py
index 04179ce..37d40dc 100644
--- a/atmosphere/tasks/composite/openstack_helm.py
+++ b/atmosphere/tasks/composite/openstack_helm.py
@@ -4,6 +4,7 @@
 import pykube
 import yaml
 
+from atmosphere import utils
 from atmosphere.models import config
 from atmosphere.models.openstack_helm import values
 from atmosphere.tasks import constants
@@ -225,13 +226,17 @@
                     "secretsName": "percona-xtradb",
                     "pxc": {
                         "size": 3,
-                        "image": "percona/percona-xtradb-cluster:5.7.39-31.61",
+                        "image": utils.get_image_ref_using_legacy_image_repository(
+                            "percona_xtradb_cluster"
+                        ).string(),
                         "autoRecovery": True,
                         "configuration": "[mysqld]\nmax_connections=8192\n",
                         "sidecars": [
                             {
                                 "name": "exporter",
-                                "image": "quay.io/prometheus/mysqld-exporter:v0.14.0",
+                                "image": utils.get_image_ref_using_legacy_image_repository(
+                                    "prometheus_mysqld_exporter"
+                                ).string(),
                                 "ports": [{"name": "metrics", "containerPort": 9104}],
                                 "livenessProbe": {
                                     "httpGet": {"path": "/", "port": 9104}
@@ -263,7 +268,9 @@
                     "haproxy": {
                         "enabled": True,
                         "size": 3,
-                        "image": "percona/percona-xtradb-cluster-operator:1.10.0-haproxy",
+                        "image": utils.get_image_ref_using_legacy_image_repository(
+                            "percona_xtradb_cluster_haproxy"
+                        ).string(),
                         "nodeSelector": {"openstack-control-plane": "enabled"},
                     },
                 },
@@ -299,6 +306,9 @@
                     "namespace": self._obj_namespace,
                 },
                 "spec": {
+                    "image": utils.get_image_ref_using_legacy_image_repository(
+                        "rabbitmq_server"
+                    ).string(),
                     "affinity": {
                         "nodeAffinity": {
                             "requiredDuringSchedulingIgnoredDuringExecution": {
diff --git a/atmosphere/tasks/constants.py b/atmosphere/tasks/constants.py
index 9c12613..00b1931 100644
--- a/atmosphere/tasks/constants.py
+++ b/atmosphere/tasks/constants.py
@@ -71,6 +71,14 @@
             "relabelings": PROMETHEUS_MONITOR_RELABELINGS_INSTANCE_TO_POD_NAME
         },
         "alertmanagerSpec": {
+            "image": {
+                "repository": utils.get_image_ref_using_legacy_image_repository(
+                    "alertmanager"
+                )["name"],
+                "tag": utils.get_image_ref_using_legacy_image_repository(
+                    "alertmanager"
+                )["tag"],
+            },
             "storage": {
                 "volumeClaimTemplate": {
                     "spec": {
@@ -84,6 +92,22 @@
         },
     },
     "grafana": {
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository("grafana")[
+                "name"
+            ],
+            "tag": utils.get_image_ref_using_legacy_image_repository("grafana")["tag"],
+        },
+        "sidecar": {
+            "image": {
+                "repository": utils.get_image_ref_using_legacy_image_repository(
+                    "grafana_sidecar"
+                )["name"],
+                "tag": utils.get_image_ref_using_legacy_image_repository(
+                    "grafana_sidecar"
+                )["tag"],
+            }
+        },
         "serviceMonitor": {
             "relabelings": PROMETHEUS_MONITOR_RELABELINGS_INSTANCE_TO_POD_NAME
         },
@@ -140,6 +164,14 @@
         }
     },
     "kube-state-metrics": {
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "kube_state_metrics"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "kube_state_metrics"
+            )["tag"],
+        },
         "prometheus": {
             "monitor": {
                 "relabelings": PROMETHEUS_MONITOR_RELABELINGS_INSTANCE_TO_POD_NAME
@@ -152,6 +184,14 @@
             "relabelings": PROMETHEUS_MONITOR_RELABELINGS_INSTANCE_TO_POD_NAME
         },
         "prometheusSpec": {
+            "image": {
+                "repository": utils.get_image_ref_using_legacy_image_repository(
+                    "prometheus"
+                )["name"],
+                "tag": utils.get_image_ref_using_legacy_image_repository("prometheus")[
+                    "tag"
+                ],
+            },
             "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
             "secrets": ["kube-prometheus-stack-etcd-client-cert"],
         },
@@ -296,13 +336,51 @@
         ],
     },
     "prometheusOperator": {
-        "admissionWebhooks": {"patch": NODE_SELECTOR_CONTROL_PLANE},
+        "admissionWebhooks": {
+            "patch": {
+                "image": {
+                    "repository": utils.get_image_ref_using_legacy_image_repository(
+                        "prometheus_operator_kube_webhook_certgen"
+                    )["name"],
+                    "tag": utils.get_image_ref_using_legacy_image_repository(
+                        "prometheus_operator_kube_webhook_certgen"
+                    )["tag"],
+                },
+                "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
+            }
+        },
         "serviceMonitor": {
             "relabelings": PROMETHEUS_MONITOR_RELABELINGS_INSTANCE_TO_POD_NAME
         },
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "prometheus_operator"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "prometheus_operator"
+            )["tag"],
+        },
+        "prometheusConfigReloader": {
+            "image": {
+                "repository": utils.get_image_ref_using_legacy_image_repository(
+                    "prometheus_config_reloader"
+                )["name"],
+                "tag": utils.get_image_ref_using_legacy_image_repository(
+                    "prometheus_config_reloader"
+                )["tag"],
+            }
+        },
     },
     "prometheus-node-exporter": {
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "prometheus_node_exporter"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "prometheus_node_exporter"
+            )["tag"],
+        },
         "extraArgs": [
             "--collector.diskstats.ignored-devices=^(ram|loop|nbd|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$",
             "--collector.filesystem.fs-types-exclude=^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|fuse.squashfuse_ll|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$",  # noqa: E501
@@ -325,6 +403,20 @@
 HELM_RELEASE_INGRESS_NGINX_VERSION = "4.0.17"
 HELM_RELEASE_INGRESS_NGINX_VALUES = {
     "controller": {
+        "image": {
+            "registry": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_controller"
+            ).repository["domain"],
+            "image": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_controller"
+            ).repository["path"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_controller"
+            )["tag"],
+            "digest": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_controller"
+            )["digest"],
+        },
         "config": {"proxy-buffer-size": "16k"},
         "dnsPolicy": "ClusterFirstWithHostNet",
         "hostNetwork": True,
@@ -333,9 +425,40 @@
         "kind": "DaemonSet",
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
         "service": {"type": "ClusterIP"},
-        "admissionWebhooks": {"port": 7443},
+        "admissionWebhooks": {
+            "port": 7443,
+            "patch": {
+                "image": {
+                    "registry": utils.get_image_ref_using_legacy_image_repository(
+                        "ingress_nginx_kube_webhook_certgen"
+                    ).repository["domain"],
+                    "image": utils.get_image_ref_using_legacy_image_repository(
+                        "ingress_nginx_kube_webhook_certgen"
+                    ).repository["path"],
+                    "tag": utils.get_image_ref_using_legacy_image_repository(
+                        "ingress_nginx_kube_webhook_certgen"
+                    )["tag"],
+                    "digest": utils.get_image_ref_using_legacy_image_repository(
+                        "ingress_nginx_kube_webhook_certgen"
+                    )["digest"],
+                }
+            },
+        },
     },
-    "defaultBackend": {"enabled": True},
+    "defaultBackend": {
+        "enabled": True,
+        "image": {
+            "registry": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_default_backend"
+            ).repository["domain"],
+            "image": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_default_backend"
+            ).repository["path"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "ingress_nginx_default_backend"
+            )["tag"],
+        },
+    },
     "tcp": {
         "5354": "openstack/minidns:5354",
     },
@@ -349,6 +472,14 @@
 HELM_RELEASE_CERT_MANAGER_VALUES = {
     "installCRDs": True,
     "featureGates": "AdditionalCertificateOutputFormats=true",
+    "image": {
+        "repository": utils.get_image_ref_using_legacy_image_repository(
+            "cert_manager_controller"
+        )["name"],
+        "tag": utils.get_image_ref_using_legacy_image_repository(
+            "cert_manager_controller"
+        )["tag"],
+    },
     "volumes": [
         {
             "name": "etc-ssl-certs",
@@ -370,41 +501,94 @@
             "--feature-gates=AdditionalCertificateOutputFormats=true",
         ],
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_webhook"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_webhook"
+            )["tag"],
+        },
     },
     "cainjector": {
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_cainjector"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_cainjector"
+            )["tag"],
+        },
     },
     "startupapicheck": {
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
+        "image": {
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_cli"
+            )["name"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "cert_manager_cli"
+            )["tag"],
+        },
     },
 }
 
 HELM_RELEASE_NODE_FEATURE_DISCOVERY_VALUES = {
-    "master": {"nodeSelector": NODE_SELECTOR_CONTROL_PLANE}
+    "image": {
+        "repository": utils.get_image_ref_using_legacy_image_repository(
+            "node_feature_discovery"
+        )["name"]
+    },
+    "master": {"nodeSelector": NODE_SELECTOR_CONTROL_PLANE},
 }
 
 HELM_RELEASE_RABBITMQ_OPERATOR_NAME = "rabbitmq-cluster-operator"
 HELM_RELEASE_RABBITMQ_OPERATOR_VERSION = "2.6.6"
 HELM_RELEASE_RABBITMQ_OPERATOR_VALUES = {
-    "rabbitmqImage": {"repository": "library/rabbitmq", "tag": "3.10.2-management"},
+    "global": {
+        "imageRegistry": utils.get_image_ref_using_legacy_image_repository(
+            "rabbitmq_cluster_operator"
+        ).repository["domain"],
+    },
+    "rabbitmqImage": {
+        "repository": utils.get_image_ref_using_legacy_image_repository(
+            "rabbitmq_server"
+        ).repository["path"],
+        "tag": utils.get_image_ref_using_legacy_image_repository("rabbitmq_server")[
+            "tag"
+        ],
+    },
     "credentialUpdaterImage": {
-        "repository": "rabbitmqoperator/default-user-credential-updater",
-        "tag": "1.0.2",
+        "repository": utils.get_image_ref_using_legacy_image_repository(
+            "rabbitmq_credential_updater"
+        ).repository["path"],
+        "tag": utils.get_image_ref_using_legacy_image_repository(
+            "rabbitmq_credential_updater"
+        )["tag"],
     },
     "clusterOperator": {
         "fullnameOverride": "rabbitmq-cluster-operator",
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
         "image": {
-            "repository": "rabbitmqoperator/cluster-operator",
-            "tag": "1.13.1",
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "rabbitmq_cluster_operator"
+            ).repository["path"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "rabbitmq_cluster_operator"
+            )["tag"],
         },
     },
     "msgTopologyOperator": {
         "fullnameOverride": "rabbitmq-messaging-topology-operator",
         "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
         "image": {
-            "repository": "rabbitmqoperator/messaging-topology-operator",
-            "tag": "1.6.0",
+            "repository": utils.get_image_ref_using_legacy_image_repository(
+                "rabbitmq_topology_operator"
+            ).repository["path"],
+            "tag": utils.get_image_ref_using_legacy_image_repository(
+                "rabbitmq_topology_operator"
+            )["tag"],
         },
     },
     "useCertManager": True,
@@ -418,6 +602,9 @@
 HELM_RELEASE_PXC_OPERATOR_NAME = "pxc-operator"
 HELM_RELEASE_PXC_OPERATOR_VERSION = "1.10.0"
 HELM_RELEASE_PXC_OPERATOR_VALUES = {
+    "image": utils.get_image_ref_using_legacy_image_repository(
+        "percona_xtradb_cluster_operator"
+    ).string(),
     "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
 }
 
diff --git a/atmosphere/utils.py b/atmosphere/utils.py
index c44db96..bdb0c3e 100644
--- a/atmosphere/utils.py
+++ b/atmosphere/utils.py
@@ -1,8 +1,31 @@
 import json
+import os
 
 import _jsonnet
+import tomli
+
+from atmosphere.operator import utils
+
+CONFIG_FILE = os.environ.get("ATMOSPHERE_CONFIG", "/etc/atmosphere/config.toml")
 
 
 def load_jsonnet_from_path(path: str) -> any:
     raw = _jsonnet.evaluate_file(path)
     return json.loads(raw)
+
+
+def get_legacy_image_repository(config_path: str = CONFIG_FILE) -> str or None:
+    with open(config_path, "rb") as fd:
+        data = tomli.load(fd)
+
+    if data.get("image_repository", ""):
+        return data["image_repository"]
+
+    return None
+
+
+def get_image_ref_using_legacy_image_repository(image_name: str) -> str:
+    return utils.get_image_ref(
+        image_name,
+        override_registry=get_legacy_image_repository(),
+    )
diff --git a/docs/user-guide/custom-registry.md b/docs/user-guide/custom-registry.md
new file mode 100644
index 0000000..48d32ac
--- /dev/null
+++ b/docs/user-guide/custom-registry.md
@@ -0,0 +1,36 @@
+# Custom Registry
+
+You can use your own local registry to store the Atmosphere images.  The scope
+of this document does not include how to setup a local registry.
+
+1. Mirror all images to your own registry
+
+   ```bash
+   atmosphere image mirror 192.168.0.20:5000/atmosphere
+   ```
+
+2. Update the Atmosphere image repository variable
+
+   ```yaml
+   atmosphere_image_repository: 192.168.0.20:5000/atmosphere
+   ```
+
+3. If needed, you can also set your registry to be an insecure registry inside
+   `containerd`:
+
+   ```yaml
+    containerd_insecure_registries:
+      - 192.168.0.20:5000/atmosphere
+    ```
+
+4. You can verify that all your images are running from your local registry by
+   running the following command:
+
+   ```bash
+   kubectl get pods --all-namespaces \
+      -o jsonpath="{.items[*].spec.containers[*].image}" | \
+         tr -s '[[:space:]]' '\n' | \
+         sort | \
+         uniq -c | \
+         sort -n
+   ```
diff --git a/molecule/default/tools/install-dependencies b/molecule/default/tools/install-dependencies
index c08b7ba..871117e 100755
--- a/molecule/default/tools/install-dependencies
+++ b/molecule/default/tools/install-dependencies
@@ -1,20 +1,8 @@
 #!/bin/sh -e
 
-# Install software dependencies
-if [ -f /etc/alpine-release ]; then
-  apk add docker-cli-buildx uuidgen
-fi
-
 # Generate image tag file
 IMAGE_TAG_FILE="${MOLECULE_EPHEMERAL_DIRECTORY}/image"
 echo "ttl.sh/$(uuidgen | tr '[:upper:]' '[:lower:]'):1d" > ${IMAGE_TAG_FILE}
 
 # Build operator image
 docker buildx build --platform linux/amd64 --tag $(cat ${IMAGE_TAG_FILE}) --push .
-
-# Install OpenStack SDK
-pip install \
-  --extra-index-url https://vexxhost.github.io/wheels/alpine-3.15/ \
-  netaddr \
-  tomli-w \
-  'openstacksdk<0.99.0'
diff --git a/plugins/lookup/image_ref.py b/plugins/lookup/image_ref.py
new file mode 100644
index 0000000..b4adc60
--- /dev/null
+++ b/plugins/lookup/image_ref.py
@@ -0,0 +1,44 @@
+from ansible.plugins.lookup import LookupBase
+
+from atmosphere.operator import utils
+
+DOCUMENTATION = """
+  name: image_ref
+  author: Mohammed Naser (@mnaser) <mnaser@vexxhost.com>
+  version_added: "0.13"
+  short_description: Lookup image reference
+  description:
+    - This lookup returns the image reference for a given image tag
+  options:
+    _terms:
+      description: tag(s) of images to generate
+      required: True
+    output:
+      type: string
+      required: True
+      choices:
+        - name
+        - ref
+"""
+
+
+class LookupModule(LookupBase):
+    def run(self, terms, variables=None, **kwargs):
+        if variables is not None:
+            self._templar.available_variables = variables
+        vars = getattr(self._templar, "_available_variables", {})
+
+        self.set_options(var_options=variables, direct=kwargs)
+
+        ret = []
+        registry = vars.get("atmosphere_image_repository", None)
+        output = self.get_option("output")
+
+        for term in terms:
+            ref = utils.get_image_ref(term, override_registry=registry)
+            if output == "name":
+                ret.append(ref["name"])
+            if output == "ref":
+                ret.append(ref.string())
+
+        return ret
diff --git a/poetry.lock b/poetry.lock
index a16cd7c..24424df 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -3,7 +3,7 @@
 version = "3.8.3"
 description = "Async http client/server framework (asyncio)"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [package.dependencies]
@@ -23,7 +23,7 @@
 version = "1.3.1"
 description = "aiosignal: a list of registered asynchronous callbacks"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.dependencies]
@@ -31,7 +31,7 @@
 
 [[package]]
 name = "ansible-compat"
-version = "2.2.5"
+version = "2.2.7"
 description = "Ansible compatibility goodies"
 category = "dev"
 optional = false
@@ -45,11 +45,11 @@
 
 [package.extras]
 docs = ["myst-parser", "sphinx (>=5.3.0)", "sphinx-ansible-theme", "sphinx-autobuild (>=2021.3.14)"]
-test = ["coverage", "flaky", "pip-tools", "pytest (>=7.2.0)", "pytest-mock", "pytest-plus"]
+test = ["coverage", "pip-tools", "pytest (>=7.2.0)", "pytest-mock", "pytest-plus"]
 
 [[package]]
 name = "ansible-core"
-version = "2.14.0"
+version = "2.14.1"
 description = "Radically simple IT automation"
 category = "dev"
 optional = false
@@ -67,7 +67,7 @@
 version = "1.4.4"
 description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -86,7 +86,7 @@
 version = "1.5.1"
 description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -94,29 +94,31 @@
 version = "4.0.2"
 description = "Timeout context manager for asyncio programs"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [[package]]
 name = "attrs"
-version = "22.1.0"
+version = "22.2.0"
 description = "Classes Without Boilerplate"
 category = "main"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.extras]
-dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"]
-docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"]
-tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"]
-tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
+cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"]
+dev = ["attrs[docs,tests]"]
+docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"]
+tests = ["attrs[tests-no-zope]", "zope.interface"]
+tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
+tests_no_zope = ["cloudpickle", "hypothesis", "mypy (>=0.971,<0.990)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"]
 
 [[package]]
 name = "automaton"
 version = "3.0.1"
 description = "Friendly state machines for python."
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.8"
 
 [package.dependencies]
@@ -124,17 +126,6 @@
 PrettyTable = ">=0.7.2"
 
 [[package]]
-name = "better-exceptions"
-version = "0.3.3"
-description = "Pretty and helpful exceptions, automatically"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-
-[[package]]
 name = "binaryornot"
 version = "0.4.4"
 description = "Ultra-lightweight pure Python package to check if a file is binary or text."
@@ -150,7 +141,7 @@
 version = "5.2.0"
 description = "Extensible memoizing collections and decorators"
 category = "main"
-optional = false
+optional = true
 python-versions = "~=3.7"
 
 [[package]]
@@ -158,7 +149,7 @@
 version = "0.14.2"
 description = "Creates and signs X.509 certificates"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
@@ -167,7 +158,7 @@
 
 [[package]]
 name = "certifi"
-version = "2022.9.24"
+version = "2022.12.7"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "main"
 optional = false
@@ -186,11 +177,11 @@
 
 [[package]]
 name = "chardet"
-version = "5.0.0"
+version = "5.1.0"
 description = "Universal encoding detector for Python 3"
 category = "dev"
 optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
 
 [[package]]
 name = "charset-normalizer"
@@ -240,7 +231,7 @@
 name = "commonmark"
 version = "0.9.1"
 description = "Python parser for the CommonMark Markdown spec"
-category = "main"
+category = "dev"
 optional = false
 python-versions = "*"
 
@@ -266,7 +257,7 @@
 
 [[package]]
 name = "coverage"
-version = "6.5.0"
+version = "7.0.1"
 description = "Code coverage measurement for Python"
 category = "dev"
 optional = false
@@ -313,7 +304,7 @@
 version = "5.1.1"
 description = "Decorators for Humans"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.5"
 
 [[package]]
@@ -321,7 +312,7 @@
 version = "2.2.1"
 description = "DNS toolkit"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6,<4.0"
 
 [package.extras]
@@ -333,11 +324,22 @@
 wmi = ["wmi (>=1.5.1,<2.0.0)"]
 
 [[package]]
+name = "docker-image-py"
+version = "0.1.12"
+description = "Parse docker image as distribution does."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+regex = ">=2019.4.14"
+
+[[package]]
 name = "dogpile.cache"
 version = "1.1.8"
 description = "A caching front-end based on the Dogpile lock."
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [package.dependencies]
@@ -363,7 +365,7 @@
 version = "0.33.2"
 description = "Highly concurrent networking library"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
@@ -373,7 +375,7 @@
 
 [[package]]
 name = "exceptiongroup"
-version = "1.0.4"
+version = "1.1.0"
 description = "Backport of PEP 654 (exception groups)"
 category = "dev"
 optional = false
@@ -423,7 +425,7 @@
 version = "1.3.3"
 description = "A list-like structure which implements collections.abc.MutableSequence"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [[package]]
@@ -431,7 +433,7 @@
 version = "2.4.1"
 description = "Useful additions to futures, from the future."
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [[package]]
@@ -453,7 +455,7 @@
 version = "2.0.1"
 description = "Lightweight in-process concurrent programming"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 
 [package.extras]
@@ -486,17 +488,17 @@
 
 [[package]]
 name = "isort"
-version = "5.10.1"
+version = "5.11.4"
 description = "A Python utility / library to sort Python imports."
 category = "dev"
 optional = false
-python-versions = ">=3.6.1,<4.0"
+python-versions = ">=3.7.0"
 
 [package.extras]
 colors = ["colorama (>=0.4.3,<0.5.0)"]
-pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
+pipfile-deprecated-finder = ["pipreqs", "requirementslib"]
 plugins = ["setuptools"]
-requirements_deprecated_finder = ["pip-api", "pipreqs"]
+requirements-deprecated-finder = ["pip-api", "pipreqs"]
 
 [[package]]
 name = "Jinja2"
@@ -548,7 +550,7 @@
 version = "0.18.0"
 description = "Python bindings for Jsonnet - The data templating language"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -556,7 +558,7 @@
 version = "1.32"
 description = "Apply JSON-Patches (RFC 6902)"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.dependencies]
@@ -567,12 +569,12 @@
 version = "2.3"
 description = "Identify specific nodes in a JSON document (RFC 6901)"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
 name = "jsonschema"
-version = "4.17.1"
+version = "4.17.3"
 description = "An implementation of JSON Schema validation for Python"
 category = "main"
 optional = false
@@ -591,7 +593,7 @@
 version = "5.1.0"
 description = "Authentication Library for OpenStack Identity"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
@@ -614,7 +616,7 @@
 version = "1.36.0"
 description = "Kubernetes Operator Pythonic Framework (Kopf)"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.dependencies]
@@ -692,7 +694,7 @@
 
 [[package]]
 name = "mkdocs-material"
-version = "8.5.10"
+version = "8.5.11"
 description = "Documentation that simply works"
 category = "dev"
 optional = false
@@ -717,7 +719,7 @@
 
 [[package]]
 name = "molecule"
-version = "4.0.3"
+version = "4.0.4"
 description = "Molecule aids in the development and testing of Ansible roles"
 category = "dev"
 optional = false
@@ -754,10 +756,10 @@
 
 [[package]]
 name = "multidict"
-version = "6.0.2"
+version = "6.0.4"
 description = "multidict implementation"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [[package]]
@@ -765,7 +767,7 @@
 version = "2.5.0"
 description = "A dot-accessible dictionary (a la JavaScript objects)"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
@@ -796,7 +798,7 @@
 version = "2.8.8"
 description = "Python package for creating and manipulating graphs and networks"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.8"
 
 [package.extras]
@@ -811,7 +813,7 @@
 version = "0.103.0"
 description = "An SDK for building applications to work with OpenStack"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [package.dependencies]
@@ -835,7 +837,7 @@
 version = "1.7.0"
 description = "Python library for consuming OpenStack sevice-types-authority data"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
@@ -846,13 +848,61 @@
 version = "1.3.0"
 description = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD."
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [package.dependencies]
 asn1crypto = ">=1.5.1"
 
 [[package]]
+name = "oslo.concurrency"
+version = "5.0.1"
+description = "Oslo Concurrency library"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+fasteners = ">=0.7.0"
+"oslo.config" = ">=5.2.0"
+"oslo.i18n" = ">=3.15.3"
+"oslo.utils" = ">=3.33.0"
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+
+[[package]]
+name = "oslo.config"
+version = "9.0.0"
+description = "Oslo Configuration API"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+debtcollector = ">=1.2.0"
+netaddr = ">=0.7.18"
+"oslo.i18n" = ">=3.15.3"
+PyYAML = ">=5.1"
+requests = ">=2.18.0"
+rfc3986 = ">=1.2.0"
+stevedore = ">=1.20.0"
+
+[package.extras]
+rst_generator = ["rst2txt (>=1.1.0)", "sphinx (>=1.8.0,!=2.1.0)"]
+test = ["bandit (>=1.6.0,<1.7.0)", "coverage (>=4.0,!=4.4)", "fixtures (>=3.0.0)", "hacking (>=3.0.1,<3.1.0)", "mypy (>=0.720)", "oslo.log (>=3.36.0)", "oslotest (>=3.2.0)", "pre-commit (>=2.6.0)", "requests-mock (>=1.5.0)", "stestr (>=2.1.0)", "testscenarios (>=0.4)", "testtools (>=2.2.0)"]
+
+[[package]]
+name = "oslo.context"
+version = "5.0.0"
+description = "Oslo Context library"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+debtcollector = ">=1.2.0"
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+
+[[package]]
 name = "oslo.i18n"
 version = "5.1.0"
 description = "Oslo i18n library"
@@ -864,6 +914,30 @@
 pbr = ">=2.0.0,<2.1.0 || >2.1.0"
 
 [[package]]
+name = "oslo.log"
+version = "5.0.2"
+description = "oslo.log library"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+debtcollector = ">=1.19.0"
+"oslo.config" = ">=5.2.0"
+"oslo.context" = ">=2.21.0"
+"oslo.i18n" = ">=3.20.0"
+"oslo.serialization" = ">=2.25.0"
+"oslo.utils" = ">=3.36.0"
+pbr = ">=3.1.1"
+pyinotify = {version = ">=0.9.6", markers = "sys_platform != \"win32\" and sys_platform != \"darwin\" and sys_platform != \"sunos5\""}
+python-dateutil = ">=2.7.0"
+
+[package.extras]
+fixtures = ["fixtures (>=3.0.0)"]
+systemd = ["systemd-python (>=234)"]
+test = ["bandit (>=1.6.0,<1.7.0)", "coverage (>=4.5.1)", "eventlet (>=0.30.1,!=0.32.0)", "fixtures (>=3.0.0)", "hacking (>=2.0.0,<2.1.0)", "oslotest (>=3.3.0)", "pre-commit (>=2.6.0)", "stestr (>=2.0.0)", "testtools (>=2.3.0)"]
+
+[[package]]
 name = "oslo.serialization"
 version = "5.0.0"
 description = "Oslo Serialization library"
@@ -897,14 +971,11 @@
 
 [[package]]
 name = "packaging"
-version = "21.3"
+version = "22.0"
 description = "Core utilities for Python packages"
 category = "main"
 optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+python-versions = ">=3.7"
 
 [[package]]
 name = "pbr"
@@ -931,7 +1002,7 @@
 version = "3.5.0"
 description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.dependencies]
@@ -976,7 +1047,7 @@
 version = "1.4.2"
 description = "Python interface to Graphviz's Dot"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [package.dependencies]
@@ -994,7 +1065,7 @@
 name = "Pygments"
 version = "2.13.0"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
+category = "dev"
 optional = false
 python-versions = ">=3.6"
 
@@ -1002,6 +1073,14 @@
 plugins = ["importlib-metadata"]
 
 [[package]]
+name = "pyinotify"
+version = "0.9.6"
+description = "Linux filesystem events monitoring"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
 name = "pykube-ng"
 version = "22.9.0"
 description = "Python client library for Kubernetes"
@@ -1085,7 +1164,7 @@
 
 [[package]]
 name = "pytest-kind"
-version = "22.9.0"
+version = "22.11.1"
 description = "Kubernetes test support with KIND for pytest"
 category = "dev"
 optional = false
@@ -1112,7 +1191,7 @@
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
-category = "dev"
+category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 
@@ -1124,7 +1203,7 @@
 version = "2.0.4"
 description = "A python library adding a json log formatter"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.5"
 
 [[package]]
@@ -1158,7 +1237,7 @@
 
 [[package]]
 name = "pytz"
-version = "2022.6"
+version = "2022.7"
 description = "World timezone definitions, modern and historical"
 category = "main"
 optional = false
@@ -1184,6 +1263,14 @@
 pyyaml = "*"
 
 [[package]]
+name = "regex"
+version = "2022.10.31"
+description = "Alternative regular expression module, to replace re."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
 name = "requests"
 version = "2.28.1"
 description = "Python HTTP for Humans."
@@ -1206,7 +1293,7 @@
 version = "1.4.0"
 description = "Import exceptions from potentially bundled packages in requests."
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -1224,10 +1311,21 @@
 test = ["commentjson", "packaging", "pytest"]
 
 [[package]]
+name = "rfc3986"
+version = "2.0.0"
+description = "Validating URI References per RFC 3986"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+idna2008 = ["idna"]
+
+[[package]]
 name = "rich"
 version = "12.6.0"
 description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-category = "main"
+category = "dev"
 optional = false
 python-versions = ">=3.6.3,<4.0.0"
 
@@ -1243,7 +1341,7 @@
 version = "2.1.1"
 description = "Python Data Structures for Humans"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -1270,7 +1368,7 @@
 version = "22.3.0"
 description = "Structured Logging for Python"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.extras]
@@ -1281,7 +1379,7 @@
 
 [[package]]
 name = "subprocess-tee"
-version = "0.4.0"
+version = "0.4.1"
 description = "subprocess-tee"
 category = "dev"
 optional = false
@@ -1295,7 +1393,7 @@
 version = "5.0.0"
 description = "Taskflow structured state management library."
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.8"
 
 [package.dependencies]
@@ -1325,7 +1423,7 @@
 version = "8.1.0"
 description = "Retry code until it succeeds"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.6"
 
 [package.extras]
@@ -1351,7 +1449,7 @@
 name = "tomli-w"
 version = "1.0.0"
 description = "A lil' TOML writer"
-category = "main"
+category = "dev"
 optional = false
 python-versions = ">=3.7"
 
@@ -1415,7 +1513,7 @@
 version = "0.17.0"
 description = "Fast implementation of asyncio event loop on top of libuv"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.extras]
@@ -1425,7 +1523,7 @@
 
 [[package]]
 name = "watchdog"
-version = "2.1.9"
+version = "2.2.0"
 description = "Filesystem events monitoring"
 category = "dev"
 optional = false
@@ -1439,7 +1537,7 @@
 version = "0.2.5"
 description = "Measures the displayed width of unicode strings in a terminal"
 category = "main"
-optional = false
+optional = true
 python-versions = "*"
 
 [[package]]
@@ -1452,20 +1550,23 @@
 
 [[package]]
 name = "yarl"
-version = "1.8.1"
+version = "1.8.2"
 description = "Yet another URL library"
 category = "main"
-optional = false
+optional = true
 python-versions = ">=3.7"
 
 [package.dependencies]
 idna = ">=2.0"
 multidict = ">=4.0"
 
+[extras]
+operator = ["schematics", "pykube-ng", "structlog", "mergedeep", "taskflow", "eventlet", "tomli", "jsonnet", "kopf", "openstacksdk", "certbuilder"]
+
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.10"
-content-hash = "4f0572f41c5627cb1ce1fb4d0a40fd77b1b5b24bb83592a824759c45d7741e14"
+content-hash = "4cfb74eb377030e130db915104c6c87052f28fcd1c6908b06e8e85ffadce6700"
 
 [metadata.files]
 aiohttp = [
@@ -1562,12 +1663,12 @@
     {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"},
 ]
 ansible-compat = [
-    {file = "ansible-compat-2.2.5.tar.gz", hash = "sha256:28c7c545fd60ef9c3059cfb2fefd27f92db091ff6b5868f83f121ceb5e1fe1b5"},
-    {file = "ansible_compat-2.2.5-py3-none-any.whl", hash = "sha256:ad5f10019a54283ae8e61a80c4c427c73a242167182c0d738018262e931476e3"},
+    {file = "ansible-compat-2.2.7.tar.gz", hash = "sha256:08deddcd0a1dc6baabe674b07c6ff882118492c123d281f56f01905271a7ffc4"},
+    {file = "ansible_compat-2.2.7-py3-none-any.whl", hash = "sha256:77fd80841279d8b0664df61faab65c32275d1a2b0079f60bf30c3d44251f6301"},
 ]
 ansible-core = [
-    {file = "ansible-core-2.14.0.tar.gz", hash = "sha256:fa48b481cb623bf79bb903f223097681a0c13e1b4ec7e78e7dd7d858d36a34b2"},
-    {file = "ansible_core-2.14.0-py3-none-any.whl", hash = "sha256:b191d397c81514bd1922e00e16f0b8ec52e0bcb19b61cc4500085f5f92470cf2"},
+    {file = "ansible-core-2.14.1.tar.gz", hash = "sha256:589257f2560fffd5d4465352cd4504e2cbfc418ba49e0c4265cd54e16070c938"},
+    {file = "ansible_core-2.14.1-py3-none-any.whl", hash = "sha256:06e136c8eda4d8695251995d3c3efa612ebb3ac66948bf42492d4c7b46a75ff2"},
 ]
 appdirs = [
     {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
@@ -1586,17 +1687,13 @@
     {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"},
 ]
 attrs = [
-    {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
-    {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
+    {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
+    {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
 ]
 automaton = [
     {file = "automaton-3.0.1-py3-none-any.whl", hash = "sha256:bb5d2f385accbe3724cbd2c28808d7d69375b09a6c03e8e3ef2980df20929c6e"},
     {file = "automaton-3.0.1.tar.gz", hash = "sha256:1004a4787c241a62ccab255c414207b93f5fdc8509a022590d05bdeb3807cb76"},
 ]
-better-exceptions = [
-    {file = "better_exceptions-0.3.3-py3-none-any.whl", hash = "sha256:9c70b1c61d5a179b84cd2c9d62c3324b667d74286207343645ed4306fdaad976"},
-    {file = "better_exceptions-0.3.3.tar.gz", hash = "sha256:e4e6bc18444d5f04e6e894b10381e5e921d3d544240418162c7db57e9eb3453b"},
-]
 binaryornot = [
     {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"},
     {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"},
@@ -1610,8 +1707,8 @@
     {file = "certbuilder-0.14.2.tar.gz", hash = "sha256:56a8aee8ed31a211678647797dfdcdc85ec25d5d1bb1515e44ebae45cce363f9"},
 ]
 certifi = [
-    {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"},
-    {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"},
+    {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"},
+    {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"},
 ]
 cffi = [
     {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"},
@@ -1680,8 +1777,8 @@
     {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"},
 ]
 chardet = [
-    {file = "chardet-5.0.0-py3-none-any.whl", hash = "sha256:d3e64f022d254183001eccc5db4040520c0f23b1a3f33d6413e099eb7f126557"},
-    {file = "chardet-5.0.0.tar.gz", hash = "sha256:0368df2bfd78b5fc20572bb4e9bb7fb53e2c094f60ae9993339e8671d0afb8aa"},
+    {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"},
+    {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"},
 ]
 charset-normalizer = [
     {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"},
@@ -1708,56 +1805,57 @@
     {file = "cookiecutter-2.1.1.tar.gz", hash = "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5"},
 ]
 coverage = [
-    {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"},
-    {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"},
-    {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"},
-    {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"},
-    {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"},
-    {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"},
-    {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"},
-    {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"},
-    {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"},
-    {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"},
-    {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"},
-    {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"},
-    {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"},
-    {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"},
-    {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"},
-    {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"},
-    {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"},
-    {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"},
-    {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"},
-    {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"},
-    {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"},
-    {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"},
-    {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"},
-    {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"},
-    {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"},
-    {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"},
-    {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"},
-    {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"},
-    {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"},
-    {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"},
-    {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"},
-    {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"},
-    {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"},
-    {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"},
-    {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"},
-    {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"},
-    {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"},
-    {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"},
-    {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"},
-    {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"},
-    {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"},
-    {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"},
-    {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"},
-    {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"},
-    {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"},
-    {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"},
-    {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"},
-    {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"},
-    {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"},
-    {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"},
+    {file = "coverage-7.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b3695c4f4750bca943b3e1f74ad4be8d29e4aeab927d50772c41359107bd5d5c"},
+    {file = "coverage-7.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa6a5a224b7f4cfb226f4fc55a57e8537fcc096f42219128c2c74c0e7d0953e1"},
+    {file = "coverage-7.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74f70cd92669394eaf8d7756d1b195c8032cf7bbbdfce3bc489d4e15b3b8cf73"},
+    {file = "coverage-7.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b66bb21a23680dee0be66557dc6b02a3152ddb55edf9f6723fa4a93368f7158d"},
+    {file = "coverage-7.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d87717959d4d0ee9db08a0f1d80d21eb585aafe30f9b0a54ecf779a69cb015f6"},
+    {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:854f22fa361d1ff914c7efa347398374cc7d567bdafa48ac3aa22334650dfba2"},
+    {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1e414dc32ee5c3f36544ea466b6f52f28a7af788653744b8570d0bf12ff34bc0"},
+    {file = "coverage-7.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6c5ad996c6fa4d8ed669cfa1e8551348729d008a2caf81489ab9ea67cfbc7498"},
+    {file = "coverage-7.0.1-cp310-cp310-win32.whl", hash = "sha256:691571f31ace1837838b7e421d3a09a8c00b4aac32efacb4fc9bd0a5c647d25a"},
+    {file = "coverage-7.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:89caf4425fe88889e2973a8e9a3f6f5f9bbe5dd411d7d521e86428c08a873a4a"},
+    {file = "coverage-7.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:63d56165a7c76265468d7e0c5548215a5ba515fc2cba5232d17df97bffa10f6c"},
+    {file = "coverage-7.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f943a3b2bc520102dd3e0bb465e1286e12c9a54f58accd71b9e65324d9c7c01"},
+    {file = "coverage-7.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:830525361249dc4cd013652b0efad645a385707a5ae49350c894b67d23fbb07c"},
+    {file = "coverage-7.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd1b9c5adc066db699ccf7fa839189a649afcdd9e02cb5dc9d24e67e7922737d"},
+    {file = "coverage-7.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c14720b8b3b6c23b487e70bd406abafc976ddc50490f645166f111c419c39"},
+    {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d55d840e1b8c0002fce66443e124e8581f30f9ead2e54fbf6709fb593181f2c"},
+    {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:66b18c3cf8bbab0cce0d7b9e4262dc830e93588986865a8c78ab2ae324b3ed56"},
+    {file = "coverage-7.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:12a5aa77783d49e05439fbe6e6b427484f8a0f9f456b46a51d8aac022cfd024d"},
+    {file = "coverage-7.0.1-cp311-cp311-win32.whl", hash = "sha256:b77015d1cb8fe941be1222a5a8b4e3fbca88180cfa7e2d4a4e58aeabadef0ab7"},
+    {file = "coverage-7.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb992c47cb1e5bd6a01e97182400bcc2ba2077080a17fcd7be23aaa6e572e390"},
+    {file = "coverage-7.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e78e9dcbf4f3853d3ae18a8f9272111242531535ec9e1009fa8ec4a2b74557dc"},
+    {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60bef2e2416f15fdc05772bf87db06c6a6f9870d1db08fdd019fbec98ae24a9"},
+    {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9823e4789ab70f3ec88724bba1a203f2856331986cd893dedbe3e23a6cfc1e4e"},
+    {file = "coverage-7.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9158f8fb06747ac17bd237930c4372336edc85b6e13bdc778e60f9d685c3ca37"},
+    {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:486ee81fa694b4b796fc5617e376326a088f7b9729c74d9defa211813f3861e4"},
+    {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1285648428a6101b5f41a18991c84f1c3959cee359e51b8375c5882fc364a13f"},
+    {file = "coverage-7.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2c44fcfb3781b41409d0f060a4ed748537557de9362a8a9282182fafb7a76ab4"},
+    {file = "coverage-7.0.1-cp37-cp37m-win32.whl", hash = "sha256:d6814854c02cbcd9c873c0f3286a02e3ac1250625cca822ca6bc1018c5b19f1c"},
+    {file = "coverage-7.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f66460f17c9319ea4f91c165d46840314f0a7c004720b20be58594d162a441d8"},
+    {file = "coverage-7.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b373c9345c584bb4b5f5b8840df7f4ab48c4cbb7934b58d52c57020d911b856"},
+    {file = "coverage-7.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d3022c3007d3267a880b5adcf18c2a9bf1fc64469b394a804886b401959b8742"},
+    {file = "coverage-7.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92651580bd46519067e36493acb394ea0607b55b45bd81dd4e26379ed1871f55"},
+    {file = "coverage-7.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cfc595d2af13856505631be072835c59f1acf30028d1c860b435c5fc9c15b69"},
+    {file = "coverage-7.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b4b3a4d9915b2be879aff6299c0a6129f3d08a775d5a061f503cf79571f73e4"},
+    {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b6f22bb64cc39bcb883e5910f99a27b200fdc14cdd79df8696fa96b0005c9444"},
+    {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72d1507f152abacea81f65fee38e4ef3ac3c02ff8bc16f21d935fd3a8a4ad910"},
+    {file = "coverage-7.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a79137fc99815fff6a852c233628e735ec15903cfd16da0f229d9c4d45926ab"},
+    {file = "coverage-7.0.1-cp38-cp38-win32.whl", hash = "sha256:b3763e7fcade2ff6c8e62340af9277f54336920489ceb6a8cd6cc96da52fcc62"},
+    {file = "coverage-7.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:09f6b5a8415b6b3e136d5fec62b552972187265cb705097bf030eb9d4ffb9b60"},
+    {file = "coverage-7.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:978258fec36c154b5e250d356c59af7d4c3ba02bef4b99cda90b6029441d797d"},
+    {file = "coverage-7.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19ec666533f0f70a0993f88b8273057b96c07b9d26457b41863ccd021a043b9a"},
+    {file = "coverage-7.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfded268092a84605f1cc19e5c737f9ce630a8900a3589e9289622db161967e9"},
+    {file = "coverage-7.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bcfb1d8ac94af886b54e18a88b393f6a73d5959bb31e46644a02453c36e475"},
+    {file = "coverage-7.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b4a923cc7566bbc7ae2dfd0ba5a039b61d19c740f1373791f2ebd11caea59"},
+    {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aec2d1515d9d39ff270059fd3afbb3b44e6ec5758af73caf18991807138c7118"},
+    {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c20cfebcc149a4c212f6491a5f9ff56f41829cd4f607b5be71bb2d530ef243b1"},
+    {file = "coverage-7.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fd556ff16a57a070ce4f31c635953cc44e25244f91a0378c6e9bdfd40fdb249f"},
+    {file = "coverage-7.0.1-cp39-cp39-win32.whl", hash = "sha256:b9ea158775c7c2d3e54530a92da79496fb3fb577c876eec761c23e028f1e216c"},
+    {file = "coverage-7.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:d1991f1dd95eba69d2cd7708ff6c2bbd2426160ffc73c2b81f617a053ebcb1a8"},
+    {file = "coverage-7.0.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:3dd4ee135e08037f458425b8842d24a95a0961831a33f89685ff86b77d378f89"},
+    {file = "coverage-7.0.1.tar.gz", hash = "sha256:a4a574a19eeb67575a5328a5760bbbb737faa685616586a9f9da4281f940109c"},
 ]
 cryptography = [
     {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"},
@@ -1799,6 +1897,10 @@
     {file = "dnspython-2.2.1-py3-none-any.whl", hash = "sha256:a851e51367fb93e9e1361732c1d60dab63eff98712e503ea7d92e6eccb109b4f"},
     {file = "dnspython-2.2.1.tar.gz", hash = "sha256:0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e"},
 ]
+docker-image-py = [
+    {file = "docker-image-py-0.1.12.tar.gz", hash = "sha256:c0eebb6c25714b2a4f91a1462183e70252fa34fb189496d3c54711a64f12f96e"},
+    {file = "docker_image_py-0.1.12-py2-none-any.whl", hash = "sha256:44e18e8000aaaddbd2e02d40050dca850acd071c4780cbe2b3366cb5dc1a6d62"},
+]
 "dogpile.cache" = [
     {file = "dogpile.cache-1.1.8-py3-none-any.whl", hash = "sha256:3f0ca10b46b165e0b0e65e0e74b1a4b36187787b69db7c0f7073077adff2f05d"},
     {file = "dogpile.cache-1.1.8.tar.gz", hash = "sha256:d844e8bb638cc4f544a4c89a834dfd36fe935400b71a16cbd744ebdfb720fd4e"},
@@ -1812,8 +1914,8 @@
     {file = "eventlet-0.33.2.tar.gz", hash = "sha256:82c382c2a2c712f1a8320378a9120ac9589d9f1131c36a63780f0b8504afa5bc"},
 ]
 exceptiongroup = [
-    {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"},
-    {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"},
+    {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
+    {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
 ]
 fasteners = [
     {file = "fasteners-0.18-py3-none-any.whl", hash = "sha256:1d4caf5f8db57b0e4107d94fd5a1d02510a450dced6ca77d1839064c1bacf20c"},
@@ -1983,8 +2085,8 @@
     {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"},
 ]
 isort = [
-    {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
-    {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
+    {file = "isort-5.11.4-py3-none-any.whl", hash = "sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b"},
+    {file = "isort-5.11.4.tar.gz", hash = "sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6"},
 ]
 Jinja2 = [
     {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
@@ -2014,8 +2116,8 @@
     {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"},
 ]
 jsonschema = [
-    {file = "jsonschema-4.17.1-py3-none-any.whl", hash = "sha256:410ef23dcdbca4eaedc08b850079179883c2ed09378bd1f760d4af4aacfa28d7"},
-    {file = "jsonschema-4.17.1.tar.gz", hash = "sha256:05b2d22c83640cde0b7e0aa329ca7754fbd98ea66ad8ae24aa61328dfe057fa3"},
+    {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"},
+    {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"},
 ]
 keystoneauth1 = [
     {file = "keystoneauth1-5.1.0-py3-none-any.whl", hash = "sha256:5f7a60efff415bd74ce57f3ceb21612deae940746bbb69e36b7b350390d7f5dc"},
@@ -2084,16 +2186,16 @@
     {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"},
 ]
 mkdocs-material = [
-    {file = "mkdocs_material-8.5.10-py3-none-any.whl", hash = "sha256:51760fa4c9ee3ca0b3a661ec9f9817ec312961bb84ff19e5b523fdc5256e1d6c"},
-    {file = "mkdocs_material-8.5.10.tar.gz", hash = "sha256:7623608f746c6d9ff68a8ef01f13eddf32fa2cae5e15badb251f26d1196bc8f1"},
+    {file = "mkdocs_material-8.5.11-py3-none-any.whl", hash = "sha256:c907b4b052240a5778074a30a78f31a1f8ff82d7012356dc26898b97559f082e"},
+    {file = "mkdocs_material-8.5.11.tar.gz", hash = "sha256:b0ea0513fd8cab323e8a825d6692ea07fa83e917bb5db042e523afecc7064ab7"},
 ]
 mkdocs-material-extensions = [
     {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"},
     {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"},
 ]
 molecule = [
-    {file = "molecule-4.0.3-py3-none-any.whl", hash = "sha256:3ddf33a8b3a3fb33b75cf1c31a410834eda42dbc23d6161fbdb7b0e72009f4ce"},
-    {file = "molecule-4.0.3.tar.gz", hash = "sha256:b5a78a77f29f1deecf768dfbffafc21b419d9520123468191438ec4c72eaef69"},
+    {file = "molecule-4.0.4-py3-none-any.whl", hash = "sha256:437a0829c3273f542e0db09516ae743607e6a2eda4d8cbdfb407edda3e0facb2"},
+    {file = "molecule-4.0.4.tar.gz", hash = "sha256:aab00c1ba62a42d77edd1a51528dfbb46abca70df7c7147fda0925ee4fe7deda"},
 ]
 msgpack = [
     {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"},
@@ -2150,65 +2252,80 @@
     {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"},
 ]
 multidict = [
-    {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"},
-    {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"},
-    {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"},
-    {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"},
-    {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"},
-    {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"},
-    {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"},
-    {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"},
-    {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"},
-    {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"},
-    {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"},
-    {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"},
-    {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"},
-    {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"},
-    {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"},
-    {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"},
-    {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"},
-    {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"},
-    {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"},
-    {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"},
-    {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"},
-    {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"},
-    {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"},
-    {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"},
-    {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"},
-    {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"},
-    {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"},
-    {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"},
-    {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"},
-    {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"},
-    {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"},
-    {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"},
-    {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"},
-    {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"},
-    {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"},
-    {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"},
-    {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"},
-    {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"},
-    {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"},
-    {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"},
-    {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"},
-    {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"},
-    {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"},
-    {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"},
-    {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"},
-    {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"},
-    {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"},
-    {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"},
-    {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"},
-    {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"},
-    {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"},
-    {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"},
-    {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"},
-    {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"},
-    {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"},
-    {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"},
-    {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"},
-    {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"},
-    {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"},
+    {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"},
+    {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"},
+    {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"},
+    {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"},
+    {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"},
+    {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"},
+    {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"},
+    {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"},
+    {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"},
+    {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"},
+    {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"},
+    {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"},
+    {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"},
+    {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"},
+    {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"},
+    {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"},
+    {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"},
+    {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"},
+    {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"},
+    {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"},
+    {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"},
+    {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"},
+    {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"},
+    {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"},
+    {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"},
+    {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"},
+    {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"},
+    {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"},
+    {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"},
+    {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"},
+    {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"},
+    {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"},
+    {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"},
+    {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"},
+    {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"},
+    {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"},
+    {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"},
+    {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"},
+    {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"},
+    {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"},
+    {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"},
+    {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"},
+    {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"},
+    {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"},
+    {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"},
+    {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"},
+    {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"},
+    {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"},
+    {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"},
+    {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"},
+    {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"},
+    {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"},
+    {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"},
+    {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"},
+    {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"},
+    {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"},
+    {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"},
+    {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"},
+    {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"},
+    {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"},
+    {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"},
+    {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"},
+    {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"},
+    {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"},
+    {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"},
+    {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"},
+    {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"},
+    {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"},
+    {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"},
+    {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"},
+    {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"},
+    {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"},
+    {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"},
+    {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"},
 ]
 munch = [
     {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"},
@@ -2266,10 +2383,26 @@
     {file = "oscrypto-1.3.0-py2.py3-none-any.whl", hash = "sha256:2b2f1d2d42ec152ca90ccb5682f3e051fb55986e1b170ebde472b133713e7085"},
     {file = "oscrypto-1.3.0.tar.gz", hash = "sha256:6f5fef59cb5b3708321db7cca56aed8ad7e662853351e7991fcf60ec606d47a4"},
 ]
+"oslo.concurrency" = [
+    {file = "oslo.concurrency-5.0.1-py3-none-any.whl", hash = "sha256:7a6b6a1aa28e65a7cbfc9e04ecc9cdcaf7f7a2ad6cdf37014b3694b627280f5f"},
+    {file = "oslo.concurrency-5.0.1.tar.gz", hash = "sha256:0dfbf36095f4637ffbb65e5c241f4c25851abd3b728dddad9f07396302a72544"},
+]
+"oslo.config" = [
+    {file = "oslo.config-9.0.0-py3-none-any.whl", hash = "sha256:f876bf759f186c854c71417b83b44ba68d69b11ed3a79c324c7737a0bfc962f1"},
+    {file = "oslo.config-9.0.0.tar.gz", hash = "sha256:3b6b63c43cf1e09344ba850bcb11d6f2b9201086fbeb0a97a8950e7eac3f2645"},
+]
+"oslo.context" = [
+    {file = "oslo.context-5.0.0-py3-none-any.whl", hash = "sha256:e325ade501b9533de1cf1fd96597dbf83406f3986d874ad9a8f5db9c2cc4a965"},
+    {file = "oslo.context-5.0.0.tar.gz", hash = "sha256:88c0c6d076681c60d560f7d66565e42ac116c5aa8a28a04db7c0ac0025133224"},
+]
 "oslo.i18n" = [
     {file = "oslo.i18n-5.1.0-py3-none-any.whl", hash = "sha256:75086cfd898819638ca741159f677e2073a78ca86a9c9be8d38b46800cdf2dc9"},
     {file = "oslo.i18n-5.1.0.tar.gz", hash = "sha256:6bf111a6357d5449640852de4640eae4159b5562bbba4c90febb0034abc095d0"},
 ]
+"oslo.log" = [
+    {file = "oslo.log-5.0.2-py3-none-any.whl", hash = "sha256:0d43f1b3bdd152dd81e4fe97afcece413e8857f4ac663a1bcf16d466c0f2c40f"},
+    {file = "oslo.log-5.0.2.tar.gz", hash = "sha256:e45e7312aa71528a16736ce45152be3f1af123f5ef62aa81da046805584fcca3"},
+]
 "oslo.serialization" = [
     {file = "oslo.serialization-5.0.0-py3-none-any.whl", hash = "sha256:b0452bb2fcb99ee3e11bce3e1163f25a6393681233d2b3c2abdc4e5efd49d2a3"},
     {file = "oslo.serialization-5.0.0.tar.gz", hash = "sha256:2845328d0f47dc8a23fed2a82253e90acff0aa731dbd24f379cf8e50e6cc66ba"},
@@ -2279,8 +2412,8 @@
     {file = "oslo.utils-6.1.0.tar.gz", hash = "sha256:76bc0108d50aca972b68fec8298e791b5fbcbeb9a51a27c6986b41b0a6a62eeb"},
 ]
 packaging = [
-    {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
-    {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+    {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"},
+    {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"},
 ]
 pbr = [
     {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"},
@@ -2352,6 +2485,9 @@
     {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
     {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
 ]
+pyinotify = [
+    {file = "pyinotify-0.9.6.tar.gz", hash = "sha256:9c998a5d7606ca835065cdabc013ae6c66eb9ea76a00a1e3bc6e0cfe2b4f71f4"},
+]
 pykube-ng = [
     {file = "pykube-ng-22.9.0.tar.gz", hash = "sha256:1cd761ed9c7768958fdb92a404b53a5b2b26f71314bbd1c5d1fcf4f45896e2c0"},
     {file = "pykube_ng-22.9.0-py3-none-any.whl", hash = "sha256:6f414281d4ec64800aaa9603c0eeeff5d591072efddf8c5faaa483f7dbc828d8"},
@@ -2397,8 +2533,8 @@
     {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
 ]
 pytest-kind = [
-    {file = "pytest-kind-22.9.0.tar.gz", hash = "sha256:e329763bf90f2f6a8ca65f37044f4e61f8437f77c63e2de1d2da23e4e0e99b1a"},
-    {file = "pytest_kind-22.9.0-py3-none-any.whl", hash = "sha256:9a9b693400a60822b10f3419e4f6862b5e85410af4a6780ebf0aea5878e15b26"},
+    {file = "pytest-kind-22.11.1.tar.gz", hash = "sha256:ae7a4c753fcbbf9e44a0cc587d5219a0b8b2b1e7bcc9cbe14234f745dd5db681"},
+    {file = "pytest_kind-22.11.1-py3-none-any.whl", hash = "sha256:35fd99e4f94e0374834b5893ee4a95e33ad5dc1c18080356f01fadf21224e830"},
 ]
 pytest-mock = [
     {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"},
@@ -2421,8 +2557,8 @@
     {file = "python_slugify-7.0.0-py2.py3-none-any.whl", hash = "sha256:003aee64f9fd955d111549f96c4b58a3f40b9319383c70fad6277a4974bbf570"},
 ]
 pytz = [
-    {file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"},
-    {file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"},
+    {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"},
+    {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"},
 ]
 PyYAML = [
     {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
@@ -2470,6 +2606,96 @@
     {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
     {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
 ]
+regex = [
+    {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"},
+    {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"},
+    {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"},
+    {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"},
+    {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"},
+    {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"},
+    {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"},
+    {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"},
+    {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"},
+    {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"},
+    {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"},
+    {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"},
+    {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"},
+    {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"},
+    {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"},
+    {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"},
+    {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"},
+    {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"},
+    {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"},
+    {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"},
+    {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"},
+    {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"},
+    {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"},
+    {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"},
+    {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"},
+    {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"},
+    {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"},
+    {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"},
+    {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"},
+    {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"},
+    {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"},
+    {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"},
+    {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"},
+    {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"},
+    {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"},
+]
 requests = [
     {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
     {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
@@ -2482,6 +2708,10 @@
     {file = "resolvelib-0.8.1-py2.py3-none-any.whl", hash = "sha256:d9b7907f055c3b3a2cfc56c914ffd940122915826ff5fb5b1de0c99778f4de98"},
     {file = "resolvelib-0.8.1.tar.gz", hash = "sha256:c6ea56732e9fb6fca1b2acc2ccc68a0b6b8c566d8f3e78e0443310ede61dbd37"},
 ]
+rfc3986 = [
+    {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"},
+    {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"},
+]
 rich = [
     {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"},
     {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"},
@@ -2503,8 +2733,8 @@
     {file = "structlog-22.3.0.tar.gz", hash = "sha256:e7509391f215e4afb88b1b80fa3ea074be57a5a17d794bd436a5c949da023333"},
 ]
 subprocess-tee = [
-    {file = "subprocess-tee-0.4.0.tar.gz", hash = "sha256:7ea885ff32cdb2b2d3b2a6c464492f2ee1ebbf324e50598d75de4f6f3ea0f149"},
-    {file = "subprocess_tee-0.4.0-py3-none-any.whl", hash = "sha256:dae5fba2640b45442a84b23f887aadfbe3f9addcca8320f5f99acb8d5c36b77e"},
+    {file = "subprocess-tee-0.4.1.tar.gz", hash = "sha256:b3c124993f8b88d1eb1c2fde0bc2069787eac720ba88771cba17e8c93324825d"},
+    {file = "subprocess_tee-0.4.1-py3-none-any.whl", hash = "sha256:eca56973a1c1237093c2055b2731bcaab784683b83f22c76f26e4c5763402e28"},
 ]
 taskflow = [
     {file = "taskflow-5.0.0-py3-none-any.whl", hash = "sha256:c47ce617041e3ad57ebcbd0681212c37b4a66cba30be819e3385addd41b622fd"},
@@ -2575,31 +2805,34 @@
     {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"},
 ]
 watchdog = [
-    {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"},
-    {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"},
-    {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"},
-    {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"},
-    {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"},
-    {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"},
-    {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"},
-    {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"},
-    {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"},
-    {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"},
-    {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"},
-    {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"},
-    {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"},
-    {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"},
-    {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"},
-    {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"},
-    {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"},
-    {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"},
-    {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"},
+    {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed91c3ccfc23398e7aa9715abf679d5c163394b8cad994f34f156d57a7c163dc"},
+    {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:76a2743402b794629a955d96ea2e240bd0e903aa26e02e93cd2d57b33900962b"},
+    {file = "watchdog-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:920a4bda7daa47545c3201a3292e99300ba81ca26b7569575bd086c865889090"},
+    {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ceaa9268d81205876bedb1069f9feab3eccddd4b90d9a45d06a0df592a04cae9"},
+    {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1893d425ef4fb4f129ee8ef72226836619c2950dd0559bba022b0818c63a7b60"},
+    {file = "watchdog-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e99c1713e4436d2563f5828c8910e5ff25abd6ce999e75f15c15d81d41980b6"},
+    {file = "watchdog-2.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a5bd9e8656d07cae89ac464ee4bcb6f1b9cecbedc3bf1334683bed3d5afd39ba"},
+    {file = "watchdog-2.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a048865c828389cb06c0bebf8a883cec3ae58ad3e366bcc38c61d8455a3138f"},
+    {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e722755d995035dd32177a9c633d158f2ec604f2a358b545bba5bed53ab25bca"},
+    {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af4b5c7ba60206759a1d99811b5938ca666ea9562a1052b410637bb96ff97512"},
+    {file = "watchdog-2.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:619d63fa5be69f89ff3a93e165e602c08ed8da402ca42b99cd59a8ec115673e1"},
+    {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f2b0665c57358ce9786f06f5475bc083fea9d81ecc0efa4733fd0c320940a37"},
+    {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:441024df19253bb108d3a8a5de7a186003d68564084576fecf7333a441271ef7"},
+    {file = "watchdog-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a410dd4d0adcc86b4c71d1317ba2ea2c92babaf5b83321e4bde2514525544d5"},
+    {file = "watchdog-2.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28704c71afdb79c3f215c90231e41c52b056ea880b6be6cee035c6149d658ed1"},
+    {file = "watchdog-2.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ac0bd7c206bb6df78ef9e8ad27cc1346f2b41b1fef610395607319cdab89bc1"},
+    {file = "watchdog-2.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27e49268735b3c27310883012ab3bd86ea0a96dcab90fe3feb682472e30c90f3"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2af1a29fd14fc0a87fb6ed762d3e1ae5694dcde22372eebba50e9e5be47af03c"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:c7bd98813d34bfa9b464cf8122e7d4bec0a5a427399094d2c17dd5f70d59bc61"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_i686.whl", hash = "sha256:56fb3f40fc3deecf6e518303c7533f5e2a722e377b12507f6de891583f1b48aa"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:74535e955359d79d126885e642d3683616e6d9ab3aae0e7dcccd043bd5a3ff4f"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cf05e6ff677b9655c6e9511d02e9cc55e730c4e430b7a54af9c28912294605a4"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:d6ae890798a3560688b441ef086bb66e87af6b400a92749a18b856a134fc0318"},
+    {file = "watchdog-2.2.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5aed2a700a18c194c39c266900d41f3db0c1ebe6b8a0834b9995c835d2ca66e"},
+    {file = "watchdog-2.2.0-py3-none-win32.whl", hash = "sha256:d0fb5f2b513556c2abb578c1066f5f467d729f2eb689bc2db0739daf81c6bb7e"},
+    {file = "watchdog-2.2.0-py3-none-win_amd64.whl", hash = "sha256:1f8eca9d294a4f194ce9df0d97d19b5598f310950d3ac3dd6e8d25ae456d4c8a"},
+    {file = "watchdog-2.2.0-py3-none-win_ia64.whl", hash = "sha256:ad0150536469fa4b693531e497ffe220d5b6cd76ad2eda474a5e641ee204bbb6"},
+    {file = "watchdog-2.2.0.tar.gz", hash = "sha256:83cf8bc60d9c613b66a4c018051873d6273d9e45d040eed06d6a96241bd8ec01"},
 ]
 wcwidth = [
     {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
@@ -2672,63 +2905,78 @@
     {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"},
 ]
 yarl = [
-    {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"},
-    {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"},
-    {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"},
-    {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"},
-    {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"},
-    {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"},
-    {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"},
-    {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"},
-    {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"},
-    {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"},
-    {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"},
-    {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"},
-    {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"},
-    {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"},
-    {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"},
-    {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"},
-    {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"},
-    {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"},
-    {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"},
-    {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"},
-    {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"},
-    {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"},
-    {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"},
-    {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"},
-    {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"},
-    {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"},
-    {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"},
-    {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"},
-    {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"},
-    {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"},
-    {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"},
-    {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"},
-    {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"},
-    {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"},
-    {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"},
-    {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"},
-    {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"},
-    {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"},
-    {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"},
-    {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"},
-    {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"},
-    {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"},
-    {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"},
-    {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"},
-    {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"},
-    {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"},
-    {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"},
-    {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"},
-    {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"},
-    {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"},
-    {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"},
-    {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"},
-    {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"},
-    {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"},
-    {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"},
-    {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"},
-    {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"},
-    {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"},
-    {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"},
+    {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"},
+    {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"},
+    {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"},
+    {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"},
+    {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"},
+    {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"},
+    {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"},
+    {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"},
+    {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"},
+    {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"},
+    {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"},
+    {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"},
+    {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"},
+    {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"},
+    {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"},
+    {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"},
+    {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"},
+    {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"},
+    {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"},
+    {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"},
+    {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"},
+    {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"},
+    {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"},
+    {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"},
+    {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"},
+    {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"},
+    {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"},
+    {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"},
+    {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"},
+    {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"},
+    {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"},
+    {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"},
+    {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"},
+    {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"},
+    {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"},
+    {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"},
+    {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"},
+    {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"},
+    {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"},
+    {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"},
+    {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"},
+    {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"},
+    {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"},
+    {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"},
+    {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"},
+    {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"},
+    {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"},
+    {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"},
+    {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"},
+    {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"},
+    {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"},
+    {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"},
+    {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"},
+    {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"},
+    {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"},
+    {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"},
+    {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"},
+    {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"},
+    {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"},
+    {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"},
+    {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"},
+    {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"},
+    {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"},
+    {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"},
+    {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"},
+    {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"},
+    {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"},
+    {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"},
+    {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"},
+    {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"},
+    {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"},
+    {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"},
+    {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"},
+    {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"},
 ]
diff --git a/pyproject.toml b/pyproject.toml
index 4d90329..96292e7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,39 +6,59 @@
 readme = "README.md"
 
 [tool.poetry.scripts]
+atmosphere = "atmosphere.cmd.cli:main"
 atmosphere-operator = "atmosphere.cmd.operator:main"
 
 [tool.poetry.dependencies]
 python = "^3.10"
-schematics = "^2.1.1"
-pykube-ng = "^22.7.0"
-structlog = "^22.1.0"
-rich = "^12.5.1"
-better-exceptions = "^0.3.3"
-mergedeep = "^1.3.4"
-taskflow = "^5.0.0"
-eventlet = "^0.33.1"
-tomli = "^2.0.1"
-tomli-w = "^1.0.0"
-jmespath = "^1.0.1"
-jsonnet = "^0.18.0"
-kopf = {extras = ["uvloop"], version = "^1.36.0"}
-openstacksdk = "^0.103.0"
-certbuilder = "^0.14.2"
+click = "^8.1.3"
+schematics = { version = "^2.1.1", optional = true }
+pykube-ng = { version = "^22.7.0", optional = true }
+structlog = { version = "^22.1.0", optional = true }
+mergedeep = { version = "^1.3.4", optional = true }
+taskflow = { version = "^5.0.0", optional = true }
+eventlet = { version = "^0.33.1", optional = true }
+tomli = { version = "^2.0.1", optional = true }
+jsonnet = { version = "^0.18.0", optional = true }
+kopf = { version = "^1.36.0", optional = true, extras = ["uvloop"] }
+openstacksdk = { version = "^0.103.0", optional = true }
+certbuilder = { version = "^0.14.2", optional = true }
+"oslo.log" = "^5.0.2"
+"oslo.config" = "^9.0.0"
+"oslo.concurrency" = "^5.0.1"
+docker-image-py = "^0.1.12"
+
+[tool.poetry.extras]
+operator = [
+  "schematics",
+  "pykube-ng",
+  "structlog",
+  "rich",
+  "better-exceptions",
+  "mergedeep",
+  "taskflow",
+  "eventlet",
+  "tomli",
+  "jsonnet",
+  "kopf",
+  "openstacksdk",
+  "certbuilder",
+]
 
 [tool.poetry.group.dev.dependencies]
-pytest = "^7.1.3"
-pytest-mock = "^3.8.2"
-pytest-cov = "^3.0.0"
-pytest-kind = "^22.9.0"
+ansible-core = "^2.13.4"
 flake8 = "^5.0.4"
 flake8-isort = "^4.2.0"
-python-on-whales = "^0.52.0"
 Jinja2 = "^3.1.2"
 jinja2-base64-filters = "^0.1.4"
 molecule = "^4.0.1"
-ansible-core = "^2.13.4"
-
+jmespath = "^1.0.1"
+pytest = "^7.1.3"
+pytest-cov = "^3.0.0"
+pytest-kind = "^22.9.0"
+pytest-mock = "^3.8.2"
+python-on-whales = "^0.52.0"
+tomli-w = "^1.0.0"
 
 [tool.poetry.group.docs.dependencies]
 mkdocs-material = "^8.5.7"
@@ -51,10 +71,7 @@
 profile = "black"
 
 [tool.pytest.ini_options]
-addopts = [
-  "--cov=atmosphere",
-  "--cov-report=term-missing",
-]
+addopts = ["--cov=atmosphere", "--cov-report=term-missing"]
 filterwarnings = [
   "ignore::DeprecationWarning",
   "ignore::schematics.deprecated.SchematicsDeprecationWarning",
diff --git a/release-please-config.json b/release-please-config.json
index 1629f46..38ec1d5 100644
--- a/release-please-config.json
+++ b/release-please-config.json
@@ -4,7 +4,7 @@
       "release-type": "python",
       "draft": true,
       "extra-files": [
-        "roles/atmosphere/defaults/main.yml",
+        "atmosphere/operator/constants.py",
         "galaxy.yml"
       ]
     }
diff --git a/roles/atmosphere/defaults/main.yml b/roles/atmosphere/defaults/main.yml
index bb1eb55..2de18fc 100644
--- a/roles/atmosphere/defaults/main.yml
+++ b/roles/atmosphere/defaults/main.yml
@@ -1,6 +1,7 @@
-atmosphere_image: quay.io/vexxhost/atmosphere:0.12.0 # x-release-please-version
+atmosphere_image: "{{ lookup('vexxhost.atmosphere.image_ref', 'atmosphere', output='ref') }}"
 
 atmosphere_config:
+  image_repository: "{{ atmosphere_image_repository | default('') }}"
   kube_prometheus_stack:
     overrides: "{{ kube_prometheus_stack_values | default({}) }}"
   memcached:
diff --git a/roles/ceph_csi_rbd/tasks/main.yml b/roles/ceph_csi_rbd/tasks/main.yml
index 9f42a44..fdb34ae 100644
--- a/roles/ceph_csi_rbd/tasks/main.yml
+++ b/roles/ceph_csi_rbd/tasks/main.yml
@@ -78,9 +78,27 @@
             nodeplugin:
               httpMetrics:
                 containerPort: 8081
+              registrar:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_node_driver_registrar', output='name') }}"
+              plugin:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_plugin', output='name') }}"
             provisioner:
               nodeSelector:
                 openstack-control-plane: enabled
+              provisioner:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_provisioner', output='name') }}"
+              attacher:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_attacher', output='name') }}"
+              resizer:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_resizer', output='name') }}"
+              snapshotter:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_snapshotter', output='name') }}"
             storageClass:
               create: true
               name: general
diff --git a/roles/cilium/tasks/main.yml b/roles/cilium/tasks/main.yml
index fbb34b5..def4496 100644
--- a/roles/cilium/tasks/main.yml
+++ b/roles/cilium/tasks/main.yml
@@ -25,8 +25,12 @@
     release_namespace: kube-system
     kubeconfig: /etc/kubernetes/admin.conf
     values:
+      image:
+        repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'cilium_node', output='name') }}"
       tunnel: geneve
       operator:
+        image:
+          repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'cilium_operator', output='name') | replace('-generic', '') }}"
         nodeSelector:
           openstack-control-plane: enabled
       ipam:
diff --git a/roles/containerd/defaults/main.yml b/roles/containerd/defaults/main.yml
index 2b742d1..60d4249 100644
--- a/roles/containerd/defaults/main.yml
+++ b/roles/containerd/defaults/main.yml
@@ -17,3 +17,5 @@
 containerd_pause_image: k8s.gcr.io/pause:3.5
 
                                                                    # ]]]
+
+containerd_insecure_registries: []
diff --git a/roles/containerd/templates/config.toml.j2 b/roles/containerd/templates/config.toml.j2
index 84cad6d..16c0ae1 100644
--- a/roles/containerd/templates/config.toml.j2
+++ b/roles/containerd/templates/config.toml.j2
@@ -3,3 +3,14 @@
 [plugins]
   [plugins."io.containerd.grpc.v1.cri"]
     sandbox_image = "{{ containerd_pause_image }}"
+  [plugins."io.containerd.grpc.v1.cri".registry]
+    [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
+      {% for registry in containerd_insecure_registries %}
+      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."{{ registry }}"]
+        endpoint = ["http://{{ registry }}"]
+      {% endfor %}
+    [plugins."io.containerd.grpc.v1.cri".registry.configs]
+      {% for registry in containerd_insecure_registries %}
+      [plugins."io.containerd.grpc.v1.cri".registry.configs."{{ registry }}".tls]
+        insecure_skip_verify = true
+      {% endfor %}
diff --git a/roles/coredns/tasks/main.yml b/roles/coredns/tasks/main.yml
index cda29f0..dceb12b 100644
--- a/roles/coredns/tasks/main.yml
+++ b/roles/coredns/tasks/main.yml
@@ -31,6 +31,8 @@
                 kind: HelmRepository
                 name: coredns
           values:
+            image:
+              repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_coredns', output='name') }}"
             replicaCount: 3
             prometheus:
               service:
diff --git a/roles/flux/tasks/main.yml b/roles/flux/tasks/main.yml
index bb89eff..adf55a9 100644
--- a/roles/flux/tasks/main.yml
+++ b/roles/flux/tasks/main.yml
@@ -7,4 +7,4 @@
 - name: Install Flux to cluster
   run_once: true
   changed_when: false
-  ansible.builtin.command: flux install
+  ansible.builtin.command: flux install {% if atmosphere_image_repository %}--registry={{ atmosphere_image_repository }}{% endif %}
diff --git a/roles/ipmi_exporter/defaults/main.yml b/roles/ipmi_exporter/defaults/main.yml
index 7530b07..0e9d2be 100644
--- a/roles/ipmi_exporter/defaults/main.yml
+++ b/roles/ipmi_exporter/defaults/main.yml
@@ -36,15 +36,3 @@
         - 185 # Entity Presence (Dell PowerEdge servers)
 
                                                                    # ]]]
-# .. envvar:: ipmi_exporter_image_repository [[[
-#
-# Keepalived container image repository location
-ipmi_exporter_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: ipmi_exporter_image_tag [[[
-#
-# Keepalived container image tag
-ipmi_exporter_image_tag: 1.4.0
-
-                                                                   # ]]]
diff --git a/roles/ipmi_exporter/tasks/main.yml b/roles/ipmi_exporter/tasks/main.yml
index bcc25d8..31cd4c4 100644
--- a/roles/ipmi_exporter/tasks/main.yml
+++ b/roles/ipmi_exporter/tasks/main.yml
@@ -47,7 +47,7 @@
             spec:
               containers:
                 - name: exporter
-                  image: "{{ ipmi_exporter_image_repository }}/ipmi-exporter:{{ ipmi_exporter_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_ipmi_exporter', output='ref') }}"
                   ports:
                     - name: metrics
                       containerPort: 9290
diff --git a/roles/keepalived/defaults/main.yml b/roles/keepalived/defaults/main.yml
index 5fddd22..ac9309e 100644
--- a/roles/keepalived/defaults/main.yml
+++ b/roles/keepalived/defaults/main.yml
@@ -36,18 +36,6 @@
 keepalived_interface: "{{ undef(hint='You must specify a Keepalived virtual IP interface') }}"
 
                                                                    # ]]]
-# .. envvar:: keepalived_image_repository [[[
-#
-# Keepalived container image repository location
-keepalived_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: keepalived_image_tag [[[
-#
-# Keepalived container image tag
-keepalived_image_tag: 2.0.19
-
-                                                                   # ]]]
 # .. envvar:: keepalived_vrid [[[
 #
 # Keepalived virtual router id
diff --git a/roles/keepalived/tasks/main.yml b/roles/keepalived/tasks/main.yml
index dedddfc..d401c4b 100644
--- a/roles/keepalived/tasks/main.yml
+++ b/roles/keepalived/tasks/main.yml
@@ -118,7 +118,7 @@
               automountServiceAccountToken: true
               initContainers:
                 - name: init
-                  image: "{{ keepalived_image_repository }}/kubernetes-entrypoint:latest"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
                   env:
                     - name: NAMESPACE
                       valueFrom:
@@ -133,7 +133,7 @@
                     - name: DEPENDENCY_POD_JSON
                       value: '[{"labels":{"application":"neutron","component":"neutron-ovs-agent"},"requireSameNode":true}]'
                 - name: wait-for-ip
-                  image: "{{ keepalived_image_repository }}/keepalived:{{ keepalived_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
                   command:
                     - /bin/wait-for-ip.sh
                   volumeMounts:
@@ -144,7 +144,7 @@
                       subPath: wait-for-ip.sh
               containers:
                 - name: keepalived
-                  image: "{{ keepalived_image_repository }}/keepalived:{{ keepalived_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
                   command:
                     - keepalived
                     - -f
diff --git a/roles/kubernetes/defaults/main.yml b/roles/kubernetes/defaults/main.yml
index abc45b9..40c25ff 100644
--- a/roles/kubernetes/defaults/main.yml
+++ b/roles/kubernetes/defaults/main.yml
@@ -20,7 +20,7 @@
 # .. envvar:: kubernetes_version [[[
 #
 # Kubernetes version
-kubernetes_version: 1.22.7
+kubernetes_version: 1.22.17
 
                                                                    # ]]]
 # .. envvar:: kubernetes_kernel_modules [[[
diff --git a/roles/kubernetes/tasks/control-plane.yml b/roles/kubernetes/tasks/control-plane.yml
index 6545c41..9d444d7 100644
--- a/roles/kubernetes/tasks/control-plane.yml
+++ b/roles/kubernetes/tasks/control-plane.yml
@@ -35,8 +35,8 @@
         dest: /etc/keepalived/check_apiserver.sh
         mode: 0755
     - name: Upload Kubernetes manifest
-      ansible.builtin.copy:
-        src: keepalived.yaml
+      ansible.builtin.template:
+        src: keepalived.yaml.j2
         dest: /etc/kubernetes/manifests/keepalived.yaml
         owner: root
         group: root
@@ -60,8 +60,8 @@
         group: root
         mode: 0644
     - name: Upload Kubernetes manifest
-      ansible.builtin.copy:
-        src: haproxy.yaml
+      ansible.builtin.template:
+        src: haproxy.yaml.j2
         dest: /etc/kubernetes/manifests/haproxy.yaml
         owner: root
         group: root
diff --git a/roles/kubernetes/files/haproxy.yaml b/roles/kubernetes/templates/haproxy.yaml.j2
similarity index 82%
rename from roles/kubernetes/files/haproxy.yaml
rename to roles/kubernetes/templates/haproxy.yaml.j2
index 0d6ea23..e780b05 100644
--- a/roles/kubernetes/files/haproxy.yaml
+++ b/roles/kubernetes/templates/haproxy.yaml.j2
@@ -5,8 +5,8 @@
   namespace: kube-system
 spec:
   containers:
-    - image: haproxy:2.5
-      name: haproxy
+    - name: haproxy
+      image: "{{ lookup('vexxhost.atmosphere.image_ref', 'haproxy', output='ref') }}"
       livenessProbe:
         failureThreshold: 8
         httpGet:
diff --git a/roles/kubernetes/files/keepalived.yaml b/roles/kubernetes/templates/keepalived.yaml.j2
similarity index 89%
rename from roles/kubernetes/files/keepalived.yaml
rename to roles/kubernetes/templates/keepalived.yaml.j2
index 5926af8..0312b42 100644
--- a/roles/kubernetes/files/keepalived.yaml
+++ b/roles/kubernetes/templates/keepalived.yaml.j2
@@ -7,7 +7,7 @@
 spec:
   containers:
     - name: keepalived
-      image: us-docker.pkg.dev/vexxhost-infra/openstack/keepalived:2.0.19
+      image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
       command: ["keepalived", "-f", "/etc/keepalived/keepalived.conf", "--dont-fork", "--log-console", "--log-detail", "--dump-conf"]
       resources: {}
       securityContext:
diff --git a/roles/kubernetes/templates/kubeadm.yaml.j2 b/roles/kubernetes/templates/kubeadm.yaml.j2
index e12280b..f4689a0 100644
--- a/roles/kubernetes/templates/kubeadm.yaml.j2
+++ b/roles/kubernetes/templates/kubeadm.yaml.j2
@@ -37,6 +37,9 @@
 apiVersion: kubeadm.k8s.io/v1beta3
 kind: ClusterConfiguration
 controlPlaneEndpoint: "{{ kubernetes_hostname }}:6443"
+{% if atmosphere_image_repository is defined %}
+imageRepository: "{{ atmosphere_image_repository }}"
+{% endif %}
 apiServer:
   extraArgs:
     oidc-username-claim: email
diff --git a/roles/openstack_exporter/defaults/main.yml b/roles/openstack_exporter/defaults/main.yml
deleted file mode 100644
index 5613cb4..0000000
--- a/roles/openstack_exporter/defaults/main.yml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-# .. vim: foldmarker=[[[,]]]:foldmethod=marker
-
-# .. Copyright (C) 2022 VEXXHOST, Inc.
-# .. SPDX-License-Identifier: Apache-2.0
-
-# Default variables
-# =================
-
-# .. contents:: Sections
-#    :local:
-
-# .. envvar:: openstack_exporter_image_repository [[[
-#
-# OpenStack-exporter container image repository location
-openstack_exporter_image_repository: "ghcr.io/openstack-exporter"
-
-                                                                   # ]]]
-# .. envvar:: openstack_exporter_image_tag [[[
-#
-# openstack-exporter container image tag
-openstack_exporter_image_tag: 1.6.0
-
-                                                                   # ]]]
diff --git a/roles/openstack_exporter/tasks/main.yml b/roles/openstack_exporter/tasks/main.yml
index 902fa2e..83cf8c1 100644
--- a/roles/openstack_exporter/tasks/main.yml
+++ b/roles/openstack_exporter/tasks/main.yml
@@ -65,7 +65,7 @@
                       mountPath: /etc/openstack
               containers:
                 - name: openstack-exporter
-                  image: "{{ openstack_exporter_image_repository }}/openstack-exporter:{{ openstack_exporter_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_openstack_exporter', output='ref') }}"
                   args:
                     - --endpoint-type
                     - internal
diff --git a/roles/openstack_helm_barbican/defaults/main.yml b/roles/openstack_helm_barbican/defaults/main.yml
index 0afbbbf..b499584 100644
--- a/roles/openstack_helm_barbican/defaults/main.yml
+++ b/roles/openstack_helm_barbican/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_barbican_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_barbican_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_barbican_image_tag [[[
-#
-# Image tag for container
-openstack_helm_barbican_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_barbican_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_barbican_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_barbican_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_barbican/vars/main.yml b/roles/openstack_helm_barbican/vars/main.yml
index 4f04ebb..0b3f894 100644
--- a/roles/openstack_helm_barbican/vars/main.yml
+++ b/roles/openstack_helm_barbican/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      db_init: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_barbican_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      barbican_db_sync: "{{ openstack_helm_barbican_image_repository }}/barbican:{{ openstack_helm_barbican_image_tag }}"
-      barbican_api: "{{ openstack_helm_barbican_image_repository }}/barbican:{{ openstack_helm_barbican_image_tag }}"
-      rabbit_init: "{{ openstack_helm_barbican_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      barbican_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'barbican_db_sync', output='ref') }}"
+      barbican_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'barbican_api', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/openstack_helm_cinder/defaults/main.yml
index ac13a22..ef5f45c 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/openstack_helm_cinder/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_cinder_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_cinder_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_cinder_image_tag [[[
-#
-# Image tag for container
-openstack_helm_cinder_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_cinder_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_cinder_heat_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_cinder_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_cinder/vars/main.yml b/roles/openstack_helm_cinder/vars/main.yml
index b0b8ff9..f2c5347 100644
--- a/roles/openstack_helm_cinder/vars/main.yml
+++ b/roles/openstack_helm_cinder/vars/main.yml
@@ -17,22 +17,22 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      cinder_api: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_backup_storage_init: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_backup: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_db_sync: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_scheduler: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_storage_init: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_volume_usage_audit: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_volume: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      db_drop: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      db_init: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_cinder_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_cinder_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      cinder_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_api', output='ref') }}"
+      cinder_backup_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_backup_storage_init', output='ref') }}"
+      cinder_backup: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_backup', output='ref') }}"
+      cinder_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_db_sync', output='ref') }}"
+      cinder_scheduler: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_scheduler', output='ref') }}"
+      cinder_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_storage_init', output='ref') }}"
+      cinder_volume_usage_audit: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_volume_usage_audit', output='ref') }}"
+      cinder_volume: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_volume', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_designate/defaults/main.yml b/roles/openstack_helm_designate/defaults/main.yml
index 0a54f7d..63aafb4 100644
--- a/roles/openstack_helm_designate/defaults/main.yml
+++ b/roles/openstack_helm_designate/defaults/main.yml
@@ -11,42 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_designate_chart_repo_name [[[
-#
-# Helm repository name for the chart.
-openstack_helm_designate_chart_repo_name: openstack-helm
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_chart_repo_url [[[
-#
-# Helm repository URL for the chart.
-openstack_helm_designate_chart_repo_url: https://tarballs.opendev.org/openstack/openstack-helm/
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_chart_name [[[
-#
-# Helm chart name (will also be used for release name)
-openstack_helm_designate_chart_name: designate
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_designate_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_image_tag [[[
-#
-# Image tag for container
-openstack_helm_designate_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_designate_heat_image_tag: zed
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_designate_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_designate/vars/main.yml b/roles/openstack_helm_designate/vars/main.yml
index 54d88d5..a4a209e 100644
--- a/roles/openstack_helm_designate/vars/main.yml
+++ b/roles/openstack_helm_designate/vars/main.yml
@@ -18,21 +18,21 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      bootstrap: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      db_init: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_designate_image_repository }}/rabbitmq:3.8.23-management"
-      ks_user: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_designate_image_repository }}/kubernetes-entrypoint:latest"
-      designate_db_sync: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_api: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_central: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_mdns: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_worker: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_producer: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_sink: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      designate_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_db_sync', output='ref') }}"
+      designate_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_api', output='ref') }}"
+      designate_central: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_central', output='ref') }}"
+      designate_mdns: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_mdns', output='ref') }}"
+      designate_worker: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_worker', output='ref') }}"
+      designate_producer: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_producer', output='ref') }}"
+      designate_sink: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_sink', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_glance/defaults/main.yml b/roles/openstack_helm_glance/defaults/main.yml
index 42e450a..5f49454 100644
--- a/roles/openstack_helm_glance/defaults/main.yml
+++ b/roles/openstack_helm_glance/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_glance_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_glance_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_glance_image_tag [[[
-#
-# Image tag for container
-openstack_helm_glance_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_glance_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_glance_heat_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_glance_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_glance/vars/main.yml b/roles/openstack_helm_glance/vars/main.yml
index 7bb4fbd..8053896 100644
--- a/roles/openstack_helm_glance/vars/main.yml
+++ b/roles/openstack_helm_glance/vars/main.yml
@@ -18,19 +18,19 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      db_init: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_glance_image_repository }}/kubernetes-entrypoint:latest"
-      glance_api: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_db_sync: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_metadefs_load: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_registry: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_storage_init: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_glance_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      glance_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_api', output='ref') }}"
+      glance_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_db_sync', output='ref') }}"
+      glance_metadefs_load: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_metadefs_load', output='ref') }}"
+      glance_registry: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_registry', output='ref') }}"
+      glance_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_storage_init', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   bootstrap:
     enabled: false
   pod:
diff --git a/roles/openstack_helm_heat/defaults/main.yml b/roles/openstack_helm_heat/defaults/main.yml
index 8b10d53..bbbe6d33 100644
--- a/roles/openstack_helm_heat/defaults/main.yml
+++ b/roles/openstack_helm_heat/defaults/main.yml
@@ -11,36 +11,12 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_heat_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_heat_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_heat_image_tag [[[
-#
-# Image tag for container
-openstack_helm_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_heat_auth_encryption_key [[[
 #
 # Unique value to use for encrypting Heat secrets
 openstack_helm_heat_auth_encryption_key: "{{ undef(hint='You must specifiy an encryption key for Heat.') }}"
 
                                                                    # ]]]
-# .. envvar:: openstack_helm_heat_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_heat_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_heat_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_heat_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_heat_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_heat/vars/main.yml b/roles/openstack_helm_heat/vars/main.yml
index e56d820..1eb2bc9 100644
--- a/roles/openstack_helm_heat/vars/main.yml
+++ b/roles/openstack_helm_heat/vars/main.yml
@@ -18,21 +18,21 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      db_init: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_heat_image_repository }}/kubernetes-entrypoint:latest"
-      heat_api: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_cfn: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_cloudwatch: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_db_sync: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_engine_cleaner: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_engine: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_purge_deleted: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_heat_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      heat_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_api', output='ref') }}"
+      heat_cfn: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_cfn', output='ref') }}"
+      heat_cloudwatch: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_cloudwatch', output='ref') }}"
+      heat_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_db_sync', output='ref') }}"
+      heat_engine_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_engine_cleaner', output='ref') }}"
+      heat_engine: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_engine', output='ref') }}"
+      heat_purge_deleted: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_purge_deleted', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_horizon/defaults/main.yml b/roles/openstack_helm_horizon/defaults/main.yml
index f9d9ec8..42cf44b 100644
--- a/roles/openstack_helm_horizon/defaults/main.yml
+++ b/roles/openstack_helm_horizon/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_horizon_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_horizon_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_horizon_image_tag [[[
-#
-# Image tag for container
-openstack_helm_horizon_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_horizon_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_horizon_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_horizon_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_horizon/vars/main.yml b/roles/openstack_helm_horizon/vars/main.yml
index eabe3f9..4b0faa4 100644
--- a/roles/openstack_helm_horizon/vars/main.yml
+++ b/roles/openstack_helm_horizon/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      db_init: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_horizon_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      horizon_db_sync: "{{ openstack_helm_horizon_image_repository }}/horizon:{{ openstack_helm_horizon_image_tag }}"
-      horizon: "{{ openstack_helm_horizon_image_repository }}/horizon:{{ openstack_helm_horizon_image_tag }}"
-      rabbit_init: "{{ openstack_helm_horizon_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      horizon_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'horizon_db_sync', output='ref') }}"
+      horizon: "{{ lookup('vexxhost.atmosphere.image_ref', 'horizon', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       server: 3
diff --git a/roles/openstack_helm_infra_libvirt/defaults/main.yml b/roles/openstack_helm_infra_libvirt/defaults/main.yml
index 3d31131..06d3c20 100644
--- a/roles/openstack_helm_infra_libvirt/defaults/main.yml
+++ b/roles/openstack_helm_infra_libvirt/defaults/main.yml
@@ -11,18 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_infra_libvirt_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_infra_libvirt_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_infra_libvirt_image_tag [[[
-#
-# Image tag for container
-openstack_helm_infra_libvirt_image_tag: "{{ atmosphere_openstack_release | default('yoga-focal') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_infra_libvirt_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_infra_libvirt/vars/main.yml b/roles/openstack_helm_infra_libvirt/vars/main.yml
index f642b45..d02c0ca 100644
--- a/roles/openstack_helm_infra_libvirt/vars/main.yml
+++ b/roles/openstack_helm_infra_libvirt/vars/main.yml
@@ -16,9 +16,9 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      ceph_config_helper: "{{ openstack_helm_infra_libvirt_image_repository }}/libvirtd:{{ openstack_helm_infra_libvirt_image_tag }}"
-      dep_check: "{{ openstack_helm_infra_libvirt_image_repository }}/kubernetes-entrypoint:latest"
-      libvirt: "{{ openstack_helm_infra_libvirt_image_repository }}/libvirtd:{{ openstack_helm_infra_libvirt_image_tag }}"
+      ceph_config_helper: "{{ lookup('vexxhost.atmosphere.image_ref', 'ceph_config_helper', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      libvirt: "{{ lookup('vexxhost.atmosphere.image_ref', 'libvirt', output='ref') }}"
   conf:
     ceph:
       enabled: "{{ atmosphere_ceph_enabled | default(true) | bool }}"
diff --git a/roles/openstack_helm_infra_openvswitch/defaults/main.yml b/roles/openstack_helm_infra_openvswitch/defaults/main.yml
index f43de8c..3407a49 100644
--- a/roles/openstack_helm_infra_openvswitch/defaults/main.yml
+++ b/roles/openstack_helm_infra_openvswitch/defaults/main.yml
@@ -11,18 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_infra_openvswitch_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_infra_openvswitch_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_infra_openvswitch_image_tag [[[
-#
-# Image tag for container
-openstack_helm_infra_openvswitch_image_tag: "{{ atmosphere_openstack_release | default('2.17.3') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_infra_openvswitch_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/openstack_helm_infra_openvswitch/vars/main.yml
index e84639e..f4cb234 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/openstack_helm_infra_openvswitch/vars/main.yml
@@ -16,6 +16,6 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      dep_check: "{{ openstack_helm_infra_openvswitch_image_repository }}/kubernetes-entrypoint:latest"
-      openvswitch_db_server: "{{ openstack_helm_infra_openvswitch_image_repository }}/openvswitch:{{ openstack_helm_infra_openvswitch_image_tag }}"
-      openvswitch_vswitchd: "{{ openstack_helm_infra_openvswitch_image_repository }}/openvswitch:{{ openstack_helm_infra_openvswitch_image_tag }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      openvswitch_db_server: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_db_server', output='ref') }}"
+      openvswitch_vswitchd: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_vswitchd', output='ref') }}"
diff --git a/roles/openstack_helm_keystone/defaults/main.yml b/roles/openstack_helm_keystone/defaults/main.yml
index fa8ecf0..d0a27cc 100644
--- a/roles/openstack_helm_keystone/defaults/main.yml
+++ b/roles/openstack_helm_keystone/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_keystone_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_keystone_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_keystone_image_tag [[[
-#
-# Image tag for container
-openstack_helm_keystone_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_keystone_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_keystone_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_keystone_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_keystone/vars/main.yml b/roles/openstack_helm_keystone/vars/main.yml
index e75a3dc..73b200b 100644
--- a/roles/openstack_helm_keystone/vars/main.yml
+++ b/roles/openstack_helm_keystone/vars/main.yml
@@ -17,20 +17,20 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      db_init: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_keystone_image_repository }}/kubernetes-entrypoint:latest"
-      keystone_api: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_credential_cleanup: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      keystone_credential_rotate: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_credential_setup: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_db_sync: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_domain_manage: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      keystone_fernet_rotate: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_fernet_setup: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      ks_user: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_keystone_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      keystone_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_api', output='ref') }}"
+      keystone_credential_cleanup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_cleanup', output='ref') }}"
+      keystone_credential_rotate: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_rotate', output='ref') }}"
+      keystone_credential_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_setup', output='ref') }}"
+      keystone_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_db_sync', output='ref') }}"
+      keystone_domain_manage: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_domain_manage', output='ref') }}"
+      keystone_fernet_rotate: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_fernet_rotate', output='ref') }}"
+      keystone_fernet_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_fernet_setup', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     #     mounts = {
     #       keystone_api = {
diff --git a/roles/openstack_helm_magnum/tasks/main.yml b/roles/openstack_helm_magnum/tasks/main.yml
index 46e08e3..0ee4691 100644
--- a/roles/openstack_helm_magnum/tasks/main.yml
+++ b/roles/openstack_helm_magnum/tasks/main.yml
@@ -69,7 +69,7 @@
                       value: /var/lib/registry
                     - name: REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED
                       value: "true"
-                  image: docker.io/library/registry:2.7.1
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'magnum_registry', output='ref') }}"
                   ports:
                     - containerPort: 5000
                       name: registry
@@ -135,189 +135,189 @@
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/cni:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cni:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cni-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/kube-controllers:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/kube-controllers:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-kube-controllers-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/node:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/node:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-node-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/pod2daemon-flexvol:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/pod2daemon-flexvol:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-pod2daemon-flexvol-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/coredns/coredns:1.6.6
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/coredns:1.6.6
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-coredns-1-6-6
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/cinder-csi-plugin:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cinder-csi-plugin:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cinder-csi-plugin-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/k8s-keystone-auth:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/k8s-keystone-auth:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-k8s-keystone-auth-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/magnum-auto-healer:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/magnum-auto-healer:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-magnum-auto-healer-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/openstack-cloud-controller-manager:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/openstack-cloud-controller-manager:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-openstack-cloud-controller-manager-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/kubernetesui/dashboard:v2.0.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/dashboard:v2.0.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-dashboard-v2-0-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/kubernetesui/metrics-scraper:v1.0.4
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/metrics-scraper:v1.0.4
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-metrics-scraper-v1-0-4
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/openstackmagnum/cluster-autoscaler:v1.22.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cluster-autoscaler:v1.22.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cluster-autoscaler-v1-22-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/openstackmagnum/heat-container-agent:wallaby-stable-1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/heat-container-agent:wallaby-stable-1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-heat-container-agent-wallaby-stable-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/planetlabs/draino:abf028a
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/draino:abf028a
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-draino-abf028a
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.19.11-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.19.11
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-19-11
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.20.7-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.20.7
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-20-7
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.21.1-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.21.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-21-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.1.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cluster-proportional-autoscaler-amd64:1.1.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cluster-proportional-autoscaler-amd64-1-1-2
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/metrics-server-amd64:v0.3.5
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/metrics-server-amd64:v0.3.5
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-metrics-server-amd64-v0-3-5
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/node-problem-detector:v0.6.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/node-problem-detector:v0.6.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-node-problem-detector-v0-6-2
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/pause:3.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/pause:3.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-pause-3-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/coreos/etcd:v3.4.6
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/etcd:v3.4.6
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-etcd-v3-4-6
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-attacher:v2.0.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-attacher:v2.0.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-attacher-v2-0-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-node-driver-registrar:v1.1.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-node-driver-registrar:v1.1.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-node-driver-registrar-v1-1-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-provisioner:v1.4.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-provisioner:v1.4.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-provisioner-v1-4-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-resizer:v0.3.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-resizer:v0.3.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-resizer-v0-3-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-snapshotter:v1.2.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-snapshotter:v1.2.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-snapshotter-v1-2-2
               nodeSelector:
                 openstack-control-plane: enabled
diff --git a/roles/openstack_helm_neutron/defaults/main.yml b/roles/openstack_helm_neutron/defaults/main.yml
index 2fe2c66..9745d4b 100644
--- a/roles/openstack_helm_neutron/defaults/main.yml
+++ b/roles/openstack_helm_neutron/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_neutron_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_neutron_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_neutron_image_tag [[[
-#
-# Image tag for container
-openstack_helm_neutron_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_neutron_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_neutron_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_neutron_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_neutron/vars/main.yml b/roles/openstack_helm_neutron/vars/main.yml
index b48307d..91003c2 100644
--- a/roles/openstack_helm_neutron/vars/main.yml
+++ b/roles/openstack_helm_neutron/vars/main.yml
@@ -17,27 +17,27 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      db_init: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_neutron_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      neutron_bagpipe_bgp: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_db_sync: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_dhcp: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_ironic_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_l2gw: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_l3: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_linuxbridge_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_metadata: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_netns_cleanup_cron: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_openvswitch_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_server: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_sriov_agent_init: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_sriov_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      rabbit_init: "{{ openstack_helm_neutron_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      neutron_bagpipe_bgp: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_bagpipe_bgp', output='ref') }}"
+      neutron_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_db_sync', output='ref') }}"
+      neutron_dhcp: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_dhcp', output='ref') }}"
+      neutron_ironic_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_ironic_agent', output='ref') }}"
+      neutron_l2gw: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_l2gw', output='ref') }}"
+      neutron_l3: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_l3', output='ref') }}"
+      neutron_linuxbridge_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_linuxbridge_agent', output='ref') }}"
+      neutron_metadata: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_metadata', output='ref') }}"
+      neutron_netns_cleanup_cron: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_netns_cleanup_cron', output='ref') }}"
+      neutron_openvswitch_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_openvswitch_agent', output='ref') }}"
+      neutron_server: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_server', output='ref') }}"
+      neutron_sriov_agent_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_sriov_agent_init', output='ref') }}"
+      neutron_sriov_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_sriov_agent', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       server: 3
diff --git a/roles/openstack_helm_nova/defaults/main.yml b/roles/openstack_helm_nova/defaults/main.yml
index eaeb06d..c0415ad 100644
--- a/roles/openstack_helm_nova/defaults/main.yml
+++ b/roles/openstack_helm_nova/defaults/main.yml
@@ -11,42 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_nova_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_nova_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_image_tag [[[
-#
-# Image tag for container
-openstack_helm_nova_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_ssh_image_tag [[[
-#
-# Image tag for SSH container
-openstack_helm_nova_ssh_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_nova_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_nova_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_nova_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_nova_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_nova/vars/main.yml b/roles/openstack_helm_nova/vars/main.yml
index 5635922..afb83b5 100644
--- a/roles/openstack_helm_nova/vars/main.yml
+++ b/roles/openstack_helm_nova/vars/main.yml
@@ -23,32 +23,31 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      db_init: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_nova_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      nova_api: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_archive_deleted_rows: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_cell_setup_init: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      nova_cell_setup: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      # TODO(mnaser): Fix Ironic images
-      nova_compute_ironic: "docker.io/kolla/ubuntu-source-nova-compute-ironic:wallaby"
-      nova_compute_ssh: "{{ openstack_helm_nova_image_repository }}/nova-ssh:{{ openstack_helm_nova_ssh_image_tag }}"
-      nova_compute: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_conductor: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_consoleauth: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_db_sync: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_novncproxy_assets: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_novncproxy: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_placement: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_scheduler: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_service_cleaner: "{{ openstack_helm_nova_image_repository }}/cli:latest"
-      nova_spiceproxy_assets: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_spiceproxy: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      rabbit_init: "{{ openstack_helm_nova_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      nova_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_api', output='ref') }}"
+      nova_archive_deleted_rows: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_archive_deleted_rows', output='ref') }}"
+      nova_cell_setup_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_cell_setup_init', output='ref') }}"
+      nova_cell_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_cell_setup', output='ref') }}"
+      nova_compute_ironic: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute_ironic', output='ref') }}"
+      nova_compute_ssh: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute_ssh', output='ref') }}"
+      nova_compute: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute', output='ref') }}"
+      nova_conductor: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_conductor', output='ref') }}"
+      nova_consoleauth: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_consoleauth', output='ref') }}"
+      nova_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_db_sync', output='ref') }}"
+      nova_novncproxy_assets: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_novncproxy_assets', output='ref') }}"
+      nova_novncproxy: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_novncproxy', output='ref') }}"
+      nova_placement: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_placement', output='ref') }}"
+      nova_scheduler: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_scheduler', output='ref') }}"
+      nova_service_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_service_cleaner', output='ref') }}"
+      nova_spiceproxy_assets: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_spiceproxy_assets', output='ref') }}"
+      nova_spiceproxy: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_spiceproxy', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   network:
     ssh:
       enabled: true
diff --git a/roles/openstack_helm_octavia/defaults/main.yml b/roles/openstack_helm_octavia/defaults/main.yml
index dbdc255..f937de8 100644
--- a/roles/openstack_helm_octavia/defaults/main.yml
+++ b/roles/openstack_helm_octavia/defaults/main.yml
@@ -11,30 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_octavia_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_octavia_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_image_tag [[[
-#
-# Image tag for container
-openstack_helm_octavia_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_octavia_heat_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_neutron_image_tag [[[
-#
-# Image tag for Neutron to be used for openvswitch_vswitchd
-openstack_helm_octavia_neutron_image_tag: zed
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_octavia_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_octavia/vars/main.yml b/roles/openstack_helm_octavia/vars/main.yml
index 002101f..7f320e3 100644
--- a/roles/openstack_helm_octavia/vars/main.yml
+++ b/roles/openstack_helm_octavia/vars/main.yml
@@ -16,21 +16,21 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      bootstrap: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      db_init: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_octavia_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_octavia_image_repository }}/rabbitmq:3.8.23-management"
-      octavia_api: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_db_sync: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_health_manager: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_health_manager_init: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      octavia_housekeeping: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_worker: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      openvswitch_vswitchd: "{{ openstack_helm_octavia_image_repository }}/neutron:{{ openstack_helm_octavia_neutron_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      octavia_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_api', output='ref') }}"
+      octavia_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_db_sync', output='ref') }}"
+      octavia_health_manager: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_health_manager', output='ref') }}"
+      octavia_health_manager_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_health_manager_init', output='ref') }}"
+      octavia_housekeeping: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_housekeeping', output='ref') }}"
+      octavia_worker: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_worker', output='ref') }}"
+      openvswitch_vswitchd: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_vswitchd', output='ref') }}"
   pod:
     mounts:
       octavia_api:
diff --git a/roles/openstack_helm_placement/defaults/main.yml b/roles/openstack_helm_placement/defaults/main.yml
index 3ff3ff6..9065332 100644
--- a/roles/openstack_helm_placement/defaults/main.yml
+++ b/roles/openstack_helm_placement/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_placement_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_placement_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_placement_image_tag [[[
-#
-# Image tag for container
-openstack_helm_placement_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_placement_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_placement_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_placement_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_placement/vars/main.yml b/roles/openstack_helm_placement/vars/main.yml
index cdffca4..0046b8e 100644
--- a/roles/openstack_helm_placement/vars/main.yml
+++ b/roles/openstack_helm_placement/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      db_init: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_placement_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      placement_db_sync: "{{ openstack_helm_placement_image_repository }}/placement:{{ openstack_helm_placement_image_tag }}"
-      placement: "{{ openstack_helm_placement_image_repository }}/placement:{{ openstack_helm_placement_image_tag }}"
-      rabbit_init: "{{ openstack_helm_placement_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      placement_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'placement_db_sync', output='ref') }}"
+      placement: "{{ lookup('vexxhost.atmosphere.image_ref', 'placement', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_senlin/defaults/main.yml b/roles/openstack_helm_senlin/defaults/main.yml
index 350ff47..dab1fdf 100644
--- a/roles/openstack_helm_senlin/defaults/main.yml
+++ b/roles/openstack_helm_senlin/defaults/main.yml
@@ -11,36 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_senlin_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_senlin_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_image_tag [[[
-#
-# Image tag for container
-openstack_helm_senlin_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_senlin_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_senlin_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_senlin_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_senlin_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_senlin/vars/main.yml b/roles/openstack_helm_senlin/vars/main.yml
index 4528366..462c949 100644
--- a/roles/openstack_helm_senlin/vars/main.yml
+++ b/roles/openstack_helm_senlin/vars/main.yml
@@ -18,20 +18,20 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      db_init: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_senlin_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_senlin_image_repository }}/rabbitmq:3.8.23-management"
-      senlin_api: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_conductor: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_db_sync: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_engine_cleaner: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_engine: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_health_manager: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      senlin_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_api', output='ref') }}"
+      senlin_conductor: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_conductor', output='ref') }}"
+      senlin_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_db_sync', output='ref') }}"
+      senlin_engine_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_engine_cleaner', output='ref') }}"
+      senlin_engine: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_engine', output='ref') }}"
+      senlin_health_manager: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_health_manager', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_tempest/defaults/main.yml b/roles/openstack_helm_tempest/defaults/main.yml
index 3dba304..28892e6 100644
--- a/roles/openstack_helm_tempest/defaults/main.yml
+++ b/roles/openstack_helm_tempest/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_tempest_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_tempest_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_tempest_image_tag [[[
-#
-# Image tag for container
-openstack_helm_tempest_image_tag: 30.1.0-4
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_tempest_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_tempest_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_tempest_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_tempest/vars/main.yml b/roles/openstack_helm_tempest/vars/main.yml
index 8a97656..5572a0e 100644
--- a/roles/openstack_helm_tempest/vars/main.yml
+++ b/roles/openstack_helm_tempest/vars/main.yml
@@ -16,9 +16,9 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      dep_check: "{{ openstack_helm_tempest_image_repository }}/kubernetes-entrypoint:latest"
-      tempest_run_tests: "{{ openstack_helm_tempest_image_repository }}/tempest:{{ openstack_helm_tempest_image_tag }}"
-      ks_user: "{{ openstack_helm_tempest_image_repository }}/heat:{{ openstack_helm_tempest_heat_image_tag }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      tempest_run_tests: "{{ lookup('vexxhost.atmosphere.image_ref', 'tempest_run_tests', output='ref') }}"
   jobs:
     run_tests:
       restartPolicy: Never
diff --git a/roles/prometheus_ethtool_exporter/tasks/main.yml b/roles/prometheus_ethtool_exporter/tasks/main.yml
index 24d01a8..79f6ce0 100644
--- a/roles/prometheus_ethtool_exporter/tasks/main.yml
+++ b/roles/prometheus_ethtool_exporter/tasks/main.yml
@@ -31,7 +31,7 @@
                       valueFrom:
                         fieldRef:
                           fieldPath: status.podIP
-                  image: quay.io/vexxhost/ethtool-exporter:{{ prometheus_ethtool_exporter_image_tag }}
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_ethtool_exporter', output='ref') }}"
                   args:
                     - "-L"
                     - "$(IP)"
diff --git a/roles/prometheus_pushgateway/tasks/main.yml b/roles/prometheus_pushgateway/tasks/main.yml
index 84a7b8b..4114ac8 100644
--- a/roles/prometheus_pushgateway/tasks/main.yml
+++ b/roles/prometheus_pushgateway/tasks/main.yml
@@ -31,6 +31,8 @@
                 kind: HelmRepository
                 name: prometheus-community
           values:
+            image:
+              repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_pushgateway', output='name') }}"
             nodeSelector:
               openstack-control-plane: enabled
             serviceMonitor: