CNTRLPLANE-3222: Port v1 lifecycle tests to v2 Ginkgo framework#8527
CNTRLPLANE-3222: Port v1 lifecycle tests to v2 Ginkgo framework#8527bryan-cox wants to merge 11 commits into
Conversation
|
Pipeline controller notification For optional jobs, comment This repository is configured in: LGTM mode |
|
Skipping CI for Draft Pull Request. |
|
@bryan-cox: This pull request references CNTRLPLANE-3222 which is a valid jira issue. Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set. DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds v2 Ginkgo E2E suites and orchestration tooling: control-plane upgrade, etcd chaos (five scenarios), nodepool autoscaling, and nodepool lifecycle tests. Widened e2e helper signatures to testing.TB, registered additional lifecycle env vars, added e2ev2 CLI binaries (create-guests, run-tests, destroy-guests, dump-guests), and wired Makefile and Dockerfile to build and package those binaries. Sequence Diagram(s)sequenceDiagram
participant CreateCLI as create-guests
participant HypershiftCLI as hypershift
participant MgmtAPI as ManagementCluster API
participant HostedCluster as HostedCluster CR
CreateCLI->>HypershiftCLI: exec "hypershift create cluster azure" (args per variant)
HypershiftCLI->>MgmtAPI: submit HostedCluster CR / related resources
MgmtAPI->>HostedCluster: create/update HostedCluster
HostedCluster->>MgmtAPI: status updates (Available, Version History)
MgmtAPI->>CreateCLI: status observed via controller-runtime watch
Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 7 | ❌ 5❌ Failed checks (5 warnings)
✅ Passed checks (7 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8527 +/- ##
==========================================
+ Coverage 40.34% 40.40% +0.06%
==========================================
Files 755 755
Lines 93167 93235 +68
==========================================
+ Hits 37587 37675 +88
+ Misses 52877 52858 -19
+ Partials 2703 2702 -1 see 3 files with indirect coverage changes
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 10
🧹 Nitpick comments (9)
control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go (2)
1543-1544: 💤 Low valueMisleading
%win log message.The
%wverb is afmtdirective for error wrapping, butr.Log.Error()doesn't perform formatting on the message string. The error is already passed as the first argument and will be logged correctly; the%wis printed literally.Suggested fix
if err != nil { - r.Log.Error(err, "failed to remove service ca annotation and secret: %w") + r.Log.Error(err, "failed to remove service ca annotation and secret") }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go` around lines 1543 - 1544, The log call in hostedcontrolplane_controller.go uses the fmt verb "%w" in the message string (`r.Log.Error(err, "failed to remove service ca annotation and secret: %w")`), which is meaningless for the logger and will be printed literally; fix it by removing the "%w" from the message so the error is passed as the first argument and logged correctly (e.g., `r.Log.Error(err, "failed to remove service ca annotation and secret")`), or alternatively keep the error and add structured context via key/value pairs to the same `r.Log.Error` call.
1721-1729: 💤 Low valueSame
%wissue and unnecessary intermediate variable.The log messages at lines 1722 and 1755 have the same misleading
%wissue as flagged earlier. Additionally, thezvariable at lines 1725-1726 and 1757-1759 is unnecessary—the reconcile function result can be returned directly.Suggested fixes
if err := removeServiceCAAnnotationAndSecret(ctx, r.Client, AzureDiskCsiDriverOperatorService, AzureDiskCsiDriverOperatorServingCert); err != nil { - r.Log.Error(err, "failed to remove service ca annotation and secret: %w") + r.Log.Error(err, "failed to remove service ca annotation and secret") } if _, err := createOrUpdate(ctx, r, AzureDiskCsiDriverOperatorServingCert, func() error { - z := pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(AzureDiskCsiDriverOperatorServingCert, rootCASecret, p.OwnerRef) - return z + return pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(AzureDiskCsiDriverOperatorServingCert, rootCASecret, p.OwnerRef) }); err != nil {Apply the same pattern at lines 1754-1759 for the Azure File CSI driver operator.
Also applies to: 1752-1762
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go` around lines 1721 - 1729, The r.Log.Error calls use a printf-style %w placeholder incorrectly and should be called as r.Log.Error(err, "failed to remove service ca annotation and secret") (i.e., pass the error as the first argument to r.Log.Error without formatting), and the reconciliation closures create an unnecessary intermediate variable (z); replace constructs like "z := pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(...); return z" with "return pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(...)" inside the createOrUpdate call (apply the same fixes for AzureDiskCsiDriverOperator* and the analogous AzureFileCsiDriverOperator* usages, and for functions removeServiceCAAnnotationAndSecret, createOrUpdate, and pki.ReconcileAzure...ServingCertSecret).api/karpenter/v1/kubelet_config.go (1)
50-50: 💤 Low valueConsider simplifying or documenting the complex eviction threshold validation.
The XValidation rule on line 50 is correct but extremely complex (>300 characters). It validates that
evictionSoft >= evictionHardfor matching signals, handling both percentage strings and quantity types. While the logic is sound, this level of complexity in a single CEL expression makes it difficult to:
- Review for correctness
- Debug when validation fails
- Maintain if requirements change
Consider adding an inline comment above the validation explaining the high-level intent, or explore whether this could be split into separate validation rules (though CEL may not permit that given the cross-field nature).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@api/karpenter/v1/kubelet_config.go` at line 50, The XValidation CEL expression on the kubebuilder annotation that enforces evictionSoft >= evictionHard for matching signals is correct but unreadable; add a clear inline comment directly above the annotation describing the high-level intent (e.g., "Ensure evictionSoft thresholds are greater than or equal to evictionHard for the same signal, handling percentage strings and resource quantities") and briefly note the two cases handled (percentage strings vs. resource quantities), or alternatively factor the check into multiple, named XValidation annotations if feasible; reference the annotation (the +kubebuilder:validation:XValidation line) and the related fields evictionSoft and evictionHard so reviewers can find and understand the rule quickly.api/hypershift/v1beta1/hostedcluster_types.go (1)
676-681: ⚡ Quick winClarify pull secret propagation mechanism for in-place updates.
Lines 678-680 state that updating the Secret's data in place "does not trigger that rollout," but then immediately say the changes "will still propagate the updated credentials down to the guest cluster and kubelet config" for AWS/Azure Replace strategy. This appears contradictory—how do the credentials propagate without triggering a rollout?
Consider clarifying:
- Does "propagate" mean existing nodes are updated in place without replacement?
- Is this via a separate controller watching the Secret?
- Does "rollout" specifically mean node replacement, while propagation is a different mechanism?
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@api/hypershift/v1beta1/hostedcluster_types.go` around lines 676 - 681, The comment is ambiguous about how Secret data changes "do not trigger that rollout" yet "will still propagate" for AWS/Azure Replace NodePools; update the paragraph (the NodePool/pull secret description) to explicitly state that “rollout” refers to NodePool replacement/in-place upgrade actions (node recreation), and that updating the referenced Secret's data in-place does not automatically trigger node replacement, but cloud-provider-specific controllers or credential reconciliation (e.g., the cloud provider credential controller or kubelet secret refresh mechanisms) will propagate updated credentials to the guest cluster and kubelet config for AWS/Azure Replace strategy; mention whether propagation is in-place (no node replacement) and name the controller or mechanism if available, or note “a separate controller/watch reconciler” if unspecified, so readers understand the distinct behaviors for secret updates vs. NodePool rollouts.control-plane-operator/controllers/azureprivatelinkservice/controller.go (1)
863-881: 💤 Low valueGood refactoring of deletion logic into focused helpers.
The extraction of deletion logic into dedicated helper functions improves maintainability and testability. Using
azPLS.Status.DNSZoneNameto avoid dependency on the HostedControlPlane during deletion is a solid design decision.The verbose log at line 873 when
DNSZoneNameis not set useslog.V(1), which may not be visible by default. Consider whether this should be a regularlog.Infogiven that it represents a potentially unexpected condition during cleanup.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@control-plane-operator/controllers/azureprivatelinkservice/controller.go` around lines 863 - 881, The log for the case where azPLS.Status.DNSZoneName is empty uses log.V(1).Info which may be too quiet for an unexpected cleanup condition; update the logging in the controller deletion path (the dnsZoneName check in the reconcile/finalizer routine that calls deleteDNSResources and deleteBaseDomainResources) to use log.Info (or a higher visibility) instead of log.V(1).Info so the message "DNSZoneName not set in status, skipping DNS cleanup" is visible by default when DNSZoneName is missing during deletion.control-plane-operator/controllers/azureprivatelinkservice/controller_test.go (1)
1747-1774: ⚡ Quick winConsolidate duplicated
errMsgQualifiercoverage.Line 1747 adds
TestDNSZoneConfigErrMsgQualifier, but this is functionally duplicatingTestErrMsgQualifierlater in the file (same inputs and expected outputs). Keeping one avoids drift and redundant maintenance.Suggested cleanup
-func TestDNSZoneConfigErrMsgQualifier(t *testing.T) { - t.Parallel() - tests := []struct { - name string - logPrefix string - expected string - }{ - { - name: "When logPrefix is empty, it should return empty string", - logPrefix: "", - expected: "", - }, - { - name: "When logPrefix is set, it should return prefix followed by a space", - logPrefix: "base domain", - expected: "base domain ", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - g := NewGomegaWithT(t) - cfg := dnsZoneConfig{logPrefix: tt.logPrefix} - g.Expect(cfg.errMsgQualifier()).To(Equal(tt.expected)) - }) - } -}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@control-plane-operator/controllers/azureprivatelinkservice/controller_test.go` around lines 1747 - 1774, Remove the duplicated unit test TestDNSZoneConfigErrMsgQualifier and keep the existing TestErrMsgQualifier to avoid redundant coverage; locate the duplicate test function named TestDNSZoneConfigErrMsgQualifier in the controller_test.go file (it constructs dnsZoneConfig{logPrefix: ...} and calls cfg.errMsgQualifier()) and delete that entire test block so only the original TestErrMsgQualifier remains exercising dnsZoneConfig.errMsgQualifier.contrib/repo_metrics/weekly_pr_report.py (2)
965-973: ⚡ Quick winAdd
strict=Truetozip()for safety.Line 965 zips
repos_to_fetchandresultswhich should have the same length by construction, but addingstrict=Truemakes this assumption explicit and catches bugs if the invariant is violated.Note:
strict=requires Python 3.10+.🔒 Proposed fix
- for (owner, name), result in zip(repos_to_fetch, results): + for (owner, name), result in zip(repos_to_fetch, results, strict=True):🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@contrib/repo_metrics/weekly_pr_report.py` around lines 965 - 973, The loop that pairs repos_to_fetch with results uses zip(repos_to_fetch, results) and assumes equal lengths; change it to zip(repos_to_fetch, results, strict=True) to enforce that invariant at runtime and fail fast if lengths differ; update the loop in the block that assigns to repo_fetch_status and repo_prs (the for (owner, name), result in zip(...) loop) so it uses strict=True, ensuring any mismatch between repos_to_fetch and results is caught immediately.
402-403: 💤 Low valueConsider using immutable types for class constants.
Lines 402-403 use mutable list and set for class constants that are never modified. Converting to tuple and frozenset would make the immutability explicit and silence the static analysis warning.
♻️ Proposed refactor
- BOT_PATTERNS = ['-bot', '-robot', '[bot]'] - BOT_LOGINS = {'coderabbitai', 'hypershift-jira-solve-ci'} + BOT_PATTERNS = ('-bot', '-robot', '[bot]') + BOT_LOGINS = frozenset({'coderabbitai', 'hypershift-jira-solve-ci'})🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@contrib/repo_metrics/weekly_pr_report.py` around lines 402 - 403, BOT_PATTERNS and BOT_LOGINS are declared as mutable list/set but never modified; change BOT_PATTERNS = ['-bot', '-robot', '[bot]'] to an immutable tuple BOT_PATTERNS = ('-bot', '-robot', '[bot]') and change BOT_LOGINS = {'coderabbitai', 'hypershift-jira-solve-ci'} to a frozenset: BOT_LOGINS = frozenset({'coderabbitai', 'hypershift-jira-solve-ci'}), and update any membership checks (e.g., "in BOT_LOGINS" or iterating BOT_PATTERNS) which will continue to work without other code changes..claude/commands/pr-report.md (1)
732-755: 💤 Low valueConsider documenting alternative environment variable names for backward compatibility.
The Python script (lines 69-70) accepts both
JIRA_API_TOKEN/JIRA_USERNAMEandJIRA_TOKEN/JIRA_EMAIL, but the documentation only mentions the latter. Consider adding a note about the alternative names for users with existing configurations.📝 Suggested documentation addition
Add a note under the environment variables table:
| `GITHUB_TOKEN` | No | GitHub token (falls back to `gh auth token` if not set) | + +**Note:** For backward compatibility, the script also accepts `JIRA_USERNAME` (alias for `JIRA_EMAIL`) and `JIRA_API_TOKEN` (alias for `JIRA_TOKEN`).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.claude/commands/pr-report.md around lines 732 - 755, Update the environment variables docs to mention the alternative legacy names accepted by the script: add a brief note under the variables table stating that JIRA_TOKEN/JIRA_EMAIL are equivalent to the older JIRA_API_TOKEN/JIRA_USERNAME (the script checks both pairs around lines where env vars are read), so existing configurations using JIRA_API_TOKEN or JIRA_USERNAME will continue to work; reference the variable names JIRA_TOKEN, JIRA_EMAIL, JIRA_API_TOKEN, and JIRA_USERNAME in the note.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.claude/commands/pr-report.md:
- Around line 115-119: The detection patterns in .claude/commands/pr-report.md
don’t match the actual runtime messages; update the checks to use partial or
regex matching against the real strings — e.g., match "Fetching Jira data via
REST API" (prefix of "Fetching Jira data via REST API ({len(tickets)}
tickets)...") and "Jira credentials not set" (prefix of "Jira credentials not
set (need JIRA_USERNAME/JIRA_API_TOKEN or JIRA_EMAIL/JIRA_TOKEN), loading from
cache") instead of the exact old phrases, so the script recognizes both messages
with variable content.
In `@api/.golangci.yml`:
- Around line 322-342: The review asks to fix the API types instead of adding
kubeapilinter exclusions: update the KubeletConfiguration and
OpenshiftEC2NodeClassSpec types to satisfy kube-apilinter rules—specifically
change CPUCFSQuota (in KubeletConfiguration) from a *bool to a string enum with
meaningful constants; add a kubebuilder:validation:MinProperties marker where
the KubeletConfiguration object is used (referenced by
OpenshiftEC2NodeClassSpec.Kubelet) and make OpenshiftEC2NodeClassSpec.Kubelet a
pointer if it must be optional to avoid the optionalfields warning; replace map
values that use Go Durations (EvictionSoftGracePeriod) with integer types whose
names include units (e.g., EvictionSoftGracePeriodSeconds) and, for the nomaps
warnings on SystemReserved, KubeReserved, EvictionHard, EvictionSoft, refactor
map fields into well-defined structured types or resource-list fields (or
concrete slice/struct representations) so they no longer use raw maps; run make
api-lint-fix and iterate until kube-apilinter passes.
In `@api/karpenter/v1/kubelet_config.go`:
- Around line 196-212: HasTypedFields currently lists typed fields manually
(KubeletConfiguration.HasTypedFields) and can get out of sync with the struct,
causing IsZero/omitzero bugs; replace the manual checks with a reflection-based
implementation or add a unit test that fails if any exported non-overflow struct
field is not checked: implement HasTypedFields by reflecting over
KubeletConfiguration, skipping overflow/XXX fields and detecting any non-zero
typed field (or alternatively write a test that compares the set of field names
in kubeletConfigKnownFields/reflection against the ones asserted in
HasTypedFields to force updates), and ensure IsZero/omitzero behavior remains
correct for all current and future typed fields.
In `@cmd/cluster/core/create.go`:
- Around line 476-484: The code currently returns early when opts.PausedUntil ==
"true" so HostedCluster.Spec.PausedUntil is never set; change the logic in the
function handling opts.PausedUntil to: if opts.PausedUntil is empty return nil;
if opts.PausedUntil == "true" set cluster.Spec.PausedUntil = &opts.PausedUntil
and return nil; otherwise parse opts.PausedUntil with time.RFC3339, return a
wrapped error on parse failure and set cluster.Spec.PausedUntil =
&opts.PausedUntil on success (update the unit test expectation for
HostedCluster.Spec.PausedUntil when "--pausedUntil=true" accordingly).
In `@cmd/fix/dr_oidc_iam.go`:
- Around line 524-568: Add unit tests covering the new OIDC helper branch logic:
write table-driven unit tests for ensureOIDCDocuments and ensureOIDCProvider
that exercise combinations of DryRun true/false, ForceRecreate true/false, and
existing-state flags (oidcDocsExist and exists) to assert correct behavior
(no-op, dry-run messages, calls into generateAndUploadOIDCDocuments,
deleteOIDCProviderIfExists, and createOIDCProvider). Mock/stub client
interactions (k8sClient, s3Client, iamClient) and the helper methods
generateAndUploadOIDCDocuments, deleteOIDCProviderIfExists, createOIDCProvider
to verify they are or are not invoked, and assert returned errors are
propagated/wrapped as expected; include tests for success and error propagation
paths.
- Around line 496-511: The check currently collapses all S3 HeadObject failures
into a false result; change checkOIDCDocumentsExist to return (bool, error)
instead of bool, have it return (false, nil) only for a genuine NotFound/404 and
return (false, err) for AccessDenied/network/transient errors so callers can
distinguish causes, then update checkOIDCState to handle the propagated error
from checkOIDCDocumentsExist (inspect error != nil to log/return the error or
abort rather than printing "documents missing") while preserving the existing
branches for oidcDocsExist and o.ForceRecreate; update any call sites of
checkOIDCDocumentsExist accordingly.
In `@Containerfile.cli`:
- Line 22: The Docker base image reference "FROM
registry.redhat.io/ubi9/nginx-124:latest" is using the mutable :latest tag;
update that FROM line to pin to a specific immutable version tag or image digest
(e.g., a released version tag or sha256 digest) so builds are reproducible and
stable—locate the FROM statement in Containerfile.cli and replace ":latest" with
the chosen version tag or digest, then commit the change and optionally add a
short comment noting the pinned version.
In `@contrib/repo_metrics/weekly_pr_report.py`:
- Around line 144-145: In _fetch_json replace the blocking time.sleep(30) with
an await asyncio.sleep(30) so the coroutine yields to the event loop; update the
call to await asyncio.sleep(30) in the same fallback path that currently does
return await self._fetch_json(...), and ensure asyncio is imported at the module
top if not already present.
In `@control-plane-operator/controllers/azureprivatelinkservice/controller.go`:
- Around line 863-1053: The new deletion helpers lack unit tests; add
table-driven unit tests for deleteDNSResources, deleteVNetLink, deleteDNSZone,
deleteBaseDomainResources, deleteBaseDomainARecords, and deletePrivateEndpoint
(and exercise hasSiblingCR behavior) that cover: (1) Azure API failures
returning errors and asserting the wrapper returns the expected formatted error,
(2) NotFound responses are treated as success (no error), (3) correct resource
name derivation by asserting the Azure client is called with expected names
(e.g., kasARecordName/appsARecordName,
vnetLinkName(crName)/baseDomainVNetLinkName, privateEndpointName(crName), and
base domain A record prefixes), and (4) sibling-CR detection flow where
deleteBaseDomainResources deletes or skips the base zone/records depending on
hasSiblingCR; implement mocks/stubs for RecordSets, VirtualNetworkLinks,
PrivateDNSZones, PrivateEndpoints, and the hasSiblingCR dependency and use
context timeouts/poller behavior to simulate BeginDelete/PollUntilDone success,
error, and nil-poller cases.
In
`@control-plane-operator/controllers/hostedcontrolplane/v2/metrics_proxy/deployment_test.go`:
- Around line 61-72: The helper assertCertVolumeCount should fail fast when the
returned slice lengths don't match expectations to avoid downstream panics: in
function assertCertVolumeCount (which calls certVolumesFromMonitors) replace the
t.Errorf checks for volume/mount count mismatches with t.Fatalf (or otherwise
return immediately with t.Fatalf) so the test stops on precondition failures
rather than allowing callers to index invalid slices; keep the existing error
check for certVolumesFromMonitors as-is and ensure callers can rely on asserted
counts when the helper returns.
---
Nitpick comments:
In @.claude/commands/pr-report.md:
- Around line 732-755: Update the environment variables docs to mention the
alternative legacy names accepted by the script: add a brief note under the
variables table stating that JIRA_TOKEN/JIRA_EMAIL are equivalent to the older
JIRA_API_TOKEN/JIRA_USERNAME (the script checks both pairs around lines where
env vars are read), so existing configurations using JIRA_API_TOKEN or
JIRA_USERNAME will continue to work; reference the variable names JIRA_TOKEN,
JIRA_EMAIL, JIRA_API_TOKEN, and JIRA_USERNAME in the note.
In `@api/hypershift/v1beta1/hostedcluster_types.go`:
- Around line 676-681: The comment is ambiguous about how Secret data changes
"do not trigger that rollout" yet "will still propagate" for AWS/Azure Replace
NodePools; update the paragraph (the NodePool/pull secret description) to
explicitly state that “rollout” refers to NodePool replacement/in-place upgrade
actions (node recreation), and that updating the referenced Secret's data
in-place does not automatically trigger node replacement, but
cloud-provider-specific controllers or credential reconciliation (e.g., the
cloud provider credential controller or kubelet secret refresh mechanisms) will
propagate updated credentials to the guest cluster and kubelet config for
AWS/Azure Replace strategy; mention whether propagation is in-place (no node
replacement) and name the controller or mechanism if available, or note “a
separate controller/watch reconciler” if unspecified, so readers understand the
distinct behaviors for secret updates vs. NodePool rollouts.
In `@api/karpenter/v1/kubelet_config.go`:
- Line 50: The XValidation CEL expression on the kubebuilder annotation that
enforces evictionSoft >= evictionHard for matching signals is correct but
unreadable; add a clear inline comment directly above the annotation describing
the high-level intent (e.g., "Ensure evictionSoft thresholds are greater than or
equal to evictionHard for the same signal, handling percentage strings and
resource quantities") and briefly note the two cases handled (percentage strings
vs. resource quantities), or alternatively factor the check into multiple, named
XValidation annotations if feasible; reference the annotation (the
+kubebuilder:validation:XValidation line) and the related fields evictionSoft
and evictionHard so reviewers can find and understand the rule quickly.
In `@contrib/repo_metrics/weekly_pr_report.py`:
- Around line 965-973: The loop that pairs repos_to_fetch with results uses
zip(repos_to_fetch, results) and assumes equal lengths; change it to
zip(repos_to_fetch, results, strict=True) to enforce that invariant at runtime
and fail fast if lengths differ; update the loop in the block that assigns to
repo_fetch_status and repo_prs (the for (owner, name), result in zip(...) loop)
so it uses strict=True, ensuring any mismatch between repos_to_fetch and results
is caught immediately.
- Around line 402-403: BOT_PATTERNS and BOT_LOGINS are declared as mutable
list/set but never modified; change BOT_PATTERNS = ['-bot', '-robot', '[bot]']
to an immutable tuple BOT_PATTERNS = ('-bot', '-robot', '[bot]') and change
BOT_LOGINS = {'coderabbitai', 'hypershift-jira-solve-ci'} to a frozenset:
BOT_LOGINS = frozenset({'coderabbitai', 'hypershift-jira-solve-ci'}), and update
any membership checks (e.g., "in BOT_LOGINS" or iterating BOT_PATTERNS) which
will continue to work without other code changes.
In
`@control-plane-operator/controllers/azureprivatelinkservice/controller_test.go`:
- Around line 1747-1774: Remove the duplicated unit test
TestDNSZoneConfigErrMsgQualifier and keep the existing TestErrMsgQualifier to
avoid redundant coverage; locate the duplicate test function named
TestDNSZoneConfigErrMsgQualifier in the controller_test.go file (it constructs
dnsZoneConfig{logPrefix: ...} and calls cfg.errMsgQualifier()) and delete that
entire test block so only the original TestErrMsgQualifier remains exercising
dnsZoneConfig.errMsgQualifier.
In `@control-plane-operator/controllers/azureprivatelinkservice/controller.go`:
- Around line 863-881: The log for the case where azPLS.Status.DNSZoneName is
empty uses log.V(1).Info which may be too quiet for an unexpected cleanup
condition; update the logging in the controller deletion path (the dnsZoneName
check in the reconcile/finalizer routine that calls deleteDNSResources and
deleteBaseDomainResources) to use log.Info (or a higher visibility) instead of
log.V(1).Info so the message "DNSZoneName not set in status, skipping DNS
cleanup" is visible by default when DNSZoneName is missing during deletion.
In
`@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go`:
- Around line 1543-1544: The log call in hostedcontrolplane_controller.go uses
the fmt verb "%w" in the message string (`r.Log.Error(err, "failed to remove
service ca annotation and secret: %w")`), which is meaningless for the logger
and will be printed literally; fix it by removing the "%w" from the message so
the error is passed as the first argument and logged correctly (e.g.,
`r.Log.Error(err, "failed to remove service ca annotation and secret")`), or
alternatively keep the error and add structured context via key/value pairs to
the same `r.Log.Error` call.
- Around line 1721-1729: The r.Log.Error calls use a printf-style %w placeholder
incorrectly and should be called as r.Log.Error(err, "failed to remove service
ca annotation and secret") (i.e., pass the error as the first argument to
r.Log.Error without formatting), and the reconciliation closures create an
unnecessary intermediate variable (z); replace constructs like "z :=
pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(...); return z"
with "return
pki.ReconcileAzureDiskCsiDriverOperatorMetricsServingCertSecret(...)" inside the
createOrUpdate call (apply the same fixes for AzureDiskCsiDriverOperator* and
the analogous AzureFileCsiDriverOperator* usages, and for functions
removeServiceCAAnnotationAndSecret, createOrUpdate, and
pki.ReconcileAzure...ServingCertSecret).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Central YAML (inherited)
Review profile: CHILL
Plan: Enterprise
Run ID: 36192739-e1b9-421b-85fb-9abe5b9a217a
⛔ Files ignored due to path filters (37)
api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterUpdateAcceptRisks.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/GCPPlatform.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HCPEtcdBackup.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ImageStreamImportMode.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/KMSEncryptionProvider.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSAdherence.yamlis excluded by!**/zz_generated.featuregated-crd-manifests/**api/karpenter/v1/zz_generated.deepcopy.gois excluded by!**/zz_generated*.go,!**/zz_generated*client/applyconfiguration/karpenter/v1/kubeletconfiguration.gois excluded by!client/**client/applyconfiguration/karpenter/v1/openshiftec2nodeclassspec.gois excluded by!client/**client/applyconfiguration/utils.gois excluded by!client/**cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-CustomNoUpgrade.crd.yamlis excluded by!**/zz_generated.crd-manifests/**,!cmd/install/assets/**/*.yamlcmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-Default.crd.yamlis excluded by!**/zz_generated.crd-manifests/**,!cmd/install/assets/**/*.yamlcmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-TechPreviewNoUpgrade.crd.yamlis excluded by!**/zz_generated.crd-manifests/**,!cmd/install/assets/**/*.yamlcontrol-plane-operator/controllers/hostedcontrolplane/infra/testdata/zz_fixture_TestReconcileInfrastructure_AWS_Private_KAS_LoadBalancer.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/infra/testdata/zz_fixture_TestReconcileInfrastructure_AWS_Private_Route.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/infra/testdata/zz_fixture_TestReconcileInfrastructure_AWS_PublicAndPrivate_Route.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/infra/testdata/zz_fixture_TestReconcileInfrastructure_AWS_Public_Route.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/AROSwift/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/GCP/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/IBMCloud/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/TechPreviewNoUpgrade/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yamlis excluded by!**/testdata/**control-plane-operator/controllers/hostedcontrolplane/testdata/control-plane-pki-operator/zz_fixture_TestControlPlaneComponents_control_plane_pki_operator_role.yamlis excluded by!**/testdata/**docs/content/reference/aggregated-docs.mdis excluded by!docs/content/reference/aggregated-docs.mddocs/content/reference/api.mdis excluded by!docs/content/reference/api.mdkarpenter-operator/controllers/karpenter/assets/karpenter.hypershift.openshift.io_openshiftec2nodeclasses.yamlis excluded by!karpenter-operator/controllers/karpenter/assets/*.yamlkarpenter-operator/controllers/karpenter/assets/zz_generated.crd-manifests/openshiftec2nodeclasses.crd.yamlis excluded by!**/zz_generated.crd-manifests/**vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/hypershift/api/karpenter/v1/karpenter_types.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/hypershift/api/karpenter/v1/kubelet_config.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/hypershift/api/karpenter/v1/zz_generated.deepcopy.gois excluded by!vendor/**,!**/vendor/**,!**/zz_generated*.go,!**/zz_generated*
📒 Files selected for processing (156)
.claude/agents/api-sme.md.claude/commands/pr-report.md.claude/rules/webhook-validation.md.github/workflows/dependabot-commit-fix-reusable.yaml.github/workflows/docs-deploy.yaml.golangci.yml.tekton/hypershift-gomaxprocs-webhook-pull-request.yaml.tekton/hypershift-gomaxprocs-webhook-push.yamlAGENTS.mdCLAUDE.mdCLAUDE.mdContainerfile.cliContainerfile.control-planeContainerfile.operatorMakefileapi/.golangci.ymlapi/AGENTS.mdapi/CLAUDE.mdapi/hypershift/v1beta1/hostedcluster_types.goapi/karpenter/v1/karpenter_types.goapi/karpenter/v1/kubelet_config.goapi/karpenter/v1/kubelet_config_test.gocmd/cluster/core/create.gocmd/cluster/core/create_test.gocmd/fix/dr_oidc_iam.gocmd/infra/aws/create.gocmd/infra/azure/create.gocmd/infra/gcp/iam-bindings.jsoncmd/infra/gcp/iam.gocmd/infra/gcp/iam_test.gocmd/install/assets/hypershift_operator.gocmd/install/assets/hypershift_operator_test.gocmd/install/install.gocmd/install/install_render.gocmd/install/install_render_test.gocmd/install/install_test.gocontrib/ai/adding-marketplace-plugins.mdcontrib/repo_metrics/weekly_pr_report.pycontrol-plane-operator/CLAUDE.mdcontrol-plane-operator/controllers/awsprivatelink/awsprivatelink_controller.gocontrol-plane-operator/controllers/awsprivatelink/awsprivatelink_controller_test.gocontrol-plane-operator/controllers/azureprivatelinkservice/controller.gocontrol-plane-operator/controllers/azureprivatelinkservice/controller_test.gocontrol-plane-operator/controllers/gcpprivateserviceconnect/observer.gocontrol-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.gocontrol-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.gocontrol-plane-operator/controllers/hostedcontrolplane/infra/infra_test.gocontrol-plane-operator/controllers/hostedcontrolplane/kas/service.gocontrol-plane-operator/controllers/hostedcontrolplane/kas/service_test.gocontrol-plane-operator/controllers/hostedcontrolplane/oauth/idp_convert.gocontrol-plane-operator/controllers/hostedcontrolplane/oauth/idp_convert_test.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/assets/control-plane-pki-operator/role.yamlcontrol-plane-operator/controllers/hostedcontrolplane/v2/kas/auth.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/kas/auth_test.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/metrics_proxy/deployment_test.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/metrics_proxy/scrape_config.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/metrics_proxy/scrape_config_test.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/oauth/idp_convert.gocontrol-plane-operator/controllers/hostedcontrolplane/v2/oauth/idp_convert_test.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/drainer/drainer.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/globalps/globalps.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/globalps/setup.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/globalps/setup_test.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/hcpstatus/hcpstatus.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/inplaceupgrader/inplaceupgrader.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/inplaceupgrader/inplaceupgrader_test.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/machine/machine.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/node/node.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/nodecount/controller.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/resources/kas/admissionpolicies.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/resources/registry/admissionpolicies.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.gocontrol-plane-operator/hostedclusterconfigoperator/controllers/resources/resources_test.gocontrol-plane-operator/main.gocontrol-plane-pki-operator/certificaterevocationcontroller/certificaterevocationcontroller.gocontrol-plane-pki-operator/certificaterevocationcontroller/certificaterevocationcontroller_test.godocs/content/how-to/ci/docs-preview.mddocs/content/how-to/ci/github-actions.mddocs/content/how-to/common/global-pull-secret.mddocs/content/how-to/gcp/configure-image-registry.mddocs/content/how-to/gcp/create-gcp-hosted-cluster.mddocs/content/how-to/gcp/index.mddocs/content/how-to/kubevirt/configuring-vm-with-jsonpatch.mddocs/mkdocs.ymlhack/github-actions-runner/README.mdhack/github-actions-runner/cache-warming-cronjob.yamlhack/kubelet-ratcheting-gen/main.gohypershift-operator/controllers/auditlogpersistence/snapshot_controller.gohypershift-operator/controllers/auditlogpersistence/snapshot_controller_test.gohypershift-operator/controllers/etcdbackup/reconciler.gohypershift-operator/controllers/etcdbackup/reconciler_test.gohypershift-operator/controllers/hostedcluster/etcd_recovery.gohypershift-operator/controllers/hostedcluster/etcd_recovery_test.gohypershift-operator/controllers/hostedcluster/hostedcluster_controller.gohypershift-operator/controllers/hostedcluster/hostedcluster_controller_test.gohypershift-operator/controllers/hostedcluster/internal/platform/platform.gohypershift-operator/controllers/hostedcluster/karpenter.gohypershift-operator/controllers/hostedcluster/karpenter_test.gohypershift-operator/controllers/hostedcluster/metrics/metrics.gohypershift-operator/controllers/hostedcluster/network_policies.gohypershift-operator/controllers/hostedcluster/network_policies_test.gohypershift-operator/controllers/hostedclustersizing/hostedclustersizing_controller.gohypershift-operator/controllers/hostedclustersizing/hostedclustersizing_controller_test.gohypershift-operator/controllers/hostedclustersizing/hostedclustersizing_validation_controller.gohypershift-operator/controllers/nodepool/aws.gohypershift-operator/controllers/nodepool/aws_test.gohypershift-operator/controllers/nodepool/capi.gohypershift-operator/controllers/nodepool/capi_test.gohypershift-operator/controllers/nodepool/metrics/metrics.gohypershift-operator/controllers/nodepool/nodepool_controller.gohypershift-operator/controllers/platform/aws/controller.gohypershift-operator/controllers/platform/aws/controller_test.gohypershift-operator/controllers/scheduler/aws/autoscaler.gohypershift-operator/controllers/scheduler/aws/autoscaler_test.gohypershift-operator/controllers/scheduler/aws/dedicated_request_serving_nodes.gohypershift-operator/controllers/scheduler/aws/dedicated_request_serving_nodes_test.gohypershift-operator/controllers/scheduler/azure/controller.gohypershift-operator/main.goignition-server/controllers/local_ignitionprovider.goignition-server/controllers/local_ignitionprovider_test.gokarpenter-operator/controllers/karpenter/assets/tests/openshiftec2nodeclasses.karpenter.hypershift.openshift.io/stable.openshiftec2nodeclasses.kubelet-field-promotion.testsuite.yamlkarpenter-operator/controllers/karpenter/assets/tests/openshiftec2nodeclasses.karpenter.hypershift.openshift.io/stable.openshiftec2nodeclasses.kubelet-ratcheting.testsuite.yamlkarpenter-operator/controllers/karpenter/assets/tests/openshiftec2nodeclasses.karpenter.hypershift.openshift.io/stable.openshiftec2nodeclasses.kubelet.testsuite.yamlkarpenter-operator/controllers/karpenter/karpenter_controller.gokarpenter-operator/controllers/karpenter/karpenter_controller_test.gokarpenter-operator/controllers/karpenterignition/karpenterignition_controller.gokarpenter-operator/controllers/karpenterignition/karpenterignition_controller_test.gokarpenter-operator/controllers/nodeclass/ec2_nodeclass_controller.gokarpenter-operator/controllers/nodeclass/karpenter_util.gokarpenter-operator/controllers/nodeclass/karpenter_util_test.gosupport/api/scheme.gosupport/controlplane-component/CLAUDE.mdsupport/karpenter/karpenter.gosupport/karpenter/karpenter_test.gosupport/podspec/containers.gosupport/podspec/containers_test.gosupport/validations/authentication.gosupport/validations/authentication_test.gotest/e2e/create_cluster_test.gotest/e2e/karpenter_kubelet_checker_pod.yamltest/e2e/karpenter_test.gotest/e2e/util/dump/journals.gotest/e2e/util/hypershift_framework.gotest/e2e/util/reqserving/verifycp.gotest/e2e/util/reqserving/verifyenv.gotest/e2e/util/util.gotest/e2e/v2/backuprestore/cleanup.gotest/e2e/v2/cmd/create-guests/main.gotest/e2e/v2/internal/env_vars.gotest/e2e/v2/tests/backup_restore_test.gotest/e2e/v2/tests/control_plane_upgrade_test.gotest/e2e/v2/tests/etcd_chaos_test.gotest/e2e/v2/tests/hosted_cluster_image_registry_test.gotest/e2e/v2/tests/nodepool_autoscaling_test.gotest/e2e/v2/tests/nodepool_lifecycle_test.gotest/integration/control_plane_pki_operator.go
💤 Files with no reviewable changes (9)
- control-plane-operator/hostedclusterconfigoperator/controllers/hcpstatus/hcpstatus.go
- control-plane-operator/hostedclusterconfigoperator/controllers/drainer/drainer.go
- control-plane-operator/hostedclusterconfigoperator/controllers/machine/machine.go
- control-plane-operator/hostedclusterconfigoperator/controllers/resources/registry/admissionpolicies.go
- control-plane-operator/hostedclusterconfigoperator/controllers/nodecount/controller.go
- control-plane-operator/controllers/gcpprivateserviceconnect/observer.go
- control-plane-operator/hostedclusterconfigoperator/controllers/node/node.go
- control-plane-operator/hostedclusterconfigoperator/controllers/globalps/globalps.go
- control-plane-operator/hostedclusterconfigoperator/controllers/resources/kas/admissionpolicies.go
beea747 to
f19b53f
Compare
f19b53f to
002d435
Compare
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: bryan-cox The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
|
Scheduling tests matching the |
Add Label("lifecycle") to all lifecycle test Describes so general v2
jobs can exclude them with a single !lifecycle filter instead of
enumerating each label individually.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
/pipeline required |
|
Scheduling tests matching the |
|
/lgtm |
|
Tests from second stage were triggered manually. Pipeline can be controlled only manually, until HEAD changes. Use command to trigger second stage. |
|
/retest |
AI Test Failure AnalysisJob: Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6 |
|
/test e2e-aks |
|
/test e2e-aws |
AI Test Failure AnalysisJob: Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6 |
|
/test e2e-azure-v2-self-managed |
|
/test e2e-azure-self-managed |
|
/retest |
|
/test e2e-aws |
|
/override "Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main" |
|
/override "Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main" |
|
@bryan-cox: Overrode contexts on behalf of bryan-cox: Red Hat Konflux / hypershift-operator-main-enterprise-contract / hypershift-operator-main DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/verified by e2e |
|
@bryan-cox: This PR has been marked as verified by DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository. |
|
@bryan-cox: Overrode contexts on behalf of bryan-cox: Red Hat Konflux / hypershift-operator-enterprise-contract / hypershift-operator-main DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/retest One more time |
AI Test Failure AnalysisJob: Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6 |
|
/retest |
|
@bryan-cox: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
|
Now I have all the evidence I need. Let me compile the final report: Test Failure Analysis CompleteJob Information
Test Failure AnalysisErrorSummaryThe Root Causee2e-aws (TestKarpenterUpgradeControlPlane): The root cause is a Karpenter node replacement failure. The test sequence was:
Karpenter's drift detection worked correctly, but its node replacement/disruption mechanism failed to act on the drift within 45 minutes. The node remained healthy (Ready=True, no pressure conditions) throughout, suggesting Karpenter never initiated the disruption/replacement workflow despite marking the NodeClaim as drifted. This could be caused by:
This failure is unrelated to PR #8527's changes. The PR modifies Konflux enterprise-contract failures: Both Konflux checks ( Recommendations
Evidence
|
Summary
Ports 4 remaining v1 lifecycle tests to the v2 Ginkgo framework with platform-agnostic labels, enabling them to run in the Azure self-managed CI pipeline (and any future platform CI).
nodepool-autoscaling): scale-up/down and multi-NodePool balancingnodepool-lifecycle): 13 sub-tests covering machineconfig, NTO, upgrades (replace/in-place/rolling), previous releases, mirror configs, trust bundles, performance profiles, auto-repair, and disk encryptioncontrol-plane-upgrade): N-1 → latest release upgrade with component and version rollout verificationetcd-chaos): 5 sub-tests for single member recovery, random/all member kills, WAL corruption, and missing member recoveryAlso includes:
e2eutilhelper functions from*testing.Ttotesting.TBfor Ginkgo compatibility (GinkgoTB()returnstesting.TB, not*testing.T)create-guestsbinary for CI cluster creation (wraps hypershift CLI, waits for availability)Design decisions
t.Run()(e.g.EnsureNoCrashingPods) remain as TODOs sincetesting.TBdoesn't exposeRun()Companion PR needed:
openshift/releasechanges for CI wiring (create/destroy/dump scripts, label filters, job config)Test plan
make verifypassesmake e2ebuilds clean (v1 backwards-compatible aftertesting.TBchange)make e2ev2builds cleango build -tags e2ev2 ./test/e2e/v2/cmd/create-guests/compilesgo vet -tags e2ev2 ./test/e2e/v2/...clean/test e2e-azure-v2-self-managed(existing tests still pass)🤖 Generated with Claude Code
Summary by CodeRabbit
Tests
New Features
Chores