The global Kea classes give the upstream loader to an x86 client that
cannot fetch its script, and the Etherboot class gives it the BIOS
loader. The network classes and the ISC x86 lines give the Genesis
script under xcat/ipxe/nets to a client with the iPXE features of its
path, and the Kea subnet lists those classes. Without an upstream loader
file on the server, neither backend names it or the second stage that it
would fetch, and the ISC lines stop such a client before the fallback.
The xNBA files name no global class.
An xnba node gets xNBA from its own first-stage classes when the server
has the xNBA BIOS file, and still xcat/xnba.efi without the local UEFI
file. Without the xNBA BIOS file it has no first-stage classes, as it
has no ISC host statements. An ipxe node without a SAN disk carries the
upstream loader in its own first-stage classes.
The ISC configuration test also checks these lines in configurations
that makedhcp upgraded, one of them with indented declarations.
The DHCP wire cases now expect the upstream loader for an x86 client
with no reservation, and its network script for a second stage that
reports the features in option 175. A second stage without them gets the
loader again, and an xnba node still gets xNBA.
A Windows UEFI install deferred to proxyDHCP must be offered option 60
PXEClient and no boot file, or the firmware boots the offered loader
instead of asking proxydhcp-xcat on port 4011.
proxydhcp.conf sends a UEFI DISCOVER with option 60 PXEClient and
asserts the offer carries PXEClient and no boot file. dhcpfixture.sh
run-proxydhcp starts proxydhcp-xcat when it is not running, defines a
win2022 node in chain.currstate install, and stops the daemon at
teardown. blackbox_dhcp_boot_file_conditions runs it.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
xcatd calls a discovering node back twice, processing and then
processed. The callback listener returned at the first one and closed,
so a late processed was missed, and the next scenario's listener on the
same port received it: findme-callbacks saw 1 callback and
findme-unprivileged-port saw 2.
The listener now collects for the whole callback_wait window.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
The provision-chain fixture defined grub2 nodes for x86_64 only. A mixed
cluster boots ppc64le and riscv64 nodes from the same management node,
and grub2.pm writes their configs against a loader named by the node's
architecture, so a regression there passed CI.
The fixture now defines a grub2 node for ppc64le (grub2.ppc) and one for
riscv64 (grub2.riscv64), set with plain grub2 over TFTP, and runs the
grub2 scenarios against each: loader, per-node config by IP and by MAC,
kernel and initrd, and the boot file DHCP names. A missing loader fails
setup. Both loaders ship in grub2-xcat.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
Several assertions held when nothing answered. Renew and rebind compared
the ACK with itself, because the step rebinds $lease before its
assertions run. tftp-escape, outside-the-aliases, monitor-is-not-tls,
postscript-unknown-client and the two credential refusals passed on a
closed port or a timeout.
Renew and rebind now compare with the earlier request, and validate
rejects an assertion on an alias its own step rebinds. Each negative
check now also requires the server to have answered: a TFTP error code,
an HTTP status, a TLS handshake, or a plain-text reply on 3002, read
from the new xcatreq field transport_error.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
bootfile returned option 67 when the reply carried one and the file
header otherwise. xCAT names the loader in the header, and the firmware
it serves does not read option 67 (dhcp-wire.md). A backend that moved
the loader to option 67 and left the header empty passed every loader
assertion.
bootfile now reads the header only, and each "no boot file" check also
asserts that option 67 is absent.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
Every DHCP step listened for its whole timeout, even after the reply it
waited for had arrived. The 15 DISCOVERs of pxe-arch-matrix.conf took
30 seconds on a management node that answers in milliseconds.
A step now stops at the first reply of the type it expects. A step that
asserts on offers, or expects none, still listens for the whole timeout,
because it must hear every server or prove that none answered.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
A DHCP step recorded a test point only for each assertion. A step with
expect = none and no assertion, such as S-07's discover on a *NOIP*
port, recorded nothing and passed when the server answered.
The DHCP client now reports its expectation the way a service step
does: expect none is met by silence, any other value by a reply of that
type. The runner records it as a test point of its own.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
noip-interface-is-denied (S-07) is one discover step with
expect = none and no assertion. The DHCP client records test points
only for assertions, so the scenario emits none and passes whether or
not the server answers the *NOIP* port.
These tests run that step against a fake wire, silent and answering,
and require a scenario to state an assertion or an expectation. They
fail until a DHCP step reports its expectation.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
dhcptest and provtest carried two copies of the config loader, the
assertion language, the $step.field substitution, the TAP reporter, the
error types and the CLI. The copies had already drifted: list equality,
multi-line regex and CIDR membership behaved differently in each.
blackboxtest keeps one of each. A step type table in steps.py declares
the keys, required keys and reply fields of every type, and the runner
dispatches to the DHCP client or to the dig, tftp, curl and xcatd
clients. One scenario can now use a DHCP reply in a TFTP step.
The shipped scenarios move unchanged to conf/dhcp/ and conf/prov/. Their
scenario, step and assertion lists are identical to the old ones. The
wire cases and fixtures move to autotest/testcase/blackboxtest/, and CI
runs one offline phase instead of two.
Removed because no scenario or fixture used them: the pretty and json
reports, --pcap, --mac, the discover subcommand, the decline, inform
and sleep steps, assert_all, select, and the keys dhcptest accepted and
ignored.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>