Skip to content

Commit

Permalink
Merge pull request #509 from /issues/501
Browse files Browse the repository at this point in the history
Fix #501 - update for new calculation of VPC/Network interfaces per Region limit
  • Loading branch information
jantman committed Dec 2, 2020
2 parents a74e18f + 23928b5 commit 21b73e8
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 118 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ All Changes
* Remove the ``EC2/Security groups per VPC`` limit, which no longer exists.
* Add the new ``EC2/VPC security groups per Region`` limit.

* `Issue #501 <https://github.com/jantman/awslimitchecker/issues/501>`__ - Update ``VPC/Network interfaces per Region`` limit for new calculation method.

.. _changelog.9_0_0:

9.0.0 (2020-09-22)
Expand Down
26 changes: 1 addition & 25 deletions awslimitchecker/services/vpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@

logger = logging.getLogger(__name__)

DEFAULT_ENI_LIMIT = 350


class _VpcService(_AwsService):

Expand Down Expand Up @@ -344,36 +342,14 @@ def get_limits(self):
limits['Network interfaces per Region'] = AwsLimit(
'Network interfaces per Region',
self,
DEFAULT_ENI_LIMIT,
5000,
self.warning_threshold,
self.critical_threshold,
limit_type='AWS::EC2::NetworkInterface'
)
self.limits = limits
return limits

def _update_limits_from_api(self):
"""
Query EC2's DescribeAccountAttributes API action and
update the network interface limit, as needed. Updates ``self.limits``.
More info on the network interface limit, from the docs:
'This limit is the greater of either the default limit (350) or your
On-Demand Instance limit multiplied by 5.
The default limit for On-Demand Instances is 20.'
"""
self.connect()
self.connect_resource()
logger.info("Querying EC2 DescribeAccountAttributes for limits")
attribs = self.conn.describe_account_attributes()
for attrib in attribs['AccountAttributes']:
if attrib['AttributeName'] == 'max-instances':
val = attrib['AttributeValues'][0]['AttributeValue']
if int(val) * 5 > DEFAULT_ENI_LIMIT:
limit_name = 'Network interfaces per Region'
self.limits[limit_name]._set_api_limit(int(val) * 5)
logger.debug("Done setting limits from API")

def required_iam_permissions(self):
"""
Return a list of IAM Actions required for this Service to function
Expand Down
43 changes: 1 addition & 42 deletions awslimitchecker/tests/services/result_fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ class EBS(object):


class VPC(object):

test_find_usage_vpcs = {
'Vpcs': [
{
Expand Down Expand Up @@ -620,48 +621,6 @@ class VPC(object):
}
}

test_update_limits_from_api_high_max_instances = {
'ResponseMetadata': {
'HTTPStatusCode': 200,
'RequestId': '16b85906-ab0d-4134-b8bb-df3e6120c6c7'
},
'AccountAttributes': [
{
'AttributeName': 'max-instances',
'AttributeValues': [
{
'AttributeValue': '400'
}
]
}
]
}

test_update_limits_from_api_low_max_instances = {
'ResponseMetadata': {
'HTTPStatusCode': 200,
'RequestId': '16b85906-ab0d-4134-b8bb-df3e6120c6c7'
},
'AccountAttributes': [
{
'AttributeName': 'max-instances',
'AttributeValues': [
{
'AttributeValue': '50'
}
]
},
{
'AttributeName': 'something-else',
'AttributeValues': [
{
'AttributeValue': '1'
}
]
}
]
}


class RDS(object):
test_find_usage_instances = []
Expand Down
52 changes: 1 addition & 51 deletions awslimitchecker/tests/services/test_vpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@

import sys
from awslimitchecker.tests.services import result_fixtures
from awslimitchecker.services.vpc import _VpcService, DEFAULT_ENI_LIMIT
from awslimitchecker.services.vpc import _VpcService

from botocore.exceptions import ClientError

Expand Down Expand Up @@ -382,56 +382,6 @@ def test_find_usage_network_interfaces(self):
}]),
]

def test_update_limits_from_api_high_max_instances(self):
fixtures = result_fixtures.VPC()
response = fixtures.test_update_limits_from_api_high_max_instances

mock_conn = Mock()
mock_client_conn = Mock()
mock_client_conn.describe_account_attributes.return_value = response

cls = _VpcService(21, 43, {}, None)
cls.resource_conn = mock_conn
cls.conn = mock_client_conn
with patch('awslimitchecker.services.vpc.logger') as mock_logger:
cls._update_limits_from_api()
assert mock_conn.mock_calls == []
assert mock_client_conn.mock_calls == [
call.describe_account_attributes()
]
assert mock_logger.mock_calls == [
call.info("Querying EC2 DescribeAccountAttributes for limits"),
call.debug('Done setting limits from API')
]
assert cls.limits['Network interfaces per Region'].api_limit == 2000
assert cls.limits['Network interfaces per Region'].get_limit() == 2000

def test_update_limits_from_api_low_max_instances(self):
fixtures = result_fixtures.VPC()
response = fixtures.test_update_limits_from_api_low_max_instances

mock_conn = Mock()
mock_client_conn = Mock()
mock_client_conn.describe_account_attributes.return_value = response

cls = _VpcService(21, 43, {}, None)
cls.resource_conn = mock_conn
cls.conn = mock_client_conn
with patch('awslimitchecker.services.vpc.logger') as mock_logger:
cls._update_limits_from_api()
assert mock_conn.mock_calls == []
assert mock_client_conn.mock_calls == [
call.describe_account_attributes()
]
assert mock_logger.mock_calls == [
call.info("Querying EC2 DescribeAccountAttributes for limits"),
call.debug('Done setting limits from API')
]

limit_name = 'Network interfaces per Region'
assert cls.limits[limit_name].api_limit is None
assert cls.limits[limit_name].get_limit() == DEFAULT_ENI_LIMIT

def test_required_iam_permissions(self):
cls = _VpcService(21, 43, {}, None)
assert cls.required_iam_permissions() == [
Expand Down

0 comments on commit 21b73e8

Please sign in to comment.