]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/lib/ltemplate.py
2 # SPDX-License-Identifier: ISC
5 # Part of NetDEF Topology Tests
7 # Copyright (c) 2017 by
8 # Network Device Education Foundation, Inc. ("NetDEF")
12 ltemplate.py: LabN template for FRR tests.
21 # pylint: disable=C0413
22 # Import topogen and topotest helpers
23 from lib
import topotest
24 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
25 from lib
.topolog
import logger
26 from lib
.lutil
import *
28 # Required to instantiate the topology builder class.
38 prestarthooksuccess
= True
39 poststarthooksuccess
= True
42 def __init__(self
, test
, testdir
):
43 pathname
= os
.path
.join(testdir
, "customize.py")
45 if sys
.version_info
>= (3, 5):
48 spec
= importlib
.util
.spec_from_file_location("customize", pathname
)
49 customize
= importlib
.util
.module_from_spec(spec
)
50 spec
.loader
.exec_module(customize
)
54 customize
= imp
.load_source("customize", pathname
)
56 self
.testdir
= testdir
57 self
.scriptdir
= testdir
59 logger
.info("LTemplate: " + test
)
61 def setup_module(self
, mod
):
62 "Sets up the pytest environment"
63 # This function initiates the topology build with Topogen...
64 tgen
= Topogen(customize
.build_topo
, mod
.__name
__)
65 # ... and here it calls Mininet initialization functions.
68 self
.logdir
= tgen
.logdir
70 logger
.info("Topology started")
72 self
.prestarthooksuccess
= customize
.ltemplatePreRouterStartHook()
73 except AttributeError:
75 logger
.debug("ltemplatePreRouterStartHook() not defined")
76 if self
.prestarthooksuccess
!= True:
77 logger
.info("ltemplatePreRouterStartHook() failed, skipping test")
80 # This is a sample of configuration loading.
81 router_list
= tgen
.routers()
83 # For all registered routers, load the zebra configuration file
84 for rname
, router
in router_list
.items():
85 logger
.info("Setting up %s" % rname
)
86 for rd_val
in TopoRouter
.RD
:
87 config
= os
.path
.join(
88 self
.testdir
, "{}/{}.conf".format(rname
, TopoRouter
.RD
[rd_val
])
90 prog
= os
.path
.join(tgen
.net
[rname
].daemondir
, TopoRouter
.RD
[rd_val
])
91 if os
.path
.exists(config
):
92 if os
.path
.exists(prog
):
93 router
.load_config(rd_val
, config
)
96 "{} not found, but have {}.conf file".format(
97 prog
, TopoRouter
.RD
[rd_val
]
101 # After loading the configurations, this function loads configured daemons.
102 logger
.info("Starting routers")
105 self
.poststarthooksuccess
= customize
.ltemplatePostRouterStartHook()
106 except AttributeError:
108 logger
.debug("ltemplatePostRouterStartHook() not defined")
109 luStart(baseScriptDir
=self
.scriptdir
, baseLogDir
=self
.logdir
, net
=tgen
.net
)
112 # initialized by ltemplate_start
116 def setup_module(mod
):
118 root
= os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
)))
119 test
= mod
.__name
__[: mod
.__name
__.rfind(".")]
120 testdir
= os
.path
.join(root
, test
)
122 # don't do this for now as reload didn't work as expected
123 # fixup sys.path, want test dir there only once
125 # sys.path.remove(testdir)
127 # logger.debug(testdir+" not found in original sys.path")
129 # sys.path.append(testdir)
132 _lt
= LTemplate(test
, testdir
)
133 _lt
.setup_module(mod
)
136 # sys.path.remove(testdir)
139 def teardown_module(mod
):
141 "Teardown the pytest environment"
144 if _lt
!= None and _lt
.scriptdir
!= None and _lt
.prestarthooksuccess
== True:
145 luShowResults(logger
.info
)
148 # This function tears down the whole topology.
154 script
, SkipIfFailed
=True, CallOnFail
=None, CheckFuncStr
=None, KeepGoing
=False
157 if _lt
== None or _lt
.prestarthooksuccess
!= True:
161 if not os
.path
.isfile(script
):
162 if not os
.path
.isfile(os
.path
.join(_lt
.scriptdir
, script
)):
163 logger
.error("Could not find script file: " + script
)
164 assert "Could not find script file: " + script
165 logger
.info("Starting template test: " + script
)
166 numEntry
= luNumFail()
168 if SkipIfFailed
and tgen
.routers_have_failure():
169 pytest
.skip(tgen
.errors
)
172 pytest
.skip("Have %d errors" % numEntry
)
174 if CheckFuncStr
!= None:
175 check
= eval(CheckFuncStr
)
177 pytest
.skip("Check function '" + CheckFuncStr
+ "' returned: " + check
)
179 if CallOnFail
!= None:
180 CallOnFail
= eval(CallOnFail
)
181 luInclude(script
, CallOnFail
)
182 numFail
= luNumFail() - numEntry
185 fatal_error
= "%d tests failed" % numFail
188 "scripts/cleanup_all.py failed" == "See summary output above"
192 # Memory leak test template
193 def test_memory_leak():
194 "Run the memory leak test and report results."
196 if not tgen
.is_memleak_enabled():
197 pytest
.skip("Memory leak test/report is disabled")
199 tgen
.report_memory_leaks()
202 class ltemplateRtrCmd
:
206 def doCmd(self
, tgen
, rtr
, cmd
, checkstr
=None):
207 logger
.info("doCmd: {} {}".format(rtr
, cmd
))
208 output
= tgen
.net
[rtr
].cmd(cmd
).strip()
212 ret
= re
.search(checkstr
, output
)
218 logger
.info("output: " + output
)
220 logger
.info("No output")
224 def resetCounts(self
):
233 def getNoMatch(self
):
243 def ltemplateVersionCheck(
244 vstr
, rname
="r1", compstr
="<", cli
=False, kernel
="4.9", iproute2
=None, mpls
=True
247 router
= tgen
.gears
[rname
]
250 logger
.info("calling mininet CLI")
252 logger
.info("exited mininet CLI")
255 ret
= "Template not initialized"
258 if _lt
.prestarthooksuccess
!= True:
259 ret
= "ltemplatePreRouterStartHook failed"
262 if _lt
.poststarthooksuccess
!= True:
263 ret
= "ltemplatePostRouterStartHook failed"
266 if mpls
== True and tgen
.hasmpls
!= True:
267 ret
= "MPLS not initialized"
271 krel
= platform
.release()
272 if topotest
.version_cmp(krel
, kernel
) < 0:
273 ret
= "Skipping tests, old kernel ({} < {})".format(krel
, kernel
)
277 if _lt
.iproute2Ver
== None:
278 # collect/log info on iproute2
279 cc
= ltemplateRtrCmd()
281 tgen
, rname
, "apt-cache policy iproute2", r
"Installed: ([\d\.]*)"
284 iproute2Ver
= found
.group(1)
286 iproute2Ver
= "0-unknown"
287 logger
.info("Have iproute2 version=" + iproute2Ver
)
289 if topotest
.version_cmp(iproute2Ver
, iproute2
) < 0:
290 ret
= "Skipping tests, old iproute2 ({} < {})".format(iproute2Ver
, iproute2
)
295 if router
.has_version(compstr
, vstr
):
296 ret
= "Skipping tests, old FRR version {} {}".format(compstr
, vstr
)
305 if __name__
== "__main__":
306 args
= ["-s"] + sys
.argv
[1:]
307 sys
.exit(pytest
.main(args
))