Source code for policy_inspector.resolver
import logging
from collections.abc import Iterable
from typing import TYPE_CHECKING
from policy_inspector.model.address_object import (
AddressObject,
AddressObjectIPNetwork,
AddressObjectIPRange,
)
if TYPE_CHECKING:
from policy_inspector.model.address_group import AddressGroup
logger = logging.getLogger(__name__)
[docs]
class Resolver:
"""Process Address Groups into their Address Objects or IP Network object.
It expands Address Groups (AG) recursively.
Args:
address_objects: A list of ``AddressObject``.
address_groups: A list of ``AddressGroup``.
"""
[docs]
def __init__(
self,
address_objects: list["AddressObject"],
address_groups: list["AddressGroup"],
):
self.address_objects: dict[str, AddressObject] = {
ao.name: ao for ao in address_objects
}
self.address_groups: dict[str, set[str]] = {
ag.name: ag.static for ag in address_groups
}
self.cache: dict[str, list[AddressObject]] = {}
[docs]
def resolve(self, names: Iterable[str]) -> list["AddressObject"]:
"""Resolve given names.
Args:
names: Names of ``Address Groups`` or ``Address Objects``
"""
result = []
for name in names:
result.extend(self._resolve_name(name))
return result
def _resolve_name(self, name: str) -> list["AddressObject"]:
"""Resolve single ``name``"""
if name == "any":
return []
if name in self.cache:
return self.cache[name]
try:
logger.debug(f"Resolving Address Group by name: {name}")
resolved = []
for member in self.address_groups[name]:
resolved.extend(self._resolve_name(member))
self.cache[name] = resolved
return resolved
except KeyError:
pass
try:
logger.debug(f"Resolving Address Object by name: {name}")
resolved = [self.address_objects[name]]
self.cache[name] = resolved
return resolved
except KeyError:
pass
try:
logger.debug(
f"Creating {AddressObjectIPNetwork} from value: {name}"
)
resolved = [AddressObjectIPNetwork(name=name, value=name)]
self.cache[name] = resolved
return resolved
except ValueError:
pass
try:
logger.debug(f"Creating {AddressObjectIPRange} from value: {name}")
resolved = [AddressObjectIPRange(name=name, value=name)]
self.cache[name] = resolved
return resolved
except ValueError as ex:
raise ValueError(f"Unknown address object/group: {name}") from ex