aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/admin/image-building.rst46
-rw-r--r--kolla/docker/aodh/aodh-base/Dockerfile.j23
-rw-r--r--kolla/docker/barbican/barbican-base/Dockerfile.j23
-rw-r--r--kolla/docker/base/Dockerfile.j21
-rw-r--r--kolla/docker/bifrost/bifrost-base/Dockerfile.j25
-rw-r--r--kolla/docker/bifrost/bifrost-deploy/Dockerfile.j23
-rw-r--r--kolla/docker/blazar/blazar-base/Dockerfile.j23
-rw-r--r--kolla/docker/ceilometer/ceilometer-base/Dockerfile.j23
-rw-r--r--kolla/docker/ceilometer/ceilometer-compute/Dockerfile.j23
-rw-r--r--kolla/docker/ceilometer/ceilometer-ipmi/Dockerfile.j23
-rw-r--r--kolla/docker/cinder/cinder-api/Dockerfile.j23
-rw-r--r--kolla/docker/cinder/cinder-backup/Dockerfile.j23
-rw-r--r--kolla/docker/cinder/cinder-base/Dockerfile.j25
-rw-r--r--kolla/docker/cinder/cinder-volume/Dockerfile.j23
-rw-r--r--kolla/docker/cloudkitty/cloudkitty-api/Dockerfile.j23
-rw-r--r--kolla/docker/cloudkitty/cloudkitty-base/Dockerfile.j23
-rw-r--r--kolla/docker/cloudkitty/cloudkitty-processor/Dockerfile.j23
-rw-r--r--kolla/docker/collectd/Dockerfile.j23
-rw-r--r--kolla/docker/cron/Dockerfile.j23
-rw-r--r--kolla/docker/cyborg/cyborg-agent/Dockerfile.j23
-rw-r--r--kolla/docker/cyborg/cyborg-api/Dockerfile.j23
-rw-r--r--kolla/docker/cyborg/cyborg-base/Dockerfile.j23
-rw-r--r--kolla/docker/designate/designate-backend-bind9/Dockerfile.j23
-rw-r--r--kolla/docker/designate/designate-base/Dockerfile.j23
-rw-r--r--kolla/docker/designate/designate-worker/Dockerfile.j23
-rw-r--r--kolla/docker/dnsmasq/Dockerfile.j23
-rw-r--r--kolla/docker/fluentd/Dockerfile.j23
-rw-r--r--kolla/docker/glance/glance-api/Dockerfile.j23
-rw-r--r--kolla/docker/glance/glance-base/Dockerfile.j25
-rw-r--r--kolla/docker/gnocchi/gnocchi-base/Dockerfile.j25
-rw-r--r--kolla/docker/grafana/Dockerfile.j23
-rw-r--r--kolla/docker/hacluster/hacluster-base/Dockerfile.j23
-rw-r--r--kolla/docker/hacluster/hacluster-corosync/Dockerfile.j23
-rw-r--r--kolla/docker/hacluster/hacluster-pacemaker-remote/Dockerfile.j23
-rw-r--r--kolla/docker/hacluster/hacluster-pacemaker/Dockerfile.j23
-rw-r--r--kolla/docker/hacluster/hacluster-pcs/Dockerfile.j23
-rw-r--r--kolla/docker/haproxy/haproxy-ssh/Dockerfile.j23
-rw-r--r--kolla/docker/haproxy/haproxy/Dockerfile.j23
-rw-r--r--kolla/docker/heat/heat-base/Dockerfile.j23
-rw-r--r--kolla/docker/horizon/Dockerfile.j23
-rw-r--r--kolla/docker/httpd/Dockerfile.j24
-rw-r--r--kolla/docker/ironic/ironic-api/Dockerfile.j23
-rw-r--r--kolla/docker/ironic/ironic-base/Dockerfile.j23
-rw-r--r--kolla/docker/ironic/ironic-conductor/Dockerfile.j23
-rw-r--r--kolla/docker/ironic/ironic-pxe-filter/Dockerfile.j23
-rw-r--r--kolla/docker/ironic/ironic-pxe/Dockerfile.j23
-rw-r--r--kolla/docker/iscsid/Dockerfile.j23
-rw-r--r--kolla/docker/keepalived/Dockerfile.j23
-rw-r--r--kolla/docker/kerbside/kerbside-api/Dockerfile.j24
-rw-r--r--kolla/docker/kerbside/kerbside-base/Dockerfile.j24
-rw-r--r--kolla/docker/kerbside/kerbside-proxy/Dockerfile.j24
-rw-r--r--kolla/docker/keystone/keystone-base/Dockerfile.j23
-rw-r--r--kolla/docker/keystone/keystone-fernet/Dockerfile.j23
-rw-r--r--kolla/docker/keystone/keystone-ssh/Dockerfile.j23
-rw-r--r--kolla/docker/keystone/keystone/Dockerfile.j23
-rw-r--r--kolla/docker/kolla-toolbox/Dockerfile.j23
-rwxr-xr-xkolla/docker/letsencrypt/letsencrypt-lego/Dockerfile.j23
-rw-r--r--kolla/docker/macros.j216
-rw-r--r--kolla/docker/magnum/magnum-base/Dockerfile.j23
-rw-r--r--kolla/docker/manila/manila-api/Dockerfile.j23
-rw-r--r--kolla/docker/manila/manila-base/Dockerfile.j23
-rw-r--r--kolla/docker/manila/manila-data/Dockerfile.j23
-rw-r--r--kolla/docker/manila/manila-share/Dockerfile.j26
-rw-r--r--kolla/docker/mariadb-server/Dockerfile.j23
-rw-r--r--kolla/docker/masakari/masakari-base/Dockerfile.j23
-rw-r--r--kolla/docker/masakari/masakari-monitors/Dockerfile.j23
-rw-r--r--kolla/docker/memcached/Dockerfile.j23
-rw-r--r--kolla/docker/mistral/mistral-api/Dockerfile.j23
-rw-r--r--kolla/docker/mistral/mistral-base/Dockerfile.j23
-rw-r--r--kolla/docker/multipathd/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-base/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-bgp-dragent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-dhcp-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-l3-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-metadata-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-mlnx-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-openvswitch-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-ovn-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-ovn-vpn-agent/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-server/Dockerfile.j23
-rw-r--r--kolla/docker/neutron/neutron-sriov-agent/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-api/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-base/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-compute-ironic/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-compute/Dockerfile.j25
-rw-r--r--kolla/docker/nova/nova-libvirt-spice/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-libvirt/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-novncproxy/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-spicehtml5proxy/Dockerfile.j23
-rw-r--r--kolla/docker/nova/nova-ssh/Dockerfile.j23
-rw-r--r--kolla/docker/octavia/octavia-api/Dockerfile.j23
-rw-r--r--kolla/docker/octavia/octavia-base/Dockerfile.j23
-rw-r--r--kolla/docker/octavia/octavia-driver-agent/Dockerfile.j23
-rw-r--r--kolla/docker/opensearch/opensearch-dashboards/Dockerfile.j23
-rw-r--r--kolla/docker/opensearch/opensearch/Dockerfile.j23
-rw-r--r--kolla/docker/openstack-base/Dockerfile.j23
-rw-r--r--kolla/docker/openvswitch/openvswitch-base/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-base/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-controller/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-nb-db-server/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-northd/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-sb-db-relay/Dockerfile.j23
-rw-r--r--kolla/docker/ovn/ovn-sb-db-server/Dockerfile.j23
-rw-r--r--kolla/docker/ovsdpdk/ovsdpdk/Dockerfile.j23
-rw-r--r--kolla/docker/placement/placement-api/Dockerfile.j23
-rw-r--r--kolla/docker/placement/placement-base/Dockerfile.j23
-rw-r--r--kolla/docker/prometheus/prometheus-blackbox-exporter/Dockerfile.j23
-rw-r--r--kolla/docker/prometheus/prometheus-libvirt-exporter/Dockerfile.j23
-rw-r--r--kolla/docker/prometheus/prometheus-valkey-exporter/Dockerfile.j23
-rw-r--r--kolla/docker/proxysql/Dockerfile.j23
-rw-r--r--kolla/docker/rabbitmq/Dockerfile.j23
-rw-r--r--kolla/docker/skyline/skyline-apiserver/Dockerfile.j23
-rw-r--r--kolla/docker/skyline/skyline-console/Dockerfile.j23
-rw-r--r--kolla/docker/tacker/tacker-base/Dockerfile.j23
-rw-r--r--kolla/docker/tgtd/Dockerfile.j23
-rw-r--r--kolla/docker/trove/trove-base/Dockerfile.j23
-rw-r--r--kolla/docker/valkey/valkey-sentinel/Dockerfile.j23
-rw-r--r--kolla/docker/valkey/valkey-server/Dockerfile.j23
-rw-r--r--kolla/docker/watcher/watcher-base/Dockerfile.j23
-rw-r--r--kolla/image/kolla_worker.py1
-rw-r--r--kolla/template/methods.py189
-rw-r--r--kolla/tests/test_methods.py373
-rw-r--r--releasenotes/notes/cleanup-repos-85faf33025fd7e5c.yaml16
-rw-r--r--tests/templates/repos.yaml.j210
124 files changed, 979 insertions, 38 deletions
diff --git a/doc/source/admin/image-building.rst b/doc/source/admin/image-building.rst
index 3a40f5f6e..82ea693ec 100644
--- a/doc/source/admin/image-building.rst
+++ b/doc/source/admin/image-building.rst
@@ -783,6 +783,52 @@ Kolla validates this at build time and raises an error listing the missing
overrides. For Rocky Linux this means overriding ``baseos`` or ``appstream``
requires also overriding ``crb``.
+Build-time-only repositories
+""""""""""""""""""""""""""""
+
+Repositories that point to CI mirrors or other infrastructure-internal URLs
+should not be baked into the final image — they may be unreachable at runtime
+and would expose internal infrastructure details. Mark such repositories with
+``build_only: true`` to have kolla automatically restore or remove the
+repository file at the end of each image build.
+
+When ``build_only: true`` is set on a repository:
+
+* **Before** writing the mirror configuration, kolla backs up the existing
+ repository file (if any) to ``/tmp/kolla-repos-backup/``.
+* The repository file is written normally so all package installations in that
+ image can use the mirror.
+* **After** all package installations, kolla injects a cleanup step into every
+ rendered Dockerfile that restores the original file from the backup, or
+ removes the file entirely if no original existed.
+
+This means the repository files in the final image contain the upstream URLs
+(or are absent, leaving the distro defaults in place) rather than mirror URLs.
+
+Example — Debian with a CI mirror marked build-time-only:
+
+.. code-block:: yaml
+
+ debian:
+ debian:
+ build_only: true
+ component: "main"
+ gpg_key: "/usr/share/keyrings/debian-archive-keyring.gpg"
+ suite: "trixie trixie-updates trixie-backports"
+ url: "http://ci-mirror.internal/debian"
+ debian-security:
+ build_only: true
+ component: "main"
+ gpg_key: "/usr/share/keyrings/debian-archive-keyring.gpg"
+ suite: "trixie-security"
+ url: "http://ci-mirror.internal/debian-security"
+
+.. note::
+
+ ``build_only: true`` is only effective for non-distro repository entries
+ (those that write a ``.repo`` or ``.sources`` file). Repositories with
+ ``distro: True`` are a no-op in ``handle_repos()`` and require no cleanup.
+
Red Hat
^^^^^^^
diff --git a/kolla/docker/aodh/aodh-base/Dockerfile.j2 b/kolla/docker/aodh/aodh-base/Dockerfile.j2
index 519537468..b2d863bb9 100644
--- a/kolla/docker/aodh/aodh-base/Dockerfile.j2
+++ b/kolla/docker/aodh/aodh-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='aodh') }}
{% set aodh_base_packages = [
@@ -36,3 +38,4 @@ RUN ln -s aodh-base-source/* aodh \
{{ macros.kolla_patch_sources() }}
{% block aodh_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/barbican/barbican-base/Dockerfile.j2 b/kolla/docker/barbican/barbican-base/Dockerfile.j2
index 89c44ef9a..e5edbb8a9 100644
--- a/kolla/docker/barbican/barbican-base/Dockerfile.j2
+++ b/kolla/docker/barbican/barbican-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='barbican', groups='nfast,hsmusers') }}
{{ macros.install_packages(barbican_base_packages | customizable("packages")) }}
@@ -34,3 +36,4 @@ RUN ln -s barbican-base-source/* barbican \
{{ macros.kolla_patch_sources() }}
{% block barbican_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/base/Dockerfile.j2 b/kolla/docker/base/Dockerfile.j2
index 746f0e731..60419f41d 100644
--- a/kolla/docker/base/Dockerfile.j2
+++ b/kolla/docker/base/Dockerfile.j2
@@ -349,4 +349,5 @@ RUN touch /usr/local/bin/kolla_extend_start \
{{ macros.kolla_patch_sources() }}
{% block base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
CMD ["kolla_start"]
diff --git a/kolla/docker/bifrost/bifrost-base/Dockerfile.j2 b/kolla/docker/bifrost/bifrost-base/Dockerfile.j2
index 3e82a9fd3..75e2fe822 100644
--- a/kolla/docker/bifrost/bifrost-base/Dockerfile.j2
+++ b/kolla/docker/bifrost/bifrost-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set venv_path='/var/lib/kolla/venv' %}
{{ macros.configure_user(name='bifrost') }}
@@ -18,7 +20,7 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% if base_package_type == 'rpm' %}
{# NOTE(mgoddard): EPEL required for nginx #}
-{{ macros.enable_extra_repos(['epel']) }}
+{{ macros.enable_extra_repos(['crb', 'epel']) }}
{% endif %}
{{ macros.install_packages(bifrost_base_packages | customizable("packages")) }}
@@ -74,3 +76,4 @@ RUN chmod 750 /etc/sudoers.d \
{{ macros.kolla_patch_sources() }}
{% block bifrost_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/bifrost/bifrost-deploy/Dockerfile.j2 b/kolla/docker/bifrost/bifrost-deploy/Dockerfile.j2
index 04fc733fc..3cb3d82a8 100644
--- a/kolla/docker/bifrost/bifrost-deploy/Dockerfile.j2
+++ b/kolla/docker/bifrost/bifrost-deploy/Dockerfile.j2
@@ -9,6 +9,8 @@ ENV container docker
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
RUN rm -f $(find /lib/systemd/system/sysinit.target.wants/ ! -name systemd-tmpfiles-setup.service -type l); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
@@ -33,3 +35,4 @@ CMD [ "/sbin/init" ]
{% block bifrost_deploy_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/blazar/blazar-base/Dockerfile.j2 b/kolla/docker/blazar/blazar-base/Dockerfile.j2
index 433842e41..926ba66a4 100644
--- a/kolla/docker/blazar/blazar-base/Dockerfile.j2
+++ b/kolla/docker/blazar/blazar-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='blazar') }}
ADD blazar-base-archive /blazar-base-source
@@ -27,3 +29,4 @@ RUN ln -s blazar-base-source/* blazar \
{{ macros.kolla_patch_sources() }}
{% block blazar_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ceilometer/ceilometer-base/Dockerfile.j2 b/kolla/docker/ceilometer/ceilometer-base/Dockerfile.j2
index 18bd7600a..4e3a63d02 100644
--- a/kolla/docker/ceilometer/ceilometer-base/Dockerfile.j2
+++ b/kolla/docker/ceilometer/ceilometer-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='ceilometer') }}
{% set ceilometer_base_pip_packages = [
@@ -41,3 +43,4 @@ RUN ln -s ceilometer-base-source/* ceilometer \
{{ macros.kolla_patch_sources() }}
{% block ceilometer_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ceilometer/ceilometer-compute/Dockerfile.j2 b/kolla/docker/ceilometer/ceilometer-compute/Dockerfile.j2
index 879c4fb01..629aa5283 100644
--- a/kolla/docker/ceilometer/ceilometer-compute/Dockerfile.j2
+++ b/kolla/docker/ceilometer/ceilometer-compute/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ceilometer_compute_packages = [
'python3-libvirt'
@@ -28,6 +30,7 @@ RUN {{ macros.install_pip(ceilometer_compute_pip_packages | customizable("pip_pa
{% block ceilometer_compute_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
# NOTE(huikang): non-root user does not work with libvirt.sock.
# Need configuration in nova-libvirt container to allow
diff --git a/kolla/docker/ceilometer/ceilometer-ipmi/Dockerfile.j2 b/kolla/docker/ceilometer/ceilometer-ipmi/Dockerfile.j2
index a767dc842..a86c01bac 100644
--- a/kolla/docker/ceilometer/ceilometer-ipmi/Dockerfile.j2
+++ b/kolla/docker/ceilometer/ceilometer-ipmi/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ceilometer_ipmi_packages = [
'ipmitool'
@@ -23,5 +25,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block ceilometer_ipmi_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER ceilometer
diff --git a/kolla/docker/cinder/cinder-api/Dockerfile.j2 b/kolla/docker/cinder/cinder-api/Dockerfile.j2
index b82fba6d3..64a01e404 100644
--- a/kolla/docker/cinder/cinder-api/Dockerfile.j2
+++ b/kolla/docker/cinder/cinder-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set cinder_api_packages = [
] %}
@@ -20,3 +22,4 @@ RUN chmod 644 /usr/local/bin/kolla_cinder_extend_start
{% block cinder_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cinder/cinder-backup/Dockerfile.j2 b/kolla/docker/cinder/cinder-backup/Dockerfile.j2
index 15be355dd..4f42ddbb6 100644
--- a/kolla/docker/cinder/cinder-backup/Dockerfile.j2
+++ b/kolla/docker/cinder/cinder-backup/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set cinder_backup_packages = [
'device-mapper-multipath',
@@ -29,5 +31,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block cinder_backup_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER cinder
diff --git a/kolla/docker/cinder/cinder-base/Dockerfile.j2 b/kolla/docker/cinder/cinder-base/Dockerfile.j2
index bd25d9b18..1b85d92ef 100644
--- a/kolla/docker/cinder/cinder-base/Dockerfile.j2
+++ b/kolla/docker/cinder/cinder-base/Dockerfile.j2
@@ -7,11 +7,13 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='cinder') }}
{% if base_package_type == 'rpm' %}
-{{ macros.enable_extra_repos(['ceph', 'epel']) }}
+{{ macros.enable_extra_repos(['ceph', 'crb', 'epel']) }}
{% set cinder_base_packages = [
'ceph-common',
@@ -58,3 +60,4 @@ RUN ln -s cinder-base-source/* cinder \
{{ macros.kolla_patch_sources() }}
{% block cinder_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cinder/cinder-volume/Dockerfile.j2 b/kolla/docker/cinder/cinder-volume/Dockerfile.j2
index 0e4f38a6e..772350e4e 100644
--- a/kolla/docker/cinder/cinder-volume/Dockerfile.j2
+++ b/kolla/docker/cinder/cinder-volume/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set cinder_volume_packages = [
'lsscsi',
@@ -54,5 +56,6 @@ RUN chmod 750 /etc/sudoers.d \
{% block cinder_volume_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER cinder
diff --git a/kolla/docker/cloudkitty/cloudkitty-api/Dockerfile.j2 b/kolla/docker/cloudkitty/cloudkitty-api/Dockerfile.j2
index fd3d124f3..65dbbe1f6 100644
--- a/kolla/docker/cloudkitty/cloudkitty-api/Dockerfile.j2
+++ b/kolla/docker/cloudkitty/cloudkitty-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set cloudkitty_api_packages = [
] %}
@@ -19,3 +21,4 @@ RUN chmod 644 /usr/local/bin/kolla_cloudkitty_extend_start
{% block cloudkitty_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cloudkitty/cloudkitty-base/Dockerfile.j2 b/kolla/docker/cloudkitty/cloudkitty-base/Dockerfile.j2
index b545d4adf..11e517673 100644
--- a/kolla/docker/cloudkitty/cloudkitty-base/Dockerfile.j2
+++ b/kolla/docker/cloudkitty/cloudkitty-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='cloudkitty') }}
{% set cloudkitty_base_pip_packages = [
@@ -27,3 +29,4 @@ RUN ln -s cloudkitty-base-source/* cloudkitty \
{{ macros.kolla_patch_sources() }}
{% block cloudkitty_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cloudkitty/cloudkitty-processor/Dockerfile.j2 b/kolla/docker/cloudkitty/cloudkitty-processor/Dockerfile.j2
index 33f30fd33..e71b52ebb 100644
--- a/kolla/docker/cloudkitty/cloudkitty-processor/Dockerfile.j2
+++ b/kolla/docker/cloudkitty/cloudkitty-processor/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set cloudkitty_processor_packages = [
] %}
@@ -16,5 +18,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block cloudkitty_processor_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER cloudkitty
diff --git a/kolla/docker/collectd/Dockerfile.j2 b/kolla/docker/collectd/Dockerfile.j2
index 32ded377e..4ea5a4c40 100644
--- a/kolla/docker/collectd/Dockerfile.j2
+++ b/kolla/docker/collectd/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='collectd') }}
{% set collectd_packages = [
@@ -77,5 +79,6 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start \
{% block collectd_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER collectd
diff --git a/kolla/docker/cron/Dockerfile.j2 b/kolla/docker/cron/Dockerfile.j2
index d3a9213ac..8a0aef268 100644
--- a/kolla/docker/cron/Dockerfile.j2
+++ b/kolla/docker/cron/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set cron_packages = [
'cronie',
@@ -33,3 +35,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{% block cron_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cyborg/cyborg-agent/Dockerfile.j2 b/kolla/docker/cyborg/cyborg-agent/Dockerfile.j2
index dfc1adc0b..e8b5d9c3c 100644
--- a/kolla/docker/cyborg/cyborg-agent/Dockerfile.j2
+++ b/kolla/docker/cyborg/cyborg-agent/Dockerfile.j2
@@ -6,6 +6,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block cyborg_agent_header %}{% endblock %}
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set cyborg_agent_packages = [
'pciutils',
] %}
@@ -20,3 +22,4 @@ RUN {{ macros.install_pip(cyborg_agent_pip_packages | customizable("pip_packages
{% block cyborg_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cyborg/cyborg-api/Dockerfile.j2 b/kolla/docker/cyborg/cyborg-api/Dockerfile.j2
index d67cdeb28..ba4e6f209 100644
--- a/kolla/docker/cyborg/cyborg-api/Dockerfile.j2
+++ b/kolla/docker/cyborg/cyborg-api/Dockerfile.j2
@@ -6,6 +6,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block cyborg_api_header %}{% endblock %}
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set cyborg_api_packages = [
] %}
{{ macros.install_packages(cyborg_api_packages | customizable("packages")) }}
@@ -17,3 +19,4 @@ RUN chmod 644 /usr/local/bin/kolla_cyborg_extend_start
{% block cyborg_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/cyborg/cyborg-base/Dockerfile.j2 b/kolla/docker/cyborg/cyborg-base/Dockerfile.j2
index c3f3e602a..95a0eab8c 100644
--- a/kolla/docker/cyborg/cyborg-base/Dockerfile.j2
+++ b/kolla/docker/cyborg/cyborg-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='cyborg') }}
ADD cyborg-base-archive /cyborg-base-source
@@ -29,3 +31,4 @@ RUN ln -s cyborg-base-source/* cyborg \
{{ macros.kolla_patch_sources() }}
{% block cyborg_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/designate/designate-backend-bind9/Dockerfile.j2 b/kolla/docker/designate/designate-backend-bind9/Dockerfile.j2
index cf1277aeb..7fc0e69b5 100644
--- a/kolla/docker/designate/designate-backend-bind9/Dockerfile.j2
+++ b/kolla/docker/designate/designate-backend-bind9/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set designate_backend_bind9_packages = ['bind'] %}
@@ -29,3 +31,4 @@ RUN mkdir -p /var/lib/kolla/ /var/lib/{{ designate_backend_bind_name }}/ /run/{{
{% block designate_backend_bind9_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/designate/designate-base/Dockerfile.j2 b/kolla/docker/designate/designate-base/Dockerfile.j2
index 26a0beca1..46836d931 100644
--- a/kolla/docker/designate/designate-base/Dockerfile.j2
+++ b/kolla/docker/designate/designate-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='designate') }}
{% set designate_base_pip_packages = [
@@ -31,3 +33,4 @@ RUN ln -s designate-base-source/* designate \
{{ macros.kolla_patch_sources() }}
{% block designate_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/designate/designate-worker/Dockerfile.j2 b/kolla/docker/designate/designate-worker/Dockerfile.j2
index b4e190df6..1cfff0c54 100644
--- a/kolla/docker/designate/designate-worker/Dockerfile.j2
+++ b/kolla/docker/designate/designate-worker/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
# The bind9 package here is only to provide the rndc binary.
{% if base_package_type == 'rpm' %}
{% set designate_worker_packages = [
@@ -23,5 +25,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block designate_worker_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER designate
diff --git a/kolla/docker/dnsmasq/Dockerfile.j2 b/kolla/docker/dnsmasq/Dockerfile.j2
index 882613be7..a91b2fca8 100644
--- a/kolla/docker/dnsmasq/Dockerfile.j2
+++ b/kolla/docker/dnsmasq/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set dnsmasq_packages = ['dnsmasq'] %}
{{ macros.install_packages(dnsmasq_packages| customizable("packages")) }}
@@ -17,3 +19,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{% block dnsmasq_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/fluentd/Dockerfile.j2 b/kolla/docker/fluentd/Dockerfile.j2
index c63e1b990..68dd71976 100644
--- a/kolla/docker/fluentd/Dockerfile.j2
+++ b/kolla/docker/fluentd/Dockerfile.j2
@@ -10,6 +10,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" fluentd_binary="flue
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.enable_extra_repos(['fluentd']) }}
{% if base_package_type == 'rpm' %}
@@ -58,5 +60,6 @@ COPY extend_start.sh /usr/local/bin/kolla_extend_start
{% block fluentd_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER {{ fluentd_user }}
diff --git a/kolla/docker/glance/glance-api/Dockerfile.j2 b/kolla/docker/glance/glance-api/Dockerfile.j2
index e3efbfef3..ca1820631 100644
--- a/kolla/docker/glance/glance-api/Dockerfile.j2
+++ b/kolla/docker/glance/glance-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set glance_api_packages = [
'lsscsi',
@@ -34,5 +36,6 @@ RUN chmod 644 /usr/local/bin/kolla_glance_extend_start
{% block glance_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER glance
diff --git a/kolla/docker/glance/glance-base/Dockerfile.j2 b/kolla/docker/glance/glance-base/Dockerfile.j2
index 885cc4353..59402e663 100644
--- a/kolla/docker/glance/glance-base/Dockerfile.j2
+++ b/kolla/docker/glance/glance-base/Dockerfile.j2
@@ -7,11 +7,13 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='glance') }}
{% if base_package_type == 'rpm' %}
-{{ macros.enable_extra_repos(['ceph', 'epel']) }}
+{{ macros.enable_extra_repos(['ceph', 'crb', 'epel']) }}
{% set glance_base_packages = [
'python3-rados',
@@ -52,3 +54,4 @@ RUN ln -s glance-base-source/* glance \
{{ macros.kolla_patch_sources() }}
{% block glance_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/gnocchi/gnocchi-base/Dockerfile.j2 b/kolla/docker/gnocchi/gnocchi-base/Dockerfile.j2
index 91199ac39..abbeb5636 100644
--- a/kolla/docker/gnocchi/gnocchi-base/Dockerfile.j2
+++ b/kolla/docker/gnocchi/gnocchi-base/Dockerfile.j2
@@ -7,11 +7,13 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='gnocchi') }}
{% if base_package_type == 'rpm' %}
-{{ macros.enable_extra_repos(['ceph', 'epel']) }}
+{{ macros.enable_extra_repos(['ceph', 'crb', 'epel']) }}
{% set gnocchi_base_packages = [
'librados2-devel',
@@ -54,3 +56,4 @@ RUN ln -s gnocchi-base-source/* gnocchi \
{{ macros.kolla_patch_sources() }}
{% block gnocchi_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/grafana/Dockerfile.j2 b/kolla/docker/grafana/Dockerfile.j2
index e401d91b6..971994baf 100644
--- a/kolla/docker/grafana/Dockerfile.j2
+++ b/kolla/docker/grafana/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.enable_extra_repos(['grafana']) }}
{% set grafana_packages = ['grafana'] %}
@@ -38,5 +40,6 @@ RUN chmod 750 /etc/sudoers.d \
{% block grafana_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER grafana
diff --git a/kolla/docker/hacluster/hacluster-base/Dockerfile.j2 b/kolla/docker/hacluster/hacluster-base/Dockerfile.j2
index 045f21e1e..52d255b88 100644
--- a/kolla/docker/hacluster/hacluster-base/Dockerfile.j2
+++ b/kolla/docker/hacluster/hacluster-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type =='rpm' %}
{{ macros.enable_extra_repos(['hacluster']) }}
@@ -20,3 +22,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{{ macros.kolla_patch_sources() }}
{% block hacluster_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/hacluster/hacluster-corosync/Dockerfile.j2 b/kolla/docker/hacluster/hacluster-corosync/Dockerfile.j2
index 74d47c380..e8ed1f147 100644
--- a/kolla/docker/hacluster/hacluster-corosync/Dockerfile.j2
+++ b/kolla/docker/hacluster/hacluster-corosync/Dockerfile.j2
@@ -7,9 +7,12 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set hacluster_corosync_packages = ['corosync'] %}
{{ macros.install_packages(hacluster_corosync_packages | customizable("packages")) }}
{{ macros.kolla_patch_sources() }}
{% block hacluster_corosync_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/hacluster/hacluster-pacemaker-remote/Dockerfile.j2 b/kolla/docker/hacluster/hacluster-pacemaker-remote/Dockerfile.j2
index 64c381e1f..a6bf2a7d4 100644
--- a/kolla/docker/hacluster/hacluster-pacemaker-remote/Dockerfile.j2
+++ b/kolla/docker/hacluster/hacluster-pacemaker-remote/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set hacluster_pacemaker_remote_packages = ['pacemaker-remote'] %}
{% if base_package_type == 'deb' %}
{% set hacluster_pacemaker_remote_packages = hacluster_pacemaker_remote_packages + [
@@ -19,3 +21,4 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{{ macros.kolla_patch_sources() }}
{% block hacluster_pacemaker_remote_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/hacluster/hacluster-pacemaker/Dockerfile.j2 b/kolla/docker/hacluster/hacluster-pacemaker/Dockerfile.j2
index 33eeb3144..e3c38fbb8 100644
--- a/kolla/docker/hacluster/hacluster-pacemaker/Dockerfile.j2
+++ b/kolla/docker/hacluster/hacluster-pacemaker/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set hacluster_pacemaker_packages = ['pacemaker'] %}
{% if base_package_type == 'deb' %}
{% set hacluster_pacemaker_packages = hacluster_pacemaker_packages + [
@@ -19,3 +21,4 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{{ macros.kolla_patch_sources() }}
{% block hacluster_pacemaker_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/hacluster/hacluster-pcs/Dockerfile.j2 b/kolla/docker/hacluster/hacluster-pcs/Dockerfile.j2
index a146d0d4b..c744ad68c 100644
--- a/kolla/docker/hacluster/hacluster-pcs/Dockerfile.j2
+++ b/kolla/docker/hacluster/hacluster-pcs/Dockerfile.j2
@@ -7,9 +7,12 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set hacluster_pcs_packages = ['pcs','crmsh'] %}
{{ macros.install_packages(hacluster_pcs_packages | customizable("packages")) }}
{{ macros.kolla_patch_sources() }}
{% block hacluster_pcs_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/haproxy/haproxy-ssh/Dockerfile.j2 b/kolla/docker/haproxy/haproxy-ssh/Dockerfile.j2
index a674cc75e..dda1c9d6f 100644
--- a/kolla/docker/haproxy/haproxy-ssh/Dockerfile.j2
+++ b/kolla/docker/haproxy/haproxy-ssh/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='haproxy', shell='/bin/bash') }}
{% if base_package_type == 'rpm' %}
@@ -40,3 +42,4 @@ COPY update-loadbalancer-cert.sh /usr/bin/update-loadbalancer-cert
{% block haproxy_ssh_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/haproxy/haproxy/Dockerfile.j2 b/kolla/docker/haproxy/haproxy/Dockerfile.j2
index 36c7ca943..aed0615fe 100644
--- a/kolla/docker/haproxy/haproxy/Dockerfile.j2
+++ b/kolla/docker/haproxy/haproxy/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='haproxy') }}
{% set haproxy_packages = [
@@ -24,3 +26,4 @@ RUN mkdir -p /var/lib/kolla/haproxy \
{% block haproxy_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/heat/heat-base/Dockerfile.j2 b/kolla/docker/heat/heat-base/Dockerfile.j2
index a06ea6f0d..65afe31fb 100644
--- a/kolla/docker/heat/heat-base/Dockerfile.j2
+++ b/kolla/docker/heat/heat-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='heat') }}
{% if base_package_type == 'rpm' %}
@@ -39,3 +41,4 @@ RUN ln -s heat-base-source/* heat \
{{ macros.kolla_patch_sources() }}
{% block heat_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/horizon/Dockerfile.j2 b/kolla/docker/horizon/Dockerfile.j2
index 73dc65dd1..6e0e8e84e 100644
--- a/kolla/docker/horizon/Dockerfile.j2
+++ b/kolla/docker/horizon/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='horizon') }}
{% if base_package_type == 'rpm' %}
@@ -72,3 +74,4 @@ RUN ln -s horizon-source/* horizon \
{% block horizon_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/httpd/Dockerfile.j2 b/kolla/docker/httpd/Dockerfile.j2
index ec5637283..3c86c57b7 100644
--- a/kolla/docker/httpd/Dockerfile.j2
+++ b/kolla/docker/httpd/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{{ macros.enable_extra_repos(['epel']) }}
{% set apache_packages = [
@@ -37,6 +39,8 @@ RUN echo > /etc/apache2/ports.conf
COPY extend_start.sh /usr/local/bin/kolla_extend_start
COPY httpd_setup.sh /usr/local/bin/kolla_httpd_setup
RUN chmod 644 /usr/local/bin/kolla_extend_start /usr/local/bin/kolla_httpd_setup
+{{ macros.kolla_patch_sources() }}
USER root
{% block apache_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ironic/ironic-api/Dockerfile.j2 b/kolla/docker/ironic/ironic-api/Dockerfile.j2
index 1c10d0372..f5337f04a 100644
--- a/kolla/docker/ironic/ironic-api/Dockerfile.j2
+++ b/kolla/docker/ironic/ironic-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set ironic_api_packages = [
] %}
{{ macros.install_packages(ironic_api_packages | customizable("packages")) }}
@@ -18,3 +20,4 @@ RUN chmod 644 /usr/local/bin/kolla_ironic_extend_start
{% block ironic_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ironic/ironic-base/Dockerfile.j2 b/kolla/docker/ironic/ironic-base/Dockerfile.j2
index 39265cf80..7696d2911 100644
--- a/kolla/docker/ironic/ironic-base/Dockerfile.j2
+++ b/kolla/docker/ironic/ironic-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='ironic', shell='/bin/bash') }}
ADD ironic-base-archive /ironic-base-source
@@ -30,3 +32,4 @@ RUN ln -s ironic-base-source/* ironic \
{{ macros.kolla_patch_sources() }}
{% block ironic_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ironic/ironic-conductor/Dockerfile.j2 b/kolla/docker/ironic/ironic-conductor/Dockerfile.j2
index 15a07e4b9..40525b620 100644
--- a/kolla/docker/ironic/ironic-conductor/Dockerfile.j2
+++ b/kolla/docker/ironic/ironic-conductor/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ironic_conductor_packages = [
'dosfstools',
@@ -71,5 +73,6 @@ RUN {{ macros.install_pip(ironic_conductor_pip_packages | customizable("pip_pack
{% block ironic_conductor_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER ironic
diff --git a/kolla/docker/ironic/ironic-pxe-filter/Dockerfile.j2 b/kolla/docker/ironic/ironic-pxe-filter/Dockerfile.j2
index 5b593e9f0..717c7849c 100644
--- a/kolla/docker/ironic/ironic-pxe-filter/Dockerfile.j2
+++ b/kolla/docker/ironic/ironic-pxe-filter/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set ironic_pxe_filter_packages = [] %}
{% set ironic_pxe_filter_pip_packages = [] %}
@@ -22,3 +24,4 @@ RUN chmod 644 /usr/local/bin/kolla_ironic_extend_start
{% block ironic_pxe_filter_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ironic/ironic-pxe/Dockerfile.j2 b/kolla/docker/ironic/ironic-pxe/Dockerfile.j2
index 0475a5b05..f198e3292 100644
--- a/kolla/docker/ironic/ironic-pxe/Dockerfile.j2
+++ b/kolla/docker/ironic/ironic-pxe/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ironic_pxe_packages = [
'dosfstools',
@@ -53,3 +55,4 @@ RUN chmod 644 /usr/local/bin/kolla_ironic_extend_start
{% block ironic_pxe_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/iscsid/Dockerfile.j2 b/kolla/docker/iscsid/Dockerfile.j2
index a1e4bba61..49c8fb9fe 100644
--- a/kolla/docker/iscsid/Dockerfile.j2
+++ b/kolla/docker/iscsid/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set iscsid_packages = [
'iscsi-initiator-utils',
@@ -34,3 +36,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start \
{% block iscsid_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/keepalived/Dockerfile.j2 b/kolla/docker/keepalived/Dockerfile.j2
index 2dcdeccd7..93b8218c8 100644
--- a/kolla/docker/keepalived/Dockerfile.j2
+++ b/kolla/docker/keepalived/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.enable_extra_repos(['mariadb']) }}
{% if base_package_type == 'rpm' %}
@@ -32,3 +34,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start \
{% block keepalived_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/kerbside/kerbside-api/Dockerfile.j2 b/kolla/docker/kerbside/kerbside-api/Dockerfile.j2
index 6ea99eb7a..28557fe52 100644
--- a/kolla/docker/kerbside/kerbside-api/Dockerfile.j2
+++ b/kolla/docker/kerbside/kerbside-api/Dockerfile.j2
@@ -3,7 +3,9 @@ FROM {{ namespace }}/{{ image_prefix }}kerbside-base:{{ tag }}
LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% endblock %}
+{% import "macros.j2" as macros with context %}
+
COPY extend_start.sh /usr/local/bin/kolla_extend_start
RUN chmod 644 /usr/local/bin/kolla_extend_start
-
+{{ macros.kolla_patch_sources() }}
USER kerbside
diff --git a/kolla/docker/kerbside/kerbside-base/Dockerfile.j2 b/kolla/docker/kerbside/kerbside-base/Dockerfile.j2
index 77f881399..bc181258f 100644
--- a/kolla/docker/kerbside/kerbside-base/Dockerfile.j2
+++ b/kolla/docker/kerbside/kerbside-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='kerbside', groups='kerbside') }}
{% if base_package_type == 'rpm' %}
@@ -35,4 +37,6 @@ RUN ln -s kerbside-source/* kerbside \
&& {{ macros.install_pip(kerbside_pip_packages | customizable("pip_packages"), false) }} \
&& rm -f /etc/machine-id
+{{ macros.kolla_patch_sources() }}
{% block kerbside_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/kerbside/kerbside-proxy/Dockerfile.j2 b/kolla/docker/kerbside/kerbside-proxy/Dockerfile.j2
index 6ea99eb7a..28557fe52 100644
--- a/kolla/docker/kerbside/kerbside-proxy/Dockerfile.j2
+++ b/kolla/docker/kerbside/kerbside-proxy/Dockerfile.j2
@@ -3,7 +3,9 @@ FROM {{ namespace }}/{{ image_prefix }}kerbside-base:{{ tag }}
LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% endblock %}
+{% import "macros.j2" as macros with context %}
+
COPY extend_start.sh /usr/local/bin/kolla_extend_start
RUN chmod 644 /usr/local/bin/kolla_extend_start
-
+{{ macros.kolla_patch_sources() }}
USER kerbside
diff --git a/kolla/docker/keystone/keystone-base/Dockerfile.j2 b/kolla/docker/keystone/keystone-base/Dockerfile.j2
index faa424fa7..82c90e6f6 100644
--- a/kolla/docker/keystone/keystone-base/Dockerfile.j2
+++ b/kolla/docker/keystone/keystone-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='keystone') }}
{% if base_package_type == 'rpm' %}
@@ -43,3 +45,4 @@ RUN ln -s keystone-base-source/* keystone \
{{ macros.kolla_patch_sources() }}
{% block keystone_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/keystone/keystone-fernet/Dockerfile.j2 b/kolla/docker/keystone/keystone-fernet/Dockerfile.j2
index da32ddb86..92ee4738b 100644
--- a/kolla/docker/keystone/keystone-fernet/Dockerfile.j2
+++ b/kolla/docker/keystone/keystone-fernet/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set keystone_fernet_packages = [
'cronie',
@@ -32,3 +34,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start \
{% block keystone_fernet_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/keystone/keystone-ssh/Dockerfile.j2 b/kolla/docker/keystone/keystone-ssh/Dockerfile.j2
index af290bd5f..a7b2a6e10 100644
--- a/kolla/docker/keystone/keystone-ssh/Dockerfile.j2
+++ b/kolla/docker/keystone/keystone-ssh/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='keystone', shell='/bin/bash') }}
{% if base_package_type == 'rpm' %}
@@ -36,3 +38,4 @@ RUN sed -ri 's/session(\s+)required(\s+)pam_loginuid.so/session\1optional\2pam_l
{% block keystone_ssh_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/keystone/keystone/Dockerfile.j2 b/kolla/docker/keystone/keystone/Dockerfile.j2
index 742626c05..df2003f10 100644
--- a/kolla/docker/keystone/keystone/Dockerfile.j2
+++ b/kolla/docker/keystone/keystone/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set keystone_packages = [
'krb5-devel',
@@ -43,3 +45,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start \
{% block keystone_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/kolla-toolbox/Dockerfile.j2 b/kolla/docker/kolla-toolbox/Dockerfile.j2
index cad44524c..2e4750e2a 100644
--- a/kolla/docker/kolla-toolbox/Dockerfile.j2
+++ b/kolla/docker/kolla-toolbox/Dockerfile.j2
@@ -10,6 +10,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='ansible') }}
{{ macros.configure_user(name='rabbitmq') }}
@@ -125,5 +127,6 @@ RUN chmod 644 /etc/ansible/ansible.cfg \
{% block kolla_toolbox_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER ansible
diff --git a/kolla/docker/letsencrypt/letsencrypt-lego/Dockerfile.j2 b/kolla/docker/letsencrypt/letsencrypt-lego/Dockerfile.j2
index b7cda214e..a52199d0b 100755
--- a/kolla/docker/letsencrypt/letsencrypt-lego/Dockerfile.j2
+++ b/kolla/docker/letsencrypt/letsencrypt-lego/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='letsencrypt', shell='/bin/bash') }}
{% if base_package_type == 'rpm' %}
@@ -39,3 +41,4 @@ RUN chmod +x /usr/bin/letsencrypt-certificates /usr/bin/sync-and-update-certific
{% block letsencrypt_lego_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/macros.j2 b/kolla/docker/macros.j2
index 34d67335c..6d43b4ccf 100644
--- a/kolla/docker/macros.j2
+++ b/kolla/docker/macros.j2
@@ -95,3 +95,19 @@ sed -e "s/^{{package_name}}==={{ from }}/{{package_name}}=={{ to }}/g" -i requir
RUN kolla_patch
{% endif %}
{%- endmacro %}
+
+{% macro kolla_cleanup_repos() -%}
+{{ cleanup_repos() }}
+{%- endmacro %}
+
+{% macro kolla_enable_base_repos() %}
+{% if base_package_type == 'rpm' %}
+{{ handle_repos(['baseos', 'appstream'], 'enable') }}
+{% elif base_package_type == 'deb' %}
+{% if base_distro == 'debian' %}
+{{ handle_repos(['debian', 'debian-security'], 'enable') }}
+{% elif base_distro == 'ubuntu' %}
+{{ handle_repos(['ubuntu', 'ubuntu-security', 'ubuntu-cloud-archive'], 'enable') }}
+{% endif %}
+{% endif %}
+{% endmacro %}
diff --git a/kolla/docker/magnum/magnum-base/Dockerfile.j2 b/kolla/docker/magnum/magnum-base/Dockerfile.j2
index ac17b94b4..ef070f88f 100644
--- a/kolla/docker/magnum/magnum-base/Dockerfile.j2
+++ b/kolla/docker/magnum/magnum-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='magnum') }}
ADD magnum-base-archive /magnum-base-source
@@ -29,3 +31,4 @@ RUN ln -s magnum-base-source/* magnum \
{{ macros.kolla_patch_sources() }}
{% block magnum_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/manila/manila-api/Dockerfile.j2 b/kolla/docker/manila/manila-api/Dockerfile.j2
index d7b75d388..ea5f46195 100644
--- a/kolla/docker/manila/manila-api/Dockerfile.j2
+++ b/kolla/docker/manila/manila-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set manila_api_packages = [
] %}
{{ macros.install_packages(manila_api_packages | customizable("packages")) }}
@@ -19,5 +21,6 @@ RUN chmod 644 /usr/local/bin/kolla_manila_extend_start
{% block manila_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER manila
diff --git a/kolla/docker/manila/manila-base/Dockerfile.j2 b/kolla/docker/manila/manila-base/Dockerfile.j2
index a236a20df..fff2d5bd3 100644
--- a/kolla/docker/manila/manila-base/Dockerfile.j2
+++ b/kolla/docker/manila/manila-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='manila') }}
{% if base_package_type == 'rpm' %}
@@ -46,3 +48,4 @@ RUN ln -s manila-base-source/* manila \
{{ macros.kolla_patch_sources() }}
{% block manila_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/manila/manila-data/Dockerfile.j2 b/kolla/docker/manila/manila-data/Dockerfile.j2
index 06e1d9dc9..f0454c122 100644
--- a/kolla/docker/manila/manila-data/Dockerfile.j2
+++ b/kolla/docker/manila/manila-data/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set manila_data_packages = [
@@ -27,5 +29,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block manila_data_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER manila
diff --git a/kolla/docker/manila/manila-share/Dockerfile.j2 b/kolla/docker/manila/manila-share/Dockerfile.j2
index 161b6865a..f5bc29bb7 100644
--- a/kolla/docker/manila/manila-share/Dockerfile.j2
+++ b/kolla/docker/manila/manila-share/Dockerfile.j2
@@ -7,7 +7,12 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
+
+{{ macros.enable_extra_repos(['crb']) }}
+
{% set manila_share_packages = [
'ceph-common',
'sqlite',
@@ -30,5 +35,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block manila_share_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER manila
diff --git a/kolla/docker/mariadb-server/Dockerfile.j2 b/kolla/docker/mariadb-server/Dockerfile.j2
index 612b37330..a9a84bf73 100644
--- a/kolla/docker/mariadb-server/Dockerfile.j2
+++ b/kolla/docker/mariadb-server/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='mysql') }}
{% if base_package_type == 'rpm' %}
@@ -92,5 +94,6 @@ CMD ["kolla_start"]
{% block mariadb_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER mysql
diff --git a/kolla/docker/masakari/masakari-base/Dockerfile.j2 b/kolla/docker/masakari/masakari-base/Dockerfile.j2
index 97e31247e..92ac9bad9 100644
--- a/kolla/docker/masakari/masakari-base/Dockerfile.j2
+++ b/kolla/docker/masakari/masakari-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='masakari') }}
{% if base_package_type == 'rpm' %}
@@ -41,3 +43,4 @@ RUN ln -s masakari-base-source/* masakari \
{{ macros.kolla_patch_sources() }}
{% block masakari_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/masakari/masakari-monitors/Dockerfile.j2 b/kolla/docker/masakari/masakari-monitors/Dockerfile.j2
index 92b8c3947..701521b4b 100644
--- a/kolla/docker/masakari/masakari-monitors/Dockerfile.j2
+++ b/kolla/docker/masakari/masakari-monitors/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{{ macros.enable_extra_repos(['hacluster']) }}
@@ -51,5 +53,6 @@ RUN ln -s masakari-monitors-source/* masakari-monitors \
{% block masakari_monitors_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER masakari
diff --git a/kolla/docker/memcached/Dockerfile.j2 b/kolla/docker/memcached/Dockerfile.j2
index dfe90b18e..8cf2e09d7 100644
--- a/kolla/docker/memcached/Dockerfile.j2
+++ b/kolla/docker/memcached/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='memcached', homedir='/run/memcache') }}
{% set memcached_packages = ['memcached'] %}
@@ -16,5 +18,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block memcached_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER memcached
diff --git a/kolla/docker/mistral/mistral-api/Dockerfile.j2 b/kolla/docker/mistral/mistral-api/Dockerfile.j2
index be3e431e1..0ad4fb767 100644
--- a/kolla/docker/mistral/mistral-api/Dockerfile.j2
+++ b/kolla/docker/mistral/mistral-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set mistral_api_packages = [
] %}
{{ macros.install_packages(mistral_api_packages | customizable("packages")) }}
@@ -18,3 +20,4 @@ RUN chmod 644 /usr/local/bin/kolla_mistral_extend_start
{% block mistral_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/mistral/mistral-base/Dockerfile.j2 b/kolla/docker/mistral/mistral-base/Dockerfile.j2
index 1d72c1cac..d459fda1f 100644
--- a/kolla/docker/mistral/mistral-base/Dockerfile.j2
+++ b/kolla/docker/mistral/mistral-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='mistral') }}
ADD mistral-base-archive /mistral-base-source
@@ -36,3 +38,4 @@ RUN ln -s mistral-base-source/* mistral \
{{ macros.kolla_patch_sources() }}
{% block mistral_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/multipathd/Dockerfile.j2 b/kolla/docker/multipathd/Dockerfile.j2
index 1341c62a7..19ef76fa5 100644
--- a/kolla/docker/multipathd/Dockerfile.j2
+++ b/kolla/docker/multipathd/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set multipathd_packages = ['device-mapper-multipath'] %}
{% elif base_package_type == 'deb' %}
@@ -19,3 +21,4 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block multipathd_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/neutron/neutron-base/Dockerfile.j2 b/kolla/docker/neutron/neutron-base/Dockerfile.j2
index 1550a0f76..1c454e0ce 100644
--- a/kolla/docker/neutron/neutron-base/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.enable_extra_repos(['docker-ce']) }}
{{ macros.configure_user(name='neutron') }}
@@ -101,3 +103,4 @@ RUN ln -s neutron-base-source/* neutron \
{{ macros.kolla_patch_sources() }}
{% block neutron_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/neutron/neutron-bgp-dragent/Dockerfile.j2 b/kolla/docker/neutron/neutron-bgp-dragent/Dockerfile.j2
index 3ad2ab596..66ee77f63 100644
--- a/kolla/docker/neutron/neutron-bgp-dragent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-bgp-dragent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
ADD neutron-bgp-dragent-archive /neutron-bgp-dragent-source
{% set neutron_bgp_dragent_pip_packages = [
@@ -20,5 +22,6 @@ RUN ln -s neutron-bgp-dragent-source/* neutron_dynamic_routing \
{% block neutron_bgp_dragent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-dhcp-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-dhcp-agent/Dockerfile.j2
index 035433bf2..750526097 100644
--- a/kolla/docker/neutron/neutron-dhcp-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-dhcp-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set neutron_dhcp_agent_packages = [
] %}
@@ -18,5 +20,6 @@ COPY extend_start.sh /usr/local/bin/kolla_extend_start
{% block neutron_dhcp_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-l3-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-l3-agent/Dockerfile.j2
index ae0457c18..52b63462a 100644
--- a/kolla/docker/neutron/neutron-l3-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-l3-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set neutron_l3_agent_packages = [
'libreswan',
@@ -28,5 +30,6 @@ COPY extend_start.sh /usr/local/bin/kolla_extend_start
{% block neutron_l3_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-metadata-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-metadata-agent/Dockerfile.j2
index 3736f70c8..b6be8d739 100644
--- a/kolla/docker/neutron/neutron-metadata-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-metadata-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set neutron_metadata_agent_packages = [
] %}
@@ -18,5 +20,6 @@ COPY extend_start.sh /usr/local/bin/kolla_extend_start
{% block neutron_metadata_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-mlnx-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-mlnx-agent/Dockerfile.j2
index 4ee89c19a..7eb6305fe 100644
--- a/kolla/docker/neutron/neutron-mlnx-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-mlnx-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set neutron_mlnx_agent_packages = [
'python3-libvirt',
] %}
@@ -23,5 +25,6 @@ RUN {{ macros.install_pip(neutron_mlnx_agent_pip_packages | customizable("pip_pa
{% block neutron_mlnx_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2
index b9499e6f7..d0a963259 100644
--- a/kolla/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-openvswitch-agent/Dockerfile.j2
@@ -7,11 +7,14 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.install_packages(neutron_openvswitch_agent_packages | customizable("packages")) }}
{{ macros.kolla_patch_sources() }}
{% block neutron_openvswitch_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-ovn-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-ovn-agent/Dockerfile.j2
index fe4e352ac..915bef108 100644
--- a/kolla/docker/neutron/neutron-ovn-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-ovn-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set neutron_ovn_agent_packages = [
] %}
@@ -16,5 +18,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block neutron_ovn_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-ovn-vpn-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-ovn-vpn-agent/Dockerfile.j2
index 4fbaaa78f..ff1f6b48f 100644
--- a/kolla/docker/neutron/neutron-ovn-vpn-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-ovn-vpn-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
# Note: VPN is currently not working on RHEL 10 due to a known issue:
# https://bugs.launchpad.net/neutron/+bug/2146308
{% if base_package_type == 'rpm' %}
@@ -27,5 +29,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block neutron_ovn_vpn_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-server/Dockerfile.j2 b/kolla/docker/neutron/neutron-server/Dockerfile.j2
index bda0d3dcf..0ee7ceabf 100644
--- a/kolla/docker/neutron/neutron-server/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-server/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set neutron_server_pip_packages = [
'networking-hyperv'
] %}
@@ -29,5 +31,6 @@ RUN {{ macros.install_pip(neutron_server_pip_packages | customizable("pip_packag
{% block neutron_server_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/neutron/neutron-sriov-agent/Dockerfile.j2 b/kolla/docker/neutron/neutron-sriov-agent/Dockerfile.j2
index c5d74fbb2..c4a1f1d4b 100644
--- a/kolla/docker/neutron/neutron-sriov-agent/Dockerfile.j2
+++ b/kolla/docker/neutron/neutron-sriov-agent/Dockerfile.j2
@@ -7,11 +7,14 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.install_packages(neutron_sriov_agent_packages | customizable("packages")) }}
{{ macros.kolla_patch_sources() }}
{% block neutron_sriov_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER neutron
diff --git a/kolla/docker/nova/nova-api/Dockerfile.j2 b/kolla/docker/nova/nova-api/Dockerfile.j2
index 57846af79..08353a708 100644
--- a/kolla/docker/nova/nova-api/Dockerfile.j2
+++ b/kolla/docker/nova/nova-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set nova_api_packages = [
] %}
{{ macros.install_packages(nova_api_packages | customizable("packages")) }}
@@ -18,3 +20,4 @@ RUN chmod 644 /usr/local/bin/kolla_nova_extend_start
{% block nova_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/nova/nova-base/Dockerfile.j2 b/kolla/docker/nova/nova-base/Dockerfile.j2
index 423a9760a..da5340f2a 100644
--- a/kolla/docker/nova/nova-base/Dockerfile.j2
+++ b/kolla/docker/nova/nova-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='nova', groups='qemu') }}
{% if base_package_type == 'rpm' %}
@@ -84,3 +86,4 @@ RUN ln -s nova-base-source/* nova \
{{ macros.kolla_patch_sources() }}
{% block nova_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/nova/nova-compute-ironic/Dockerfile.j2 b/kolla/docker/nova/nova-compute-ironic/Dockerfile.j2
index 3c455e2ec..69227056c 100644
--- a/kolla/docker/nova/nova-compute-ironic/Dockerfile.j2
+++ b/kolla/docker/nova/nova-compute-ironic/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set nova_compute_ironic_packages = [
'genisoimage',
'nvme-cli',
@@ -19,5 +21,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block nova_compute_ironic_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER nova
diff --git a/kolla/docker/nova/nova-compute/Dockerfile.j2 b/kolla/docker/nova/nova-compute/Dockerfile.j2
index 8b3c1bcfe..de8d8062d 100644
--- a/kolla/docker/nova/nova-compute/Dockerfile.j2
+++ b/kolla/docker/nova/nova-compute/Dockerfile.j2
@@ -7,9 +7,11 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
-{{ macros.enable_extra_repos(['ceph', 'epel']) }}
+{{ macros.enable_extra_repos(['ceph', 'crb', 'epel']) }}
{% set nova_compute_packages = [
'ceph-common',
@@ -108,5 +110,6 @@ RUN {{ macros.install_pip(nova_compute_pip_packages | customizable("pip_packages
{% block nova_compute_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER nova
diff --git a/kolla/docker/nova/nova-libvirt-spice/Dockerfile.j2 b/kolla/docker/nova/nova-libvirt-spice/Dockerfile.j2
index 4c7ded894..4691df8fd 100644
--- a/kolla/docker/nova/nova-libvirt-spice/Dockerfile.j2
+++ b/kolla/docker/nova/nova-libvirt-spice/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='nova', groups='qemu') }}
{% if base_package_type == 'rpm' %}
@@ -118,3 +120,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start && chmod 744 /usr/local/bin/koll
{% block nova_libvirt_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/nova/nova-libvirt/Dockerfile.j2 b/kolla/docker/nova/nova-libvirt/Dockerfile.j2
index fb82401b3..cfca7306a 100644
--- a/kolla/docker/nova/nova-libvirt/Dockerfile.j2
+++ b/kolla/docker/nova/nova-libvirt/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='nova', groups='qemu') }}
{% if base_package_type == 'rpm' %}
@@ -98,3 +100,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start && chmod 744 /usr/local/bin/koll
{% block nova_libvirt_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/nova/nova-novncproxy/Dockerfile.j2 b/kolla/docker/nova/nova-novncproxy/Dockerfile.j2
index 4952ed734..2c13db694 100644
--- a/kolla/docker/nova/nova-novncproxy/Dockerfile.j2
+++ b/kolla/docker/nova/nova-novncproxy/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set nova_novncproxy_packages = [
'novnc'
] %}
@@ -17,5 +19,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block nova_novncproxy_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER nova
diff --git a/kolla/docker/nova/nova-spicehtml5proxy/Dockerfile.j2 b/kolla/docker/nova/nova-spicehtml5proxy/Dockerfile.j2
index f3a90b0c5..4d22973f5 100644
--- a/kolla/docker/nova/nova-spicehtml5proxy/Dockerfile.j2
+++ b/kolla/docker/nova/nova-spicehtml5proxy/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set nova_spicehtml5proxy_packages = [
@@ -29,5 +31,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block nova_spicehtml5proxy_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER nova
diff --git a/kolla/docker/nova/nova-ssh/Dockerfile.j2 b/kolla/docker/nova/nova-ssh/Dockerfile.j2
index 0d9e36b65..dfb269180 100644
--- a/kolla/docker/nova/nova-ssh/Dockerfile.j2
+++ b/kolla/docker/nova/nova-ssh/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='nova', shell='/bin/bash') }}
{% set nova_ssh_packages = [
@@ -32,3 +34,4 @@ RUN sed -ri 's/session(\s+)required(\s+)pam_loginuid.so/session\1optional\2pam_l
{% block nova_ssh_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/octavia/octavia-api/Dockerfile.j2 b/kolla/docker/octavia/octavia-api/Dockerfile.j2
index ccb7bad11..c5c7406a8 100644
--- a/kolla/docker/octavia/octavia-api/Dockerfile.j2
+++ b/kolla/docker/octavia/octavia-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set octavia_api_packages = [
] %}
@@ -29,3 +31,4 @@ RUN if [ "$(ls /plugins)" ]; then \
{% block octavia_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/octavia/octavia-base/Dockerfile.j2 b/kolla/docker/octavia/octavia-base/Dockerfile.j2
index 81a589a09..9cd040578 100644
--- a/kolla/docker/octavia/octavia-base/Dockerfile.j2
+++ b/kolla/docker/octavia/octavia-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='octavia') }}
{% if base_package_type == 'rpm' %}
@@ -46,3 +48,4 @@ RUN ln -s /octavia-base-source/* octavia \
{{ macros.kolla_patch_sources() }}
{% block octavia_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/octavia/octavia-driver-agent/Dockerfile.j2 b/kolla/docker/octavia/octavia-driver-agent/Dockerfile.j2
index b3519922a..fdd078ed7 100644
--- a/kolla/docker/octavia/octavia-driver-agent/Dockerfile.j2
+++ b/kolla/docker/octavia/octavia-driver-agent/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set octavia_driver_agent_packages = [
] %}
@@ -25,5 +27,6 @@ RUN if [ "$(ls /plugins)" ]; then \
{% block octavia_driver_agent_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER octavia
diff --git a/kolla/docker/opensearch/opensearch-dashboards/Dockerfile.j2 b/kolla/docker/opensearch/opensearch-dashboards/Dockerfile.j2
index 3249b62d2..f6bd31587 100644
--- a/kolla/docker/opensearch/opensearch-dashboards/Dockerfile.j2
+++ b/kolla/docker/opensearch/opensearch-dashboards/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='opensearch-dashboards', shell='/bin/bash', homedir='/usr/share/opensearch-dashboards') }}
{{ macros.enable_extra_repos(['opensearch-dashboards']) }}
@@ -22,5 +24,6 @@ RUN chmod 755 /usr/local/bin/kolla_extend_start
{% block opensearch_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER opensearch-dashboards
diff --git a/kolla/docker/opensearch/opensearch/Dockerfile.j2 b/kolla/docker/opensearch/opensearch/Dockerfile.j2
index 6ad8fb29a..2765d9985 100644
--- a/kolla/docker/opensearch/opensearch/Dockerfile.j2
+++ b/kolla/docker/opensearch/opensearch/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='opensearch', shell='/bin/bash', homedir='/usr/share/opensearch') }}
{{ macros.enable_extra_repos(['opensearch']) }}
@@ -28,5 +30,6 @@ RUN chmod 755 /usr/local/bin/kolla_extend_start
{% block opensearch_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER opensearch
diff --git a/kolla/docker/openstack-base/Dockerfile.j2 b/kolla/docker/openstack-base/Dockerfile.j2
index b8ed2e465..e062045c9 100644
--- a/kolla/docker/openstack-base/Dockerfile.j2
+++ b/kolla/docker/openstack-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{{ macros.enable_extra_repos(['crb', 'epel']) }}
@@ -211,3 +213,4 @@ RUN {{ macros.install_pip(['pip', 'wheel', 'setuptools']) }} \
{{ macros.kolla_patch_sources() }}
{% block openstack_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/openvswitch/openvswitch-base/Dockerfile.j2 b/kolla/docker/openvswitch/openvswitch-base/Dockerfile.j2
index 44d8df41c..46fe0be83 100644
--- a/kolla/docker/openvswitch/openvswitch-base/Dockerfile.j2
+++ b/kolla/docker/openvswitch/openvswitch-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% block ovs_install %}
{% if base_package_type == 'rpm' %}
@@ -43,3 +45,4 @@ RUN if [ -e /usr/sbin/tcpdump ]; then mv /usr/sbin/tcpdump /usr/bin/tcpdump; fi
{{ macros.kolla_patch_sources() }}
{% block openvswitch_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovn/ovn-base/Dockerfile.j2 b/kolla/docker/ovn/ovn-base/Dockerfile.j2
index 3efd001a3..9ab9f0aa6 100644
--- a/kolla/docker/ovn/ovn-base/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ovn_base_packages = [
'ovn${KOLLA_RPM_OVN_VERSION}',
@@ -27,3 +29,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{{ macros.kolla_patch_sources() }}
{% block ovn_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovn/ovn-controller/Dockerfile.j2 b/kolla/docker/ovn/ovn-controller/Dockerfile.j2
index f95e61fee..a04562107 100644
--- a/kolla/docker/ovn/ovn-controller/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-controller/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ovn_controller_packages = [
'ovn${KOLLA_RPM_OVN_VERSION}-host'
@@ -27,3 +29,4 @@ RUN chmod 644 /usr/local/bin/kolla_ovn_extend_start
{% block ovn_controller_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovn/ovn-nb-db-server/Dockerfile.j2 b/kolla/docker/ovn/ovn-nb-db-server/Dockerfile.j2
index ea6a53249..932d7a5d7 100644
--- a/kolla/docker/ovn/ovn-nb-db-server/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-nb-db-server/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ovn_nb_db_server_packages = [
'ovn${KOLLA_RPM_OVN_VERSION}-central',
@@ -29,3 +31,4 @@ RUN chmod 644 /usr/local/bin/kolla_ovn_extend_start
{% block ovn_nb_db_server_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovn/ovn-northd/Dockerfile.j2 b/kolla/docker/ovn/ovn-northd/Dockerfile.j2
index 4a15e10eb..227584ed4 100644
--- a/kolla/docker/ovn/ovn-northd/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-northd/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ovn_northd_packages = [
'ovn${KOLLA_RPM_OVN_VERSION}-central',
@@ -27,3 +29,4 @@ RUN chmod 644 /usr/local/bin/kolla_ovn_extend_start
{% block ovn_northd_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovn/ovn-sb-db-relay/Dockerfile.j2 b/kolla/docker/ovn/ovn-sb-db-relay/Dockerfile.j2
index 427b6f7f1..1d1761033 100644
--- a/kolla/docker/ovn/ovn-sb-db-relay/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-sb-db-relay/Dockerfile.j2
@@ -5,6 +5,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block ovn_sb_db_server_header %}{% endblock %}
+{% import "macros.j2" as macros with context %}
+
{% block ovn_sb_db_relay_ovn_ctl %}
{# TODO(mnasiadka): Switch to 25.03 branch when available, ideally rpm/deb packages will be
available. #}
@@ -14,5 +16,6 @@ RUN curl -o /usr/share/ovn/scripts/ovn-ctl https://raw.githubusercontent.com/ovn
COPY extend_start.sh /usr/local/bin/kolla_ovn_extend_start
RUN chmod 644 /usr/local/bin/kolla_ovn_extend_start
+{{ macros.kolla_patch_sources() }}
{% block ovn_sb_db_relay_footer %}{% endblock %}
{% block footer %}{% endblock %}
diff --git a/kolla/docker/ovn/ovn-sb-db-server/Dockerfile.j2 b/kolla/docker/ovn/ovn-sb-db-server/Dockerfile.j2
index afceb8173..fbef63713 100644
--- a/kolla/docker/ovn/ovn-sb-db-server/Dockerfile.j2
+++ b/kolla/docker/ovn/ovn-sb-db-server/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set ovn_sb_db_server_packages = [
'ovn${KOLLA_RPM_OVN_VERSION}-central',
@@ -29,3 +31,4 @@ RUN chmod 644 /usr/local/bin/kolla_ovn_extend_start
{% block ovn_sb_db_server_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/ovsdpdk/ovsdpdk/Dockerfile.j2 b/kolla/docker/ovsdpdk/ovsdpdk/Dockerfile.j2
index eab4f5474..0eaf85cf1 100644
--- a/kolla/docker/ovsdpdk/ovsdpdk/Dockerfile.j2
+++ b/kolla/docker/ovsdpdk/ovsdpdk/Dockerfile.j2
@@ -4,6 +4,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% endblock %}
{% import "macros.j2" as macros with context %}
+
+{{ macros.kolla_enable_base_repos() }}
{% block ovsdpdk_header %}{% endblock %}
{% block ovsdpdk_install %}
@@ -38,3 +40,4 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{{ macros.kolla_patch_sources() }}
{% block ovsdpdk_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/placement/placement-api/Dockerfile.j2 b/kolla/docker/placement/placement-api/Dockerfile.j2
index a13f65bdf..6f5281ca4 100644
--- a/kolla/docker/placement/placement-api/Dockerfile.j2
+++ b/kolla/docker/placement/placement-api/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set placement_api_packages = [
] %}
{{ macros.install_packages(placement_api_packages | customizable("packages")) }}
@@ -17,3 +19,4 @@ COPY extend_start.sh /usr/local/bin/kolla_placement_extend_start
{% block placement_api_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/placement/placement-base/Dockerfile.j2 b/kolla/docker/placement/placement-base/Dockerfile.j2
index 6454da748..258b09cee 100644
--- a/kolla/docker/placement/placement-base/Dockerfile.j2
+++ b/kolla/docker/placement/placement-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='placement') }}
{% if base_package_type == 'rpm' %}
@@ -42,3 +44,4 @@ RUN ln -s placement-base-source/* placement \
{{ macros.kolla_patch_sources() }}
{% block placement_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/prometheus/prometheus-blackbox-exporter/Dockerfile.j2 b/kolla/docker/prometheus/prometheus-blackbox-exporter/Dockerfile.j2
index 95018facf..f918d4f12 100644
--- a/kolla/docker/prometheus/prometheus-blackbox-exporter/Dockerfile.j2
+++ b/kolla/docker/prometheus/prometheus-blackbox-exporter/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{% set blackbox_packages = [
'libcap'
@@ -32,5 +34,6 @@ RUN ln -s /prometheus-blackbox-exporter-source/* prometheus-blackbox-exporter \
{% block prometheus_blackbox_exporter_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER prometheus
diff --git a/kolla/docker/prometheus/prometheus-libvirt-exporter/Dockerfile.j2 b/kolla/docker/prometheus/prometheus-libvirt-exporter/Dockerfile.j2
index c32b2f8c7..cdf01797f 100644
--- a/kolla/docker/prometheus/prometheus-libvirt-exporter/Dockerfile.j2
+++ b/kolla/docker/prometheus/prometheus-libvirt-exporter/Dockerfile.j2
@@ -5,6 +5,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% block prometheus_libvirt_exporter_header %}{% endblock %}
{{ macros.install_packages(prometheus_libvirt_exporter_packages | customizable("packages")) }}
@@ -21,5 +23,6 @@ RUN ln -s /prometheus-libvirt-exporter-source/* prometheus-libvirt-exporter \
{% block prometheus_libvirt_exporter_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER root
diff --git a/kolla/docker/prometheus/prometheus-valkey-exporter/Dockerfile.j2 b/kolla/docker/prometheus/prometheus-valkey-exporter/Dockerfile.j2
index c6cf79ac3..348c7fe2a 100644
--- a/kolla/docker/prometheus/prometheus-valkey-exporter/Dockerfile.j2
+++ b/kolla/docker/prometheus/prometheus-valkey-exporter/Dockerfile.j2
@@ -5,6 +5,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% block prometheus_valkey_exporter_header %}{% endblock %}
{{ macros.install_packages(prometheus_valkey_exporter_packages | customizable("packages")) }}
@@ -21,5 +23,6 @@ RUN ln -s /prometheus-valkey-exporter-source/* prometheus-valkey-exporter \
{% block prometheus_valkey_exporter_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER prometheus
diff --git a/kolla/docker/proxysql/Dockerfile.j2 b/kolla/docker/proxysql/Dockerfile.j2
index a76dbcda8..4ddf7d5cb 100644
--- a/kolla/docker/proxysql/Dockerfile.j2
+++ b/kolla/docker/proxysql/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.enable_extra_repos(['proxysql']) }}
{% set proxysql_packages = [
@@ -39,5 +41,6 @@ RUN install -g proxysql -o proxysql -m 770 -d /var/lib/kolla/proxysql \
{% block proxysql_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER proxysql
diff --git a/kolla/docker/rabbitmq/Dockerfile.j2 b/kolla/docker/rabbitmq/Dockerfile.j2
index bd600785b..79c762e4c 100644
--- a/kolla/docker/rabbitmq/Dockerfile.j2
+++ b/kolla/docker/rabbitmq/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='rabbitmq') }}
{{ macros.enable_extra_repos(['erlang', 'rabbitmq']) }}
@@ -65,5 +67,6 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{% block rabbitmq_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER rabbitmq
diff --git a/kolla/docker/skyline/skyline-apiserver/Dockerfile.j2 b/kolla/docker/skyline/skyline-apiserver/Dockerfile.j2
index 85b40d51c..e50b0467d 100644
--- a/kolla/docker/skyline/skyline-apiserver/Dockerfile.j2
+++ b/kolla/docker/skyline/skyline-apiserver/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
ADD skyline-apiserver-archive /skyline-apiserver-source
{% set skyline_apiserver_pip_packages = [
@@ -23,5 +25,6 @@ RUN ln -s skyline-apiserver-source/* skyline-apiserver \
{% block skyline_apiserver_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER skyline
diff --git a/kolla/docker/skyline/skyline-console/Dockerfile.j2 b/kolla/docker/skyline/skyline-console/Dockerfile.j2
index ba62f5041..9b34f503f 100644
--- a/kolla/docker/skyline/skyline-console/Dockerfile.j2
+++ b/kolla/docker/skyline/skyline-console/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% set skyline_console_packages = [
'nginx'
] %}
@@ -26,5 +28,6 @@ RUN ln -s skyline-console-source/* skyline-console \
{% block skyline_console_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER root
diff --git a/kolla/docker/tacker/tacker-base/Dockerfile.j2 b/kolla/docker/tacker/tacker-base/Dockerfile.j2
index c24c8d87c..e84a4fe21 100644
--- a/kolla/docker/tacker/tacker-base/Dockerfile.j2
+++ b/kolla/docker/tacker/tacker-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='tacker') }}
{% if base_package_type == 'rpm' %}
@@ -41,3 +43,4 @@ RUN ln -s tacker-base-source/* tacker \
{{ macros.kolla_patch_sources() }}
{% block tacker_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/tgtd/Dockerfile.j2 b/kolla/docker/tgtd/Dockerfile.j2
index b8cbbaaf5..864aa1232 100644
--- a/kolla/docker/tgtd/Dockerfile.j2
+++ b/kolla/docker/tgtd/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
RUN echo 'Not available for {{ base_distro }}' \
@@ -24,3 +26,4 @@ RUN sed -i '1 i include /var/lib/cinder/volumes/*' /etc/tgt/targets.conf
{% block tgtd_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/trove/trove-base/Dockerfile.j2 b/kolla/docker/trove/trove-base/Dockerfile.j2
index a675b2b72..5309b744e 100644
--- a/kolla/docker/trove/trove-base/Dockerfile.j2
+++ b/kolla/docker/trove/trove-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='trove') }}
ADD trove-base-archive /trove-base-source
@@ -28,3 +30,4 @@ RUN ln -s trove-base-source/* trove \
{{ macros.kolla_patch_sources() }}
{% block trove_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/docker/valkey/valkey-sentinel/Dockerfile.j2 b/kolla/docker/valkey/valkey-sentinel/Dockerfile.j2
index 94828a38f..e9b89113b 100644
--- a/kolla/docker/valkey/valkey-sentinel/Dockerfile.j2
+++ b/kolla/docker/valkey/valkey-sentinel/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{{ macros.enable_extra_repos(['epel']) }}
{% set valkey_sentinel_packages = ['valkey'] %}
@@ -22,5 +24,6 @@ RUN chmod 644 /usr/local/bin/kolla_extend_start
{% block valkey_sentinel_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER valkey
diff --git a/kolla/docker/valkey/valkey-server/Dockerfile.j2 b/kolla/docker/valkey/valkey-server/Dockerfile.j2
index be157d89e..e0005a9e0 100644
--- a/kolla/docker/valkey/valkey-server/Dockerfile.j2
+++ b/kolla/docker/valkey/valkey-server/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{% if base_package_type == 'rpm' %}
{{ macros.enable_extra_repos(['epel']) }}
{% endif %}
@@ -19,5 +21,6 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% block valkey_server_footer %}{% endblock %}
{% block footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
USER valkey
diff --git a/kolla/docker/watcher/watcher-base/Dockerfile.j2 b/kolla/docker/watcher/watcher-base/Dockerfile.j2
index 8de6ceb9d..e5530842d 100644
--- a/kolla/docker/watcher/watcher-base/Dockerfile.j2
+++ b/kolla/docker/watcher/watcher-base/Dockerfile.j2
@@ -7,6 +7,8 @@ LABEL maintainer="{{ maintainer }}" name="{{ image_name }}"
{% import "macros.j2" as macros with context %}
+{{ macros.kolla_enable_base_repos() }}
+
{{ macros.configure_user(name='watcher') }}
ADD watcher-base-archive /watcher-base-source
@@ -27,3 +29,4 @@ RUN ln -s watcher-base-source/* watcher \
{{ macros.kolla_patch_sources() }}
{% block watcher_base_footer %}{% endblock %}
+{{ macros.kolla_cleanup_repos() }}
diff --git a/kolla/image/kolla_worker.py b/kolla/image/kolla_worker.py
index b54e81bea..acaa08ed0 100644
--- a/kolla/image/kolla_worker.py
+++ b/kolla/image/kolla_worker.py
@@ -329,6 +329,7 @@ class KollaWorker(object):
return {
'debian_package_install': jinja_methods.debian_package_install,
'handle_repos': jinja_methods.handle_repos,
+ 'cleanup_repos': jinja_methods.cleanup_repos,
'raise_error': jinja_methods.raise_error,
}
diff --git a/kolla/template/methods.py b/kolla/template/methods.py
index 8bb7a7fc3..fcef7ae11 100644
--- a/kolla/template/methods.py
+++ b/kolla/template/methods.py
@@ -45,6 +45,22 @@ echo 'enabled=1' >>/etc/yum.repos.d/{repo}.repo"
DNF_REPO_GPGCHECK = " && echo 'repo_gpgcheck={repo_gpgcheck}' \
>>/etc/yum.repos.d/{repo}.repo"
+BACKUP_DIR = '/tmp/kolla-repos-backup' # nosec B108
+APT_BACKUP = (
+ 'mkdir -p {backup_dir}'
+ ' && cp /etc/apt/sources.list.d/{repo}.sources'
+ ' {backup_dir}/{repo}.sources 2>/dev/null || true'
+ ' && touch {backup_dir}/{repo}.enabled'
+ ' && '
+)
+RPM_BACKUP = (
+ 'mkdir -p {backup_dir}'
+ ' && cp /etc/yum.repos.d/{file}'
+ ' {backup_dir}/{file} 2>/dev/null || true'
+ ' && touch {backup_dir}/{file}.enabled'
+ ' && '
+)
+
def debian_package_install(packages, clean_package_cache=True):
"""Jinja utility method for building debian-based package install command.
@@ -99,6 +115,41 @@ def debian_package_install(packages, clean_package_cache=True):
return ' && '.join(cmds)
+def _load_repos(repos_yaml_override=None):
+ """Load default repos.yaml and merge an optional override file."""
+ default_repofile = os.path.dirname(
+ os.path.realpath(__file__)) + '/repos.yaml'
+ with open(default_repofile, 'r') as f:
+ repo_data = yaml.safe_load(f)
+
+ if repos_yaml_override:
+ with open(repos_yaml_override, 'r') as f:
+ for section, repos in yaml.safe_load(f).items():
+ if section in repo_data:
+ repo_data[section].update(repos)
+ else:
+ repo_data[section] = repos
+
+ return repo_data
+
+
+def _build_repo_list(repo_data, base_package_type, base_distro, base_arch):
+ """Flatten repo_data sections for the current distro/arch into one dict."""
+ result = {}
+ for section in (base_package_type, base_distro,
+ '%s-%s' % (base_distro, base_arch)):
+ for repo_name, repo_info in repo_data.get(section, {}).items():
+ if repo_name in result:
+ merged = {**result[repo_name], **repo_info}
+ if any(k in merged for k in
+ ('baseurl', 'metalink', 'mirrorlist', 'url')):
+ merged.pop('distro', None)
+ result[repo_name] = merged
+ else:
+ result[repo_name] = repo_info
+ return result
+
+
@pass_context
def handle_repos(context, reponames, mode):
"""Generate Dockerfile RUN commands to enable or disable package repos.
@@ -120,19 +171,9 @@ def handle_repos(context, reponames, mode):
if not isinstance(reponames, list):
raise TypeError("First argument should be a list of repositories")
- default_repofile = os.path.dirname(
- os.path.realpath(__file__)) + '/repos.yaml'
- with open(default_repofile, 'r') as repos_file:
- repo_data = yaml.safe_load(repos_file)
- default_repo_data = {k: dict(v) for k, v in repo_data.items()}
-
- if context.get('repos_yaml'):
- with open(context.get('repos_yaml'), 'r') as repos_file:
- for section, repos in yaml.safe_load(repos_file).items():
- if section in repo_data:
- repo_data[section].update(repos)
- else:
- repo_data[section] = repos
+ repos_yaml = context.get('repos_yaml')
+ repo_data = _load_repos(repos_yaml)
+ default_repo_data = _load_repos()
base_package_type = context.get('base_package_type')
base_distro = context.get('base_distro')
@@ -141,30 +182,23 @@ def handle_repos(context, reponames, mode):
openstack_release_codename = context.get('openstack_release_codename')
commands = ''
-
- def _build_repo_list(data):
- result = {}
- for section in (base_package_type, base_distro,
- '%s-%s' % (base_distro, base_arch)):
- for repo_name, repo_info in data.get(section, {}).items():
- if repo_name in result:
- merged = {**result[repo_name], **repo_info}
- if any(k in merged for k in
- ('baseurl', 'metalink', 'mirrorlist', 'url')):
- merged.pop('distro', None)
- result[repo_name] = merged
- else:
- result[repo_name] = repo_info
- return result
+ backed_up_files = set()
try:
- repo_list = _build_repo_list(repo_data)
+ repo_list = _build_repo_list(
+ repo_data, base_package_type, base_distro, base_arch)
except KeyError:
# NOTE(hrw): Fallback to distro list
repo_list = repo_data[base_distro]
- if base_package_type == 'rpm' and context.get('repos_yaml'):
- default_repo_list = _build_repo_list(default_repo_data)
+ # NOTE: repos_yaml overrides replace a repo's whole entry (see
+ # _load_repos), so an override that doesn't restate 'file_group' would
+ # otherwise lose it. Keep the default list around to fall back to the
+ # distro's real on-disk layout for repos sharing a file.
+ default_repo_list = _build_repo_list(
+ default_repo_data, base_package_type, base_distro, base_arch)
+
+ if base_package_type == 'rpm' and repos_yaml:
distro_overridden = {r for r, d in repo_list.items()
if not d.get('distro')
and default_repo_list.get(r, {}).get('distro')}
@@ -192,6 +226,21 @@ def handle_repos(context, reponames, mode):
if base_package_type == 'rpm':
if mode == 'enable':
if not _repo.get('distro'):
+ if _repo.get('build_only'):
+ # NOTE: some distros (e.g. Rocky's baseos,
+ # appstream and crb) share a single .repo file,
+ # so back up that shared file, not one named
+ # after this repo, or the original content is
+ # lost once handle_repos rewrites the file.
+ repo_file = (
+ _repo.get('file_group')
+ or default_repo_list.get(repo, {}).get(
+ 'file_group')
+ or '{}.repo'.format(repo))
+ if repo_file not in backed_up_files:
+ commands += RPM_BACKUP.format(
+ backup_dir=BACKUP_DIR, file=repo_file)
+ backed_up_files.add(repo_file)
commands += DNF_REMOVE_EXISTING.format(
name=_repo['name'])
commands += " && "
@@ -252,6 +301,13 @@ def handle_repos(context, reponames, mode):
elif base_package_type == "deb":
if mode == "enable" and not _repo.get('distro'):
+ if _repo.get('build_only'):
+ sources_file = (
+ '/etc/apt/sources.list.d/{}.sources'.format(repo))
+ if sources_file not in backed_up_files:
+ commands += APT_BACKUP.format(
+ backup_dir=BACKUP_DIR, repo=repo)
+ backed_up_files.add(sources_file)
gpg_key = _repo['gpg_key']
signed_by = gpg_key if gpg_key.startswith('/') \
else '/etc/kolla/apt-keys/' + gpg_key
@@ -286,5 +342,76 @@ def handle_repos(context, reponames, mode):
return commands
+def get_cleanup_commands(repos_yaml, base_package_type, base_distro,
+ base_arch):
+ """Return a RUN command string restoring or removing build_only repos.
+
+ Repos marked build_only: true are backed up before being overwritten in
+ handle_repos(). This function generates the matching restore commands so
+ that mirror URLs are not baked into the final image. Repos that had no
+ prior file (no backup exists) are deleted instead of restored.
+
+ Returns an empty string when there are no build_only repos.
+ """
+ repo_data = _load_repos(repos_yaml)
+ repo_list = _build_repo_list(
+ repo_data, base_package_type, base_distro, base_arch)
+ default_repo_list = _build_repo_list(
+ _load_repos(), base_package_type, base_distro, base_arch)
+
+ cleanup_cmds = []
+ restored_file_groups = set()
+ for repo_name, repo_info in repo_list.items():
+ if not repo_info.get('build_only'):
+ continue
+ if base_package_type == 'rpm' and not repo_info.get('distro'):
+ own_file = '{}.repo'.format(repo_name)
+ file_group = (
+ repo_info.get('file_group')
+ or default_repo_list.get(repo_name, {}).get('file_group')
+ or own_file)
+ if file_group != own_file:
+ # handle_repos always writes this repo's override to
+ # own_file, regardless of where the original repo lived,
+ # so it always needs dropping on its own.
+ cleanup_cmds.append(
+ 'rm -f /etc/yum.repos.d/{}'.format(own_file))
+ if file_group in restored_file_groups:
+ continue
+ restored_file_groups.add(file_group)
+ cleanup_cmds.append(
+ '[ -f {backup_dir}/{file}.enabled ]'
+ ' && ( mv {backup_dir}/{file}'
+ ' /etc/yum.repos.d/{file} 2>/dev/null'
+ ' || rm -f /etc/yum.repos.d/{file} )'
+ ' || true'.format(
+ backup_dir=BACKUP_DIR, file=file_group))
+ elif base_package_type == 'deb' and not repo_info.get('distro'):
+ cleanup_cmds.append(
+ '[ -f {backup_dir}/{repo}.enabled ]'
+ ' && ( mv {backup_dir}/{repo}.sources'
+ ' /etc/apt/sources.list.d/{repo}.sources 2>/dev/null'
+ ' || rm -f /etc/apt/sources.list.d/{repo}.sources )'
+ ' || true'.format(
+ backup_dir=BACKUP_DIR, repo=repo_name))
+
+ if not cleanup_cmds:
+ return ''
+
+ cleanup_cmds.append('rm -rf {}'.format(BACKUP_DIR))
+ return 'RUN ' + ' \\\n && '.join(cleanup_cmds)
+
+
+@pass_context
+def cleanup_repos(context):
+ """Jinja2-callable wrapper around get_cleanup_commands()."""
+ return get_cleanup_commands(
+ context.get('repos_yaml'),
+ context.get('base_package_type'),
+ context.get('base_distro'),
+ context.get('base_arch'),
+ )
+
+
def raise_error(msg: str) -> t.NoReturn:
raise Exception(msg)
diff --git a/kolla/tests/test_methods.py b/kolla/tests/test_methods.py
index 8a577aead..1e30f1f9b 100644
--- a/kolla/tests/test_methods.py
+++ b/kolla/tests/test_methods.py
@@ -10,6 +10,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import os
import tempfile
import yaml
@@ -398,6 +399,378 @@ class MethodsTest(base.TestCase):
self.assertRaises(ValueError, methods.handle_repos,
template_vars, ['test-repo'], 'enable')
+ def test_handle_repos_deb_build_only_backup(self):
+ repos = {'debian': {'build-only-mirror': {
+ 'build_only': True,
+ 'url': 'http://mirror.example.com/debian',
+ 'suite': 'trixie',
+ 'component': 'main',
+ 'gpg_key': '/usr/share/keyrings/debian-archive-keyring.gpg',
+ }}}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'debian',
+ 'base_package_type': 'deb',
+ 'openstack_release_codename': 'Gazpacho',
+ 'repos_yaml': fname,
+ }
+ result = methods.handle_repos(
+ template_vars, ['build-only-mirror'], 'enable')
+ self.assertIn('mkdir -p /tmp/kolla-repos-backup', result)
+ self.assertIn(
+ 'cp /etc/apt/sources.list.d/build-only-mirror.sources'
+ ' /tmp/kolla-repos-backup/build-only-mirror.sources',
+ result)
+ self.assertIn(
+ 'touch /tmp/kolla-repos-backup/build-only-mirror.enabled',
+ result)
+ # backup must precede the actual repo write
+ self.assertLess(
+ result.index('cp /etc/apt/sources.list.d/build-only-mirror'),
+ result.index("echo 'Uris:"))
+ finally:
+ os.unlink(fname)
+
+ def test_handle_repos_rpm_build_only_backup(self):
+ repos = {'rpm': {'build-only-mirror': {
+ 'build_only': True,
+ 'name': 'build-only-mirror',
+ 'baseurl': 'http://mirror.example.com/rpm/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10',
+ }}}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'centos',
+ 'base_package_type': 'rpm',
+ 'repos_yaml': fname,
+ }
+ result = methods.handle_repos(
+ template_vars, ['build-only-mirror'], 'enable')
+ self.assertIn('mkdir -p /tmp/kolla-repos-backup', result)
+ self.assertIn(
+ 'cp /etc/yum.repos.d/build-only-mirror.repo'
+ ' /tmp/kolla-repos-backup/build-only-mirror.repo',
+ result)
+ self.assertIn(
+ 'touch /tmp/kolla-repos-backup/build-only-mirror.repo'
+ '.enabled',
+ result)
+ # backup must precede DNF_REMOVE_EXISTING
+ self.assertLess(
+ result.index(
+ 'cp /etc/yum.repos.d/build-only-mirror.repo'),
+ result.index('grep -rlF'))
+ finally:
+ os.unlink(fname)
+
+ def test_handle_repos_rpm_shared_file_group_backup(self):
+ """Repos sharing a file_group back up that file once, by its name.
+
+ e.g. Rocky's baseos/appstream/crb all live in rocky.repo.
+ """
+ repos = {'rpm': {
+ 'shared-a': {
+ 'build_only': True,
+ 'file_group': 'shared.repo',
+ 'name': 'shared-a',
+ 'baseurl': 'http://mirror.example.com/a/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-a',
+ },
+ 'shared-b': {
+ 'build_only': True,
+ 'file_group': 'shared.repo',
+ 'name': 'shared-b',
+ 'baseurl': 'http://mirror.example.com/b/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-b',
+ },
+ }}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'centos',
+ 'base_package_type': 'rpm',
+ 'repos_yaml': fname,
+ }
+ result = methods.handle_repos(
+ template_vars, ['shared-a', 'shared-b'], 'enable')
+ self.assertEqual(
+ 1,
+ result.count(
+ 'cp /etc/yum.repos.d/shared.repo'
+ ' /tmp/kolla-repos-backup/shared.repo'))
+ self.assertNotIn('shared-a.repo /tmp/kolla-repos-backup',
+ result)
+ self.assertNotIn('shared-b.repo /tmp/kolla-repos-backup',
+ result)
+ # each repo still gets its own override file written
+ self.assertIn('>/etc/yum.repos.d/shared-a.repo', result)
+ self.assertIn('>/etc/yum.repos.d/shared-b.repo', result)
+ finally:
+ os.unlink(fname)
+
+ def test_get_cleanup_commands_rpm_shared_file_group(self):
+ """The shared file is restored once, each own override always."""
+ repos = {'rpm': {
+ 'shared-a': {
+ 'build_only': True,
+ 'file_group': 'shared.repo',
+ 'name': 'shared-a',
+ 'baseurl': 'http://mirror.example.com/a/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-a',
+ },
+ 'shared-b': {
+ 'build_only': True,
+ 'file_group': 'shared.repo',
+ 'name': 'shared-b',
+ 'baseurl': 'http://mirror.example.com/b/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-b',
+ },
+ }}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ result = methods.get_cleanup_commands(
+ fname, 'rpm', 'centos', 'x86_64')
+ self.assertEqual(
+ 1,
+ result.count(
+ 'mv /tmp/kolla-repos-backup/shared.repo'
+ ' /etc/yum.repos.d/shared.repo'))
+ self.assertIn('rm -f /etc/yum.repos.d/shared-a.repo', result)
+ self.assertIn('rm -f /etc/yum.repos.d/shared-b.repo', result)
+ finally:
+ os.unlink(fname)
+
+ def _rocky_mirror_override(self):
+ """The exact override shape documented for Rocky, minus file_group.
+
+ repos_yaml overrides replace a repo's whole entry, so this matches
+ what a real user would write per doc/source/admin/image-building
+ .rst - it must not restate 'file_group' for the fix to be tested.
+ """
+ return {'rocky': {
+ 'baseos': {
+ 'build_only': True,
+ 'name': 'baseos',
+ 'baseurl': 'http://mirror.example.com/rocky/10/BaseOS/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10',
+ },
+ 'appstream': {
+ 'build_only': True,
+ 'name': 'appstream',
+ 'baseurl': 'http://mirror.example.com/rocky/10/AppStream/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10',
+ },
+ 'crb': {
+ 'build_only': True,
+ 'name': 'crb',
+ 'baseurl': 'http://mirror.example.com/rocky/10/CRB/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10',
+ },
+ }}
+
+ def test_handle_repos_rocky_baseos_backs_up_shared_file(self):
+ """file_group must be resolved even if the override omits it.
+
+ Rocky's baseos/appstream/crb live in rocky.repo, not their own
+ .repo files, and a repos_yaml override doesn't restate file_group.
+ """
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(self._rocky_mirror_override(), f)
+ fname = f.name
+ try:
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'rocky',
+ 'base_package_type': 'rpm',
+ 'repos_yaml': fname,
+ }
+ result = methods.handle_repos(
+ template_vars, ['baseos', 'appstream'], 'enable')
+ self.assertEqual(
+ 1,
+ result.count(
+ 'cp /etc/yum.repos.d/rocky.repo'
+ ' /tmp/kolla-repos-backup/rocky.repo'))
+ self.assertNotIn('baseos.repo /tmp/kolla-repos-backup', result)
+ self.assertNotIn('appstream.repo /tmp/kolla-repos-backup',
+ result)
+ finally:
+ os.unlink(fname)
+
+ def test_get_cleanup_commands_rocky_restores_shared_file(self):
+ """Restoring baseos/appstream/crb recovers the shared rocky.repo."""
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(self._rocky_mirror_override(), f)
+ fname = f.name
+ try:
+ result = methods.get_cleanup_commands(
+ fname, 'rpm', 'rocky', 'x86_64')
+ self.assertEqual(
+ 1,
+ result.count(
+ 'mv /tmp/kolla-repos-backup/rocky.repo'
+ ' /etc/yum.repos.d/rocky.repo'))
+ self.assertIn('rm -f /etc/yum.repos.d/baseos.repo', result)
+ self.assertIn('rm -f /etc/yum.repos.d/appstream.repo', result)
+ self.assertIn('rm -f /etc/yum.repos.d/crb.repo', result)
+ finally:
+ os.unlink(fname)
+
+ def test_handle_repos_build_only_no_double_backup(self):
+ """Each distinct file is backed up exactly once per handle_repos."""
+ repos = {'debian': {
+ 'mirror-a': {
+ 'build_only': True,
+ 'url': 'http://mirror.example.com/a',
+ 'suite': 'trixie',
+ 'component': 'main',
+ 'gpg_key': '/usr/share/keyrings/debian-archive-keyring.gpg',
+ },
+ 'mirror-b': {
+ 'build_only': True,
+ 'url': 'http://mirror.example.com/b',
+ 'suite': 'trixie',
+ 'component': 'main',
+ 'gpg_key': '/usr/share/keyrings/debian-archive-keyring.gpg',
+ },
+ }}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'debian',
+ 'base_package_type': 'deb',
+ 'openstack_release_codename': 'Gazpacho',
+ 'repos_yaml': fname,
+ }
+ result = methods.handle_repos(
+ template_vars, ['mirror-a', 'mirror-b'], 'enable')
+ self.assertEqual(
+ 1,
+ result.count(
+ 'cp /etc/apt/sources.list.d/mirror-a.sources'
+ ' /tmp/kolla-repos-backup/mirror-a.sources'))
+ self.assertEqual(
+ 1,
+ result.count(
+ 'cp /etc/apt/sources.list.d/mirror-b.sources'
+ ' /tmp/kolla-repos-backup/mirror-b.sources'))
+ finally:
+ os.unlink(fname)
+
+ def test_handle_repos_without_build_only_no_backup(self):
+ template_vars = {
+ 'base_arch': 'x86_64',
+ 'base_distro': 'debian',
+ 'base_package_type': 'deb',
+ 'openstack_release_codename': 'Gazpacho',
+ }
+ result = methods.handle_repos(template_vars, ['grafana'], 'enable')
+ self.assertNotIn('kolla-repos-backup', result)
+
+ def test_get_cleanup_commands_deb(self):
+ repos = {'debian': {'build-only-mirror': {
+ 'build_only': True,
+ 'url': 'http://mirror.example.com/debian',
+ 'suite': 'trixie',
+ 'component': 'main',
+ 'gpg_key': '/usr/share/keyrings/debian-archive-keyring.gpg',
+ }}}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ result = methods.get_cleanup_commands(
+ fname, 'deb', 'debian', 'x86_64')
+ self.assertTrue(result.startswith('RUN '))
+ self.assertIn(
+ '[ -f /tmp/kolla-repos-backup/build-only-mirror.enabled ]',
+ result)
+ self.assertIn(
+ 'mv /tmp/kolla-repos-backup/build-only-mirror.sources'
+ ' /etc/apt/sources.list.d/build-only-mirror.sources',
+ result)
+ self.assertIn(
+ 'rm -f /etc/apt/sources.list.d/build-only-mirror.sources',
+ result)
+ self.assertIn('rm -rf /tmp/kolla-repos-backup', result)
+ finally:
+ os.unlink(fname)
+
+ def test_get_cleanup_commands_rpm(self):
+ repos = {'rpm': {'build-only-mirror': {
+ 'build_only': True,
+ 'name': 'build-only-mirror',
+ 'baseurl': 'http://mirror.example.com/',
+ 'gpgkey': 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10',
+ }}}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ result = methods.get_cleanup_commands(
+ fname, 'rpm', 'centos', 'x86_64')
+ self.assertTrue(result.startswith('RUN '))
+ self.assertIn(
+ '[ -f /tmp/kolla-repos-backup/build-only-mirror.repo'
+ '.enabled ]',
+ result)
+ self.assertIn(
+ 'mv /tmp/kolla-repos-backup/build-only-mirror.repo'
+ ' /etc/yum.repos.d/build-only-mirror.repo',
+ result)
+ self.assertIn(
+ 'rm -f /etc/yum.repos.d/build-only-mirror.repo',
+ result)
+ self.assertIn('rm -rf /tmp/kolla-repos-backup', result)
+ finally:
+ os.unlink(fname)
+
+ def test_get_cleanup_commands_empty_without_build_only(self):
+ result = methods.get_cleanup_commands(None, 'deb', 'debian', 'x86_64')
+ self.assertEqual('', result)
+
+ def test_get_cleanup_commands_skips_distro_repos(self):
+ """distro: True repos are a no-op in handle_repos."""
+ repos = {'debian': {'debian': {
+ 'build_only': True,
+ 'distro': True,
+ }}}
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml',
+ delete=False) as f:
+ yaml.dump(repos, f)
+ fname = f.name
+ try:
+ result = methods.get_cleanup_commands(
+ fname, 'deb', 'debian', 'x86_64')
+ self.assertEqual('', result)
+ finally:
+ os.unlink(fname)
+
def test_repos_yaml_rpm_section_override_not_blocked_by_distro_section(
self):
"""Overriding distro repos in 'rpm' section must not be undone.
diff --git a/releasenotes/notes/cleanup-repos-85faf33025fd7e5c.yaml b/releasenotes/notes/cleanup-repos-85faf33025fd7e5c.yaml
new file mode 100644
index 000000000..627cce663
--- /dev/null
+++ b/releasenotes/notes/cleanup-repos-85faf33025fd7e5c.yaml
@@ -0,0 +1,16 @@
+---
+features:
+ - |
+ Repository cleanup is now performed via Jinja2 macros
+ (``kolla_cleanup_repos()``) injected directly into each Dockerfile
+ template, replacing the previous Python-level injection in
+ ``kolla_worker.py``. This ensures cleanup always runs before any
+ ``USER`` directive, avoiding permission errors when non-root service
+ users attempted to modify root-owned repository files.
+ - |
+ Base OS repositories (``baseos``, ``appstream`` on RPM distros;
+ ``debian``/``debian-security`` or ``ubuntu``/``ubuntu-security``/
+ ``ubuntu-cloud-archive`` on Debian-based distros) are now explicitly
+ re-enabled in every service image via the new ``kolla_enable_base_repos()``
+ macro. This guarantees that packages from base OS repositories remain
+ available in child images after parent image cleanup.
diff --git a/tests/templates/repos.yaml.j2 b/tests/templates/repos.yaml.j2
index 42c6724f9..9129f74eb 100644
--- a/tests/templates/repos.yaml.j2
+++ b/tests/templates/repos.yaml.j2
@@ -2,12 +2,14 @@
{% if base_distro == 'debian' %}
debian:
debian:
+ build_only: true
component: "main"
gpg_key: "/usr/share/keyrings/debian-archive-keyring.gpg"
suite: "trixie trixie-updates trixie-backports"
trusted: True
url: "http://{{ nodepool_mirror_host }}/debian"
debian-security:
+ build_only: true
component: "main"
gpg_key: "/usr/share/keyrings/debian-archive-keyring.gpg"
suite: "trixie-security"
@@ -17,31 +19,37 @@ debian:
rocky:
appstream:
baseurl: "http://dl.rockylinux.org/$contentdir/$releasever/AppStream/$basearch/os/"
+ build_only: true
gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10"
name: "appstream"
baseos:
baseurl: "http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/"
+ build_only: true
gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10"
name: "baseos"
crb:
baseurl: "http://dl.rockylinux.org/$contentdir/$releasever/CRB/$basearch/os/"
+ build_only: true
gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-10"
name: "crb"
{% elif base_distro == 'ubuntu' %}
ubuntu:
ubuntu:
+ build_only: true
component: "main universe"
gpg_key: "/usr/share/keyrings/ubuntu-archive-keyring.gpg"
suite: "noble noble-updates noble-backports"
trusted: True
url: "http://{{ nodepool_mirror_host }}/ubuntu/"
ubuntu-security:
+ build_only: true
component: "main universe"
gpg_key: "/usr/share/keyrings/ubuntu-archive-keyring.gpg"
suite: "noble-security"
trusted: True
url: "http://{{ nodepool_mirror_host }}/ubuntu/"
ubuntu-cloud-archive:
+ build_only: true
component: "main"
gpg_key: "/usr/share/keyrings/ubuntu-cloud-keyring.gpg"
suite: "noble-updates/gazpacho"
@@ -49,12 +57,14 @@ ubuntu:
url: "http://{{ nodepool_mirror_host }}/ubuntu-cloud-archive"
ubuntu-aarch64:
ubuntu:
+ build_only: true
component: "main universe"
gpg_key: "/usr/share/keyrings/ubuntu-archive-keyring.gpg"
suite: "noble noble-updates noble-backports"
trusted: True
url: "http://{{ nodepool_mirror_host }}/ubuntu-ports/"
ubuntu-security:
+ build_only: true
component: "main universe"
gpg_key: "/usr/share/keyrings/ubuntu-archive-keyring.gpg"
suite: "noble-security"