示例#1
0
class TestAppVersions(unittest.TestCase):
    app_name = 'awesomeApp'
    solution = '64bit Amazon Linux 2014.03 v1.0.6 running PHP 5.5'

    def setUp(self):
        self.root_dir = os.getcwd()
        if not os.path.exists('testDir'):
            os.mkdir('testDir')

        os.chdir('testDir')

        fileoperations.create_config_file(self.app_name, 'us-west-2',
                                          self.solution)

    def tearDown(self):
        os.chdir(self.root_dir)
        shutil.rmtree('testDir')

    @mock.patch('ebcli.controllers.appversion.appversionops')
    def test_delete_particular_version_label(self, appversionops_mock):
        EB.Meta.exit_on_close = False
        self.app = EB(argv=['appversion', '--delete', 'version-label-1'])
        self.app.setup()
        self.app.run()
        self.app.close()

        appversionops_mock.delete_app_version_label.assert_called_with(
            self.app_name, 'version-label-1')

    @mock.patch('ebcli.controllers.appversion.appversionops')
    @mock.patch(
        'ebcli.controllers.appversion.elasticbeanstalk.get_application_versions'
    )
    def test_enter_interactive_mode(self, get_application_versions_mock,
                                    appversionops_mock):
        app_versions = [{
            u'ApplicationName': self.app_name,
            u'VersionLabel': 'v13'
        }, {
            u'ApplicationName': self.app_name,
            u'VersionLabel': 'v8'
        }]
        get_app_versions_response = {u'ApplicationVersions': app_versions}

        get_application_versions_mock.return_value = get_app_versions_response

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['appversion'])
        self.app.setup()
        self.app.run()
        self.app.close()

        appversionops_mock.display_versions.assert_called_with(
            self.app_name, None, app_versions)
class TestRestore(unittest.TestCase):
    def setUp(self):
        self.patcher_restore_ops = mock.patch(
            'ebcli.controllers.restore.restoreops')
        self.patcher_base_controller = mock.patch(
            'ebcli.controllers.restore.AbstractBaseController.get_app_name')
        self.mock_restore_ops = self.patcher_restore_ops.start()
        self.mock_base_controller = self.patcher_base_controller.start()

    def tearDown(self):
        self.patcher_restore_ops.stop()
        self.patcher_base_controller.stop()

    def test_restore_with_id(self):
        env_id = 'e-1234567890'

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['restore', env_id])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_restore_ops.restore.assert_called_with(env_id, None)

    def test_restore_interactive(self):
        env1 = {
            'EnvironmnetId': "e-1234567890",
            'EnvironmentName': "env1",
            'VersionLabel': "v1",
            'ApplicationName': "app1",
            'DateUpdated': (date.today() - timedelta(days=10))
        }
        env2 = {
            'EnvironmnetId': "e-0987654321",
            'EnvironmentName': "env2",
            'VersionLabel': "v2",
            'ApplicationName': "app2",
            'DateUpdated': (date.today())
        }

        self.mock_restore_ops.get_restorable_envs.return_value = [env1, env2]

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['restore'])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_restore_ops.display_environments.assert_called_with(
            [env1, env2])
示例#3
0
class TestCodeSource(unittest.TestCase):
    solution = SolutionStack(
        '64bit Amazon Linux 2015.03 v2.0.6 running PHP 5.5')
    app_name = 'ebcli-intTest-app'

    def setUp(self):
        self.patcher_io = mock.patch('ebcli.controllers.codesource.io')
        self.mock_io = self.patcher_io.start()

    def tearDown(self):
        self.patcher_io.stop()

    @mock.patch('ebcli.controllers.codesource.gitops')
    def test_case_insensative_input(self, mock_gitops):
        EB.Meta.exit_on_close = False
        self.app = EB(argv=['codesource', 'LoCaL'])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_io.echo.assert_called_once_with(
            strings['codesource.localmsg'])

    @mock.patch('ebcli.controllers.codesource.gitops')
    @mock.patch('ebcli.controllers.codesource.utils.io')
    def test_interactive_choices_codecommit(self, mock_utils_io, mock_gitops):
        mock_utils_io.prompt.side_effect = [
            '1',  # select CodeCommit
        ]

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['codesource'])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_io.echo.assert_called_with(
            prompts['codesource.codesourceprompt'])

        io_calls = [mock.call('2)', 'Local'), mock.call('1)', 'CodeCommit')]
        mock_utils_io.echo.assert_has_calls(io_calls, any_order=True)
示例#4
0
class TestLifecycle(unittest.TestCase):
    app_name = 'foo_app'

    def setUp(self):
        self.patcher_lifecycle_ops = mock.patch(
            'ebcli.controllers.lifecycle.lifecycleops')
        self.patcher_base_get_app = mock.patch(
            'ebcli.controllers.restore.AbstractBaseController.get_app_name')
        self.mock_lifecycle_ops = self.patcher_lifecycle_ops.start()
        self.mock_base_get_app = self.patcher_base_get_app.start()

    def tearDown(self):
        self.patcher_lifecycle_ops.stop()
        self.patcher_base_get_app.stop()

    def test_lifecycle_with_print_flag(self):
        self.mock_base_get_app.return_value = self.app_name

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['appversion', 'lifecycle', '--print'])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_lifecycle_ops.print_lifecycle_policy.assert_called_with(
            self.app_name)

    def test_lifecycle_no_args_spawn_interactive(self):
        self.mock_base_get_app.return_value = self.app_name

        EB.Meta.exit_on_close = False
        self.app = EB(argv=['appversion', 'lifecycle'])
        self.app.setup()
        self.app.run()
        self.app.close()

        self.mock_lifecycle_ops.print_lifecycle_policy.assert_not_called()
        self.mock_lifecycle_ops.interactive_update_lifcycle_policy.assert_called_with(
            self.app_name)
class TestStreamArgument(TestLogs):
    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_instance_logs__instance_log_streaming_is_disabled(
            self, stream_cloudwatch_logs_mock,
            instance_log_streaming_enabled_mock):
        instance_log_streaming_enabled_mock.return_value = False

        self.app = EB(argv=['logs', '--stream'])
        self.app.setup()

        with self.assertRaises(InvalidOptionsError) as context_manager:
            self.app.run()

        self.assertEqual(
            "Can't retrieve instance logs for environment MyFooEnv. Instance log streaming is disabled.",
            str(context_manager.exception))
        stream_cloudwatch_logs_mock.assert_not_called()

    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_instance_logs_with_instance_cloudwatch_log_source__instance_log_streaming_is_disabled(
            self, stream_cloudwatch_logs_mock,
            instance_log_streaming_enabled_mock):
        instance_log_streaming_enabled_mock.return_value = False

        self.app = EB(
            argv=['logs', '--stream', '--cloudwatch-log-source', 'instance'])
        self.app.setup()

        with self.assertRaises(InvalidOptionsError) as context_manager:
            self.app.run()

        self.assertEqual(
            "Can't retrieve instance logs for environment MyFooEnv. Instance log streaming is disabled.",
            str(context_manager.exception))
        stream_cloudwatch_logs_mock.assert_not_called()

    @mock.patch(
        'ebcli.controllers.logs.logsops.environment_health_streaming_enabled')
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_environment_health_logs_from_cloudwatch'
    )
    def test_logs__stream_environment_health_logs__environment_health_log_streaming_is_disabled(
            self, stream_cloudwatch_logs_mock,
            environment_health_streaming_enabled_mock):
        environment_health_streaming_enabled_mock.return_value = False

        self.app = EB(argv=[
            'logs', '--stream', '--cloudwatch-log-source', 'environment-health'
        ])
        self.app.setup()

        with self.assertRaises(InvalidOptionsError) as context_manager:
            self.app.run()

        self.assertEqual(
            """Can't retrieve environment-health logs for environment MyFooEnv. Environment-health log streaming is disabled.""",
            str(context_manager.exception))
        stream_cloudwatch_logs_mock.assert_not_called()

    @mock.patch('ebcli.controllers.logs.logsops.normalize_log_group_name')
    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.raise_if_instance_log_streaming_is_not_enabled'
    )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_instance_logs_by_default(
            self, stream_cloudwatch_logs_mock,
            raise_if_instance_log_streaming_is_not_enabled_mock,
            instance_log_streaming_enabled_mock, normalize_log_group_name):
        instance_log_streaming_enabled_mock.return_value = True
        raise_if_instance_log_streaming_is_not_enabled_mock.side_effect = None
        normalize_log_group_name.return_value = '/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log'

        self.app = EB(argv=['logs', '--stream'])
        self.app.setup()
        self.app.run()

        stream_cloudwatch_logs_mock.assert_called_with(
            log_group='/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log',
            specific_log_stream=None)

    @mock.patch('ebcli.controllers.logs.logsops.normalize_log_group_name')
    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.raise_if_instance_log_streaming_is_not_enabled'
    )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_instance_logs__cloudwatch_log_source_is_explicitly_specified(
            self, stream_cloudwatch_logs_mock,
            raise_if_instance_log_streaming_is_not_enabled_mock,
            instance_log_streaming_enabled_mock, normalize_log_group_name):
        instance_log_streaming_enabled_mock.return_value = True
        raise_if_instance_log_streaming_is_not_enabled_mock.side_effect = None
        normalize_log_group_name.return_value = '/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log'

        self.app = EB(
            argv=['logs', '--stream', '--cloudwatch-log-source', 'instance'])
        self.app.setup()
        self.app.run()

        stream_cloudwatch_logs_mock.assert_called_with(
            log_group='/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log',
            specific_log_stream=None)

    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.raise_if_instance_log_streaming_is_not_enabled'
    )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_logs_with_specified_stream_log_steaming_enabled(
            self, stream_cloudwatch_logs_mock,
            raise_if_instance_log_streaming_is_not_enabled_mock,
            instance_log_streaming_enabled_mock):
        instance_log_streaming_enabled_mock.return_value = True
        raise_if_instance_log_streaming_is_not_enabled_mock.side_effect = None

        self.app = EB(argv=[
            'logs', '--stream', '--log-group', TestLogs.SPECIFIED_LOG_GROUP
        ])
        self.app.setup()
        self.app.run()

        stream_cloudwatch_logs_mock.assert_called_with(
            specific_log_stream=None,
            log_group=
            '/aws/elasticbeanstalk/MyFooEnv/aws/elasticbeanstalk/foo/specific/error.log'
        )

    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.raise_if_instance_log_streaming_is_not_enabled'
    )
    @mock.patch(
        'ebcli.controllers.logs.logsops.stream_instance_logs_from_cloudwatch')
    def test_logs__stream_instance_logs__cloudwatch_log_source_is_explicitly_specified__log_group_specified(
            self, stream_cloudwatch_logs_mock,
            raise_if_instance_log_streaming_is_not_enabled_mock,
            instance_log_streaming_enabled_mock):
        instance_log_streaming_enabled_mock.return_value = True
        raise_if_instance_log_streaming_is_not_enabled_mock.side_effect = None

        self.app = EB(argv=[
            'logs', '--stream', '--cloudwatch-log-source', 'instance',
            '--log-group', TestLogs.SPECIFIED_LOG_GROUP
        ])
        self.app.setup()
        self.app.run()

        stream_cloudwatch_logs_mock.assert_called_with(
            specific_log_stream=None,
            log_group=
            '/aws/elasticbeanstalk/MyFooEnv/aws/elasticbeanstalk/foo/specific/error.log'
        )

    @mock.patch('ebcli.controllers.logs.logsops.normalize_log_group_name')
    @mock.patch('ebcli.controllers.logs.logsops.instance_log_streaming_enabled'
                )
    @mock.patch(
        'ebcli.controllers.logs.logsops.raise_if_instance_log_streaming_is_not_enabled'
    )
    @mock.patch(
        'ebcli.controllers.logs.logsops.retrieve_cloudwatch_instance_logs')
    def test_logs__get_logs__zip_logs__instance_log_streaming_to_cloudwatch_enabled(
            self, retrieve_cloudwatch_instance_logs_mock,
            raise_if_instance_log_streaming_is_not_enabled_mock,
            instance_log_streaming_enabled_mock, normalize_log_group_name):
        instance_log_streaming_enabled_mock.return_value = True
        raise_if_instance_log_streaming_is_not_enabled_mock.side_effect = None
        retrieve_cloudwatch_instance_logs_mock.return_value = None
        normalize_log_group_name.return_value = '/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log'

        self.app = EB(argv=['logs', '--zip'])
        self.app.setup()
        self.app.run()

        retrieve_cloudwatch_instance_logs_mock.assert_called_with(
            '/aws/elasticbeanstalk/MyFooEnv/var/log/eb-activity.log',
            'bundle',
            do_zip=True,
            specific_log_stream=None)

    @mock.patch('ebcli.controllers.logs.logsops.enable_cloudwatch_logs')
    def test_logs__default_option_cloudwatch_logs(self,
                                                  enable_cloudwatch_logs_mock):
        EB.Meta.exit_on_close = False
        self.app = EB(argv=['logs', '--cloudwatch-logs'])
        self.app.setup()
        self.app.run()
        self.app.close()

        enable_cloudwatch_logs_mock.enable_cloudwatch_logs(TestLogs.ENV_NAME)

    @mock.patch('ebcli.controllers.logs.logsops.enable_cloudwatch_logs')
    def test_logs__enable_cloudwatch_logs(self, enable_cloudwatch_logs_mock):
        EB.Meta.exit_on_close = False
        self.app = EB(argv=['logs', '--cloudwatch-logs', 'enable'])
        self.app.setup()
        self.app.run()
        self.app.close()

        enable_cloudwatch_logs_mock.enable_cloudwatch_logs(TestLogs.ENV_NAME)

    @mock.patch('ebcli.controllers.logs.logsops.disable_cloudwatch_logs')
    def test_logs__disable_cloudwatch_logs(self, disable_cloudwatch_logs_mock):
        EB.Meta.exit_on_close = False
        self.app = EB(argv=['logs', '--cloudwatch-logs', 'disable'])
        self.app.setup()
        self.app.run()
        self.app.close()

        disable_cloudwatch_logs_mock.disable_cloudwatch_logs(TestLogs.ENV_NAME)