diff --git a/node_external_ip_controller_async.py b/node_external_ip_controller_async.py index 26273af..1c18d06 100644 --- a/node_external_ip_controller_async.py +++ b/node_external_ip_controller_async.py @@ -44,6 +44,7 @@ async def update_service_annotation(v1, service, external_ips): async def watch_nodes(v1, external_ips_update_queue): w = watch.Watch() + external_node_ipset = set() while True: try: logger.debug("Starting to watch nodes") @@ -53,16 +54,29 @@ async def watch_nodes(v1, external_ips_update_queue): _request_timeout=NODE_REQUEST_TIMEOUT, ): node = event["object"] - logger.debug(f"Received event for node: {node.metadata.name}") + event_type = event["type"] + logger.debug( + f"Received {event_type} event for node: {node.metadata.name}" + ) external_ips = [ addr.address for addr in node.status.addresses if addr.type == "ExternalIP" ] - logger.debug( - f"External IPs for node {node.metadata.name}: {external_ips}" - ) - await external_ips_update_queue.put(external_ips) + if event_type in {"ADDED", "MODIFIED"}: + external_node_ipset.update(external_ips) + logger.debug( + f"External IPs for node {node.metadata.name}: {external_ips}" + ) + elif event_type == "REMOVED": + for ip in external_ips: + if ip in external_node_ipset: + external_node_ipset.remove(ip) + logger.debug( + f"External IPs for node {node.metadata.name}: {external_ips}" + ) + external_node_ips = list(external_node_ipset) + await external_ips_update_queue.put(external_node_ips) logger.debug(f"Added external IPs to update queue: {external_ips}") except client.exceptions.ApiException as e: