Skip to content

Commit ac9eb1f

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

2 files changed

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

0 commit comments

Comments
 (0)