You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`Ready`| any | Conditions above not met |`—`|`—`|`—`|`—`|
342
+
|`Available`|`Available=False`| all `statuses[].obs_gen==X`| unchanged |`min(statuses[].lut)`|`—`|`X`|
343
+
|`Available`|`Available=True`| all `statuses[].obs_gen==X`|**`False`**|`obs_time`|`obs_time`|`X`|
344
+
|`Available`| any | Conditions above not met |`—`|`—`|`—`|`—`|
345
+
252
346
## NodePool Management
253
347
254
348
### Endpoints
@@ -456,7 +550,7 @@ The status object contains synthesized conditions computed from adapter reports:
456
550
- All above fields plus:
457
551
-`observed_generation` - Generation this condition reflects
458
552
-`created_time` - When condition was first created (API-managed)
459
-
-`last_updated_time` - When adapter last reported (API-managed, from AdapterStatus.last_report_time)
553
+
-`last_updated_time` - When this condition was last refreshed (API-managed). For **Available**, always the evaluation time. For **Ready**: when Ready=True, the minimum of `last_report_time` across all required adapters that report Available=True at the current generation; when Ready=False, the evaluation time (so consumers can detect staleness).
460
554
-`last_transition_time` - When status last changed (API-managed)
`UpdateClusterStatusFromAdapters()` in `cluster.go` synthesizes two top-level conditions:
25
-
-**Available**: True if all required adapters report `Available=True`(any generation)
25
+
-**Available**: True if all required adapters report `Available=True`at ANY generation (last-known-good semantics). `ObservedGeneration` = minimum observed generation across qualifying adapters. When False, `ObservedGeneration` = current resource generation.
26
26
-**Ready**: True if all adapters report `Available=True` AND `observed_generation` matches current generation
27
27
28
+
Ready's `LastUpdatedTime` is computed in `status_aggregation.computeReadyLastUpdated`: when Ready=False it is the minimum of `LastReportTime` across all required adapters (falls back to `now` if any required adapter has no stored status yet); when Ready=True it is the minimum of `LastReportTime` across required adapters that have Available=True at the current generation. True→False transitions override this with the triggering adapter's `observedTime`.
29
+
28
30
`ProcessAdapterStatus()` validates mandatory conditions (`Available`, `Applied`, `Health`) before persisting. Rejects `Available=Unknown` on subsequent reports (only allowed on first report).
0 commit comments