Skip to content

Commit 910752a

Browse files
Add AMD driver image (jsc#PED-14049)
This image is required for adding support for the AMD GPU Operator on SLES.
1 parent fd9fba6 commit 910752a

2 files changed

Lines changed: 288 additions & 0 deletions

File tree

src/bci_build/package/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,7 @@ def generate_disk_size_constraints(size_gb: int) -> str:
14781478
"""
14791479

14801480

1481+
from .amd import AMD_CONTAINERS # noqa: E402
14811482
from .apache_tomcat import TOMCAT_CONTAINERS # noqa: E402
14821483
from .appcontainers import ALERTMANAGER_CONTAINERS # noqa: E402
14831484
from .appcontainers import BLACKBOX_EXPORTER_CONTAINERS # noqa: E402
@@ -1549,6 +1550,7 @@ def generate_disk_size_constraints(size_gb: int) -> str:
15491550
*BCI_CI_CONTAINERS,
15501551
*THREE_EIGHT_NINE_DS_CONTAINERS,
15511552
*NGINX_CONTAINERS,
1553+
*AMD_CONTAINERS,
15521554
*DOTNET_CONTAINERS,
15531555
*PCP_CONTAINERS,
15541556
*REGISTRY_CONTAINERS,

src/bci_build/package/amd.py

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
from jinja2 import Template
2+
3+
from bci_build.container_attributes import Arch
4+
from bci_build.container_attributes import PackageType
5+
from bci_build.container_attributes import ReleaseStage
6+
from bci_build.container_attributes import SupportLevel
7+
from bci_build.containercrate import ContainerCrate
8+
from bci_build.os_version import OsVersion
9+
from bci_build.package import DOCKERFILE_RUN
10+
from bci_build.package import _RELEASE_PLACEHOLDER
11+
from bci_build.package import DevelopmentContainer
12+
from bci_build.package import Package
13+
from bci_build.package import generate_disk_size_constraints
14+
from bci_build.package.helpers import generate_from_image_tag
15+
from bci_build.package.thirdparty import ThirdPartyRepo
16+
from bci_build.package.thirdparty import ThirdPartyRepoMixin
17+
from bci_build.repomdparser import RpmPackage
18+
19+
AMD_REPOS = [
20+
ThirdPartyRepo(
21+
name="radeon-sles15sp7-x86_64",
22+
arch=Arch.X86_64,
23+
url="https://repo.radeon.com/amdgpu/7.0.3/sle/15.7/main/x86_64/",
24+
key_url="https://repo.radeon.com/rocm/rocm.gpg.key",
25+
),
26+
]
27+
28+
29+
CUSTOM_END_TEMPLATE = Template(
30+
"""
31+
{{ DOCKERFILE_RUN }} depmod {{ kernel_ga }}
32+
# decompress modules for getKmodsToSign (kmmmodule.go) since it expects uncompressed files
33+
{{ DOCKERFILE_RUN }} find /lib/modules/{{ kernel_ga }} -name "*.ko.zst" -exec zstd -d --rm {} \\;
34+
{{ DOCKERFILE_RUN }} depmod {{ kernel_ga }}
35+
# copy files to /opt since getKmodsToSign (kmmmodule.go) expects it there
36+
{{ DOCKERFILE_RUN }} mkdir -p /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms/
37+
{{ DOCKERFILE_RUN }} cp /lib/modules/{{ kernel_ga }}/updates/amd* /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms/
38+
{{ DOCKERFILE_RUN }} cp /lib/modules/{{ kernel_ga }}/modules.* /target/opt/lib/modules/{{ kernel_ga }}/
39+
{{ DOCKERFILE_RUN }} cp -r /lib/modules/{{ kernel_ga }}/kernel /target/opt/lib/modules/{{ kernel_ga }}/kernel
40+
{{ DOCKERFILE_RUN }} mkdir -p /target/firmwareDir/updates/amdgpu
41+
{{ DOCKERFILE_RUN }} cp -r /lib/firmware/updates/amdgpu /target/firmwareDir/updates/amdgpu
42+
# add symlinks for getKmodsToSign (kmmmodule.go) since we build only for GA
43+
{%- for kernel_version in kernel_versions %}
44+
{{ DOCKERFILE_RUN }} ln -s /opt/lib/modules/{{ kernel_ga }} /target/opt/lib/modules/{{ kernel_version }}
45+
{%- endfor %}
46+
"""
47+
)
48+
49+
50+
class AMDDriverBCI(ThirdPartyRepoMixin, DevelopmentContainer):
51+
def __init__(self, **kwargs):
52+
super().__init__(**kwargs)
53+
54+
self.extra_files.update(
55+
{
56+
"_constraints": generate_disk_size_constraints(4),
57+
}
58+
)
59+
60+
@property
61+
def labelprefix(self) -> str:
62+
labelprefix = "com.suse"
63+
if self.os_version.is_tumbleweed:
64+
labelprefix = "org.opensuse"
65+
return f"{labelprefix}.third-party.{(self.custom_labelprefix_end or self.name)}"
66+
67+
@property
68+
def release_stage(self) -> ReleaseStage:
69+
# TODO: Remove once the image is completed with all driver versions
70+
return ReleaseStage.BETA
71+
72+
@property
73+
def registry_prefix(self):
74+
return "third-party"
75+
76+
@property
77+
def build_tags(self) -> list[str]:
78+
# addition tags should match sles-15.7-6.4.0-150700.53.19-default-7.0.3
79+
return [
80+
f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}",
81+
f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}",
82+
] + [
83+
f"{self.registry_prefix}/amd/amdgpu-driver:sles-{self.os_version.os_version}-{v}-default-{self.tag_version}"
84+
for v in self.additional_versions
85+
]
86+
87+
@property
88+
def image_ref_name(self) -> str:
89+
return f"sles-%OS_VERSION_ID_SP%-{self.tag_version}"
90+
91+
@property
92+
def build_name(self) -> str:
93+
return f"{self.name}-{self.tag_version}"
94+
95+
@property
96+
def build_version(self) -> str:
97+
return f"{self.os_version.os_version}.{self.version}"
98+
99+
@property
100+
def reference(self) -> str:
101+
return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}"
102+
103+
@property
104+
def pretty_reference(self) -> str:
105+
return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}"
106+
107+
def fetch_rpm_packages(self) -> list[RpmPackage]:
108+
"""Fetches all the required packages from the repository.
109+
110+
Returns:
111+
list of :py:class:`RpmPackage` representing the downloaded rpms
112+
"""
113+
if self._rpms:
114+
return self._rpms
115+
116+
super().fetch_rpm_packages()
117+
118+
project = "SUSE:SLE-15-SP7:GA"
119+
repo = "pool"
120+
version = "6.4.0"
121+
release = "150700.51.1"
122+
arches = self.exclusive_arch
123+
subpackages = [
124+
{
125+
"name": "kernel-default",
126+
"package": "kernel-default",
127+
},
128+
{
129+
"name": "kernel-default-devel",
130+
"package": "kernel-default",
131+
},
132+
{
133+
"name": "kernel-syms",
134+
"package": "kernel-syms",
135+
},
136+
{
137+
"name": "kernel-devel",
138+
"package": "kernel-source",
139+
"no_arch": True,
140+
},
141+
{
142+
"name": "kernel-macros",
143+
"package": "kernel-source",
144+
"no_arch": True,
145+
},
146+
]
147+
148+
for subpkg in subpackages:
149+
name = subpkg["name"]
150+
package = subpkg["package"]
151+
no_arch = subpkg.get("no_arch", False)
152+
153+
for arch in arches:
154+
filename_in_image = f"{name}-{version}-{release}.{arch}.rpm"
155+
156+
if no_arch:
157+
filename_in_repo = f"{name}-{version}-{release}.noarch.rpm"
158+
else:
159+
filename_in_repo = f"{name}-{version}-{release}.{arch}.rpm"
160+
161+
self._rpms.append(
162+
RpmPackage(
163+
name=name,
164+
arch=str(arch),
165+
evr=("", version, release),
166+
filename=filename_in_image,
167+
url=f"https://api.opensuse.org/public/build/{project}/{repo}/{arch}/{package}/{filename_in_repo}",
168+
)
169+
)
170+
171+
return self._rpms
172+
173+
def prepare_template(self) -> None:
174+
super().prepare_template()
175+
176+
self.build_stage_custom_end += "\n" + CUSTOM_END_TEMPLATE.render(
177+
image=self,
178+
DOCKERFILE_RUN=DOCKERFILE_RUN,
179+
kernel_ga=_get_kernel_versions(self.os_version)[-1] + "-default",
180+
kernel_versions=[
181+
f"{v}-default" for v in _get_kernel_versions(self.os_version)[:-1]
182+
],
183+
)
184+
185+
186+
def _get_kernel_versions(os_version: OsVersion):
187+
"""Return all kernel versions for a given OS version."""
188+
189+
# TODO: This should be moved to the package_versions.json
190+
# otherwise a new kernel version needs to be added here
191+
# for every release.
192+
if os_version == OsVersion.SL16_0:
193+
return [
194+
"6.12.0-160000.26",
195+
"6.12.0-160000.9",
196+
"6.12.0-160000.8",
197+
"6.12.0-160000.7",
198+
"6.12.0-160000.6",
199+
"6.12.0-160000.5", # GA
200+
]
201+
202+
if os_version == OsVersion.SP7:
203+
return [
204+
"6.4.0-150700.53.31",
205+
"6.4.0-150700.53.28",
206+
"6.4.0-150700.53.25",
207+
"6.4.0-150700.53.22",
208+
"6.4.0-150700.53.19",
209+
"6.4.0-150700.53.16",
210+
"6.4.0-150700.53.11",
211+
"6.4.0-150700.53.6",
212+
"6.4.0-150700.53.3",
213+
"6.4.0-150700.51", # GA
214+
]
215+
216+
raise ValueError(f"Unknown kernel versions for '{os_version}'")
217+
218+
219+
_AMD_DRIVER_VERSIONS: list[str] = ["7.0.3"]
220+
221+
AMD_CONTAINERS: list[AMDDriverBCI] = []
222+
223+
for os_version in (OsVersion.SP7,):
224+
for ver in _AMD_DRIVER_VERSIONS:
225+
AMD_CONTAINERS.append(
226+
AMDDriverBCI(
227+
os_version=os_version,
228+
version=ver,
229+
tag_version=ver,
230+
additional_versions=_get_kernel_versions(os_version),
231+
version_in_uid=True,
232+
use_build_flavor_in_tag=False,
233+
name="amd-driver",
234+
pretty_name="AMD GPU Driver",
235+
is_latest=False,
236+
from_image=generate_from_image_tag(os_version, "bci-base"),
237+
from_target_image=generate_from_image_tag(os_version, "bci-micro"),
238+
support_level=SupportLevel.TECHPREVIEW,
239+
supported_until="",
240+
exclusive_arch=[Arch.X86_64],
241+
package_list=[
242+
(
243+
Package("rpm-ndb", PackageType.IMAGE)
244+
if os_version.is_sle15
245+
else Package("rpm", PackageType.IMAGE)
246+
),
247+
# needed by kernel GA packages
248+
# since kernel GA packages are using RemoteAssetUrl a few dependencies
249+
# are not solved by zypper automatically
250+
Package("awk", PackageType.BOOTSTRAP),
251+
Package("dwarves", PackageType.BOOTSTRAP),
252+
Package("elfutils", PackageType.BOOTSTRAP),
253+
Package("gcc", PackageType.BOOTSTRAP),
254+
Package("libelf-devel", PackageType.BOOTSTRAP),
255+
Package("pesign-obs-integration", PackageType.BOOTSTRAP),
256+
Package("zstd", PackageType.BOOTSTRAP),
257+
# build requirements for amdgpu-dkms
258+
Package("autoconf", PackageType.BOOTSTRAP),
259+
Package("automake", PackageType.BOOTSTRAP),
260+
Package("bc", PackageType.BOOTSTRAP),
261+
Package("bison", PackageType.BOOTSTRAP),
262+
Package("dracut", PackageType.BOOTSTRAP),
263+
Package("flex", PackageType.BOOTSTRAP),
264+
Package("gawk", PackageType.BOOTSTRAP),
265+
Package("libzstd-devel", PackageType.BOOTSTRAP),
266+
Package("make", PackageType.BOOTSTRAP),
267+
Package("mokutil", PackageType.BOOTSTRAP),
268+
Package("perl", PackageType.BOOTSTRAP),
269+
Package("perl-Bootloader", PackageType.BOOTSTRAP),
270+
Package("python3", PackageType.BOOTSTRAP),
271+
Package("python3-setuptools", PackageType.BOOTSTRAP),
272+
Package("python3-wheel", PackageType.BOOTSTRAP),
273+
# runtime requirement to load amdgpu-dkms
274+
Package("kmod", PackageType.IMAGE),
275+
*os_version.release_package_names,
276+
],
277+
third_party_repos=AMD_REPOS,
278+
third_party_package_list=[
279+
"amdgpu-dkms",
280+
"amdgpu-dkms-firmware",
281+
"dkms",
282+
],
283+
)
284+
)
285+
286+
AMD_CRATE = ContainerCrate(AMD_CONTAINERS)

0 commit comments

Comments
 (0)