from bundlewrap.exceptions import NoSuchGroup, NoSuchNode from ipaddress import ip_address, IPv4Address def resolve_identifier(repo, identifier): """ Try to resolve an identifier (group or node). Return a set of ip addresses valid for this identifier. """ try: nodes = {repo.get_node(identifier)} except NoSuchNode: try: nodes = repo.nodes_in_group(identifier) except NoSuchGroup: try: return {ip_address(identifier)} except: return set() found_ips = set() for node in nodes: for interface, config in node.metadata.get('interfaces', {}).items(): for ip in config.get('ips', set()): if '/' in ip: found_ips.add(ip_address(ip.split('/')[0])) else: found_ips.add(ip_address(ip)) if node.metadata.get('external_ipv4', None): found_ips.add(ip_address(node.metadata.get('external_ipv4'))) ip_dict = { 'ipv4': set(), 'ipv6': set(), } for ip in found_ips: if isinstance(ip, IPv4Address): ip_dict['ipv4'].add(ip) else: ip_dict['ipv6'].add(ip) return ip_dict