Skip to content

Commit b0e4f88

Browse files
committed
Adding rpm OSes metadata saving and rpm package resolver to handle conditional statement
Signed-off-by: Mah, Yock Gen <yock.gen.mah@intel.com>
1 parent 261e5e9 commit b0e4f88

6 files changed

Lines changed: 315 additions & 66 deletions

File tree

config/osv/redhat-compatible-distro/rcd10/imageconfigs/defaultconfigs/default-raw-aarch64.yml

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,29 @@ systemConfig:
6262
enabled: true # default is true
6363

6464
packages:
65-
- filesystem
66-
- kernel
67-
- azurelinux-release
68-
# hyperv packages
69-
- dracut-hyperv
70-
- hyperv-daemons
71-
# core image packages
72-
- shim
73-
- systemd-boot
74-
- systemd-ukify
75-
- ca-certificates
76-
- cronie-anacron
77-
- logrotate
78-
- core-packages-base-image
79-
- dracut-hostonly
80-
- dracut-vrf
81-
- initramfs
82-
- shadow-utils
83-
# ssh-server
84-
- openssh-server
85-
# cloud-init packages
86-
- cloud-init
87-
- cloud-utils-growpart
88-
# virt guest packages
89-
- dracut-virtio
90-
- dracut-xen
91-
- veritysetup
65+
# --- MINIMUM BOOTABLE BASE ---
66+
- basesystem # The skeleton of the OS structure
67+
- filesystem # Provides the basic directory layout (/, /etc, /usr, etc.)
68+
- setup # Contains fundamental system configuration files (like /etc/passwd)
69+
- glibc # The core C library for almost all binaries
70+
- bash # The shell required for init scripts
71+
- coreutils # Basic commands (ls, cp, mkdir) required during boot
72+
- systemd # The init system (PID 1)
73+
- util-linux # Required for mounting filesystems (mount, fdisk)
74+
- kernel # The Linux kernel itself
75+
- kernel-core # Essential kernel modules for hardware/filesystem support
76+
- dracut # Used to generate the initramfs to find the root disk
77+
- dnf # Even a minimum build needs a way to install more packages
78+
79+
# --- BOOTLOADER (For UEFI/UKI) ---
80+
- grub2-common # The EFI boot manager
81+
- shim-x64 # Necessary for UEFI handover
82+
83+
# --- MINIMUM CONFIGURATION ---
84+
- hostname # To identify the system
85+
- shadow-utils # To manage users/root password
86+
- iproute # Minimum networking tool to bring up an interface
87+
- ncurses # Required for terminal display
9288

9389
additionalFiles:
9490
- local: ../additionalfiles/99-dhcp-en.network

config/osv/redhat-compatible-distro/rcd10/imageconfigs/defaultconfigs/default-raw-x86_64.yml

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,30 @@ systemConfig:
6262
enabled: true # default is true
6363

6464
packages:
65-
- filesystem
66-
- kernel
67-
- azurelinux-release
68-
# hyperv packages
69-
- dracut-hyperv
70-
- hyperv-daemons
71-
# core image packages
72-
- shim
73-
- systemd-boot
74-
- systemd-ukify
75-
- ca-certificates
76-
- cronie-anacron
77-
- logrotate
78-
- core-packages-base-image
79-
- dracut-hostonly
80-
- dracut-vrf
81-
- initramfs
82-
- shadow-utils
83-
# ssh-server
84-
- openssh-server
85-
# cloud-init packages
86-
- cloud-init
87-
- cloud-utils-growpart
88-
# virt guest packages
89-
- dracut-virtio
90-
- dracut-xen
91-
- veritysetup
65+
# --- MINIMUM BOOTABLE BASE ---
66+
- basesystem # The skeleton of the OS structure
67+
- filesystem # Provides the basic directory layout (/, /etc, /usr, etc.)
68+
- setup # Contains fundamental system configuration files (like /etc/passwd)
69+
- glibc # The core C library for almost all binaries
70+
- bash # The shell required for init scripts
71+
- coreutils # Basic commands (ls, cp, mkdir) required during boot
72+
- systemd # The init system (PID 1)
73+
- util-linux # Required for mounting filesystems (mount, fdisk)
74+
- kernel # The Linux kernel itself
75+
- kernel-core # Essential kernel modules for hardware/filesystem support
76+
- dracut # Used to generate the initramfs to find the root disk
77+
- dnf # Even a minimum build needs a way to install more packages
78+
79+
# --- BOOTLOADER (For UEFI/UKI) ---
80+
- grub2-common # The EFI boot manager
81+
- shim-x64 # Necessary for UEFI handover
82+
83+
# --- MINIMUM CONFIGURATION ---
84+
- hostname # To identify the system
85+
- shadow-utils # To manage users/root password
86+
- iproute # Minimum networking tool to bring up an interface
87+
- ncurses # Required for terminal display
88+
9289

9390
additionalFiles:
9491
- local: ../additionalfiles/99-dhcp-en.network

internal/ospackage/rpmutils/helper.go

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,52 @@ func extractBasePackageNameFromFile(fullName string) string {
246246
// extractBaseNameFromDep takes a potentially complex requirement string
247247
// and returns only the base package/capability name.
248248
func extractBaseNameFromDep(req string) string {
249-
if strings.HasPrefix(req, "(") && strings.Contains(req, " ") {
250-
trimmed := strings.TrimPrefix(req, "(")
251-
parts := strings.Fields(trimmed)
249+
req = strings.TrimSpace(req)
250+
if req == "" {
251+
return ""
252+
}
253+
254+
// Handle complex conditional dependencies with "if" clauses
255+
if strings.Contains(req, ") if ") {
256+
// Extract content between first '((' and ') if'
257+
if start := strings.Index(req, "(("); start != -1 {
258+
if end := strings.Index(req, ") if "); end != -1 {
259+
inner := req[start+2 : end]
260+
// Handle multiple operators in priority order
261+
for _, op := range []string{" >= ", " <= ", " > ", " < ", " = "} {
262+
if idx := strings.Index(inner, op); idx != -1 {
263+
return strings.TrimSpace(inner[:idx])
264+
}
265+
}
266+
return strings.TrimSpace(inner)
267+
}
268+
}
269+
}
270+
271+
// Handle simple parentheses cases
272+
if strings.HasPrefix(req, "(") && strings.HasSuffix(req, ")") {
273+
inner := req[1 : len(req)-1]
274+
inner = strings.TrimSpace(inner)
275+
// Handle version operators in priority order
276+
for _, op := range []string{" >= ", " <= ", " > ", " < ", " = "} {
277+
if idx := strings.Index(inner, op); idx != -1 {
278+
return strings.TrimSpace(inner[:idx])
279+
}
280+
}
281+
parts := strings.Fields(inner)
252282
if len(parts) > 0 {
253-
req = parts[0]
283+
return parts[0]
254284
}
285+
return inner
255286
}
287+
288+
// Handle regular cases with operators
289+
for _, op := range []string{" >= ", " <= ", " > ", " < ", " = "} {
290+
if idx := strings.Index(req, op); idx != -1 {
291+
return strings.TrimSpace(req[:idx])
292+
}
293+
}
294+
256295
finalParts := strings.Fields(req)
257296
if len(finalParts) == 0 {
258297
return ""

internal/ospackage/rpmutils/helper_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,26 @@ func TestExtractBaseNameFromDep(t *testing.T) {
204204
req: "glibc >= 2.17",
205205
expected: "glibc",
206206
},
207+
{
208+
name: "Complex conditional dependency",
209+
req: "((kernel-modules-extra-uname-r = 6.12.0-174.el10.x86_64) if kernel-modules-extra-matched)",
210+
expected: "kernel-modules-extra-uname-r",
211+
},
212+
{
213+
name: "Simple parentheses without spaces",
214+
req: "(linux-firmware)",
215+
expected: "linux-firmware",
216+
},
217+
{
218+
name: "Simple parentheses with version constraint",
219+
req: "(glibc >= 2.17)",
220+
expected: "glibc",
221+
},
222+
{
223+
name: "Complex conditional dependency with >= operator",
224+
req: "((linux-firmware >= 20150904-56.git6ebf5d57) if linux-firmware)",
225+
expected: "linux-firmware",
226+
},
207227
}
208228

209229
for _, tt := range tests {

0 commit comments

Comments
 (0)