Skip to content

Commit dd424ad

Browse files
committed
ContainerFamily class added
1 parent 1b8328d commit dd424ad

File tree

7 files changed

+100
-64
lines changed

7 files changed

+100
-64
lines changed

src/bci_build/containercrate.py

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/bci_build/package/__init__.py

Lines changed: 89 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from dataclasses import field
1212
from pathlib import Path
1313
from typing import Literal
14+
from typing import Sequence
1415
from typing import overload
1516

1617
import jinja2
@@ -22,7 +23,6 @@
2223
from bci_build.container_attributes import PackageType
2324
from bci_build.container_attributes import ReleaseStage
2425
from bci_build.container_attributes import SupportLevel
25-
from bci_build.containercrate import ContainerCrate
2626
from bci_build.os_version import ALL_OS_LTSS_VERSIONS
2727
from bci_build.os_version import RELEASED_OS_VERSIONS
2828
from bci_build.os_version import OsVersion
@@ -209,7 +209,7 @@ class BaseContainerImage(abc.ABC):
209209
build_flavor: str | None = None
210210

211211
#: create that this container is part of
212-
crate: ContainerCrate = None
212+
family: ContainerFamily = None
213213

214214
#: Add any replacements via `obs-service-replace_using_package_version
215215
#: <https://github.com/openSUSE/obs-service-replace_using_package_version>`_
@@ -1108,11 +1108,17 @@ async def write_file_to_dest(fname: str, contents: str | bytes) -> None:
11081108

11091109
if self.build_flavor:
11101110
dfile = "Dockerfile"
1111-
tasks.append(write_file_to_dest(dfile, self.crate.default_dockerfile(self)))
1111+
tasks.append(
1112+
write_file_to_dest(
1113+
dfile, self.family.get_default_dockerfile_content(self)
1114+
)
1115+
)
11121116
files.append(dfile)
11131117

11141118
mname = "_multibuild"
1115-
tasks.append(write_file_to_dest(mname, self.crate.multibuild(self)))
1119+
tasks.append(
1120+
write_file_to_dest(mname, self.family.get_multibuild_file_content(self))
1121+
)
11161122
files.append(mname)
11171123

11181124
tasks.append(
@@ -1435,6 +1441,85 @@ def prepare_template(self) -> None:
14351441
pass
14361442

14371443

1444+
class ContainerFamily:
1445+
"""ContainerFamily is grouping multiple containers build flavors.
1446+
1447+
This provides package-central functions like generating _service and
1448+
_multibuild files, checking version_uid
1449+
"""
1450+
1451+
def __init__(
1452+
self,
1453+
containers: Sequence[BaseContainerImage],
1454+
):
1455+
# Assign the family for every container build flavor based on os version and package name
1456+
# Sample family structure:
1457+
# {
1458+
# (OsVersion.TumbleWeed, "test-package-name"): {"flavor1", "flavor2"}
1459+
# }
1460+
self._container_families: dict[tuple, set] = {}
1461+
for container in containers:
1462+
if container.build_flavor:
1463+
self._container_families.setdefault(
1464+
(container.os_version, container.package_name), set()
1465+
).add(container.build_flavor)
1466+
1467+
for container in containers:
1468+
if container.family is not None:
1469+
raise ValueError("Container is already part of a ContainerFamily")
1470+
container.family = self
1471+
1472+
def get_all_build_flavors(
1473+
self,
1474+
container: BaseContainerImage,
1475+
) -> list[str]:
1476+
"""Return all available build flavors for this container in based on its family"""
1477+
return sorted(
1478+
self._container_families.get(
1479+
(container.os_version, container.package_name), [""]
1480+
)
1481+
)
1482+
1483+
def get_default_dockerfile_content(
1484+
self,
1485+
container: BaseContainerImage,
1486+
) -> str:
1487+
buildrelease: str = ""
1488+
if container.build_release:
1489+
buildrelease = f"\n#!BuildVersion: workaround-for-an-obs-bug\n#!BuildRelease: {container.build_release}"
1490+
"""Return a default Dockerfile to disable build on default flavor."""
1491+
return f"""#!ExclusiveArch: do-not-build
1492+
#!ForceMultiVersion{buildrelease}
1493+
1494+
# For this container we only build the Dockerfile.$flavor builds.
1495+
"""
1496+
1497+
def get_multibuild_file_content(
1498+
self,
1499+
container: BaseContainerImage,
1500+
) -> str:
1501+
"""Return the _multibuild file string to write for this container based on its family."""
1502+
if not self.check_version_in_uid(container):
1503+
return ""
1504+
1505+
flavors: str = "\n".join(
1506+
" " * 4 + f"<package>{pkg}</package>"
1507+
for pkg in self.get_all_build_flavors(container)
1508+
)
1509+
return f"<multibuild>\n{flavors}\n</multibuild>"
1510+
1511+
def check_version_in_uid(
1512+
self,
1513+
container: BaseContainerImage,
1514+
) -> bool:
1515+
""" check if version_in_uid is set to False if a container has more than one flavour """
1516+
if len(self.get_all_build_flavors(container)) > 1 and getattr(
1517+
container, "version_in_uid", False
1518+
):
1519+
return False
1520+
return True
1521+
1522+
14381523
def generate_disk_size_constraints(size_gb: int) -> str:
14391524
"""Creates the contents of a :file:`_constraints` file for OBS to require
14401525
workers with at least ``size_gb`` GB of disk space.

src/bci_build/package/apache_tomcat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
from bci_build.container_attributes import TCP
66
from bci_build.container_attributes import PackageType
7-
from bci_build.containercrate import ContainerCrate
87
from bci_build.os_version import CAN_BE_LATEST_OS_VERSION
98
from bci_build.os_version import OsVersion
109
from bci_build.package import DOCKERFILE_RUN
1110
from bci_build.package import ApplicationStackContainer
11+
from bci_build.package import ContainerFamily
1212
from bci_build.package import OsContainer
1313
from bci_build.package import Package
1414
from bci_build.package import Replacement
@@ -150,4 +150,4 @@ def _get_java_packages(jre_major: int) -> list[str]:
150150
)
151151
]
152152

153-
TOMCAT_CRATE = ContainerCrate(TOMCAT_CONTAINERS)
153+
TOMCAT_FAMILIES = ContainerFamily(TOMCAT_CONTAINERS)

src/bci_build/package/package_versions.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"5": "2.35",
1111
"6": "2.43",
1212
"7": "2.43",
13-
"Tumbleweed": "2.47",
13+
"Tumbleweed": "2.48",
1414
"version_format": "minor"
1515
},
1616
"helm": {
@@ -54,7 +54,7 @@
5454
},
5555
"spack": {
5656
"6": "0.21.3",
57-
"7": "0.21.3",
57+
"7": "0.23.0",
5858
"Tumbleweed": "0.23.0"
5959
},
6060
"valkey": {

src/bci_build/templates.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@
202202
<service mode="buildtime" name="{{ image.build_recipe_type }}_label_helper"/>
203203
<service mode="buildtime" name="kiwi_metainfo_helper"/>
204204
{%- set all_build_flavors = [""] %}
205-
{%- if image.crate and image.build_flavor %}
206-
{%- set all_build_flavors = image.crate.all_build_flavors(image) %}
205+
{%- if image.family and image.build_flavor %}
206+
{%- set all_build_flavors = image.family.get_all_build_flavors(image) %}
207207
{%- endif %}
208208
{%- for flavor in all_build_flavors %}
209209
{%- for replacement in image.replacements_via_service %}

tests/test_crate.py renamed to tests/test_container_family.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from bci_build.container_attributes import BuildType
2-
from bci_build.containercrate import ContainerCrate
32
from bci_build.os_version import OsVersion
3+
from bci_build.package import ContainerFamily
44
from bci_build.package import DevelopmentContainer
55

66
_BASE_KWARGS = {
@@ -19,11 +19,12 @@ def test_multibuild_with_multi_flavor_docker():
1919
**_BASE_KWARGS,
2020
build_recipe_type=BuildType.DOCKER,
2121
build_flavor=flavor,
22+
version_in_uid=False,
2223
)
2324
for flavor in ("flavor1", "flavor2")
2425
]
2526
assert (
26-
ContainerCrate(containers).multibuild(containers[0])
27+
ContainerFamily(containers).get_multibuild_file_content(containers[0])
2728
== """<multibuild>
2829
<package>flavor1</package>
2930
<package>flavor2</package>

tests/test_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import pytest
22

33
from bci_build.container_attributes import BuildType
4-
from bci_build.containercrate import ContainerCrate
54
from bci_build.os_version import OsVersion
5+
from bci_build.package import ContainerFamily
66
from bci_build.package import DevelopmentContainer
77
from bci_build.package import ParseVersion
88
from bci_build.package import Replacement
@@ -181,7 +181,7 @@ def test_service_with_multi_flavor_docker():
181181
)
182182
for flavor in ("flavor1", "flavor2")
183183
]
184-
ContainerCrate(containers)
184+
ContainerFamily(containers)
185185

186186
assert (
187187
SERVICE_TEMPLATE.render(

0 commit comments

Comments
 (0)