def test_less_simple(self): d = {"zzz": "bar", "aaa": "blam", "abcdefghijklmnopqrstuv": "someothervalue"} res = dict2cols(d) assert ( res == "" + "aaa blam\n" + "abcdefghijklmnopqrstuv someothervalue\n" + "zzz bar\n" )
def test_less_simple(self): d = { 'zzz': 'bar', 'aaa': 'blam', 'abcdefghijklmnopqrstuv': 'someothervalue', } res = dict2cols(d) assert res == '' + \ 'aaa blam\n' + \ 'abcdefghijklmnopqrstuv someothervalue\n' + \ 'zzz bar\n'
def test_empty(self): d = {} res = dict2cols(d) assert res == ''
def test_separator(self): d = {'foo': 'bar', 'baz': 'blam'} res = dict2cols(d, spaces=4, separator='.') assert res == 'baz....blam\nfoo....bar\n'
def test_spaces(self): d = {'foo': 'bar', 'baz': 'blam'} res = dict2cols(d, spaces=4) assert res == 'baz blam\nfoo bar\n'
def test_simple(self): d = {'foo': 'bar', 'baz': 'blam'} res = dict2cols(d) assert res == 'baz blam\nfoo bar\n'
def test_verify_limits(self, checker_args, creds_type, service_name, use_ta, expect_api_source, allow_endpoint_error): """ This essentially replicates what's done when awslimitchecker is called from the command line with ``-l``. This replicates some of the internal logic of :py:class:`~awslimitchecker.runner.Runner`. The main purpose is: 1. to allow passing in an existing :py:class:`awslimitchecker.checker.Checker` instance for testing the various authentication options, and, 2. to verify that at least some limits are found This method is largely a duplication of :py:meth:`~awslimitchecker.runner.Runner.list_limits`. :param checker_args: dict of kwargs to pass to :py:class:`awslimitchecker.checker.Checker` constructor :type checker_args: dict :param creds_type: Type of credentials to use; 'normal', 'sts', or 'sts_mfa' :type creds_type: str :param service_name: the Service name to test limits for; if None, check for all. :type service_name: str :param use_ta: whether or not to use TrustedAdvisor :type use_ta: bool :param expect_api_source: whether or not to expect a limit with an API source :type expect_api_source: bool :param allow_endpoint_error: passed on to :py:meth:`~.support.LogRecordHelper.unexpected_logs` :type allow_endpoint_error: bool """ # destroy boto3's session, so it creates a new one boto3.DEFAULT_SESSION = None # set the env vars to the creds we want if creds_type == 'normal': creds = self.normal_creds() elif creds_type == 'sts': creds = self.sts_creds() elif creds_type == 'sts_mfa': creds = self.sts_mfa_creds() checker_args['mfa_serial_number'] = creds[2] else: raise RuntimeError("unknown creds type: '%s'" % creds_type) os.environ['AWS_ACCESS_KEY_ID'] = creds[0] os.environ['AWS_SECRET_ACCESS_KEY'] = creds[1] # this has to be generated inside the method, not in the method that # yields it if 'mfa_token' in checker_args: checker_args['mfa_token'] = self.totp_code(creds[3]) # pytest-capturelog looked good, but won't work with our yielded # test functions, per https://github.com/pytest-dev/pytest/issues/227 with LogCapture() as l: checker = AwsLimitChecker(**checker_args) limits = checker.get_limits(use_ta=use_ta, service=service_name) logs = LogRecordHelper(l) have_api_source = False data = {} for svc in sorted(limits.keys()): for lim in sorted(limits[svc].keys()): src_str = '' if limits[svc][lim].get_limit_source() == SOURCE_API: have_api_source = True src_str = ' (API)' if limits[svc][lim].get_limit_source() == SOURCE_TA: src_str = ' (TA)' data["{s}/{l}".format(s=svc, l=lim)] = '{v}{t}'.format( v=limits[svc][lim].get_limit(), t=src_str) # check that we connected to the right region logs.verify_region(checker_args.get('region', REGION)) # this is the normal Runner output print(dict2cols(data)) if expect_api_source: assert have_api_source is True # ensure we didn't log anything at WARN or above, except possibly # a TrustedAdvisor subscription required message records = logs.unexpected_logs( allow_endpoint_error=allow_endpoint_error) assert len(records) == 0, "awslimitchecker emitted unexpected log " \ "messages at WARN or higher: \n%s" % "\n".join(records) polls = logs.num_ta_polls assert polls == 0, "awslimitchecker should have polled Trusted " \ "Advisor ZERO times, but polled %s times" % polls
def verify_limits(self, checker_args, creds, service_name, use_ta, expect_api_source): """ This essentially replicates what's done when awslimitchecker is called from the command line with ``-l``. This replicates some of the internal logic of :py:class:`~awslimitchecker.runner.Runner`. The main purpose is: 1. to allow passing in an existing :py:class:`awslimitchecker.checker.Checker` instance for testing the various authentication options, and, 2. to verify that at least some limits are found This method is largely a duplication of :py:meth:`~awslimitchecker.runner.Runner.list_limits`. :param checker_args: dict of kwargs to pass to :py:class:`awslimitchecker.checker.Checker` constructor :type checker_args: dict :param creds: AWS access key ID and secret key :type creds: tuple :param service_name: the Service name to test limits for; if None, check for all. :type service_name: str :param use_ta: whether or not to use TrustedAdvisor :type use_ta: bool :param expect_api_source: whether or not to expect a limit with an API source :type expect_api_source: bool """ # clear the Connectable credentials Connectable.credentials = None # destroy boto3's session, so it creates a new one boto3.DEFAULT_SESSION = None # set the env vars to the creds we want os.environ['AWS_ACCESS_KEY_ID'] = creds[0] os.environ['AWS_SECRET_ACCESS_KEY'] = creds[1] # this has to be generated inside the method, not in the method that # yields it if 'mfa_token' in checker_args: checker_args['mfa_token'] = self.totp_code(creds[3]) # pytest-capturelog looked good, but won't work with our yielded # test functions, per https://github.com/pytest-dev/pytest/issues/227 with LogCapture() as l: checker = AwsLimitChecker(**checker_args) limits = checker.get_limits(use_ta=use_ta, service=service_name) logs = LogRecordHelper(l) have_api_source = False data = {} for svc in sorted(limits.keys()): for lim in sorted(limits[svc].keys()): src_str = '' if limits[svc][lim].get_limit_source() == SOURCE_API: have_api_source = True src_str = ' (API)' if limits[svc][lim].get_limit_source() == SOURCE_TA: src_str = ' (TA)' data["{s}/{l}".format(s=svc, l=lim)] = '{v}{t}'.format( v=limits[svc][lim].get_limit(), t=src_str) # this is the normal Runner output print(dict2cols(data)) if expect_api_source: assert have_api_source is True # ensure we didn't log anything at WARN or above, except possibly # a TrustedAdvisor subscription required message records = logs.unexpected_logs() assert len(records) == 0, "awslimitchecker emitted unexpected log " \ "messages at WARN or higher: \n%s" % "\n".join(records)
def verify_usage(self, checker_args, creds, service_name, expect_usage, allow_endpoint_error): """ This essentially replicates what's done when awslimitchecker is called from the command line with ``-u``. This replicates some of the internal logic of :py:class:`~awslimitchecker.runner.Runner`. The main purpose is: 1. to allow passing in an existing :py:class:`awslimitchecker.checker.Checker` instance for testing the various authentication options, and, 2. to verify that at least some usage is found This method is largely a duplication of :py:meth:`~awslimitchecker.runner.Runner.show_usage`. :param checker_args: dict of kwargs to pass to :py:class:`awslimitchecker.checker.Checker` constructor :type checker_args: dict :param creds: AWS access key ID and secret key :type creds: tuple :param service_name: the Service name to test usage for; if None, check for all. :type service_name: str :param expect_usage: whether or not to expect non-zero usage :type expect_usage: bool :param allow_endpoint_error: passed on to :py:meth:`~.support.LogRecordHelper.unexpected_logs` :type allow_endpoint_error: bool """ # clear the Connectable credentials Connectable.credentials = None # destroy boto3's session, so it creates a new one boto3.DEFAULT_SESSION = None # set the env vars to the creds we want os.environ['AWS_ACCESS_KEY_ID'] = creds[0] os.environ['AWS_SECRET_ACCESS_KEY'] = creds[1] # this has to be generated inside the method, not in the method that # yields it if 'mfa_token' in checker_args: checker_args['mfa_token'] = self.totp_code(creds[3]) # pytest-capturelog looked good, but won't work with our yielded # test functions, per https://github.com/pytest-dev/pytest/issues/227 with LogCapture() as l: checker = AwsLimitChecker(**checker_args) checker.find_usage(service=service_name) limits = checker.get_limits(service=service_name) logs = LogRecordHelper(l) have_usage = False data = {} for svc in sorted(limits.keys()): for lim in sorted(limits[svc].keys()): limit = limits[svc][lim] data["{s}/{l}".format( s=svc, l=lim)] = '{v}'.format(v=limit.get_current_usage_str()) for usage in limit.get_current_usage(): if usage.get_value() != 0: have_usage = True # this is the normal Runner command line output print(dict2cols(data)) if expect_usage: assert have_usage is True # ensure we didn't log anything at WARN or above, except possibly # a TrustedAdvisor subscription required message records = logs.unexpected_logs( allow_endpoint_error=allow_endpoint_error) assert len(records) == 0, "awslimitchecker emitted unexpected log " \ "messages at WARN or higher: \n%s" % "\n".join(records)
def test_simple(self): d = {"foo": "bar", "baz": "blam"} res = dict2cols(d) assert res == "baz blam\nfoo bar\n"
def test_separator(self): d = {"foo": "bar", "baz": "blam"} res = dict2cols(d, spaces=4, separator=".") assert res == "baz....blam\nfoo....bar\n"
def test_spaces(self): d = {"foo": "bar", "baz": "blam"} res = dict2cols(d, spaces=4) assert res == "baz blam\nfoo bar\n"
def test_verify_limits(self, checker_args, creds_type, service_name, use_ta, expect_api_source, allow_endpoint_error): """ This essentially replicates what's done when awslimitchecker is called from the command line with ``-l``. This replicates some of the internal logic of :py:class:`~awslimitchecker.runner.Runner`. The main purpose is: 1. to allow passing in an existing :py:class:`awslimitchecker.checker.Checker` instance for testing the various authentication options, and, 2. to verify that at least some limits are found This method is largely a duplication of :py:meth:`~awslimitchecker.runner.Runner.list_limits`. :param checker_args: dict of kwargs to pass to :py:class:`awslimitchecker.checker.Checker` constructor :type checker_args: dict :param creds_type: Type of credentials to use; 'normal', 'sts', or 'sts_mfa' :type creds_type: str :param service_name: the Service name to test limits for; if None, check for all. :type service_name: str :param use_ta: whether or not to use TrustedAdvisor :type use_ta: bool :param expect_api_source: whether or not to expect a limit with an API source :type expect_api_source: bool :param allow_endpoint_error: passed on to :py:meth:`~.support.LogRecordHelper.unexpected_logs` :type allow_endpoint_error: bool """ # destroy boto3's session, so it creates a new one boto3.DEFAULT_SESSION = None # set the env vars to the creds we want if creds_type == 'normal': creds = self.normal_creds() elif creds_type == 'sts': creds = self.sts_creds() elif creds_type == 'sts_mfa': creds = self.sts_mfa_creds() checker_args['mfa_serial_number'] = creds[2] else: raise RuntimeError("unknown creds type: '%s'" % creds_type) os.environ['AWS_ACCESS_KEY_ID'] = creds[0] os.environ['AWS_SECRET_ACCESS_KEY'] = creds[1] # this has to be generated inside the method, not in the method that # yields it if 'mfa_token' in checker_args: checker_args['mfa_token'] = self.totp_code(creds[3]) # pytest-capturelog looked good, but won't work with our yielded # test functions, per https://github.com/pytest-dev/pytest/issues/227 with LogCapture() as l: checker = AwsLimitChecker(**checker_args) limits = checker.get_limits(use_ta=use_ta, service=service_name) logs = LogRecordHelper(l) have_api_source = False data = {} for svc in sorted(limits.keys()): for lim in sorted(limits[svc].keys()): src_str = '' if limits[svc][lim].get_limit_source() == SOURCE_API: have_api_source = True src_str = ' (API)' if limits[svc][lim].get_limit_source() == SOURCE_TA: src_str = ' (TA)' data["{s}/{l}".format(s=svc, l=lim)] = '{v}{t}'.format( v=limits[svc][lim].get_limit(), t=src_str) # check that we connected to the right region logs.verify_region(checker_args.get('region', REGION)) # this is the normal Runner output print(dict2cols(data)) if expect_api_source: assert have_api_source is True # ensure we didn't log anything at WARN or above, except possibly # a TrustedAdvisor subscription required message records = logs.unexpected_logs( allow_endpoint_error=allow_endpoint_error ) assert len(records) == 0, "awslimitchecker emitted unexpected log " \ "messages at WARN or higher: \n%s" % "\n".join(records) polls = logs.num_ta_polls assert polls == 1, "awslimitchecker should have polled Trusted " \ "Advisor once, but polled %s times" % polls