From 8247b33a98de61ee5281fdc10ca4ad853626267b456e70611d120e8401ecace6 Mon Sep 17 00:00:00 2001 From: Steven Hardy <steven.hardy@suse.com> Date: Tue, 12 Nov 2024 18:34:16 +0000 Subject: [PATCH] ironic-ipa-ramdisk: add new/renamed package To align with isv:SUSE:Edge:Metal3:Ironic:2024.2 --- .obs/workflows.yml | 4 + ironic-ipa-ramdisk/_constraints | 8 + ironic-ipa-ramdisk/config.sh | 105 +++++++++++++ ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi | 173 +++++++++++++++++++++ ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec | 167 ++++++++++++++++++++ ironic-ipa-ramdisk/root.tar.bz2 | Bin 0 -> 3866 bytes 6 files changed, 457 insertions(+) create mode 100644 ironic-ipa-ramdisk/_constraints create mode 100644 ironic-ipa-ramdisk/config.sh create mode 100644 ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi create mode 100644 ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec create mode 100644 ironic-ipa-ramdisk/root.tar.bz2 diff --git a/.obs/workflows.yml b/.obs/workflows.yml index af2407f..8c923ad 100644 --- a/.obs/workflows.yml +++ b/.obs/workflows.yml @@ -230,3 +230,7 @@ staging_build: source_package: kube-rbac-proxy-image source_project: isv:SUSE:Edge:Factory target_project: isv:SUSE:Edge:Factory:Staging + - branch_package: + source_package: ironic-ipa-ramdisk + source_project: isv:SUSE:Edge:Factory + target_project: isv:SUSE:Edge:Factory:Staging diff --git a/ironic-ipa-ramdisk/_constraints b/ironic-ipa-ramdisk/_constraints new file mode 100644 index 0000000..19d0995 --- /dev/null +++ b/ironic-ipa-ramdisk/_constraints @@ -0,0 +1,8 @@ +<constraints> + <hardware> + <processors>4</processors> + <disk> + <size unit="G">12</size> + </disk> + </hardware> +</constraints> diff --git a/ironic-ipa-ramdisk/config.sh b/ironic-ipa-ramdisk/config.sh new file mode 100644 index 0000000..8285ba4 --- /dev/null +++ b/ironic-ipa-ramdisk/config.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +test -f /.kconfig && . /.kconfig +test -f /.profile && . /.profile + +#====================================== +# Greeting... +#-------------------------------------- +echo "Configure image: [$kiwi_iname]..." + +#========================================== +# setup build day +#------------------------------------------ +baseSetupBuildDay + +#====================================== +# Mount system filesystems +#-------------------------------------- +#baseMount + +#========================================== +# remove unneded kernel files +#------------------------------------------ +suseStripKernel +baseStripLocales en_US.utf-8 C.utf8 + +#====================================== +# Setup baseproduct link +#-------------------------------------- +suseSetupProduct + +#====================================== +# Add missing gpg keys to rpm +#-------------------------------------- +suseImportBuildKey + +#====================================== +# Activate services +#-------------------------------------- +baseInsertService openstack-ironic-python-agent +baseInsertService suse-ironic-image-setup +baseInsertService suse-network-setup +baseInsertService sshd +baseInsertService NetworkManager +#suseInsertService sshd +#suseInsertService openstack-ironic-python-agent +#suseInsertService suse-ironic-image-setup + +echo 'DEFAULT_TIMEZONE="UTC"' >> /etc/sysconfig/clock +baseUpdateSysConfig /etc/sysconfig/clock HWCLOCK "-u" +baseUpdateSysConfig /etc/sysconfig/clock TIMEZONE UTC +baseUpdateSysConfig /etc/sysconfig/network/dhcp DHCLIENT_SET_HOSTNAME no +baseUpdateSysConfig /etc/sysconfig/network/dhcp WRITE_HOSTNAME_TO_HOSTS no + +#========================================== +# generate autologin@ service +# based on getty@ service +#------------------------------------------ +#sed 's/^ExecStart=.*/\0 --autologin root/' /usr/lib/systemd/system/getty@.service > /etc/systemd/system/autologin\@.service +sed -E 's/^(ExecStart=.*\/agetty).*(--noclear.*)/\1 \2 --autologin root/' /usr/lib/systemd/system/getty@.service > /etc/systemd/system/autologin\@.service + +#========================================== +# add fstab entry for tmpfs based /tmp +#------------------------------------------ +echo 'tmpfs /tmp tmpfs size=3G 0 0' >> /etc/fstab + +#========================================== +# remove package docs and manuals +#------------------------------------------ +#baseStripDocs +#baseStripMans +#baseStripInfos + +#====================================== +# only basic version of vim is +# installed; no syntax highlighting +#-------------------------------------- +sed -i -e's/^syntax on/" syntax on/' /etc/vimrc + +#====================================== +# Remove yast if not in use +#-------------------------------------- +#suseRemoveYaST + +#====================================== +# Remove package manager +#-------------------------------------- +#suseStripPackager + +#rm -f usr/lib/perl5/*/*/auto/Encode/??/??.so # 9MB + +#====================================== +# Umount kernel filesystems +#-------------------------------------- +#baseCleanMount + +ln -s /sbin/init /init + +#========================================== +# umount +#------------------------------------------ +umount /proc >/dev/null 2>&1 + +exit 0 + diff --git a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi new file mode 100644 index 0000000..315d4d0 --- /dev/null +++ b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.kiwi @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="utf-8"?> +<image schemaversion="7.4" name="openstack-ironic-image-201"> + <description type="system"> + <author>Cloud developers</author> + <contact>cloud-devel@suse.de</contact> + <specification>kernel and ramdisk image for metal3</specification> + </description> + <profiles> + <profile name="default" description="Booting default profile" import="true"/> + </profiles> + <preferences> + <locale>en_US</locale> + <packagemanager>zypper</packagemanager> + <rpm-check-signatures>false</rpm-check-signatures> + <timezone>UTC</timezone> + <version>1.0.0</version> + </preferences> + <preferences profiles="default"> + <type image="kis" initrd_system="none" compressed="false"/> + </preferences> + + <users> + <user password="*" home="/root" name="root" groups="root"/> + </users> + + <repository alias="build-binaries" type="rpm-md" priority="99"> + <source path="dir:///.build.binaries"/> + </repository> + + <drivers> + <file name="crypto/*"/> + <file name="drivers/acpi/*"/> + <file name="drivers/acpi/dock.ko"/> + <file name="drivers/ata/*"/> + <file name="drivers/block/brd.ko"/> + <file name="drivers/block/cciss.ko"/> + <file name="drivers/block/loop.ko"/> + <file name="drivers/block/virtio_blk.ko"/> + <file name="drivers/cdrom/*"/> + <file name="drivers/char/hw_random/virtio-rng.ko"/> + <file name="drivers/char/lp.ko"/> + <file name="drivers/char/ipmi/*"/> + <file name="drivers/firmware/iscsi_ibft.ko"/> + <file name="drivers/firmware/edd.ko"/> + <file name="drivers/gpu/drm/*"/> + <file name="drivers/hid/*"/> + <file name="drivers/hv/*"/> + <file name="drivers/hwmon/*"/> + <file name="drivers/ide/*"/> + <file name="drivers/input/keyboard/*"/> + <file name="drivers/input/mouse/*"/> + <file name="drivers/md/*"/> + <file name="drivers/message/fusion/*"/> + <file name="drivers/misc/hpilo.ko"/> + <file name="drivers/net/*"/> + <file name="drivers/parport/*"/> + <file name="drivers/scsi/*"/> + <file name="drivers/staging/hv/*"/> + <file name="drivers/target/*"/> + <file name="drivers/thermal/*"/> + <file name="drivers/usb/*"/> + <file name="drivers/virtio/*"/> + <file name="fs/binfmt_aout.ko"/> + <file name="fs/binfmt_misc.ko"/> + <file name="fs/overlayfs/*"/> + <file name="fs/btrfs/*"/> + <file name="fs/exportfs/*"/> + <file name="fs/ext4/*"/> + <file name="fs/fat/*"/> + <file name="fs/fuse/*"/> + <file name="fs/hfs/*"/> + <file name="fs/jbd2/*"/> + <file name="fs/nfs/*"/> + <file name="fs/mbcache.ko"/> + <file name="fs/nls/nls_cp437.ko"/> + <file name="fs/nls/nls_iso8859-1.ko"/> + <file name="fs/nls/nls_utf8.ko"/> + <file name="fs/quota_v1.ko"/> + <file name="fs/quota_v2.ko"/> + <file name="fs/squashfs/*"/> + <file name="fs/udf/*"/> + <file name="fs/vfat/*"/> + <file name="fs/xfs/*"/> + <file name="fs/isofs/*"/> + <file name="lib/crc-t10dif.ko"/> + <file name="lib/crc16.ko"/> + <file name="lib/libcrc32c.ko"/> + <file name="lib/zlib_deflate/zlib_deflate.ko"/> + <file name="net/packet/*"/> + </drivers> + + <packages type="delete"> + <package name="gpg2"/> + <package name="libcairo2"/> + <package name="libpango-1_0-0"/> + <package name="libX11-6"/> + <package name="libXext6"/> + <package name="libXft2"/> + <package name="libXrender1"/> + <package name="libX11-data"/> + <package name="libXau6"/> + <package name="libxcb-render0"/> + <package name="libxcb-shm0"/> + <package name="libxcb1"/> + <package name="plymouth"/> + <package name="plymouth-branding-SLE"/> + </packages> + + <packages type="image"> + <package name="checkmedia"/> + <package name="plymouth-branding-SLE"/> + <package name="plymouth-dracut"/> + <package name="plymouth-theme-bgrt"/> + <package name="grub2-branding-SLE"/> + <package name="iputils"/> + <package name="vim"/> + <package name="grub2"/> + <package name="grub2-x86_64-efi" arch="x86_64"/> + <package name="grub2-i386-pc"/> + <package name="syslinux"/> + <package name="lvm2"/> + <package name="plymouth"/> + <package name="fontconfig"/> + <package name="fonts-config"/> + <package name="openssh"/> + <package name="iproute2"/> + <package name="which"/> + <package name="kernel-firmware"/> + <package name="kernel-default"/> + <package name="NetworkManager"/> + <package name="nm-configurator-030"/> + <package name="timezone"/> + <package name="haveged"/> + <!-- ironic-python-agent specific --> + <package name="openstack-ironic-python-agent"/> + <package name="hdparm"/> + <package name="qemu-tools"/> + <package name="python311-proliantutils" arch="x86_64"/> + <package name="lshw"/> + <package name="dmidecode" arch="aarch64"/> + <package name="dmidecode" arch="x86_64"/> + <package name="efibootmgr" arch="aarch64" /> + <package name="efibootmgr" arch="x86_64" /> + <package name="gptfdisk"/> + <package name="open-iscsi"/> + <package name="hwinfo"/> + <package name="ipmitool"/> + <package name="iputils"/> + <package name="lvm2"/> + <package name="net-tools"/> + <package name="ntp"/> + <package name="parted"/> + <package name="psmisc"/> + <package name="timezone"/> + <package name="which"/> + <package name="kbd"/> + </packages> + + <packages type="kis"> + <package name="gfxboot-branding-SLE"/> + <package name="dracut-kiwi-oem-repart"/> + <package name="dracut-kiwi-oem-dump"/> + </packages> + + <packages type="bootstrap"> + <package name="glibc-locale"/> + <package name="udev"/> + <package name="filesystem"/> + <package name="cracklib-dict-full"/> + <package name="ca-certificates"/> + <package name="sles-release"/> + </packages> +</image> diff --git a/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec new file mode 100644 index 0000000..2e4232a --- /dev/null +++ b/ironic-ipa-ramdisk/ironic-ipa-ramdisk.spec @@ -0,0 +1,167 @@ +# +# spec file for package openstack-ironic-image +# +# Copyright (c) 2023 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# +# needsrootforbuild +# needsbinariesforbuild + + +Name: ironic-ipa-ramdisk +Version: 3.0.0 +Release: 0 +Summary: Kernel and ramdisk image for OpenStack Ironic +License: SUSE-EULA +Group: System/Management +URL: https://github.com/SUSE-Cloud/ +Source0: config.sh +Source10: ironic-ipa-ramdisk.kiwi +Source20: root.tar.bz2 + +BuildRequires: -post-build-checks +BuildRequires: bash +BuildRequires: kiwi +BuildRequires: kiwi-tools +BuildRequires: zypper +BuildArch: noarch + +BuildRequires: checkmedia +BuildRequires: acl +BuildRequires: ca-certificates +BuildRequires: cracklib-dict-full +BuildRequires: cron +BuildRequires: dbus-1 +BuildRequires: elfutils +BuildRequires: filesystem +BuildRequires: fipscheck +BuildRequires: fontconfig +BuildRequires: fonts-config +BuildRequires: gptfdisk +BuildRequires: grub2 +BuildRequires: grub2-x86_64-efi +BuildRequires: haveged +BuildRequires: hdparm +BuildRequires: hwinfo +BuildRequires: ipmitool +BuildRequires: iproute2 +BuildRequires: iputils +BuildRequires: kernel-default +BuildRequires: kernel-firmware +BuildRequires: lvm2 +BuildRequires: net-tools +BuildRequires: ntp +BuildRequires: open-iscsi +BuildRequires: openssh +BuildRequires: openstack-ironic-python-agent +BuildRequires: pam-config +BuildRequires: parted +BuildRequires: patterns-base-minimal_base +BuildRequires: pinentry +BuildRequires: pkgconfig +BuildRequires: Mesa-gallium +BuildRequires: plymouth +BuildRequires: plymouth-scripts +BuildRequires: python311-proliantutils +BuildRequires: psmisc +BuildRequires: qemu-tools +BuildRequires: sg3_utils +BuildRequires: sles-release +BuildRequires: sudo +BuildRequires: suse-build-key +BuildRequires: systemd-presets-branding-SLE +BuildRequires: timezone +BuildRequires: udev +BuildRequires: vim +BuildRequires: wpa_supplicant +BuildRequires: dhcp-client +BuildRequires: which +BuildRequires: NetworkManager +BuildRequires: nm-configurator-030 +BuildRequires: logrotate +BuildRequires: plymouth-dracut +BuildRequires: plymouth-theme-bgrt +BuildRequires: dracut-kiwi-oem-dump +BuildRequires: dracut-kiwi-oem-repart +BuildRequires: gfxboot-branding-SLE +BuildRequires: grub2-branding-SLE +BuildRequires: open-iscsi +BuildRequires: plymouth-branding-SLE +BuildRequires: lshw +BuildRequires: kbd +%ifarch aarch64 +BuildRequires: dmidecode +BuildRequires: efibootmgr +%endif +%ifarch x86_64 +BuildRequires: dmidecode +BuildRequires: efibootmgr +BuildRequires: syslinux +%endif + +%description +Kernel and ramdisk image for use with Metal3 + +%package %{_arch} +Summary: Kernel and ramdisk image for Metal3 +Group: System/Management +Provides: openstack-ironic-python-agent = %{version} +Obsoletes: openstack-ironic-python-agent < %{version} + +%description %{_arch} +Kernel and ramdisk image for use with Metal3 +For %{_arch} + +%prep +mkdir -p /tmp/openstack-ironic-image/build /tmp/openstack-ironic-image/root /tmp/openstack-ironic-image/img + +cp -a %{SOURCE0} /tmp/openstack-ironic-image/config.sh + +cp -a %{SOURCE10} /tmp/openstack-ironic-image/config.kiwi + +tar -xC /tmp/openstack-ironic-image/root -f %{SOURCE20} + +%build +if ! which kiwi; then + cat <<EOF >&2 +kiwi not found in \$PATH; most likely this build was missing +the --userootforbuild option. If you are invoking osc build +manually, please use 'make buildlocal' instead. +EOF + exit 1 +fi + +kiwi-ng --debug --profile default system build --description /tmp/openstack-ironic-image --target-dir /tmp/openstack-ironic-image/img + +%install +TDIR=`mktemp -d /tmp/openstack-ironic-image.XXXXX` +cd /tmp/openstack-ironic-image/img/build/image-root +find . | cpio --create --format=newc --quiet > $TDIR/initrdtmp +cd $TDIR +gzip -9 -f initrdtmp +INITRDGZ=`ls *.gz | head -1` +gzip -cd $INITRDGZ | xz --check=crc32 -c9 > initrd.xz +INITRD=`ls *.xz | head -1` + +ls /tmp/openstack-ironic-image/img/openstack-ironic-image* +KERNEL=`ls /tmp/openstack-ironic-image/img/openstack-ironic-image*default*kernel | head -1` + +mkdir -p %{buildroot}/srv/tftpboot/openstack-ironic-image +install -p -m 644 $KERNEL $INITRD %{buildroot}/srv/tftpboot/openstack-ironic-image/ + +%files %{_arch} +%defattr(644,root,root) +%dir %attr(755, root, root) /srv/tftpboot/openstack-ironic-image +%attr(644, root, root) /srv/tftpboot/openstack-ironic-image/* + +%changelog diff --git a/ironic-ipa-ramdisk/root.tar.bz2 b/ironic-ipa-ramdisk/root.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000000000000000000000000000..b7be89a56cef5e1a5db424f5919a5260afcfcdd1f963159fa6d1fc6067566dcd GIT binary patch literal 3866 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 literal 0 HcmV?d00001