diff --git a/tripleoclient/tests/fakes.py b/tripleoclient/tests/fakes.py index 55495d90c..6ce95be18 100644 --- a/tripleoclient/tests/fakes.py +++ b/tripleoclient/tests/fakes.py @@ -51,6 +51,19 @@ class FakeHandle(object): return +class FakeFile(FakeHandle): + def __init__(self, contents): + self.contents = contents + + def read(self): + if not self.contents: + raise ValueError('I/O operation on closed file') + return self.contents + + def close(self): + self.contents = None + + class FakeWebSocket(FakeHandle): def wait_for_messages(self, timeout=None): diff --git a/tripleoclient/tests/v1/overcloud_roles/test_overcloud_roles.py b/tripleoclient/tests/v1/overcloud_roles/test_overcloud_roles.py index 5c98a3676..9a41fc2ba 100644 --- a/tripleoclient/tests/v1/overcloud_roles/test_overcloud_roles.py +++ b/tripleoclient/tests/v1/overcloud_roles/test_overcloud_roles.py @@ -77,6 +77,8 @@ class TestOvercloudRolesGenerateData(fakes.TestDeployOvercloud): generate_roles_mock.return_value = 'foo' capture_mock = mock.MagicMock() self.cmd._capture_output = capture_mock + stop_capture_mock = mock.MagicMock() + self.cmd._stop_capture_output = stop_capture_mock arglist = ['--roles-path', '/tmp', 'Controller', 'Compute'] verifylist = [ @@ -93,6 +95,7 @@ class TestOvercloudRolesGenerateData(fakes.TestDeployOvercloud): generate_roles_mock.assert_called_once_with('/tmp', ['Controller', 'Compute'], True) + stop_capture_mock.assert_called_once_with(None) @mock.patch( 'tripleo_common.utils.roles.generate_roles_data_from_directory') @@ -106,6 +109,8 @@ class TestOvercloudRolesGenerateData(fakes.TestDeployOvercloud): generate_roles_mock.return_value = 'foo' capture_mock = mock.MagicMock() self.cmd._capture_output = capture_mock + stop_capture_mock = mock.MagicMock() + self.cmd._stop_capture_output = stop_capture_mock arglist = ['--roles-path', '/tmp', '-o', 'foo.yaml', 'Controller', 'Compute'] @@ -124,6 +129,7 @@ class TestOvercloudRolesGenerateData(fakes.TestDeployOvercloud): generate_roles_mock.assert_called_once_with('/tmp', ['Controller', 'Compute'], True) + stop_capture_mock.assert_called_once_with('foo.yaml') @mock.patch('tripleo_common.utils.roles.get_roles_list_from_directory') @mock.patch('os.path.realpath') diff --git a/tripleoclient/tests/workflows/test_deployment.py b/tripleoclient/tests/workflows/test_deployment.py index cce59253f..7b6dae359 100644 --- a/tripleoclient/tests/workflows/test_deployment.py +++ b/tripleoclient/tests/workflows/test_deployment.py @@ -17,6 +17,7 @@ import mock from osc_lib.tests import utils from tripleoclient import exceptions +from tripleoclient.tests.fakes import FakeFile from tripleoclient.workflows import deployment @@ -60,9 +61,7 @@ class TestDeploymentWorkflows(utils.TestCommand): ssh_key = 'test-key' mock_tempfile.mkdtemp.return_value = '/foo' - mock_read = mock.Mock() - mock_read.read.return_value = 'key' - mock_open.return_value = mock_read + mock_open.return_value = FakeFile('key') mock_state = mock.Mock() mock_state.state = 'SUCCESS' self.workflow.executions.get.return_value = mock_state @@ -102,9 +101,7 @@ class TestDeploymentWorkflows(utils.TestCommand): ssh_key = 'test-key' mock_tempfile.mkdtemp.return_value = '/foo' - mock_read = mock.Mock() - mock_read.read.return_value = 'key' - mock_open.return_value = mock_read + mock_open.side_effect = [FakeFile('pubkey'), FakeFile('privkey')] mock_state = mock.Mock() mock_state.state = 'ERROR' mock_state.to_dict.return_value = dict(state_info='an error') diff --git a/tripleoclient/v1/container_image.py b/tripleoclient/v1/container_image.py index db0652024..e29daa55d 100644 --- a/tripleoclient/v1/container_image.py +++ b/tripleoclient/v1/container_image.py @@ -436,7 +436,8 @@ class PrepareImageFiles(command.Command): modify_role = parsed_args.modify_role append_tag = time.strftime('-modified-%Y%m%d%H%M%S') if parsed_args.modify_vars: - modify_vars = yaml.safe_load(open(parsed_args.modify_vars).read()) + with open(parsed_args.modify_vars) as m: + modify_vars = yaml.safe_load(m.read()) prepare_data = kolla_builder.container_images_prepare( excludes=parsed_args.excludes, diff --git a/tripleoclient/v1/overcloud_config.py b/tripleoclient/v1/overcloud_config.py index e13559785..398410970 100644 --- a/tripleoclient/v1/overcloud_config.py +++ b/tripleoclient/v1/overcloud_config.py @@ -99,6 +99,7 @@ class DownloadConfig(command.Command): self.log.debug("config-download tempurl: %s" % tempurl) f = request.urlopen(tempurl) tarball_contents = f.read() + f.close() tarball_name = "%s-config.tar.gz" % name tarball_path = os.path.join(config_dir, tarball_name) diff --git a/tripleoclient/v1/overcloud_roles.py b/tripleoclient/v1/overcloud_roles.py index 483addf5c..3b0037114 100644 --- a/tripleoclient/v1/overcloud_roles.py +++ b/tripleoclient/v1/overcloud_roles.py @@ -64,6 +64,11 @@ class RolesGenerate(RolesBaseCommand): if filename is not None: sys.stdout = open(filename, 'w') + def _stop_capture_output(self, filename=None): + """Stop capturing stdout to a file if provided""" + if filename is not None: + sys.stdout.close() + def take_action(self, parsed_args): """Generate roles_data.yaml from imputed roles @@ -83,6 +88,7 @@ class RolesGenerate(RolesBaseCommand): roles_path, list(requested_roles.keys()), parsed_args.skip_validate) sys.stdout.write(roles_data) + self._stop_capture_output(parsed_args.output_file) class RoleList(RolesBaseCommand): diff --git a/tripleoclient/workflows/deployment.py b/tripleoclient/workflows/deployment.py index a21039184..3eeb98df1 100644 --- a/tripleoclient/workflows/deployment.py +++ b/tripleoclient/workflows/deployment.py @@ -189,11 +189,15 @@ def wait_for_ssh_port(host): "Timed out waiting for port 22 from %s" % host) # first check ipv4 then check ipv6 try: - socket.socket().connect((host, 22)) + sock = socket.socket() + sock.connect((host, 22)) + sock.close() return except socket.error: try: - socket.socket(socket.AF_INET6).connect((host, 22)) + sock = socket.socket(socket.AF_INET6) + sock.connect((host, 22)) + sock.close() return except socket.error: pass @@ -244,7 +248,10 @@ def enable_ssh_admin(log, clients, plan_name, hosts, ssh_user, ssh_key): tmp_key_command = ["ssh-keygen", "-N", "", "-t", "rsa", "-b", "4096", "-f", tmp_key_private, "-C", tmp_key_comment] subprocess.check_call(tmp_key_command, stderr=subprocess.STDOUT) - tmp_key_public_contents = open(tmp_key_public).read() + with open(tmp_key_public) as pubkey: + tmp_key_public_contents = pubkey.read() + with open(tmp_key_private) as privkey: + tmp_key_private_contents = privkey.read() for host in hosts: wait_for_ssh_port(host) @@ -265,7 +272,7 @@ def enable_ssh_admin(log, clients, plan_name, hosts, ssh_user, ssh_key): workflow_input = { "ssh_user": ssh_user, "ssh_servers": hosts, - "ssh_private_key": open(tmp_key_private).read(), + "ssh_private_key": tmp_key_private_contents, "plan_name": plan_name } @@ -329,7 +336,8 @@ def config_download(log, clients, stack, templates, if output_dir: workflow_input.update(dict(work_dir=output_dir)) if override_ansible_cfg: - override_ansible_cfg_contents = open(override_ansible_cfg).read() + with open(override_ansible_cfg) as cfg: + override_ansible_cfg_contents = cfg.read() workflow_input.update( dict(override_ansible_cfg=override_ansible_cfg_contents))