def test_default_port(self): runner = FabricRunner( validate_connection=False, user='******', host='host', password='******') self.assertTrue(runner.port, 22)
def create_runner(agent_config, validate_connection): if agent_config.is_local: runner = LocalCommandRunner(logger=ctx.logger) elif not agent_config.is_remote: runner = StubRunner() else: host = agent_config['ip'] try: if agent_config.is_windows: runner = WinRMRunner(host=host, port=agent_config.get('port'), user=agent_config['user'], password=agent_config.get('password'), protocol=agent_config.get('protocol'), uri=agent_config.get('uri'), logger=ctx.logger, validate_connection=validate_connection) else: runner = FabricRunner( host=host, port=agent_config.get('port'), user=agent_config['user'], key=agent_config.get('key'), password=agent_config.get('password'), fabric_env=agent_config.get('fabric_env'), logger=ctx.logger, validate_connection=validate_connection) except CommandExecutionError as e: message = e.error if not message: message = 'Failed connecting to host on {0}'.format(host) return ctx.operation.retry(message=message) return runner
def test_no_key_no_password(): with pytest.raises(exceptions.AgentInstallerConfigurationError, match='.*Must specify either key or password.*'): FabricRunner( validate_connection=False, host='host', user='******', )
def test_no_user(): with pytest.raises(exceptions.AgentInstallerConfigurationError, match='.*Missing user.*'): FabricRunner( validate_connection=False, host='host', password='******', )
def test_exception_message(self): """Exception message is the same one used by fabric.""" expected_message = '<message>' runner = FabricRunner( validate_connection=False, user='******', host='host', password='******', ) fabric_api_path = ( 'cloudify_agent.installer.runners.fabric_runner.fabric_api') with patch(fabric_api_path) as fabric_api: fabric_api.run.side_effect = Exception(expected_message) with self.assertRaises(FabricCommandExecutionError) as context: runner.run('a command') self.assertEqual(context.exception.error, expected_message)
def test_exception_message(self): """Exception message is the same one used by fabric.""" expected_message = '<message>' runner = FabricRunner( validate_connection=False, user='******', host='host', password='******', ) fabric_api_path = ( 'cloudify_agent.installer.runners.fabric_runner.fabric_api' ) with patch(fabric_api_path) as fabric_api: fabric_api.run.side_effect = Exception(expected_message) with self.assertRaises(FabricCommandExecutionError) as context: runner.run('a command') self.assertEqual(context.exception.error, expected_message)
def test_exception_message(self): """Exception message is the same one used by fabric.""" expected_message = '<message>' runner = FabricRunner( validate_connection=False, user='******', host='host', password='******', ) connection_path = ( 'cloudify_agent.installer.runners.fabric_runner.Connection') with patch(connection_path) as conn_factory: conn_factory.return_value.run.return_value = Mock( return_code=1, stderr=expected_message) try: runner.run('a command') except FabricCommandExecutionException as e: self.assertEqual(e.error, expected_message) else: self.fail('FabricCommandExecutionException not raised')
def wrapper(*args, **kwargs): cloudify_agent = kwargs.get('cloudify_agent') or {} agent_config = kwargs.get('agent_config') or {} cloudify_agent.update(agent_config) # first prepare all connection details configuration.prepare_connection(cloudify_agent) # create the correct runner according to os # and local/remote execution. we need this runner now because it # will be used to determine the agent basedir in case it wasn't # explicitly set if cloudify_agent['local']: runner = LocalCommandRunner(logger=ctx.logger) elif cloudify_agent['remote_execution'] is False: runner = StubRunner() else: host = cloudify_agent['ip'] try: if cloudify_agent['windows']: runner = WinRMRunner( host=host, port=cloudify_agent.get('port'), user=cloudify_agent['user'], password=cloudify_agent['password'], protocol=cloudify_agent.get('protocol'), uri=cloudify_agent.get('uri'), logger=ctx.logger, validate_connection=validate_connection) else: runner = FabricRunner( host=host, port=cloudify_agent.get('port'), user=cloudify_agent['user'], key=cloudify_agent.get('key'), password=cloudify_agent.get('password'), fabric_env=cloudify_agent.get('fabric_env'), logger=ctx.logger, validate_connection=validate_connection) except CommandExecutionError as e: message = e.error if not message: message = 'Failed connecting to host on {0}'.format( host) return ctx.operation.retry(message=message) # now we can create all other agent attributes configuration.prepare_agent(cloudify_agent, runner) # create the correct installer according to os # and local/remote execution if cloudify_agent['local']: installer = prepare_local_installer(cloudify_agent, ctx.logger) elif cloudify_agent['windows']: installer = RemoteWindowsAgentInstaller( cloudify_agent, runner, ctx.logger) else: installer = RemoteLinuxAgentInstaller(cloudify_agent, runner, ctx.logger) kwargs['cloudify_agent'] = cloudify_agent kwargs['installer'] = installer try: return func(*args, **kwargs) finally: if hasattr(installer.runner, 'close'): installer.runner.close()
def test_default_port(): runner = FabricRunner(validate_connection=False, user='******', host='host', password='******') assert runner.port == 22