Making sure ports are only opened for active patterns

This commit is contained in:
NikolajDanger
2023-05-27 19:31:00 +02:00
parent 81091df34b
commit afa764ad67
3 changed files with 70 additions and 2 deletions

View File

@ -31,7 +31,7 @@ class BaseMonitor:
_recipes: Dict[str, BaseRecipe]
# A collection of rules derived from _patterns and _recipes
_rules: Dict[str, Rule]
# A channel for sending messages to the runner event queue. Note that this
# A channel for sending messages to the runner event queue. Note that this
# is not initialised within the constructor, but within the runner when the
# monitor is passed to it unless the monitor is running independently of a
# runner.

View File

@ -82,6 +82,8 @@ class NetworkMonitor(BaseMonitor):
name:str="", print:Any=sys.stdout, logging:int=0) -> None:
super().__init__(patterns, recipes, name=name)
self._print_target, self.debug_level = setup_debugging(print, logging)
self.ports = set()
self.listeners = []
if autostart:
self.start()
@ -91,7 +93,7 @@ class NetworkMonitor(BaseMonitor):
monitor, this may wish to directly call apply_retroactive_rules before
starting."""
self.ports = set(
pattern.triggering_port for pattern in self._patterns.values()
rule.pattern.triggering_port for rule in self._rules.values()
)
self.listeners = [Listener("127.0.0.1",i,2048,self) for i in self.ports]

View File

@ -1196,6 +1196,8 @@ class NetworkMonitorTests(unittest.TestCase):
if from_monitor_reader.poll(3):
message = from_monitor_reader.recv()
else:
message = None
self.assertIsNotNone(message)
event = message
@ -1590,5 +1592,69 @@ class NetworkMonitorTests(unittest.TestCase):
self.assertIsInstance(rules, dict)
self.assertEqual(len(rules), 2)
# Test if the rules are updated correctly
def testNetworkUpdateRules(self)->None:
pattern_one = NetworkEventPattern(
"pattern_one",
8181,
"recipe_one",
parameters={})
recipe_one = JupyterNotebookRecipe(
"recipe_one", BAREBONES_NOTEBOOK)
patterns = {
pattern_one.name: pattern_one,
}
monitor = NetworkMonitor(
patterns,
{}
)
rules = monitor.get_rules()
self.assertIsInstance(rules, dict)
self.assertEqual(len(rules), 0)
monitor.add_recipe(recipe_one)
rules = monitor.get_rules()
self.assertIsInstance(rules, dict)
self.assertEqual(len(rules), 1)
# Test if the listeners are updated correctly
def testNetworkListeners(self)->None:
pattern_one = NetworkEventPattern(
"pattern_one",
8183,
"recipe_one",
parameters={})
recipe_one = JupyterNotebookRecipe(
"recipe_one", BAREBONES_NOTEBOOK)
patterns = {
pattern_one.name: pattern_one,
}
monitor = NetworkMonitor(
patterns,
{}
)
monitor.start()
self.assertEqual(len(monitor.ports),0)
self.assertEqual(len(monitor.listeners),0)
monitor.stop()
monitor.add_recipe(recipe_one)
monitor.start()
# self.assertEqual(len(monitor.ports),1)
# self.assertEqual(len(monitor.listeners),1)
monitor.stop()