diff --git a/agent/nix_builder_autoscaler/runtime/ec2.py b/agent/nix_builder_autoscaler/runtime/ec2.py index f20dcd2..fda0117 100644 --- a/agent/nix_builder_autoscaler/runtime/ec2.py +++ b/agent/nix_builder_autoscaler/runtime/ec2.py @@ -260,7 +260,7 @@ class EC2Runtime(RuntimeAdapter): @staticmethod def _peer_is_online(peer: dict[str, Any]) -> bool: - return bool(peer.get("Online") or peer.get("Active")) + return bool(peer.get("Online")) @staticmethod def _peer_hostname(peer: dict[str, Any]) -> str | None: diff --git a/agent/nix_builder_autoscaler/tests/test_runtime_ec2.py b/agent/nix_builder_autoscaler/tests/test_runtime_ec2.py index a8d9ffe..a82c53f 100644 --- a/agent/nix_builder_autoscaler/tests/test_runtime_ec2.py +++ b/agent/nix_builder_autoscaler/tests/test_runtime_ec2.py @@ -249,6 +249,55 @@ class TestDescribeInstance: info = runtime.describe_instance("i-running1") assert info["tailscale_ip"] is None + @patch.object( + EC2Runtime, + "_read_tailscale_status", + return_value={ + "Peer": { + "stale": { + "HostName": "nix-builder-slot001", + "Online": False, + "Active": True, + "TailscaleIPs": ["100.64.0.10"], + }, + "current": { + "HostName": "nix-builder-slot001", + "Online": True, + "Active": False, + "TailscaleIPs": ["100.64.0.11"], + }, + } + }, + ) + def test_ignores_active_but_offline_stale_peer(self, _mock_status): + ec2_client = boto3.client("ec2", region_name="us-east-1") + stubber = Stubber(ec2_client) + + launch_time = datetime(2026, 1, 15, 12, 30, 0, tzinfo=UTC) + response = { + "Reservations": [ + { + "Instances": [ + { + "InstanceId": "i-running1", + "State": {"Code": 16, "Name": "running"}, + "LaunchTime": launch_time, + "Tags": [{"Key": "AutoscalerSlot", "Value": "slot001"}], + } + ], + } + ], + } + stubber.add_response( + "describe_instances", + response, + {"InstanceIds": ["i-running1"]}, + ) + runtime = _make_runtime(stubber, ec2_client) + + info = runtime.describe_instance("i-running1") + assert info["tailscale_ip"] == "100.64.0.11" + def test_localapi_permission_error_returns_none(self): ec2_client = boto3.client("ec2", region_name="us-east-1") runtime = EC2Runtime(_make_config(), _client=ec2_client)