aboutsummaryrefslogtreecommitdiff
path: root/kolla/template/methods.py
diff options
context:
space:
mode:
authorMichal Nasiadka <mnasiadka@gmail.com>2025-10-01 02:25:23 -0400
committerMichal Nasiadka <mnasiadka@gmail.com>2025-10-02 14:24:31 +0200
commit806602e488240deb87bdf1c8ce00973ca8ec914d (patch)
tree6b3c54c39d2689d194cf5cca38e39c6b9fdfbcc4 /kolla/template/methods.py
parent17727e148120c43a5c7056b33e4277592376ccca (diff)
downloadkolla-806602e488240deb87bdf1c8ce00973ca8ec914d.tar.gz
kolla-806602e488240deb87bdf1c8ce00973ca8ec914d.zip
Add support for rpm to repos.yaml
Add the ability to configure repositories in the same way as we do Debuntu ones - via repos.yaml. Removes .repo files from base - since these are not needed there anymore. gpgcheck = 1 is default in docker/base/dnf.conf Change-Id: I7df7d452c45c57c434d5b4ad15a87963e4d6d0d4 Signed-off-by: Michal Nasiadka <mnasiadka@gmail.com>
Diffstat (limited to 'kolla/template/methods.py')
-rw-r--r--kolla/template/methods.py136
1 files changed, 98 insertions, 38 deletions
diff --git a/kolla/template/methods.py b/kolla/template/methods.py
index e9edbfeb0..388d4858f 100644
--- a/kolla/template/methods.py
+++ b/kolla/template/methods.py
@@ -10,6 +10,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from kolla.image.utils import LOG
import os
import typing as t
@@ -17,6 +18,29 @@ import yaml
from jinja2 import pass_context
+APT_ARCH = " && echo 'Architectures: {arch}' \
+>>/etc/apt/sources.list.d/{repo}.sources"
+APT_REPO = "echo 'Uris: {url}' >/etc/apt/sources.list.d/{repo}.sources && \
+echo 'Components: {component}' >>/etc/apt/sources.list.d/{repo}.sources && \
+echo 'Types: deb' >>/etc/apt/sources.list.d/{repo}.sources && \
+echo 'Suites: {suite}' >>/etc/apt/sources.list.d/{repo}.sources && \
+echo 'Signed-By: /etc/kolla/apt-keys/{gpg_key}' \
+>>/etc/apt/sources.list.d/{repo}.sources"
+DNF_BASEURL = " && echo 'baseurl={baseurl}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_DISABLE = "dnf config-manager --disable {name} || true"
+DNF_ENABLE = "dnf config-manager --enable {name} || true"
+DNF_GPGCHECK = " && echo 'gpgcheck={gpgcheck}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_GPGKEY = " && echo 'gpgkey={gpgkey}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_GPGKEY_ADD = " && echo ' {gpgkey}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_METALINK = " && echo 'metalink={metalink}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_MIRRORLIST = " && \
+echo 'mirrorlist={mirrorlist}' >>/etc/yum.repos.d/{repo}.repo"
+DNF_REPO = "echo '[{name}]' >/etc/yum.repos.d/{repo}.repo && \
+echo 'name={name}' >>/etc/yum.repos.d/{repo}.repo && \
+echo 'enabled=1' >>/etc/yum.repos.d/{repo}.repo"
+DNF_REPO_GPGCHECK = " && echo 'repo_gpgcheck={repo_gpgcheck}' \
+>>/etc/yum.repos.d/{repo}.repo"
+
def debian_package_install(packages, clean_package_cache=True):
"""Jinja utility method for building debian-based package install command.
@@ -81,13 +105,6 @@ def handle_repos(context, reponames, mode):
Distro/arch are not required to have all entries - we ignore missing ones.
"""
- if mode == 'enable':
- rpm_switch = '--enable'
- elif mode == 'disable':
- rpm_switch = '--disable'
- else:
- raise KeyError
-
if not isinstance(reponames, list):
raise TypeError("First argument should be a list of repositories")
@@ -104,6 +121,7 @@ def handle_repos(context, reponames, mode):
base_package_type = context.get('base_package_type')
base_distro = context.get('base_distro')
base_arch = context.get('base_arch')
+ image_name = context.get('image_name')
commands = ''
@@ -113,40 +131,82 @@ def handle_repos(context, reponames, mode):
# NOTE(hrw): Fallback to distro list
repo_list = repo_data[base_distro]
- for repo in reponames:
+ for index, repo in enumerate(reponames):
try:
+ _repo = repo_list[repo]
if base_package_type == 'rpm':
- commands += ' %s %s' % (rpm_switch, repo_list[repo])
- elif base_package_type == 'deb':
if mode == 'enable':
- commands += f"""echo 'Uris: {repo_list[repo]['url']}' \
->/etc/apt/sources.list.d/{repo}.sources \
-&& echo 'Components: {repo_list[repo]['component']}' \
->>/etc/apt/sources.list.d/{repo}.sources \
-&& echo 'Types: deb' >>/etc/apt/sources.list.d/{repo}.sources \
-&& echo 'Suites: {repo_list[repo]['suite']}' \
->>/etc/apt/sources.list.d/{repo}.sources \
-&& echo 'Signed-By: /etc/kolla/apt-keys/{repo_list[repo]['gpg_key']}' \
->>/etc/apt/sources.list.d/{repo}.sources \
-&& """
- if repo_list[repo]['arch']:
- commands += f"""echo 'Architectures: \
-{repo_list[repo]['arch']}' \
->>/etc/apt/sources.list.d/{repo}.sources \
-&& """
- except KeyError:
- # NOTE(hrw): we ignore missing repositories for a given
- # distro/arch
- pass
-
- if base_package_type == 'rpm' and commands:
- # NOTE(hrw): if commands is empty then no repos are enabled
- # otherwise we need to add command to handle repositories
- # NOTE(hrw) dnf errors out if we enable unknown repo
- commands = 'dnf config-manager %s || true' % commands
- elif base_package_type == 'deb':
- # NOTE(hrw): Debian commands end with '&&'
- commands = commands[0:-4]
+ if not _repo.get('distro'):
+ commands += DNF_REPO.format(
+ name=_repo['name'],
+ repo=repo,
+ )
+ if _repo.get('gpgcheck'):
+ commands += DNF_GPGCHECK.format(
+ gpgcheck=_repo['gpgcheck'],
+ repo=repo)
+
+ if _repo.get('repo_gpgcheck'):
+ commands += DNF_REPO_GPGCHECK.format(
+ repo_gpgcheck=_repo['repo_gpgcheck'],
+ repo=repo)
+
+ # NOTE(mnasiadka): Support multiple gpgkeys
+ gpgkeys = _repo['gpgkey'].splitlines()
+ for _, gpgkey in enumerate(gpgkeys):
+ if _ == 0:
+ commands += DNF_GPGKEY.format(gpgkey=gpgkey,
+ repo=repo)
+ else:
+ commands += DNF_GPGKEY_ADD.format(
+ gpgkey=gpgkey,
+ repo=repo)
+ else:
+ commands += DNF_ENABLE.format(name=_repo['name'])
+
+ if 'baseurl' in _repo:
+ # NOTE(mnasiadka): Support multiple baseurls
+ baseurl = _repo['baseurl'].splitlines()
+ for url in baseurl:
+ commands += DNF_BASEURL.format(baseurl=url,
+ repo=repo)
+ elif 'metalink' in _repo:
+ commands += DNF_METALINK.format(
+ metalink=_repo['metalink'], repo=repo
+ )
+
+ elif 'mirrorlist' in _repo:
+ commands += DNF_MIRRORLIST.format(
+ mirrorlist=_repo['mirrorlist'], repo=repo
+ )
+
+ if index != len(reponames) - 1:
+ commands += " && "
+
+ elif mode == 'disable' and _repo.get('distro'):
+ commands += DNF_DISABLE.format(name=_repo['name'])
+
+ elif base_package_type == "deb":
+ if mode == "enable":
+ commands += APT_REPO.format(
+ component=_repo['component'],
+ gpg_key=_repo['gpg_key'],
+ suite=_repo['suite'],
+ url=_repo['url'],
+ repo=repo,
+ )
+
+ if 'arch' in _repo:
+ commands += APT_ARCH.format(
+ arch=_repo['arch'], repo=repo
+ )
+
+ if index != len(reponames) - 1:
+ commands += ' && '
+ except KeyError as e:
+ LOG.exception("Error enabling repository %s in image %s", e,
+ image_name)
+ raise
if commands:
commands = "RUN %s" % commands