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='******',
        )
Example #5
0
    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)
Example #7
0
    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')
Example #8
0
        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