diff --git a/awslimitchecker/services/elasticache.py b/awslimitchecker/services/elasticache.py index 634f7586..1e7807b4 100644 --- a/awslimitchecker/services/elasticache.py +++ b/awslimitchecker/services/elasticache.py @@ -39,6 +39,7 @@ import abc # noqa from boto.elasticache.layer1 import ElastiCacheConnection +from boto.exception import BotoServerError import logging from .base import _AwsService @@ -121,10 +122,22 @@ def _find_usage_parameter_groups(self): def _find_usage_security_groups(self): """find usage for elasticache security groups""" - groups = self.conn.describe_cache_security_groups()[ - 'DescribeCacheSecurityGroupsResponse'][ - 'DescribeCacheSecurityGroupsResult'][ - 'CacheSecurityGroups'] + try: + # If EC2-Classic isn't available (e.g., a new account) + # this method will fail with: + # Code: "InvalidParameterValue" + # Message: "Use of cache security groups is not permitted in + # this API version for your account." + # Type: "Sender" + groups = self.conn.describe_cache_security_groups()[ + 'DescribeCacheSecurityGroupsResponse'][ + 'DescribeCacheSecurityGroupsResult'][ + 'CacheSecurityGroups'] + except BotoServerError: + logger.debug("caught BotoServerError checking ElastiCache security " + "groups (account without EC2-Classic?)") + groups = [] + self.limits['Security Groups']._add_current_usage( len(groups), aws_type='WS::ElastiCache::SecurityGroup' diff --git a/awslimitchecker/tests/services/test_elasticache.py b/awslimitchecker/tests/services/test_elasticache.py index 2a6f373b..218b57de 100644 --- a/awslimitchecker/tests/services/test_elasticache.py +++ b/awslimitchecker/tests/services/test_elasticache.py @@ -38,8 +38,8 @@ """ import sys -# TODO confirm this is the correct import from boto.elasticache.layer1 import ElastiCacheConnection +from boto.exception import BotoServerError from awslimitchecker.services.elasticache import _ElastiCacheService # https://code.google.com/p/mock/issues/detail?id=249 @@ -469,6 +469,25 @@ def test_find_usage_security_groups(self): assert len(usage) == 1 assert usage[0].get_value() == 2 + def test_find_usage_security_groups_exception(self): + """test find usage for security groups""" + def se_exc(): + raise BotoServerError(None, None, None) + + mock_conn = Mock(spec_set=ElastiCacheConnection) + mock_conn.describe_cache_security_groups.side_effect = se_exc + cls = _ElastiCacheService(21, 43) + cls.conn = mock_conn + cls._find_usage_security_groups() + + assert mock_conn.mock_calls == [ + call.describe_cache_security_groups(), + ] + + usage = cls.limits['Security Groups'].get_current_usage() + assert len(usage) == 1 + assert usage[0].get_value() == 0 + def test_required_iam_permissions(self): cls = _ElastiCacheService(21, 43) assert cls.required_iam_permissions() == [