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
[1953] feat: populate Expiring/Expired Conditions for Application Credentials
Wires the App Credential helpers (#1953 prior commit) through the
validation flow and controller status path:
- pkg/common/validation/openstack: extends ValidationResult with an
AppCred *utils.AppCredentialDetails field. validateFromCloudsYAML
calls utils.FetchAppCredentialDetails after successful auth when
auth_type is v3applicationcredential; populates result.AppCred when
the metadata fetch succeeds, logs a non-fatal info message and
leaves AppCred nil when the fetch is unavailable.
- internal/controller/openstackcreds_controller: setConditionsForValidResult
now takes the AppCred details and uses utils.EvaluateAppCredExpiration
to set Expiring / Expired Conditions. Mapping:
- expired -> Expired=True (Reason: Expired)
- within 7 days -> Expiring=True (Reason: Within7Days)
- within 30 days -> Expiring=True (Reason: Within30Days)
- beyond / not App Cred -> Expiring=False, Expired=False (NotApplicable / Active)
- internal/controller/openstackcreds_controller: setConditionsForInvalidResult
drops the inline heuristic switch and uses utils.MapKeystoneError on
the raw validation error. Typed gophercloud HTTP status codes win
over string matching when available.
Existing TestApplyValidationResult_ValidationFailure passes unchanged
(MapKeystoneError preserves the existing Reason output for 401 and
timeout error strings the test exercises).
Implements FR-007 / FR-008 / FR-009.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
utils.SetCondition(&status.Conditions, utils.ConditionCredentialsParsed, metav1.ConditionTrue, utils.ReasonParsed, "Credential data parsed successfully")
537
536
utils.SetCondition(&status.Conditions, utils.ConditionCredentialsValidated, metav1.ConditionTrue, utils.ReasonAuthSucceeded, "Authenticated to destination Keystone")
538
-
utils.SetCondition(&status.Conditions, utils.ConditionExpiring, metav1.ConditionFalse, utils.ReasonNotApplicable, "Credential is not an Application Credential")
539
-
utils.SetCondition(&status.Conditions, utils.ConditionExpired, metav1.ConditionFalse, utils.ReasonNotApplicable, "Credential is not an Application Credential")
537
+
538
+
ifappCred==nil {
539
+
utils.SetCondition(&status.Conditions, utils.ConditionExpiring, metav1.ConditionFalse, utils.ReasonNotApplicable, "Credential is not an Application Credential or details unavailable")
540
+
utils.SetCondition(&status.Conditions, utils.ConditionExpired, metav1.ConditionFalse, utils.ReasonNotApplicable, "Credential is not an Application Credential or details unavailable")
utils.SetCondition(&status.Conditions, utils.ConditionExpired, metav1.ConditionFalse, utils.ReasonActive, "Credential is active")
553
+
default:
554
+
utils.SetCondition(&status.Conditions, utils.ConditionExpiring, metav1.ConditionFalse, utils.ReasonNotApplicable, "Credential is not approaching expiration")
555
+
utils.SetCondition(&status.Conditions, utils.ConditionExpired, metav1.ConditionFalse, utils.ReasonActive, "Credential is active")
0 commit comments