Skip to content

Commit

Permalink
Let XML executables/nodes be "required" (like in ROS 1) (ros2#751)
Browse files Browse the repository at this point in the history
* Let XML nodes be "required"

Essentially on_exit="shutdown" is equivalent to ROS 1 required="true".

This feature is implemented using the python launchfile on_exit mechanism.

Right now "shutdown" is the only action accepted by on_exit,
but theoretically more "on_exit" actions could be added later.

Example:
<executable cmd="ls" on_exit="shutdown"/>

* Added tests for yaml

Signed-off-by: Matthew Elwin <elwin@northwestern.edu>
Signed-off-by: Tim Clephas <tim.clephas@nobleo.nl>
  • Loading branch information
m-elwin authored and Timple committed Mar 5, 2024
1 parent f15691c commit e8714b9
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
12 changes: 11 additions & 1 deletion launch/launch/actions/execute_process.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from typing import Text

from .execute_local import ExecuteLocal

from .shutdown_action import Shutdown
from ..descriptions import Executable
from ..frontend import Entity
from ..frontend import expose_action
Expand Down Expand Up @@ -329,6 +329,16 @@ def parse(
if name is not None:
kwargs['name'] = parser.parse_substitution(name)

if 'on_exit' not in ignore:
on_exit = entity.get_attr('on_exit', optional=True)
if on_exit is not None:
if on_exit == 'shutdown':
kwargs['on_exit'] = [Shutdown()]
else:
raise ValueError(
'Attribute on_exit of Entity node expected to be shutdown but got `{}`'
'Other on_exit actions not yet supported'.format(on_exit))

if 'prefix' not in ignore:
prefix = entity.get_attr('launch-prefix', optional=True)
if prefix is not None:
Expand Down
17 changes: 17 additions & 0 deletions launch_xml/test/launch_xml/test_executable.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import textwrap

from launch import LaunchService
from launch.actions import Shutdown
from launch.frontend import Parser

import pytest
Expand Down Expand Up @@ -67,5 +68,21 @@ def test_executable_wrong_subtag():
assert 'whats_this' in str(excinfo.value)


def test_executable_on_exit():
xml_file = \
"""\
<launch>
<executable cmd="ls" on_exit="shutdown"/>
</launch>
"""
xml_file = textwrap.dedent(xml_file)
root_entity, parser = Parser.load(io.StringIO(xml_file))
ld = parser.parse_description(root_entity)
executable = ld.entities[0]
sub_entities = executable.get_sub_entities()
assert len(sub_entities) == 1
assert isinstance(sub_entities[0], Shutdown)


if __name__ == '__main__':
test_executable()
18 changes: 18 additions & 0 deletions launch_yaml/test/launch_yaml/test_executable.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import textwrap

from launch import LaunchService
from launch.actions import Shutdown
from launch.frontend import Parser


Expand Down Expand Up @@ -64,5 +65,22 @@ def test_executable():
assert(0 == ls.run())


def test_executable_on_exit():
yaml_file = \
"""\
launch:
- executable:
cmd: ls
on_exit: shutdown
"""
yaml_file = textwrap.dedent(yaml_file)
root_entity, parser = Parser.load(io.StringIO(yaml_file))
ld = parser.parse_description(root_entity)
executable = ld.entities[0]
sub_entities = executable.get_sub_entities()
assert len(sub_entities) == 1
assert isinstance(sub_entities[0], Shutdown)


if __name__ == '__main__':
test_executable()

0 comments on commit e8714b9

Please sign in to comment.