Skip to content

Commit 8ab39ca

Browse files
committed
munet: add env variables to L3NamespaceNode
Fixes #22 Signed-off-by: Liam Brady <[email protected]>
1 parent 1037e78 commit 8ab39ca

File tree

2 files changed

+74
-4
lines changed

2 files changed

+74
-4
lines changed

munet/base.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,7 @@ def run_in_window( # pylint: disable=too-many-positional-arguments
12041204
new_window=False,
12051205
tmux_target=None,
12061206
ns_only=False,
1207+
env_vars=None,
12071208
):
12081209
"""Run a command in a new window (TMUX, Screen or XTerm).
12091210
@@ -1217,6 +1218,7 @@ def run_in_window( # pylint: disable=too-many-positional-arguments
12171218
forcex: Force use of X11.
12181219
new_window: Open new window (instead of pane) in TMUX
12191220
tmux_target: Target for tmux pane.
1221+
env_vars: Dict of extra env variables to set in the window
12201222
12211223
Returns:
12221224
the pane/window identifier from TMUX (depends on `new_window`)
@@ -1228,6 +1230,9 @@ def run_in_window( # pylint: disable=too-many-positional-arguments
12281230
channel = "{}-wait-{}".format(our_pid, Commander.tmux_wait_gen)
12291231
Commander.tmux_wait_gen += 1
12301232

1233+
if not isinstance(env_vars, dict):
1234+
env_vars = {}
1235+
12311236
if forcex or ("TMUX" not in os.environ and "STY" not in os.environ):
12321237
root_level = False
12331238
else:
@@ -1249,8 +1254,11 @@ def run_in_window( # pylint: disable=too-many-positional-arguments
12491254
cmd = shlex.split(cmd)
12501255
cmd = [
12511256
"/usr/bin/env",
1252-
f"MUNET_NODENAME={self.name}",
12531257
]
1258+
# Set extra env variables first so that they will be overwritted if needed
1259+
for key, value in env_vars:
1260+
cmd.append(f"{key}={shell_quote(value)}")
1261+
cmd.append(f"MUNET_NODENAME={self.name}")
12541262
if "MUNET_PID" in os.environ:
12551263
cmd.append(f"MUNET_PID={os.environ.get('MUNET_PID')}")
12561264
cmd += cmd
@@ -1269,8 +1277,12 @@ def run_in_window( # pylint: disable=too-many-positional-arguments
12691277
]
12701278
else:
12711279
# This is the command to execute to be inside the namespace.
1280+
# Set extra env variables first so that they will be overwritted if needed
1281+
envvars = ""
1282+
for key, value in env_vars.items():
1283+
envvars += f' {key}={shell_quote(value)}'
12721284
# We are getting into trouble with quoting.
1273-
envvars = f"MUNET_NODENAME={self.name} NODENAME={self.name}"
1285+
envvars += f" MUNET_NODENAME={self.name} NODENAME={self.name}"
12741286
if hasattr(self, "rundir"):
12751287
envvars += f" RUNDIR={self.rundir}"
12761288
if "MUNET_PID" in os.environ:

munet/native.py

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,16 +1231,74 @@ async def _async_delete(self):
12311231
class L3NamespaceNode(L3NodeMixin, LinuxNamespace):
12321232
"""A namespace L3 node."""
12331233

1234-
def __init__(self, name, pid=True, **kwargs):
1234+
def __init__(self, name, pid=True, config=None, **kwargs):
12351235
# logging.warning(
12361236
# "L3NamespaceNode: name %s MRO: %s kwargs %s",
12371237
# name,
12381238
# L3NamespaceNode.mro(),
12391239
# kwargs,
12401240
# )
1241-
super().__init__(name, pid=pid, **kwargs)
1241+
self.config = config if config else {}
1242+
super().__init__(name, pid=pid, config=config, **kwargs)
12421243
super().pytest_hook_open_shell()
12431244

1245+
def _get_sub_args(self, cmd_list, defaults, use_pty=False, ns_only=False, **kwargs):
1246+
"""Returns pre-command, cmd, and default keyword args.
1247+
1248+
Overrides Commander in order to insert configured enviornmental variables
1249+
"""
1250+
pre_cmd_list, cmd_list, defaults = super()._get_sub_args(
1251+
cmd_list, defaults, use_pty, ns_only, **kwargs
1252+
)
1253+
1254+
if self.config and "env" in self.config and self.config["env"]:
1255+
config_env = {}
1256+
for env_var in self.config["env"].items():
1257+
config_env[env_var[0]] = env_var[1]["value"]
1258+
1259+
# All values in defaults should NOT be overwritten by config_env
1260+
config_env.update(defaults["env"])
1261+
defaults["env"] = config_env
1262+
1263+
return pre_cmd_list, cmd_list, defaults
1264+
1265+
def run_in_window( # pylint: disable=too-many-positional-arguments
1266+
self,
1267+
cmd,
1268+
wait_for=False,
1269+
background=False,
1270+
name=None,
1271+
title=None,
1272+
forcex=False,
1273+
new_window=False,
1274+
tmux_target=None,
1275+
ns_only=False,
1276+
env_vars=None,
1277+
):
1278+
1279+
if self.config and "env" in self.config and self.config["env"]:
1280+
config_env = {}
1281+
for env_var in self.config["env"].items():
1282+
config_env[env_var[0]] = env_var[1]["value"]
1283+
1284+
if isinstance(env_vars, dict):
1285+
# All values in defaults should NOT be overwritten by config_env
1286+
config_env.update(env_vars)
1287+
env_vars=config_env
1288+
1289+
super().run_in_window(
1290+
cmd,
1291+
wait_for,
1292+
background,
1293+
name,
1294+
title,
1295+
forcex,
1296+
new_window,
1297+
tmux_target,
1298+
ns_only,
1299+
env_vars,
1300+
)
1301+
12441302
async def _async_delete(self):
12451303
self.logger.debug("%s: deleting", self)
12461304
await super()._async_delete()

0 commit comments

Comments
 (0)