Skip to content

Commit 4ebc2ad

Browse files
committed
Isolate shm implementation from #304
1 parent 89af699 commit 4ebc2ad

3 files changed

Lines changed: 57 additions & 0 deletions

File tree

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
'privileged = rocker.extensions:Privileged',
6363
'pulse = rocker.extensions:PulseAudio',
6464
'rmw = rocker.rmw_extension:RMW',
65+
'shm_size = rocker.extensions:ShmSize',
6566
'ssh = rocker.ssh_extension:Ssh',
6667
'ulimit = rocker.ulimit_extension:Ulimit',
6768
'user = rocker.extensions:User',

src/rocker/extensions.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,27 @@ def register_arguments(parser, defaults):
468468
default=defaults.get(GroupAdd.get_name(), None),
469469
action='append',
470470
help="Add additional groups to join.")
471+
472+
class ShmSize(RockerExtension):
473+
@staticmethod
474+
def get_name():
475+
return 'shm_size'
476+
477+
def __init__(self):
478+
self.name = ShmSize.get_name()
479+
480+
def get_preamble(self, cliargs):
481+
return ''
482+
483+
def get_docker_args(self, cliargs):
484+
args = ''
485+
shm_size = cliargs.get('shm_size', None)
486+
if shm_size:
487+
args += f' --shm-size {shm_size} '
488+
return args
489+
490+
@staticmethod
491+
def register_arguments(parser, defaults={}):
492+
parser.add_argument('--shm-size',
493+
default=defaults.get('shm_size', None),
494+
help="Set the size of the shared memory for the container (e.g., 512m, 1g).")

test/test_extension.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,3 +617,35 @@ def test_group_add_extension(self):
617617
args = p.get_docker_args(mock_cliargs)
618618
self.assertIn('--group-add sudo', args)
619619
self.assertIn('--group-add docker', args)
620+
621+
class ShmSizeExtensionTest(unittest.TestCase):
622+
623+
def setUp(self):
624+
# Work around interference between empy Interpreter
625+
# stdout proxy and test runner. empy installs a proxy on stdout
626+
# to be able to capture the information.
627+
# And the test runner creates a new stdout object for each test.
628+
# This breaks empy as it assumes that the proxy has persistent
629+
# between instances of the Interpreter class
630+
# empy will error with the exception
631+
# "em.Error: interpreter stdout proxy lost"
632+
em.Interpreter._wasProxyInstalled = False
633+
634+
@pytest.mark.docker
635+
def test_shm_size_extension(self):
636+
plugins = list_plugins()
637+
shm_size_plugin = plugins['shm_size']
638+
self.assertEqual(shm_size_plugin.get_name(), 'shm_size')
639+
640+
p = shm_size_plugin()
641+
self.assertTrue(plugin_load_parser_correctly(shm_size_plugin))
642+
643+
mock_cliargs = {}
644+
self.assertEqual(p.get_snippet(mock_cliargs), '')
645+
self.assertEqual(p.get_preamble(mock_cliargs), '')
646+
args = p.get_docker_args(mock_cliargs)
647+
self.assertNotIn('--shm-size', args)
648+
649+
mock_cliargs = {'shm_size': '12g'}
650+
args = p.get_docker_args(mock_cliargs)
651+
self.assertIn('--shm-size 12g', args)

0 commit comments

Comments
 (0)