diff --git a/CHANGELOG.md b/CHANGELOG.md index e27beda5..ffc8755d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## v4.6.0, unreleased +## v4.6.0, 2025-03-02 + +### Added + +- Support Ubuntu-style dracut initrd images. + +### Fixed + +- Fix nightly builds. +- Better handling for missing NetDev.Device. #1777 +- Remove dracut NetworkManager connections between boot phases. #1780 + +### Changed + +- Match default kernel arguments from `wwctl upgrade nodes` with the distributed `nodes.conf`. +- Use `wwctl overlay --workers=0` to indicate `runtime.NumCPU()`. #1782 ### Dependencies @@ -16,23 +31,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Bump golang.org/x/net from 0.30.0 to 0.33.0 #1774 - Bump github.com/go-jose/go-jose/v4 from 4.0.2 to 4.0.5 #1773 - Bump github.com/golang/glog from 1.2.3 to 1.2.4 #1771 -### Added - -- Support Ubuntu-style dracut initrd images. - -### Changed - -- Match default kernel arguments from `wwctl upgrade nodes` with the distributed `nodes.conf`. - -### Fixed - -- Fix nightly builds. -- Better handling for missing NetDev.Device. #1777 -- Remove dracut NetworkManager connections between boot phases. #1780 - -### Changed - -- User `wwctl overlay --workers=0` to indicate `runtime.NumCPU()`. #1782 ## v4.6.0rc3, 2025-02-23 @@ -167,8 +165,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Add `wwctl clean` to remove OCI cache and overlays from deleted nodes - Add `wwctl container import --platform`. #1381 - Read environment variables from `/etc/default/warewulfd` #725 -- Add support for VLANs to NetworkManager, wicked, ifcfg, debian.network_interfaces overlays. #1257 -- Add support for static routes to NetworkManager, wicked, ifcfg, debian.network_interfaces overlays. #1257 +- Add support for VLANs to NetworkManager, wicked, ifcfg, debian.interfaces overlays. #1257 +- Add support for static routes to NetworkManager, wicked, ifcfg, debian.interfaces overlays. #1257 - Add `wwctl upgrade `. #230, #517 - Better handling of InfiniBand udev net naming. #1227 - use templating mechanism for power commands. #1004 @@ -213,7 +211,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Remove NodeInfo (in-memory-only) data structure, consolidating onto NodeConf. #916 - Replace `defaults.conf` with settings on the default profile. #917 - Switched from yaml.v2 to yaml.v3 #1462 -- Make OCIBlobCache a seperate path and point it to `/var/cache` #1459 +- Make OCIBlobCache a separate path and point it to `/var/cache` #1459 - Updated various shell scripts for POSIX compatibility. #1464 - Update `wwctl server` to always run in the foreground #508 - Update `wwctl server` to log to stdout rather than a file #503 @@ -262,11 +260,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Update links on contributing page to point to warewulf repo. -- Prevent Networkmanager from trying to optain IP address via DHCP +- Prevent NetworkManager from trying to obtain IP address via DHCP on unused/unmanaged network interfaces. - Systems with no SMBIOS (Raspberry Pi) will create a UUID from `/sys/firmware/devicetree/base/serial-number` -- Replace slice in templates with sprig substr. #1093 +- Replace slice in templates with sprig substr. #1139 - Fix an invalid format issue for the GitHub nightly build action. #1258 - Return non-zero exit code on overlay build failure #1393 - Return non-zero exit code on container copy failure #1377 diff --git a/userdocs/getting-started/debian-quickstart.rst b/userdocs/getting-started/debian-quickstart.rst index 5ca46bf8..2ca09842 100644 --- a/userdocs/getting-started/debian-quickstart.rst +++ b/userdocs/getting-started/debian-quickstart.rst @@ -31,7 +31,7 @@ Install Warewulf and dependencies cd ~/git git clone https://github.com/warewulf/warewulf.git cd warewulf - git checkout main # or switch to a tag like 'v4.6.0rc3' + git checkout main # or switch to a tag like 'v4.6.0' make all && sudo make install Configure firewalld diff --git a/userdocs/getting-started/el-quickstart.rst b/userdocs/getting-started/el-quickstart.rst index be07680a..efb2eb2d 100644 --- a/userdocs/getting-started/el-quickstart.rst +++ b/userdocs/getting-started/el-quickstart.rst @@ -10,11 +10,11 @@ Install Warewulf The preferred way to install Warewulf on Enterprise Linux is using the the RPMs published in `GitHub releases`_. For example, to install the -v4.6.0rc3 release on Enterprise Linux 9: +v4.6.0 release on Enterprise Linux 9: .. code-block:: bash - dnf install https://github.com/warewulf/warewulf/releases/download/v4.6.0rc3/warewulf-4.6.0rc3-1.el9.x86_64.rpm + dnf install https://github.com/warewulf/warewulf/releases/download/v4.6.0/warewulf-4.6.0-1.el9.x86_64.rpm Packages are available for el8 and el9. diff --git a/userdocs/index.rst b/userdocs/index.rst index 05c09663..9e15ad27 100644 --- a/userdocs/index.rst +++ b/userdocs/index.rst @@ -5,7 +5,7 @@ User Guide Welcome to the Warewulf User Guide! .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Getting Started Introduction @@ -17,7 +17,7 @@ Welcome to the Warewulf User Guide! Glossary .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Server Server Installation @@ -29,7 +29,7 @@ Welcome to the Warewulf User Guide! Upgrading Warewulf .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Nodes and Profiles Cluster Nodes @@ -39,7 +39,7 @@ Welcome to the Warewulf User Guide! Disks .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Images Node Images @@ -48,21 +48,21 @@ Welcome to the Warewulf User Guide! SELinux .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Overlays Overlays Templating .. toctree:: - :maxdepth: 2 - :caption: troubleshooting + :maxdepth: 1 + :caption: Troubleshooting Troubleshooting Known issues .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Contributing Contributing @@ -83,3 +83,9 @@ Welcome to the Warewulf User Guide! :glob: reference/man5/* + +.. toctree:: + :maxdepth: 1 + :caption: Release Notes + + v4.6.0 diff --git a/userdocs/nodes/network.rst b/userdocs/nodes/network.rst index dc9ef7c6..e62a3898 100644 --- a/userdocs/nodes/network.rst +++ b/userdocs/nodes/network.rst @@ -34,6 +34,8 @@ specifying ``--netname``. an interface may fail to be named correct if its desired name conflicts with the kernel-assigned name of another interface during the boot process. +.. _bonding: + Bonding ======= @@ -60,6 +62,8 @@ The ``ifcfg`` and ``NetworkManager`` overlays can configure a network bond like tags: master: bond0 +.. _vlan: + VLAN ==== @@ -84,6 +88,8 @@ Other network systems need additional network tags: --nettagadd "vlan_id=42,parent_device=eth0" \ n001 +.. _static_routes: + Static Routes ============= diff --git a/userdocs/overlays/overlays.rst b/userdocs/overlays/overlays.rst index 812dd687..eee44bbc 100644 --- a/userdocs/overlays/overlays.rst +++ b/userdocs/overlays/overlays.rst @@ -220,6 +220,8 @@ configured network interfaces, typically based on a known MAC address. - systemd.netname - udev.netname +.. _dns: + Several of the network configuration overlays support netdev tags to further customize the interface: @@ -308,6 +310,19 @@ the use of most available template metadata. wwctl overlay show --render= debug tstruct.md.ww +.. _localtime: + +localtime +--------- + +The **localtime** overlay configures the timezone of a cluster node to match +that of the Warewulf server; alternatively, a different timezone may be +specified with a ``localtime`` tag. + +.. code-block:: shell + + wwctl profile set default --tagadd="localtime=UTC" + host ---- diff --git a/userdocs/overlays/templates.rst b/userdocs/overlays/templates.rst index 56f15b39..5818574e 100644 --- a/userdocs/overlays/templates.rst +++ b/userdocs/overlays/templates.rst @@ -83,6 +83,8 @@ abort string is found. {{ IncludeBlock "/etc/hosts" "# Do not edit after this line" }} +.. _importLink: + ImportLink ---------- @@ -120,6 +122,8 @@ more than once in a template to write content to multiple files. {{/* content here */}} {{- end }} +.. _softlink: + softlink -------- @@ -129,6 +133,8 @@ Causes the processed template file to become a symlink to the referenced target. {{ printf "%s/%s" "/usr/share/zoneinfo" .Tags.localtime | softlink }} +.. _readlink: + readlink -------- @@ -163,6 +169,8 @@ nobackup {{ nobackup }} +.. _UniqueField: + UniqueField ----------- diff --git a/userdocs/release/v4.6.0.rst b/userdocs/release/v4.6.0.rst new file mode 100644 index 00000000..db873073 --- /dev/null +++ b/userdocs/release/v4.6.0.rst @@ -0,0 +1,453 @@ +==================== +v4.6.0 Release Notes +==================== + +v4.6.0 is a significant upgrade, with many changes relative to the v4.5.x +series. + +Particularly significant changes, especially those affecting the user interface, +are described below. Additional changes not impacting the user interface are +listed in the `CHANGELOG`_. + +.. _CHANGELOG: https://github.com/warewulf/warewulf/blob/main/CHANGELOG.md + +Documentation +============= + +The `user documentation`_ has been significantly refactored and re-written. The +majority of changes mentioned here should be documented in more detail there, as +well, and the reorganization and deduplication supports better documentation +maintenance in the future. + +The documentation also now includes complete and automatically-generated +references for all ``wwctl`` commands, sub-comands, and options. + +.. _user documentation: https://warewulf.org/docs/ + +Upgrade +======= + +Warewulf v4.6.0 adds the ``wwctl upgrade`` command to assist with upgrading from +previous versions of Warewulf v4. This command updates existing configuration +files for use with the current version. + +There are two subcommands: + +- ``wwctl upgrade config`` updates ``warewulf.conf``. +- ``wwctl upgrade nodes`` updates ``nodes.conf``. + +Both of these will attempt to update their respective configuration file +in-place, retaining a copy of the previous version with a ``.bak`` suffix. +Alternatively, you can see what each command will do by specifying an +``--output-file=-`` option, to direct the output of the command to "standard +out." + +``wwctl upgrade nodes`` additionally requires two options to be specified: + +- ``--add-defaults`` adds default settings to the default profile when those + settings are absent. If you *do not* wish to add defaults, specify + ``--add-defaults=false``. + + For more information, see the section on the default profile, below. + +- ``--replace-overlays`` replaces any reference to the "generic" or "wwinit" + overlays with a new set of overlays that replace their behavior. Because an + overlay named "wwinit" is present in both the legacy and the upgraded state, + ``--replace-overlays`` is **not** idempotent, and should only be used once. If + you *do not* wish to replace overlays, specify ``--replace-overlays=false``. + + For more information, see the section on overlays, below. + +The default profile +=================== + +At various points Warewulf v4 has had a number of built-in default settings. +These settings were once "compiled in," and more recently were moved to a +dedicated ``defaults.conf`` file. In v4.6.0 these defaults have been moved to +the default profile, and are included in ``nodes.conf`` for new installations. + +A legacy configuration from a previous Warewulf installation can be updated to +include recommended defaults using ``wwctl upgrade nodes --add-defaults``. (For +more information, refer to the section on upgrades, above.) + +If the default overlay exists, it will be automatically (and explicitly) +included by new nodes created with ``wwctl node add``. It is otherwise not +"special," and may be removed if a different organization is preferred. + +A few ``wwctl`` commands have previously had ``--setdefault`` options to +automatically update the default profile: these options have been removed in +v4.6.0. + +Images +====== + +One of the more visible changes to Warewulf in v4.6.0: "containers" have been +renamed to "images" (more specifically, "node images") throughout the interface, +documentation, and even code. This decision (requested by the user community) is +meant to alleviate confusion regarding whether Warewulf "containers" are "real" +containers running on a container runtime with potential performance and +operational consequences. + +Warewulf "containers" have never been "virtualized" or executed with a container +runtime. Rather, the name "container" was selected to imply the integration in +v4 with the container ecosystem of tooling for defining, building, storing, and +testing node images. But this terminology ended up causing persistent confusion, +so a more industry-standard "node image" terminology has been adopted in stead. + +The ``wwctl container`` command is retained as an alias for the new ``wwctl +image`` command. The variables ``.Container`` and ``.ContainerName`` are also +retained as overlay template variables. These backwards-compatibility retentions +will continue to work through the v4.6.x series. + +There are smaller changes to the image system, as well: + +- ``wwctl image shell`` now supports a ``WW_HISTFILE`` environment variable to + save shell history _inside_ the image. +- ``wwctl image shell`` now supports a ``WW_PS1`` environment variable to + specify the prompt for the interactive shell. The default prompt has also been + updated to indicate the current directory. +- ``wwctl image import`` now supports ``--username`` and ``--password`` + parameters for authenticating to a secure OCI registry. +- ``wwctl image import`` now supports a ``--nohttps`` parameter to use HTTP, + rather than HTTPS, when importing an image from an OCI registry. +- ``wwctl image import`` now supports a ``--platform`` parameter to specify a + different target architecture (e.g.., for importing an aarch64 image into an + x86_64 Warewulf server). This simplifies importing images in a + multi-architecture environment. +- ``wwctl image `` all now support a ``--build`` flag to + control whether the image should be automatically rebuilt after the operation. + (For ``exec`` and ``shell`` the default value is "true", and may be disabled + with ``--build=false``. For ``copy`` the default value is "false", and may be + enabled with ``--build`` or ``--build=true``.) +- Warewulf v4.5 used the permissions on an image's ``rootfs/`` directory to + determine a "read-only" state of the image. This behavior is now replaced with + a sentinel ``readonly`` file stored alongside ``rootfs/`` in the image + "chroot" directory. (For more information, see the "known issues" section in + the Warewulf documentation.) + +Kernels +======= + +Warewulf v4.6.0 removes the ``wwctl kernel`` command, and all its subcommands, +along with the ``wwctl --kerneloverride`` parameter. +All kernels are now provisioned from an associated node image. If more than one +kernel is present in the image, Warewulf uses the highest-version, non-debug +kernel; but an explicit kernel version or kernel path can be specified with +``wwctl --kernelversion``. + +``wwctl image kernels`` provides a new interface to show what kernels are +available in each image, along with information regarding the detected version, +whether the kernel is the "default" for the image, and how many nodes are +configured to use it. (If no version is specified, the detected kernel version +is provided to overlay templates as ``.Kernel.Version``). + +Kernel arguments are also now represented as a list, rather than as a flat +string. This allows kernel arguments to be combined from various levels (e.g., +profiles and the node) without having to re-specify the full argument list. +However, this also means that kernel arguments must be explicitly *negated* to +remove them from prior specification. (For example, you might need to specify +both ``~crashkernel=no`` and ``crashkernel=512MB``.) List arguments to ``wwctl + `` may be comma-separated; so arguments that *contain* a +comma must now be quoted on the command-line. (e.g., ``wwctl profile set default +--cluster oso --kernelargs 'console=tty0,"console=ttyS0,115200"'``) + +Overlays +======== + +``wwctl overlay build`` has been enhanced to build overlays in parallel, and has +also been made significantly more efficient. As a result, building overlay +images for large clusters now takes significantly less time. By default, the +number of parallel workers is equal to the number of CPUs on the Warewulf +server; this can be adjusted with a new ``wwctl overlay +--workers=0`` parameter. + +The "wwinit" and "generic" overlays have been split into multiple overlays based +on discrete functionality. Their equivalents may be substituted using ``wwctl +upgrade nodes --replace-overlays``. (See the section on upgrading above.) This +supports more precise removal of default overlay functionality from a given node +or profile by removing only a subset of the default overlays. (For example, you +may wish to include only one of the network management overlays, +``NetworkManager``, ``ifcfg``, ``wicked``, or ``debian.interfaces``.) + +Overlays have been further separated into "distribution" and "site" overlays. +All overlays provided with Warewulf are "distribution" overlays, and should not +be modified. New overlays, and modifications to distribution overlays, are +stored as "site" overlays. Site overlays are retained between Warewulf upgrades, +and take precedence over a distribution overlay of the same name. + +``wwctl overlay build --host`` and ``--nodes`` have been removed to clarify that +the host overlay is not "built." To support development and debugging of the +host overlay, ``wwctl overlay show --render=host`` now renders overlay templates +as they would be applied to the Warewulf server. #623 + +There are smaller changes to the overlay system, as well: + +- ``wwctl [--system-overlays|--runtime-overlays]`` + replaces ``--wwinit`` and ``--runtime``, respectively. (The original flags are + retained, but deprecated.) +- ``wwctl overlay show --render`` can now accept the path to a template without + its ``.ww`` suffix. + +Templates +========= + +Overlay templates now have access to the full suite of `Sprig template +functions. `_ Use of the local ``tr`` and +``slice`` template functions in the distribution overlays has been replaced with +their Sprig equivalents (``replace`` and ``substr``, respectively). + +An additional template function, :ref:`UniqueField`, was added to facilitate +removing duplicate ``passwd`` and ``group`` entries in the ``syncuser`` overlay. +(For more information, see the section on syncuser, below.) + +A set of new template functions, :ref:`importLink`, :ref:`softlink`, and +:ref:`readlink`, add support for creating symbolic links from overlay templates. + +The new :ref:`localtime` overlay configures the timezone of a cluster node. + +Network Overlays +================ + +The network overlays now support :ref:`VLAN tagging `, and :ref:`static +routes `, and have improved support for configuring a +:ref:`network bond. ` They also now support specifying a :ref:`DNS +search path. ` + +.. note:: + + Not all functionality is supported by all network overlays. + +There are smaller changes to the network overlays, as well: + +- The NetworkManager overlay now prevents interfaces without a specified + ``Ipaddr`` from activating DHCP. +- The NetworkManager overlay now only marks interfaces "unmanaged" if they have + neither a ``Device`` name nor an ``Hwaddr`` specified. + +Profiles +======== + +Node profiles now support profiles themselves, allowing for complex nested +hierarchies of nested profiles. + +.. code-block:: yaml + + nodeprofiles: + default: + profiles: + - rocky + - net + rocky: + image name: rockylinux-9 + net: + network devices: + default: + netmask: 255.255.255.0 + gateway: 192.168.1.1 + nodes: + n1: + profiles: + - default + network devices: + default: + ipaddr: 192.168.1.101 + +Resources and NFS +================= + +Resources are similar to tags except that their value is an arbitrary data +structure rather than just a string. This data is represented as YAML data in +``nodes.conf``, and these data structures may then be referenced by overlay +templates to implement more expressive cluster behavior. + +Resources can currently only be defined with ``wwctl edit``, or +by editing ``nodes.conf`` directly. + +.. note:: + + Resources are defined only at the root of nodes (and profiles), not on + network interfaces and IPMI interfaces. + +The premiere use of resources is in the refactoring of NFS client configuration. + +NFS +=== + +Cluster node NFS mounts are no longer configured in ``warewulf.conf``. In stead, +a new ``fstab`` overlay configures NFS (or any other) mounts on cluster nodes +based on an ``fstab`` resource definition. + +.. code-block:: yaml + + nodeprofiles: + default: + resources: + fstab: + - spec: warewulf:/home + file: /home + vfstype: nfs + mntops: defaults,nofail + - spec: warewulf:/opt + file: /opt + vfstype: nfs + mntops: defaults,noauto,nofail,ro + +Syncuser +======== + +"Syncuser" has always been optional, but the output of certain commands has been +updated to no longer imply that not running syncuser is an error condition. The +``wwctl image build --syncuser`` now explicitly opts-in to automatic syncuser +during image build, and the ``wwctl image syncuser --write`` parameter is now +automatically enabled. (Specify ``--write=false`` to disable.) + +Some syncuser functionality is now implemented in a new ``syncuser`` overlay. +While this overlay *is* supplied by ``wwctl upgrade nodes --replace-overlays``, +it is not included by default in the initial ``nodes.conf`` in new deployments. + +There are smaller changes to the syncuser, as well: + +- The ``syncuser`` overlay now looks for the ``passwd`` and ``group`` databases + in ``sysconfdir``, rather than explicitly in ``/etc/``. This change is + primarily to support testing; but it does mean that if ``sysconfdir`` is a + path other than ``/etc/`` then these databases must be provided explicitly + (e.g., by copying them or symlinking them into ``sysconfdir``). +- The ``syncuser`` overlay now skips duplicate users and groups when generating + synchronized ``passwd`` and ``group`` databases. + +Network Boot and wwinit +======================= + +The network boot and wwinit process have been made more consistent and verbose +for both iPXE and GRUB methods. Additional output and logging provides more +information about each step of the process as it happens to aid in +troubleshooting. And available network boot options are now presented using an +iPXE menu, allowing a specific method to be selected without using a custom iPXE +script. + +Utilizing the new iPXE menu, specifying an ``IPXEMenuEntry`` tag on a cluster +node now selects the boot method to use, similar to the previously-existing +``GRUBMenuEntry``. The ``dracut.ipxe`` script has now been merged into the +default iPXE script, and specifying ``IPXEMenuEntry=dracut`` now replaces +specifying a discrete ``dracut`` iPXE template. + +An issue that prevented nodes from booting in some circumstances with the +Warewulf server configured in "secure" mode have also been resolved: now, if the +runtime overlay cannot be downloaded during boot, boot proceeds regardless, and +``wwclient`` applies the runtime overlay after boot when it is able to control +its source port. + +IPMI +==== + +The IPMI system has been refactored to use templates to define the required IPMI +template from the cluster node configuration. This is expected to support +additional BMC implementation in the future. + +CLI +=== + +There have been many enhancements to the ``wwctl`` command: + +``wwctl`` has been updated to use a different table-formatting library that +produces more natural output without extraneous whitespace padding. + +``wwctl`` has been updated to add hostlist support to ``wwctl node`` and ``wwctl +overlay build``. Hostlists have also been enhanced to support comma-separated +hostlist patterns. (e.g., ``n[1-2],n5,n[8-9]``) Other pattern formats (regular +expressions and globs) are no longer supported. + +``wwctl`` has been updated to add "tab completions" for additional parameters. + +``wwctl list [--yaml|--json]`` generates machine-readable output +in YAML and JSON format, and ``wwctl node export`` has been updated to match, +including indicating node IDs. + +``wwctl`` now return a non-zero exit code on error. + +There are smaller changes to the syncuser, as well: + +- ``wwctl list --fullall`` has been removed. +- ``wwctl clean`` removes the OCI cache and vestigial overlay images from + deleted nodes. +- ``wwctl container exec`` no longer requires a double hyphen (``-- --``) before + flags. + +Debian/Ubuntu +============= + +Warewulf v4.6.0 does not yet fully support Debian or Ubuntu; but there have been +multiple improvements towards future support: + +- ``warewulfd`` can now detect Ubuntu-style Dracut initrd images. +- A new ``netplan`` overlay adds support for modern Debian/Ubuntu network + configuration. +- Multiple internal shell scripts have been updated for POSIX compatibility to + support internal use of shells other than Bash. + +Server +====== + +The Warewulf server daemon (``warewulfd``) has been refactored to more closely +behave like a `12-factor app `_. As such, the ability to +daemonize has been removed (as have the daemon management commands, ``wwctl +server ``). The server now always runs in the +foreground and logs to stdout rather than to ``/var/log/warewulfd.log`` or +syslog. + +The ``warewulfd.service`` systemd unit has been updated to read environment +variables from ``/etc/default/warewulfd``, and now references an ``OPTIONS`` +environment variable to supply additional arguments to the ``wwctl server`` +command. (e.g., ``OPTIONS=--debug``) + +``wwctl`` auto-detects some network settings if they are not specified in +``warewulf.conf``. These settings are now written back to ``warewulf.conf`` +after auto-detection. The ``ipaddr`` field of ``warewulf.conf`` can now also +handle a CIDR-formatted address, which internally populates the ``netmask`` and +``network`` fields. These network fields are also provided to overlay templates +in CIDR format as ``IpCIDR`` and ``NetworkCIDR`` fields. + +A new ``warewulfd`` API endpoint at +``/overlay-file/{overlay}/{path...}?render={id}`` supports fetching (and +rendering) arbitrary overlay files. + +There are smaller changes to the server, as well: + +- ``wwctl configure ssh`` now generates ed25519 keys by default. + +DHCP Server +=========== + +The Warewulf server's external DHCP service now more flexibly accounts for the +presence or absence of an address range. ``wwctl configure dhcp`` now generates +a DHCP configuration without a defined range, generating as much of the subnet +and range definition as possible, for either a "default" configuration or a +"static" configuration. + +For Warewulf Developers +======================= + +Finally, there are a number of changes that really only matter to Warewulf +developers: + +The minimum Go version is now ``1.22.9``, as required by updated dependencies. + +Warewulf v4.6.0 includes a significant refactor of the internal datastructures +that represent cluster nodes. The NodeInfo structure (in-memory-only) has been +merged with NodeConf, the YAML-backed data structure. In its place, a new Field +system supports tracks the source of node fields while values are merged from +profiles for use explicitly during ``wwctl node list --all``. + +The primary Warewulf ``Makefile`` has been enhanced with target help: just run +``make`` to see a list and descriptions of notable targets. + +The official Warewulf RPM spec file has been updated to recommend the +installation of ``ipmitool``. It also simplifies the permissions of installed +files, and omits the gRPC API by default. + +The GitHub CI process now runs "staticcheck," and problems highlighted by it +have been resolved. Recent problems in the nightly build workflow have also been +resolved. + +A Visual Studio Code "development container" definition is now included in the +repository.