171 lines
5.9 KiB
Python
171 lines
5.9 KiB
Python
from moto.core import get_account_id
|
|
from moto.utilities.utils import filter_resources
|
|
from .core import TaggedEC2Resource
|
|
from ..utils import random_managed_prefix_list_id, describe_tag_filter
|
|
|
|
|
|
class ManagedPrefixList(TaggedEC2Resource):
|
|
def __init__(
|
|
self,
|
|
backend,
|
|
address_family=None,
|
|
entry=None,
|
|
max_entries=None,
|
|
prefix_list_name=None,
|
|
region=None,
|
|
tags=None,
|
|
owner_id=None,
|
|
):
|
|
self.ec2_backend = backend
|
|
self.address_family = address_family
|
|
self.max_entries = max_entries
|
|
self.id = random_managed_prefix_list_id()
|
|
self.prefix_list_name = prefix_list_name
|
|
self.state = "create-complete"
|
|
self.state_message = "create complete"
|
|
self.add_tags(tags or {})
|
|
self.version = 1
|
|
self.entries = {self.version: entry} if entry else {}
|
|
self.resource_owner_id = owner_id if owner_id else None
|
|
self.prefix_list_arn = self.arn(region, self.owner_id)
|
|
self.delete_counter = 1
|
|
|
|
def arn(self, region, owner_id):
|
|
return "arn:aws:ec2:{region}:{owner_id}:prefix-list/{resource_id}".format(
|
|
region=region, resource_id=self.id, owner_id=owner_id
|
|
)
|
|
|
|
@property
|
|
def owner_id(self):
|
|
return (
|
|
get_account_id() if not self.resource_owner_id else self.resource_owner_id
|
|
)
|
|
|
|
|
|
class ManagedPrefixListBackend:
|
|
def __init__(self):
|
|
self.managed_prefix_lists = {}
|
|
self.create_default_pls()
|
|
|
|
def create_managed_prefix_list(
|
|
self,
|
|
address_family=None,
|
|
entry=None,
|
|
max_entries=None,
|
|
prefix_list_name=None,
|
|
tags=None,
|
|
owner_id=None,
|
|
):
|
|
managed_prefix_list = ManagedPrefixList(
|
|
self,
|
|
address_family=address_family,
|
|
entry=entry,
|
|
max_entries=max_entries,
|
|
prefix_list_name=prefix_list_name,
|
|
region=self.region_name,
|
|
tags=tags,
|
|
owner_id=owner_id,
|
|
)
|
|
self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
|
|
return managed_prefix_list
|
|
|
|
def describe_managed_prefix_lists(self, prefix_list_ids=None, filters=None):
|
|
managed_prefix_lists = list(self.managed_prefix_lists.copy().values())
|
|
attr_pairs = (
|
|
("owner-id", "owner_id"),
|
|
("prefix-list-id", "id"),
|
|
("prefix-list-name", "prefix_list_name"),
|
|
)
|
|
|
|
if prefix_list_ids:
|
|
managed_prefix_lists = [
|
|
managed_prefix_list
|
|
for managed_prefix_list in managed_prefix_lists
|
|
if managed_prefix_list.id in prefix_list_ids
|
|
]
|
|
|
|
result = managed_prefix_lists
|
|
if filters:
|
|
result = filter_resources(result, filters, attr_pairs)
|
|
result = describe_tag_filter(filters, result)
|
|
|
|
for item in result.copy():
|
|
if not item.delete_counter:
|
|
self.managed_prefix_lists.pop(item.id, None)
|
|
result.remove(item)
|
|
if item.state == "delete-complete":
|
|
item.delete_counter -= 1
|
|
return result
|
|
|
|
def get_managed_prefix_list_entries(self, prefix_list_id=None):
|
|
managed_prefix_list = self.managed_prefix_lists.get(prefix_list_id)
|
|
return managed_prefix_list
|
|
|
|
def delete_managed_prefix_list(self, prefix_list_id):
|
|
managed_prefix_list = self.managed_prefix_lists.get(prefix_list_id)
|
|
managed_prefix_list.state = "delete-complete"
|
|
return managed_prefix_list
|
|
|
|
def modify_managed_prefix_list(
|
|
self,
|
|
add_entry=None,
|
|
prefix_list_id=None,
|
|
current_version=None,
|
|
prefix_list_name=None,
|
|
remove_entry=None,
|
|
):
|
|
managed_pl = self.managed_prefix_lists.get(prefix_list_id)
|
|
managed_pl.prefix_list_name = prefix_list_name
|
|
if remove_entry or add_entry:
|
|
latest_version = managed_pl.entries.get(managed_pl.version)
|
|
entries = (
|
|
managed_pl.entries.get(current_version, latest_version).copy()
|
|
if managed_pl.entries
|
|
else []
|
|
)
|
|
for item in entries.copy():
|
|
if item.get("Cidr", "") in remove_entry:
|
|
entries.remove(item)
|
|
|
|
for item in add_entry:
|
|
if item not in entries.copy():
|
|
entries.append(item)
|
|
managed_pl.version += 1
|
|
managed_pl.entries[managed_pl.version] = entries
|
|
managed_pl.state = "modify-complete"
|
|
return managed_pl
|
|
|
|
def create_default_pls(self):
|
|
entry = [
|
|
{"Cidr": "52.216.0.0/15", "Description": "default"},
|
|
{"Cidr": "3.5.0.0/19", "Description": "default"},
|
|
{"Cidr": "54.231.0.0/16", "Description": "default"},
|
|
]
|
|
|
|
managed_prefix_list = self.create_managed_prefix_list(
|
|
address_family="IPv4",
|
|
entry=entry,
|
|
prefix_list_name="com.amazonaws.{}.s3".format(self.region_name),
|
|
owner_id="aws",
|
|
)
|
|
managed_prefix_list.version = None
|
|
managed_prefix_list.max_entries = None
|
|
self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
|
|
|
|
entry = [
|
|
{"Cidr": "3.218.182.0/24", "Description": "default"},
|
|
{"Cidr": "3.218.180.0/23", "Description": "default"},
|
|
{"Cidr": "52.94.0.0/22", "Description": "default"},
|
|
{"Cidr": "52.119.224.0/20", "Description": "default"},
|
|
]
|
|
|
|
managed_prefix_list = self.create_managed_prefix_list(
|
|
address_family="IPv4",
|
|
entry=entry,
|
|
prefix_list_name="com.amazonaws.{}.dynamodb".format(self.region_name),
|
|
owner_id="aws",
|
|
)
|
|
managed_prefix_list.version = None
|
|
managed_prefix_list.max_entries = None
|
|
self.managed_prefix_lists[managed_prefix_list.id] = managed_prefix_list
|