|
| 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 | +# decompress modules for getKmodsToSign (kmmmodule.go) since it expects uncompressed files |
| 32 | +{{ DOCKERFILE_RUN }} \\ |
| 33 | + find /lib/modules/{{ kernel_ga }} -name "*.ko.zst" -exec zstd -d --rm {} \\;; \\ |
| 34 | + depmod {{ kernel_ga }} |
| 35 | +
|
| 36 | +# copy modules to /opt since getKmodsToSign (kmmmodule.go) expects it there |
| 37 | +{{ DOCKERFILE_RUN }} \\ |
| 38 | + mkdir -p /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms; \\ |
| 39 | + cp /lib/modules/{{ kernel_ga }}/updates/amd* /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms; \\ |
| 40 | + cp /lib/modules/{{ kernel_ga }}/modules.* /target/opt/lib/modules/{{ kernel_ga }}/; \\ |
| 41 | + cp -r /lib/modules/{{ kernel_ga }}/kernel /target/opt/lib/modules/{{ kernel_ga }}/kernel; \\ |
| 42 | + depmod -b /target/opt {{ kernel_ga }} |
| 43 | +
|
| 44 | +# copy firmware to /firmwareDir |
| 45 | +{{ DOCKERFILE_RUN }} \\ |
| 46 | + mkdir -p /target/firmwareDir/updates/amdgpu; \\ |
| 47 | + cp -r /lib/firmware/updates/amdgpu /target/firmwareDir/updates/amdgpu |
| 48 | +""" |
| 49 | +) |
| 50 | + |
| 51 | + |
| 52 | +class AMDDriverBCI(ThirdPartyRepoMixin, DevelopmentContainer): |
| 53 | + def __init__(self, **kwargs): |
| 54 | + super().__init__(**kwargs) |
| 55 | + |
| 56 | + self.extra_files.update( |
| 57 | + { |
| 58 | + "_constraints": generate_disk_size_constraints(4), |
| 59 | + } |
| 60 | + ) |
| 61 | + |
| 62 | + @property |
| 63 | + def labelprefix(self) -> str: |
| 64 | + labelprefix = "com.suse" |
| 65 | + if self.os_version.is_tumbleweed: |
| 66 | + labelprefix = "org.opensuse" |
| 67 | + return f"{labelprefix}.third-party.{(self.custom_labelprefix_end or self.name)}" |
| 68 | + |
| 69 | + @property |
| 70 | + def release_stage(self) -> ReleaseStage: |
| 71 | + # TODO: Remove once the image is completed with all driver versions |
| 72 | + return ReleaseStage.BETA |
| 73 | + |
| 74 | + @property |
| 75 | + def registry_prefix(self): |
| 76 | + return "third-party" |
| 77 | + |
| 78 | + @property |
| 79 | + def build_tags(self) -> list[str]: |
| 80 | + # addition tags should match sles-15.7-6.4.0-150700.51-default-7.0.3 |
| 81 | + return [ |
| 82 | + f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}", |
| 83 | + f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}", |
| 84 | + ] + [ |
| 85 | + f"{self.registry_prefix}/amd/amdgpu-driver:sles-{self.os_version.os_version}-{v}-default-{self.tag_version}" |
| 86 | + for v in self.additional_versions |
| 87 | + ] |
| 88 | + |
| 89 | + @property |
| 90 | + def image_ref_name(self) -> str: |
| 91 | + return f"sles-%OS_VERSION_ID_SP%-{self.tag_version}" |
| 92 | + |
| 93 | + @property |
| 94 | + def build_name(self) -> str: |
| 95 | + return f"{self.name}-{self.tag_version}" |
| 96 | + |
| 97 | + @property |
| 98 | + def build_version(self) -> str: |
| 99 | + return f"{self.os_version.os_version}.{self.version}" |
| 100 | + |
| 101 | + @property |
| 102 | + def reference(self) -> str: |
| 103 | + return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}" |
| 104 | + |
| 105 | + @property |
| 106 | + def pretty_reference(self) -> str: |
| 107 | + return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}" |
| 108 | + |
| 109 | + def fetch_rpm_packages(self) -> list[RpmPackage]: |
| 110 | + """Fetches all the required packages from the repository. |
| 111 | +
|
| 112 | + Returns: |
| 113 | + list of :py:class:`RpmPackage` representing the downloaded rpms |
| 114 | + """ |
| 115 | + if self._rpms: |
| 116 | + return self._rpms |
| 117 | + |
| 118 | + super().fetch_rpm_packages() |
| 119 | + |
| 120 | + project = "SUSE:SLE-15-SP7:GA" |
| 121 | + repo = "pool" |
| 122 | + version = "6.4.0" |
| 123 | + release = "150700.51.1" |
| 124 | + arches = self.exclusive_arch |
| 125 | + subpackages = [ |
| 126 | + { |
| 127 | + "name": "kernel-default", |
| 128 | + "package": "kernel-default", |
| 129 | + }, |
| 130 | + { |
| 131 | + "name": "kernel-default-devel", |
| 132 | + "package": "kernel-default", |
| 133 | + }, |
| 134 | + { |
| 135 | + "name": "kernel-syms", |
| 136 | + "package": "kernel-syms", |
| 137 | + }, |
| 138 | + { |
| 139 | + "name": "kernel-devel", |
| 140 | + "package": "kernel-source", |
| 141 | + "no_arch": True, |
| 142 | + }, |
| 143 | + { |
| 144 | + "name": "kernel-macros", |
| 145 | + "package": "kernel-source", |
| 146 | + "no_arch": True, |
| 147 | + }, |
| 148 | + ] |
| 149 | + |
| 150 | + for subpkg in subpackages: |
| 151 | + name = subpkg["name"] |
| 152 | + package = subpkg["package"] |
| 153 | + no_arch = subpkg.get("no_arch", False) |
| 154 | + |
| 155 | + for arch in arches: |
| 156 | + filename_in_image = f"{name}-{version}-{release}.{arch}.rpm" |
| 157 | + |
| 158 | + if no_arch: |
| 159 | + filename_in_repo = f"{name}-{version}-{release}.noarch.rpm" |
| 160 | + else: |
| 161 | + filename_in_repo = f"{name}-{version}-{release}.{arch}.rpm" |
| 162 | + |
| 163 | + self._rpms.append( |
| 164 | + RpmPackage( |
| 165 | + name=name, |
| 166 | + arch=str(arch), |
| 167 | + evr=("", version, release), |
| 168 | + filename=filename_in_image, |
| 169 | + url=f"https://api.opensuse.org/public/build/{project}/{repo}/{arch}/{package}/{filename_in_repo}", |
| 170 | + ) |
| 171 | + ) |
| 172 | + |
| 173 | + return self._rpms |
| 174 | + |
| 175 | + def prepare_template(self) -> None: |
| 176 | + super().prepare_template() |
| 177 | + |
| 178 | + self.build_stage_custom_end += "\n" + CUSTOM_END_TEMPLATE.render( |
| 179 | + image=self, |
| 180 | + DOCKERFILE_RUN=DOCKERFILE_RUN, |
| 181 | + kernel_ga="6.4.0-150700.51-default", |
| 182 | + ) |
| 183 | + |
| 184 | + |
| 185 | +_AMD_DRIVER_VERSIONS: list[str] = ["7.0.3"] |
| 186 | + |
| 187 | +AMD_CONTAINERS: list[AMDDriverBCI] = [] |
| 188 | + |
| 189 | +for os_version in (OsVersion.SP7,): |
| 190 | + for ver in _AMD_DRIVER_VERSIONS: |
| 191 | + AMD_CONTAINERS.append( |
| 192 | + AMDDriverBCI( |
| 193 | + os_version=os_version, |
| 194 | + version=ver, |
| 195 | + tag_version=ver, |
| 196 | + additional_versions=["6.4.0-150700.51"], |
| 197 | + version_in_uid=True, |
| 198 | + use_build_flavor_in_tag=False, |
| 199 | + name="amd-driver", |
| 200 | + pretty_name="AMD GPU Driver", |
| 201 | + license="GPL-2.0 WITH Linux-syscall-note", |
| 202 | + is_latest=False, |
| 203 | + from_image=generate_from_image_tag(os_version, "bci-base"), |
| 204 | + from_target_image=generate_from_image_tag(os_version, "bci-micro"), |
| 205 | + support_level=SupportLevel.TECHPREVIEW, |
| 206 | + supported_until="", |
| 207 | + exclusive_arch=[Arch.X86_64], |
| 208 | + package_list=[ |
| 209 | + ( |
| 210 | + Package("rpm-ndb", PackageType.IMAGE) |
| 211 | + if os_version.is_sle15 |
| 212 | + else Package("rpm", PackageType.IMAGE) |
| 213 | + ), |
| 214 | + # needed by kernel GA packages |
| 215 | + # since kernel GA packages are using RemoteAssetUrl a few dependencies |
| 216 | + # are not solved by zypper automatically |
| 217 | + Package("awk", PackageType.BOOTSTRAP), |
| 218 | + Package("dwarves", PackageType.BOOTSTRAP), |
| 219 | + Package("elfutils", PackageType.BOOTSTRAP), |
| 220 | + Package("gcc", PackageType.BOOTSTRAP), |
| 221 | + Package("libelf-devel", PackageType.BOOTSTRAP), |
| 222 | + Package("pesign-obs-integration", PackageType.BOOTSTRAP), |
| 223 | + Package("zstd", PackageType.BOOTSTRAP), |
| 224 | + # build requirements for amdgpu-dkms |
| 225 | + Package("autoconf", PackageType.BOOTSTRAP), |
| 226 | + Package("automake", PackageType.BOOTSTRAP), |
| 227 | + Package("bc", PackageType.BOOTSTRAP), |
| 228 | + Package("bison", PackageType.BOOTSTRAP), |
| 229 | + Package("dracut", PackageType.BOOTSTRAP), |
| 230 | + Package("flex", PackageType.BOOTSTRAP), |
| 231 | + Package("gawk", PackageType.BOOTSTRAP), |
| 232 | + Package("libzstd-devel", PackageType.BOOTSTRAP), |
| 233 | + Package("make", PackageType.BOOTSTRAP), |
| 234 | + Package("mokutil", PackageType.BOOTSTRAP), |
| 235 | + Package("perl", PackageType.BOOTSTRAP), |
| 236 | + Package("perl-Bootloader", PackageType.BOOTSTRAP), |
| 237 | + Package("python3", PackageType.BOOTSTRAP), |
| 238 | + Package("python3-setuptools", PackageType.BOOTSTRAP), |
| 239 | + Package("python3-wheel", PackageType.BOOTSTRAP), |
| 240 | + # runtime requirement to load amdgpu-dkms |
| 241 | + Package("kmod", PackageType.IMAGE), |
| 242 | + *os_version.release_package_names, |
| 243 | + ], |
| 244 | + third_party_repos=AMD_REPOS, |
| 245 | + third_party_package_list=[ |
| 246 | + "amdgpu-dkms", |
| 247 | + "amdgpu-dkms-firmware", |
| 248 | + "dkms", |
| 249 | + ], |
| 250 | + ) |
| 251 | + ) |
| 252 | + |
| 253 | +AMD_CRATE = ContainerCrate(AMD_CONTAINERS) |
0 commit comments