Skip to content

Commit 68e7167

Browse files
authored
Merge pull request #1184 from kernelkit/releng
Release prep for v25.08.1
2 parents 4ccc70a + 25a26fe commit 68e7167

File tree

14 files changed

+286
-149
lines changed

14 files changed

+286
-149
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ env:
3939
jobs:
4040
test:
4141
name: Regression Test ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
42-
runs-on: [ self-hosted, regression ]
42+
runs-on: [self-hosted, regression]
4343
steps:
4444
- name: Checkout infix repo
4545
uses: actions/checkout@v4
@@ -87,7 +87,7 @@ jobs:
8787
fi
8888
make test
8989
90-
- name: Publish Test Result for ${{ env.TARGET }}
90+
- name: Publish Test Result for ${{ env.TARGET }}
9191
# Ensure this runs even if Regression Test fails
9292
if: always()
9393
run: cat $TEST_PATH/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY
@@ -96,15 +96,10 @@ jobs:
9696
# Ensure this runs even if Regression Test fails
9797
if: always()
9898
run: |
99-
asciidoctor-pdf \
100-
--theme $TEST_PATH/9pm/report/theme.yml \
101-
-a pdf-fontsdir=$TEST_PATH/9pm/report/fonts \
102-
$TEST_PATH/.log/last/report.adoc \
103-
-o $TEST_PATH/.log/last/report.pdf
99+
make test-dir="$(pwd)/$TEST_PATH" test-report
104100
105101
- name: Upload Test Report as Artifact
106102
uses: actions/upload-artifact@v4
107103
with:
108104
name: test-report
109-
path: ${{ env.TEST_PATH }}/.log/last/report.pdf
110-
105+
path: output/images/test-report.pdf

.github/workflows/trigger.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ jobs:
3737
name: "infix"
3838

3939
test-publish-x86_64:
40-
if: startsWith(github.repository, 'kernelkit/')
40+
if: ${{ github.repository_owner == 'kernelkit' && github.ref_name == 'main' }}
4141
needs: test-run-x86_64
4242
uses: ./.github/workflows/publish.yml

board/common/mkdisk.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ genboot()
8383
{
8484
if [ -d "$bootdata" ]; then
8585
bootimg=$(cat <<EOF
86-
image efi-part.vfat {
86+
image $BINARIES_DIR/efi-part.vfat {
8787
size = $bootsize
8888
vfat {
8989
file EFI {
@@ -98,7 +98,7 @@ EOF
9898
offset = $bootoffs
9999
partition-type-uuid = U
100100
bootable = true
101-
image = efi-part.vfat
101+
image = $BINARIES_DIR/efi-part.vfat
102102
}
103103
EOF
104104
)

doc/ChangeLog.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Change Log
33

44
All notable changes to the project are documented in this file.
55

6-
[v25.08.1][] - 2025-09-30
6+
[v25.08.1][] - 2025-10-03
77
-------------------------
88

99
### Changes
@@ -12,8 +12,8 @@ All notable changes to the project are documented in this file.
1212
### Fixes
1313
- Fix #1150: `show-legacy` wrapper permissions
1414
- Fix #1155: `show ospf` commands regression
15-
- Fix #1169: Expected neighbors not shown in sysrepocfg
16-
- Various test stability improvments
15+
- Fix #1169: Expected OSPF neighbors not shown in `sysrepocfg` when the
16+
system has at least one non-OSPF interface
1717

1818
[v25.08.0][] - 2025-09-01
1919
-------------------------

test/case/ietf_routing/ospf_basic/ospf_basic.adoc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
=== OSPF Basic
22
==== Description
3-
Very basic OSPF test just test that OSPF sends HELLO packets between the DUTs
4-
and that they exchange routes, ending with a simple connectivity check.
3+
Verifies basic OSPF functionality by configuring two routers (R1 and R2)
4+
with OSPF on their interconnecting link. The test ensures OSPF
5+
neighbors are established, routes are exchanged between the routers, and
6+
end-to-end connectivity is achieved.
7+
8+
An end-device (HOST) is connected to R2 on an interface without OSPF enabled.
9+
This verifies that OSPF status information remains accessible when a router
10+
has non-OSPF interfaces.
511

612
==== Topology
713
ifdef::topdoc[]
@@ -19,6 +25,7 @@ endif::topdoc[]
1925
. Set up topology and attach to target DUTs
2026
. Configure targets
2127
. Wait for OSPF routes
28+
. Verify R2 OSPF neighbors with non-OSPF interface
2229
. Test connectivity from PC:data to 192.168.200.1
2330

2431

test/case/ietf_routing/ospf_basic/test.py

Lines changed: 105 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
#!/usr/bin/env python3
2-
"""
3-
OSPF Basic
2+
"""OSPF Basic
3+
4+
Verifies basic OSPF functionality by configuring two routers (R1 and R2)
5+
with OSPF on their interconnecting link. The test ensures OSPF
6+
neighbors are established, routes are exchanged between the routers, and
7+
end-to-end connectivity is achieved.
8+
9+
An end-device (HOST) is connected to R2 on an interface without OSPF enabled.
10+
This verifies that OSPF status information remains accessible when a router
11+
has non-OSPF interfaces.
412
5-
Very basic OSPF test just test that OSPF sends HELLO packets between the DUTs
6-
and that they exchange routes, ending with a simple connectivity check.
713
"""
814

15+
# TODO: Remove HOST node once Infamy supports unconnected ports in topologies
16+
917
import infamy
1018
import infamy.route as route
1119
from infamy.util import until, parallel
1220

21+
1322
def config_target1(target, data, link):
1423
target.put_config_dict("ietf-interfaces", {
1524
"interfaces": {
@@ -30,8 +39,8 @@ def config_target1(target, data, link):
3039
"ipv4": {
3140
"forwarding": True,
3241
"address": [{
33-
"ip": "192.168.50.1",
34-
"prefix-length": 24
42+
"ip": "192.168.50.1",
43+
"prefix-length": 24
3544
}]
3645
}
3746
},
@@ -40,8 +49,8 @@ def config_target1(target, data, link):
4049
"enabled": True,
4150
"ipv4": {
4251
"address": [{
43-
"ip": "192.168.100.1",
44-
"prefix-length": 32
52+
"ip": "192.168.100.1",
53+
"prefix-length": 32
4554
}]
4655
}
4756
}
@@ -56,38 +65,34 @@ def config_target1(target, data, link):
5665
target.put_config_dict("ietf-routing", {
5766
"routing": {
5867
"control-plane-protocols": {
59-
"control-plane-protocol": [
60-
{
61-
"type": "infix-routing:static",
62-
"name": "default",
63-
"static-routes": {
64-
"ipv4": {
65-
"route": [{
66-
"destination-prefix": "192.168.33.1/32",
67-
"next-hop": {
68-
"special-next-hop": "blackhole"
69-
}
70-
}]
71-
}
68+
"control-plane-protocol": [{
69+
"type": "infix-routing:static",
70+
"name": "default",
71+
"static-routes": {
72+
"ipv4": {
73+
"route": [{
74+
"destination-prefix": "192.168.33.1/32",
75+
"next-hop": {
76+
"special-next-hop": "blackhole"
77+
}
78+
}]
7279
}
73-
},
74-
{
80+
}
81+
}, {
7582
"type": "infix-routing:ospfv2",
7683
"name": "default",
7784
"ospf": {
7885
"redistribute": {
7986
"redistribute": [{
8087
"protocol": "static"
81-
},
82-
{
88+
}, {
8389
"protocol": "connected"
8490
}]
8591
},
8692
"areas": {
8793
"area": [{
8894
"area-id": "0.0.0.0",
89-
"interfaces":
90-
{
95+
"interfaces": {
9196
"interface": [{
9297
"enabled": True,
9398
"name": link,
@@ -103,35 +108,43 @@ def config_target1(target, data, link):
103108
}
104109
})
105110

106-
def config_target2(target, link):
111+
112+
def config_target2(target, link, data):
107113
target.put_config_dict("ietf-interfaces", {
108-
"interfaces": {
109-
"interface": [
110-
{
111-
"name": link,
112-
"enabled": True,
113-
"ipv4": {
114-
"forwarding": True,
115-
"address": [{
116-
"ip": "192.168.50.2",
117-
"prefix-length": 24
118-
}]
119-
}
120-
},
121-
{
122-
"name": "lo",
123-
"enabled": True,
124-
"forwarding": True,
125-
"ipv4": {
126-
"address": [{
127-
"ip": "192.168.200.1",
128-
"prefix-length": 32
129-
}]
130-
}
131-
}
132-
]
133-
}
134-
})
114+
"interfaces": {
115+
"interface": [{
116+
"name": link,
117+
"enabled": True,
118+
"ipv4": {
119+
"forwarding": True,
120+
"address": [{
121+
"ip": "192.168.50.2",
122+
"prefix-length": 24
123+
}]
124+
}
125+
}, {
126+
"name": data,
127+
"enabled": True,
128+
"ipv4": {
129+
"forwarding": True,
130+
"address": [{
131+
"ip": "192.168.60.1",
132+
"prefix-length": 24
133+
}]
134+
}
135+
}, {
136+
"name": "lo",
137+
"enabled": True,
138+
"forwarding": True,
139+
"ipv4": {
140+
"address": [{
141+
"ip": "192.168.200.1",
142+
"prefix-length": 32
143+
}]
144+
}
145+
}]
146+
}
147+
})
135148

136149
target.put_config_dict("ietf-system", {
137150
"system": {
@@ -141,8 +154,7 @@ def config_target2(target, link):
141154
target.put_config_dict("ietf-routing", {
142155
"routing": {
143156
"control-plane-protocols": {
144-
"control-plane-protocol": [
145-
{
157+
"control-plane-protocol": [{
146158
"type": "infix-routing:ospfv2",
147159
"name": "default",
148160
"ospf": {
@@ -154,7 +166,7 @@ def config_target2(target, link):
154166
"areas": {
155167
"area": [{
156168
"area-id": "0.0.0.0",
157-
"interfaces":{
169+
"interfaces": {
158170
"interface": [{
159171
"enabled": True,
160172
"name": link,
@@ -165,31 +177,61 @@ def config_target2(target, link):
165177
}]
166178
}
167179
}
168-
}
169-
]
180+
}]
170181
}
171182
}
172183
})
173184

185+
186+
def config_host(target, link):
187+
target.put_config_dict("ietf-interfaces", {
188+
"interfaces": {
189+
"interface": [{
190+
"name": link,
191+
"enabled": True,
192+
"ipv4": {
193+
"address": [{
194+
"ip": "192.168.60.2",
195+
"prefix-length": 24
196+
}]
197+
}
198+
}]
199+
}
200+
})
201+
202+
target.put_config_dict("ietf-system", {
203+
"system": {
204+
"hostname": "HOST"
205+
}
206+
})
207+
208+
174209
with infamy.Test() as test:
175210
with test.step("Set up topology and attach to target DUTs"):
176211
env = infamy.Env()
177212
R1 = env.attach("R1", "mgmt")
178213
R2 = env.attach("R2", "mgmt")
214+
HOST = env.attach("HOST", "mgmt")
179215

180216
with test.step("Configure targets"):
181217
_, R1data = env.ltop.xlate("R1", "data")
182218
_, R2link = env.ltop.xlate("R2", "link")
183-
_, R1link= env.ltop.xlate("R1", "link")
219+
_, R1link = env.ltop.xlate("R1", "link")
220+
_, R2data = env.ltop.xlate("R2", "data")
221+
_, HOSTlink = env.ltop.xlate("HOST", "link")
184222

185223
parallel(config_target1(R1, R1data, R1link),
186-
config_target2(R2, R2link))
224+
config_target2(R2, R2link, R2data),
225+
config_host(HOST, HOSTlink))
187226
with test.step("Wait for OSPF routes"):
188-
print("Waiting for OSPF routes..")
189227
until(lambda: route.ipv4_route_exist(R1, "192.168.200.1/32", proto="ietf-ospf:ospfv2"), attempts=200)
190228
until(lambda: route.ipv4_route_exist(R2, "192.168.100.1/32", proto="ietf-ospf:ospfv2"), attempts=200)
191229
until(lambda: route.ipv4_route_exist(R2, "192.168.33.1/32", proto="ietf-ospf:ospfv2"), attempts=200)
192230

231+
with test.step("Verify R2 OSPF neighbors with non-OSPF interface"):
232+
# Regression test for #1169
233+
assert route.ospf_has_neighbors(R2)
234+
193235
with test.step("Test connectivity from PC:data to 192.168.200.1"):
194236
_, hport0 = env.ltop.xlate("PC", "data")
195237
with infamy.IsolatedMacVlan(hport0) as ns0:

0 commit comments

Comments
 (0)