From 8470a17aa45dc1009c1072f709c255c768015803 Mon Sep 17 00:00:00 2001 From: Brett Holman Date: Wed, 15 Nov 2023 17:03:35 +0000 Subject: [PATCH] refactor(subp): Remove redundant parameter 'env' (#4555) - Remove redundant code from the few callsites that used this parameter. - Eliminate tests for behavior that was never used. --- cloudinit/config/cc_ansible.py | 6 +-- cloudinit/config/cc_bootcmd.py | 8 +-- cloudinit/config/cc_growpart.py | 23 ++++----- cloudinit/config/cc_seed_random.py | 13 ++--- cloudinit/config/cc_snap.py | 2 +- cloudinit/config/cc_ssh.py | 6 +-- cloudinit/distros/bsd.py | 2 +- cloudinit/distros/freebsd.py | 4 +- cloudinit/distros/netbsd.py | 14 +++--- cloudinit/distros/openbsd.py | 4 +- cloudinit/distros/package_management/apt.py | 5 +- cloudinit/handlers/boot_hook.py | 10 ++-- cloudinit/subp.py | 8 +-- tests/unittests/config/test_cc_ansible.py | 20 ++++---- tests/unittests/config/test_cc_growpart.py | 50 ++++++++++--------- tests/unittests/config/test_cc_seed_random.py | 2 +- .../distros/package_management/test_apt.py | 2 +- tests/unittests/test_subp.py | 11 ---- 18 files changed, 82 insertions(+), 108 deletions(-) diff --git a/cloudinit/config/cc_ansible.py b/cloudinit/config/cc_ansible.py index 5039fe02e23a..659420aff309 100644 --- a/cloudinit/config/cc_ansible.py +++ b/cloudinit/config/cc_ansible.py @@ -70,12 +70,12 @@ def __init__(self, distro: Distro): self.cmd_pull = ["ansible-pull"] self.cmd_version = ["ansible-pull", "--version"] self.distro = distro - self.env = os.environ + self.env = {} self.run_user: Optional[str] = None # some ansible modules directly reference os.environ["HOME"] # and cloud-init might not have that set, default: /root - self.env["HOME"] = self.env.get("HOME", "/root") + self.env["HOME"] = os.environ.get("HOME", "/root") def get_version(self) -> Optional[Version]: stdout, _ = self.do_as(self.cmd_version) @@ -100,7 +100,7 @@ def do_as(self, command: list, **kwargs): return self.distro.do_as(command, self.run_user, **kwargs) def subp(self, command, **kwargs): - return subp(command, env=self.env, **kwargs) + return subp(command, update_env=self.env, **kwargs) @abc.abstractmethod def is_installed(self): diff --git a/cloudinit/config/cc_bootcmd.py b/cloudinit/config/cc_bootcmd.py index c75ea05cd449..8e0bbfc9e3ed 100644 --- a/cloudinit/config/cc_bootcmd.py +++ b/cloudinit/config/cc_bootcmd.py @@ -10,7 +10,6 @@ """Bootcmd: run arbitrary commands early in the boot process.""" import logging -import os from textwrap import dedent from cloudinit import subp, temp_utils, util @@ -83,12 +82,9 @@ def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None: raise try: - env = os.environ.copy() iid = cloud.get_instance_id() - if iid: - env["INSTANCE_ID"] = str(iid) - cmd = ["/bin/sh", tmpf.name] - subp.subp(cmd, env=env, capture=False) + env = {"INSTANCE_ID": str(iid)} if iid else {} + subp.subp(["/bin/sh", tmpf.name], update_env=env, capture=False) except Exception: util.logexc(LOG, "Failed to run bootcmd module %s", name) raise diff --git a/cloudinit/config/cc_growpart.py b/cloudinit/config/cc_growpart.py index f2e847e3e6ea..9a08a067c238 100644 --- a/cloudinit/config/cc_growpart.py +++ b/cloudinit/config/cc_growpart.py @@ -167,11 +167,10 @@ def resize(self, diskdev, partnum, partdev): class ResizeGrowPart(Resizer): def available(self, devices: list): - myenv = os.environ.copy() - myenv["LANG"] = "C" - try: - (out, _err) = subp.subp(["growpart", "--help"], env=myenv) + out = subp.subp( + ["growpart", "--help"], update_env={"LANG": "C"} + ).stdout if re.search(r"--update\s+", out): return True @@ -180,8 +179,6 @@ def available(self, devices: list): return False def resize(self, diskdev, partnum, partdev): - myenv = os.environ.copy() - myenv["LANG"] = "C" before = get_size(partdev) # growpart uses tmp dir to store intermediate states @@ -189,12 +186,13 @@ def resize(self, diskdev, partnum, partdev): tmp_dir = self._distro.get_tmp_exec_path() with temp_utils.tempdir(dir=tmp_dir, needs_exe=True) as tmpd: growpart_tmp = os.path.join(tmpd, "growpart") + my_env = {"LANG": "C", "TMPDIR": growpart_tmp} if not os.path.exists(growpart_tmp): os.mkdir(growpart_tmp, 0o700) - myenv["TMPDIR"] = growpart_tmp try: subp.subp( - ["growpart", "--dry-run", diskdev, partnum], env=myenv + ["growpart", "--dry-run", diskdev, partnum], + update_env=my_env, ) except subp.ProcessExecutionError as e: if e.exit_code != 1: @@ -208,7 +206,7 @@ def resize(self, diskdev, partnum, partdev): return (before, before) try: - subp.subp(["growpart", diskdev, partnum], env=myenv) + subp.subp(["growpart", diskdev, partnum], update_env=my_env) except subp.ProcessExecutionError as e: util.logexc(LOG, "Failed: growpart %s %s", diskdev, partnum) raise ResizeFailedException(e) from e @@ -246,11 +244,10 @@ def resize(self, diskdev, partnum, partdev): class ResizeGpart(Resizer): def available(self, devices: list): - myenv = os.environ.copy() - myenv["LANG"] = "C" - try: - (_out, err) = subp.subp(["gpart", "help"], env=myenv, rcs=[0, 1]) + err = subp.subp( + ["gpart", "help"], update_env={"LANG": "C"}, rcs=[0, 1] + ).stderr if re.search(r"gpart recover ", err): return True diff --git a/cloudinit/config/cc_seed_random.py b/cloudinit/config/cc_seed_random.py index ba17a9c8a09c..ffe1f5cd9056 100644 --- a/cloudinit/config/cc_seed_random.py +++ b/cloudinit/config/cc_seed_random.py @@ -10,7 +10,6 @@ import base64 import logging -import os from io import BytesIO from textwrap import dedent @@ -90,7 +89,7 @@ def _decode(data, encoding=None): raise IOError("Unknown random_seed encoding: %s" % (encoding)) -def handle_random_seed_command(command, required, env=None): +def handle_random_seed_command(command, required, update_env): if not command and required: raise ValueError("no command found but required=true") elif not command: @@ -106,7 +105,7 @@ def handle_random_seed_command(command, required, env=None): else: LOG.debug("command '%s' not found for seed_command", cmd) return - subp.subp(command, env=env, capture=False) + subp.subp(command, update_env=update_env, capture=False) def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None: @@ -137,9 +136,11 @@ def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None: command = mycfg.get("command", None) req = mycfg.get("command_required", False) try: - env = os.environ.copy() - env["RANDOM_SEED_FILE"] = seed_path - handle_random_seed_command(command=command, required=req, env=env) + handle_random_seed_command( + command=command, required=req, update_env={ + "RANDOM_SEED_FILE": seed_path + } + ) except ValueError as e: LOG.warning("handling random command [%s] failed: %s", command, e) raise e diff --git a/cloudinit/config/cc_snap.py b/cloudinit/config/cc_snap.py index bfeeecf02248..93c6fe7a78a6 100644 --- a/cloudinit/config/cc_snap.py +++ b/cloudinit/config/cc_snap.py @@ -173,7 +173,7 @@ def run_commands(commands): for command in fixed_snap_commands: shell = isinstance(command, str) try: - subp.subp(command, shell=shell) + subp.subp([command], shell=shell) except subp.ProcessExecutionError as e: cmd_failures.append(str(e)) if cmd_failures: diff --git a/cloudinit/config/cc_ssh.py b/cloudinit/config/cc_ssh.py index bc8c88fa2d7d..8c7156ec418a 100644 --- a/cloudinit/config/cc_ssh.py +++ b/cloudinit/config/cc_ssh.py @@ -275,8 +275,6 @@ def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None: ",".join(skipped_keys), ) - lang_c = os.environ.copy() - lang_c["LANG"] = "C" for keytype in key_names: keyfile = KEY_FILE_TPL % (keytype) if os.path.exists(keyfile): @@ -287,7 +285,9 @@ def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None: # TODO(harlowja): Is this guard needed? with util.SeLinuxGuard("/etc/ssh", recursive=True): try: - out, err = subp.subp(cmd, capture=True, env=lang_c) + out, err = subp.subp( + cmd, capture=True, update_env={"LANG": "C"} + ) if not util.get_cfg_option_bool( cfg, "ssh_quiet_keygen", False ): diff --git a/cloudinit/distros/bsd.py b/cloudinit/distros/bsd.py index 761cf5c46677..bce3cd806e7b 100644 --- a/cloudinit/distros/bsd.py +++ b/cloudinit/distros/bsd.py @@ -130,7 +130,7 @@ def package_command(self, command, args=None, pkgs=None): cmd.extend(pkglist) # Allow the output of this to flow outwards (ie not be captured) - subp.subp(cmd, env=self._get_pkg_cmd_environ(), capture=False) + subp.subp(cmd, update_env=self._get_pkg_cmd_environ(), capture=False) def set_timezone(self, tz): distros.set_etc_timezone(tz=tz, tz_file=self._find_tz_file(tz)) diff --git a/cloudinit/distros/freebsd.py b/cloudinit/distros/freebsd.py index 587f6bb12680..68042c77ae92 100644 --- a/cloudinit/distros/freebsd.py +++ b/cloudinit/distros/freebsd.py @@ -201,9 +201,7 @@ def apply_locale(self, locale, out_fn=None): def _get_pkg_cmd_environ(self): """Return environment vars used in FreeBSD package_command operations""" - e = os.environ.copy() - e["ASSUME_ALWAYS_YES"] = "YES" - return e + return {"ASSUME_ALWAYS_YES": "YES"} def update_package_sources(self): self._runner.run( diff --git a/cloudinit/distros/netbsd.py b/cloudinit/distros/netbsd.py index a56789070f79..e8b9bcd5b8a9 100644 --- a/cloudinit/distros/netbsd.py +++ b/cloudinit/distros/netbsd.py @@ -146,14 +146,12 @@ def _get_pkg_cmd_environ(self): """Return env vars used in NetBSD package_command operations""" os_release = platform.release() os_arch = platform.machine() - e = os.environ.copy() - e[ - "PKG_PATH" - ] = "http://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/%s/%s/All" % ( - os_arch, - os_release, - ) - return e + return { + "PKG_PATH": ( + f"http://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD" + f"/{os_arch}/{os_release}/All" + ) + } def update_package_sources(self): pass diff --git a/cloudinit/distros/openbsd.py b/cloudinit/distros/openbsd.py index 154eec388152..d36c3d44a85f 100644 --- a/cloudinit/distros/openbsd.py +++ b/cloudinit/distros/openbsd.py @@ -3,7 +3,6 @@ # This file is part of cloud-init. See LICENSE file for license information. import logging -import os import cloudinit.distros.netbsd from cloudinit import subp, util @@ -58,5 +57,4 @@ def unlock_passwd(self, name): def _get_pkg_cmd_environ(self): """Return env vars used in OpenBSD package_command operations""" - e = os.environ.copy() - return e + return {} diff --git a/cloudinit/distros/package_management/apt.py b/cloudinit/distros/package_management/apt.py index 3c4164cd2dad..627c0348e69b 100644 --- a/cloudinit/distros/package_management/apt.py +++ b/cloudinit/distros/package_management/apt.py @@ -91,8 +91,7 @@ def __init__( ) self.apt_get_upgrade_subcommand = apt_get_upgrade_subcommand - self.environment = os.environ.copy() - self.environment["DEBIAN_FRONTEND"] = "noninteractive" + self.environment = {"DEBIAN_FRONTEND": "noninteractive"} @classmethod def from_config(cls, runner: helpers.Runners, cfg: Mapping) -> "Apt": @@ -162,7 +161,7 @@ def run_package_command(self, command, args=None, pkgs=None): short_cmd=command, subp_kwargs={ "args": full_command, - "env": self.environment, + "update_env": self.environment, "capture": False, }, ) diff --git a/cloudinit/handlers/boot_hook.py b/cloudinit/handlers/boot_hook.py index 7ef30072ba9f..5ba51ae70382 100644 --- a/cloudinit/handlers/boot_hook.py +++ b/cloudinit/handlers/boot_hook.py @@ -44,11 +44,13 @@ def handle_part(self, data, ctype, filename, payload, frequency): filepath = self._write_part(payload, filename) try: - env = os.environ.copy() - if self.instance_id is not None: - env["INSTANCE_ID"] = str(self.instance_id) + env = ( + {"INSTANCE_ID": str(self.instance_id)} + if self.instance_id + else {} + ) LOG.debug("Executing boothook") - subp.subp([filepath], env=env, capture=False) + subp.subp([filepath], update_env=env, capture=False) except subp.ProcessExecutionError: util.logexc(LOG, "Boothooks script %s execution error", filepath) except Exception: diff --git a/cloudinit/subp.py b/cloudinit/subp.py index be7253f1806b..dafa900c4791 100644 --- a/cloudinit/subp.py +++ b/cloudinit/subp.py @@ -148,7 +148,6 @@ def subp( *, data=None, rcs=None, - env=None, capture=True, shell=False, logstring=False, @@ -164,7 +163,6 @@ def subp( a list of allowed return codes. If subprocess exits with a value not in this list, a ProcessExecutionError will be raised. By default, data is returned as a string. See 'decode' parameter. - :param env: a dictionary for the command's environment. :param capture: boolean indicating if output should be captured. If True, then stderr and stdout will be returned. If False, they will not be redirected. @@ -178,7 +176,7 @@ def subp( These values are passed through to bytes().decode() as the 'errors' parameter. There is no support for decoding to other than utf-8. :param update_env: - update the enviornment for this command with this dictionary. + update the environment for this command with this dictionary. this will not affect the current processes os.environ. :param cwd: change the working directory to cwd before executing the command. @@ -195,10 +193,8 @@ def subp( if rcs is None: rcs = [0] + env = os.environ.copy() if update_env: - if env is None: - env = os.environ - env = env.copy() env.update(update_env) if not logstring: diff --git a/tests/unittests/config/test_cc_ansible.py b/tests/unittests/config/test_cc_ansible.py index 12dd6414d178..685dbd70ff9a 100644 --- a/tests/unittests/config/test_cc_ansible.py +++ b/tests/unittests/config/test_cc_ansible.py @@ -1,6 +1,6 @@ +import os import re from copy import deepcopy -from os import environ from textwrap import dedent from unittest import mock from unittest.mock import MagicMock @@ -298,7 +298,6 @@ def test_required_keys(self, cfg, exception, mocker): M_PATH + "AnsiblePullDistro.is_installed", return_value=False, ) - mocker.patch.dict(M_PATH + "os.environ", clear=True) if exception: with raises(exception): cc_ansible.handle("", cfg, get_cloud(), None) @@ -385,21 +384,20 @@ def test_ansible_pull(self, m_subp1, m_subp2, m_which, cfg, expected): """verify expected ansible invocation from userdata config""" pull_type = cfg["ansible"]["install_method"] distro = get_cloud().distro - with mock.patch.dict(M_PATH + "os.environ", clear=True): - ansible_pull = ( - cc_ansible.AnsiblePullPip(distro, "ansible") - if pull_type == "pip" - else cc_ansible.AnsiblePullDistro(distro) - ) + ansible_pull = ( + cc_ansible.AnsiblePullPip(distro, "ansible") + if pull_type == "pip" + else cc_ansible.AnsiblePullDistro(distro) + ) cc_ansible.run_ansible_pull( ansible_pull, deepcopy(cfg["ansible"]["pull"]) ) if pull_type != "pip": assert m_subp2.call_args[0][0] == expected - assert m_subp2.call_args[1]["env"].get("HOME") == environ.get( + assert m_subp2.call_args[1]["update_env"].get( "HOME" - ) + ) == os.environ.get("HOME", "/root") @mock.patch(M_PATH + "validate_config") def test_do_not_run(self, m_validate): @@ -435,5 +433,5 @@ def test_ansible_env_var(self, m_which, m_subp): if isinstance(m_subp.call_args.kwargs, dict): assert ( "/etc/ansible/ansible.cfg" - == m_subp.call_args.kwargs["env"]["ansible_config"] + == m_subp.call_args.kwargs["update_env"]["ansible_config"] ) diff --git a/tests/unittests/config/test_cc_growpart.py b/tests/unittests/config/test_cc_growpart.py index 5b97f7bdbe3b..46a537fd9e3f 100644 --- a/tests/unittests/config/test_cc_growpart.py +++ b/tests/unittests/config/test_cc_growpart.py @@ -20,6 +20,7 @@ get_schema, validate_cloudconfig_schema, ) +from cloudinit.subp import SubpResult from tests.unittests.helpers import ( TestCase, does_not_raise, @@ -137,27 +138,27 @@ def tearDown(self): os.remove(self.tmppath) @mock.patch.object(os.path, "isfile", return_value=False) - @mock.patch.dict("os.environ", clear=True) def test_no_resizers_auto_is_fine(self, m_isfile): with mock.patch.object( - subp, "subp", return_value=(HELP_GROWPART_NO_RESIZE, "") + subp, "subp", return_value=SubpResult(HELP_GROWPART_NO_RESIZE, "") ) as mockobj: config = {"growpart": {"mode": "auto"}} self.handle(self.name, config, self.cloud, self.args) mockobj.assert_has_calls( [ - mock.call(["growpart", "--help"], env={"LANG": "C"}), mock.call( - ["gpart", "help"], env={"LANG": "C"}, rcs=[0, 1] + ["growpart", "--help"], update_env={"LANG": "C"} + ), + mock.call( + ["gpart", "help"], update_env={"LANG": "C"}, rcs=[0, 1] ), ] ) - @mock.patch.dict("os.environ", clear=True) def test_no_resizers_mode_growpart_is_exception(self): with mock.patch.object( - subp, "subp", return_value=(HELP_GROWPART_NO_RESIZE, "") + subp, "subp", return_value=SubpResult(HELP_GROWPART_NO_RESIZE, "") ) as mockobj: config = {"growpart": {"mode": "growpart"}} self.assertRaises( @@ -170,13 +171,12 @@ def test_no_resizers_mode_growpart_is_exception(self): ) mockobj.assert_called_once_with( - ["growpart", "--help"], env={"LANG": "C"} + ["growpart", "--help"], update_env={"LANG": "C"} ) - @mock.patch.dict("os.environ", clear=True) def test_mode_auto_prefers_growpart(self): with mock.patch.object( - subp, "subp", return_value=(HELP_GROWPART_RESIZE, "") + subp, "subp", return_value=SubpResult(HELP_GROWPART_RESIZE, "") ) as mockobj: ret = cc_growpart.resizer_factory( mode="auto", distro=mock.Mock(), devices=["/"] @@ -184,10 +184,9 @@ def test_mode_auto_prefers_growpart(self): self.assertIsInstance(ret, cc_growpart.ResizeGrowPart) mockobj.assert_called_once_with( - ["growpart", "--help"], env={"LANG": "C"} + ["growpart", "--help"], update_env={"LANG": "C"} ) - @mock.patch.dict("os.environ", {"LANG": "cs_CZ.UTF-8"}, clear=True) @mock.patch.object(temp_utils, "mkdtemp", return_value="/tmp/much-random") @mock.patch.object(stat, "S_ISDIR", return_value=False) @mock.patch.object(os.path, "samestat", return_value=True) @@ -203,7 +202,7 @@ def test_mode_auto_prefers_growpart(self): @mock.patch.object(os, "lstat", return_value="interesting metadata") def test_force_lang_check_tempfile(self, *args, **kwargs): with mock.patch.object( - subp, "subp", return_value=(HELP_GROWPART_RESIZE, "") + subp, "subp", return_value=SubpResult(HELP_GROWPART_RESIZE, "") ) as mockobj: ret = cc_growpart.resizer_factory( mode="auto", distro=mock.Mock(), devices=["/"] @@ -217,20 +216,19 @@ def test_force_lang_check_tempfile(self, *args, **kwargs): [ mock.call( ["growpart", "--dry-run", diskdev, partnum], - env={"LANG": "C", "TMPDIR": "/tmp"}, + update_env={"LANG": "C", "TMPDIR": "/tmp"}, ), mock.call( ["growpart", diskdev, partnum], - env={"LANG": "C", "TMPDIR": "/tmp"}, + update_env={"LANG": "C", "TMPDIR": "/tmp"}, ), ] ) - @mock.patch.dict("os.environ", clear=True) @mock.patch.object(os.path, "isfile", return_value=True) def test_mode_use_growfs_on_root(self, m_isfile): with mock.patch.object( - subp, "subp", return_value=("File not found", "") + subp, "subp", return_value=SubpResult("File not found", "") ) as mockobj: ret = cc_growpart.resizer_factory( mode="auto", distro=mock.Mock(), devices=["/"] @@ -239,14 +237,15 @@ def test_mode_use_growfs_on_root(self, m_isfile): mockobj.assert_has_calls( [ - mock.call(["growpart", "--help"], env={"LANG": "C"}), + mock.call( + ["growpart", "--help"], update_env={"LANG": "C"} + ), ] ) - @mock.patch.dict("os.environ", {"LANG": "cs_CZ.UTF-8"}, clear=True) def test_mode_auto_falls_back_to_gpart(self): with mock.patch.object( - subp, "subp", return_value=("", HELP_GPART) + subp, "subp", return_value=SubpResult("", HELP_GPART) ) as mockobj: ret = cc_growpart.resizer_factory( mode="auto", distro=mock.Mock(), devices=["/", "/opt"] @@ -255,18 +254,19 @@ def test_mode_auto_falls_back_to_gpart(self): mockobj.assert_has_calls( [ - mock.call(["growpart", "--help"], env={"LANG": "C"}), mock.call( - ["gpart", "help"], env={"LANG": "C"}, rcs=[0, 1] + ["growpart", "--help"], update_env={"LANG": "C"} + ), + mock.call( + ["gpart", "help"], update_env={"LANG": "C"}, rcs=[0, 1] ), ] ) @mock.patch.object(os.path, "isfile", return_value=True) - @mock.patch.dict("os.environ", {"LANG": "cs_CZ.UTF-8"}, clear=True) def test_mode_auto_falls_back_to_growfs(self, m_isfile): with mock.patch.object( - subp, "subp", return_value=("", HELP_GPART) + subp, "subp", return_value=SubpResult("", HELP_GPART) ) as mockobj: ret = cc_growpart.resizer_factory( mode="auto", distro=mock.Mock(), devices=["/"] @@ -275,7 +275,9 @@ def test_mode_auto_falls_back_to_growfs(self, m_isfile): mockobj.assert_has_calls( [ - mock.call(["growpart", "--help"], env={"LANG": "C"}), + mock.call( + ["growpart", "--help"], update_env={"LANG": "C"} + ), ] ) diff --git a/tests/unittests/config/test_cc_seed_random.py b/tests/unittests/config/test_cc_seed_random.py index 3ba2a96707de..bef01c24ccd4 100644 --- a/tests/unittests/config/test_cc_seed_random.py +++ b/tests/unittests/config/test_cc_seed_random.py @@ -209,7 +209,7 @@ def test_file_in_environment_for_command(self): # this just instists that the first time subp was called, # RANDOM_SEED_FILE was in the environment set up correctly - subp_env = [f["env"] for f in self.subp_called] + subp_env = [f["update_env"] for f in self.subp_called] self.assertEqual(subp_env[0].get("RANDOM_SEED_FILE"), self._seed_file) diff --git a/tests/unittests/distros/package_management/test_apt.py b/tests/unittests/distros/package_management/test_apt.py index 6af3ad8ed640..d261e757ae64 100644 --- a/tests/unittests/distros/package_management/test_apt.py +++ b/tests/unittests/distros/package_management/test_apt.py @@ -22,7 +22,7 @@ def test_simple_command(self, m_apt_avail, m_subp, m_which): expected_call = { "args": ["eatmydata"] + list(APT_GET_COMMAND) + ["update"], "capture": False, - "env": {"DEBIAN_FRONTEND": "noninteractive"}, + "update_env": {"DEBIAN_FRONTEND": "noninteractive"}, } assert m_subp.call_args == mock.call(**expected_call) diff --git a/tests/unittests/test_subp.py b/tests/unittests/test_subp.py index 2900745daacd..c86c9aacb3fb 100644 --- a/tests/unittests/test_subp.py +++ b/tests/unittests/test_subp.py @@ -166,17 +166,6 @@ def test_subp_reads_env(self): out, _err = subp.subp(self.printenv + ["FOO"], capture=True) self.assertEqual("FOO=BAR", out.splitlines()[0]) - def test_subp_env_and_update_env(self): - out, _err = subp.subp( - self.printenv + ["FOO", "HOME", "K1", "K2"], - capture=True, - env={"FOO": "BAR"}, - update_env={"HOME": "/myhome", "K2": "V2"}, - ) - self.assertEqual( - ["FOO=BAR", "HOME=/myhome", "K1=", "K2=V2"], out.splitlines() - ) - def test_subp_update_env(self): extra = {"FOO": "BAR", "HOME": "/root", "K1": "V1"} with mock.patch.dict("os.environ", values=extra):