Skip to content

OCPBUGS-61218: test(e2e): add control plane component rollout validation to upgrade test#6767

Merged
openshift-merge-bot[bot] merged 1 commit intoopenshift:mainfrom
csrwng:upgrade_cp_validation
Sep 8, 2025
Merged

OCPBUGS-61218: test(e2e): add control plane component rollout validation to upgrade test#6767
openshift-merge-bot[bot] merged 1 commit intoopenshift:mainfrom
csrwng:upgrade_cp_validation

Conversation

@csrwng
Copy link
Contributor

@csrwng csrwng commented Sep 5, 2025

What this PR does / why we need it:
Add WaitForControlPlaneComponentRollout function to ensure control plane components complete rollout before proceeding with upgrade validation. This includes:

  • New test step to wait for control plane component rollout completion
  • Support for ControlPlaneComponent conditions in the eventually utility
  • 30-minute timeout with 3-second polling interval for efficient validation

Which issue(s) this PR fixes (optional, use fixes #<issue_number>(, fixes #<issue_number>, ...) format, where issue_number might be a GitHub issue, or a Jira story:
Fixes #OCPBUGS-61218

Checklist

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes unit tests.

Summary by CodeRabbit

  • Tests
    • Enhanced upgrade e2e coverage to explicitly wait for control plane components to complete rollout, using the detected starting version as a baseline.
    • Validates that components progress beyond the initial version and report rollout-complete before continuing the flow.
    • Expanded condition handling to include control plane components for more accurate readiness checks.
    • Improves reliability and signal of upgrade validations without impacting runtime behavior.

@openshift-ci openshift-ci bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 5, 2025
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Sep 5, 2025
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 5, 2025

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci-robot openshift-ci-robot added the jira/invalid-bug Indicates that a referenced Jira bug is invalid for the branch this PR is targeting. label Sep 5, 2025
@openshift-ci-robot
Copy link

@csrwng: This pull request references Jira Issue OCPBUGS-61218, which is invalid:

  • expected the bug to target the "4.21.0" version, but no target version was set

Comment /jira refresh to re-evaluate validity if changes to the Jira bug are made, or edit the title of this pull request to link to a different bug.

The bug has been updated to refer to the pull request using the external bug tracker.

Details

In response to this:

What this PR does / why we need it:
Add WaitForControlPlaneComponentRollout function to ensure control plane components complete rollout before proceeding with upgrade validation. This includes:

  • New test step to wait for control plane component rollout completion
  • Support for ControlPlaneComponent conditions in the eventually utility
  • 30-minute timeout with 3-second polling interval for efficient validation

Which issue(s) this PR fixes (optional, use fixes #<issue_number>(, fixes #<issue_number>, ...) format, where issue_number might be a GitHub issue, or a Jira story:
Fixes #OCPBUGS-61218

Checklist

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes unit tests.

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.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 5, 2025

Walkthrough

Adds a control plane component rollout wait to the upgrade e2e test, deriving the starting version from HostedCluster status. Introduces a util to wait for ControlPlaneComponent rollout (with optional starting-version gate) and extends condition extraction to ControlPlaneComponent objects.

Changes

Cohort / File(s) Summary of changes
Upgrade test flow
test/e2e/control_plane_upgrade_test.go
Extracts startingVersion from HostedCluster status. Adds subtest (>=4.20) to wait for control plane component rollout. Invokes the rollout wait after setting release image and after updating HostedCluster. Updates calls to include startingVersion.
E2E util: conditions support
test/e2e/util/eventually.go
Extends Conditions(...) to handle *hyperv1.ControlPlaneComponent, returning adapted status conditions.
E2E util: rollout wait helper
test/e2e/util/util.go
Adds WaitForControlPlaneComponentRollout(t, ctx, client, hostedCluster, initialVersion) which lists ControlPlaneComponent objects, requires >10 components, waits for RolloutComplete condition, and ensures components progress beyond initialVersion if provided. 30m timeout, 10s interval.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Test as e2e Upgrade Test
  participant API as K8s API Server
  participant Util as util.WaitForControlPlaneComponentRollout

  Note over Test: Extract startingVersion from HostedCluster.Status.Version.History[0]
  Test->>API: Update release image / HostedCluster
  Test->>Util: WaitForControlPlaneComponentRollout(startingVersion)
  Util->>API: List ControlPlaneComponent in HCP namespace (poll)
  alt Components count > 10
    loop Until rollout complete for all
      Util->>API: Get each ControlPlaneComponent
      Util->>Util: Check RolloutComplete condition
      opt startingVersion provided
        Util->>Util: Verify reported version != startingVersion
      end
    end
    Util-->>Test: Success
  else Too few components
    Util->>API: Retry (polling)
  end
  Test->>API: Wait for overall image rollout (existing flow)
  Test-->>Test: Upgrade test proceeds
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.2.2)

Error: can't load config: unsupported version of the configuration: "" See https://golangci-lint.run/product/migration-guide for migration instructions
The command is terminated due to an error: can't load config: unsupported version of the configuration: "" See https://golangci-lint.run/product/migration-guide for migration instructions

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@openshift-ci openshift-ci bot added do-not-merge/needs-area area/testing Indicates the PR includes changes for e2e testing and removed do-not-merge/needs-area labels Sep 5, 2025
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 5, 2025

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: csrwng

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Sep 5, 2025
@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 5, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

/test verify
/test e2e-aws

@csrwng csrwng force-pushed the upgrade_cp_validation branch from 998e913 to 4d53181 Compare September 5, 2025 15:31
@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

/test verify
/test e2e-aws

@csrwng csrwng force-pushed the upgrade_cp_validation branch from 4d53181 to 3ca5e53 Compare September 5, 2025 15:56
@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

/test verify
/test e2e-aws

…test

Add WaitForControlPlaneComponentRollout function to ensure control plane
components complete rollout before proceeding with upgrade validation.
This includes:
- New test step to wait for control plane component rollout completion
- Support for ControlPlaneComponent conditions in the eventually utility
- 30-minute timeout with 3-second polling interval for efficient validation

Signed-off-by: Cesar Wong <cewong@redhat.com>
Assisted-by: Claude Sonnet 4 (via Cursor)
@csrwng csrwng force-pushed the upgrade_cp_validation branch from 3ca5e53 to c10bcee Compare September 5, 2025 16:38
@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

/test verify
/test e2e-aws

@sjenning
Copy link
Contributor

sjenning commented Sep 5, 2025

/test verify

@cwbotbot
Copy link

cwbotbot commented Sep 5, 2025

Test Results

e2e-aws

e2e-aks

@sjenning
Copy link
Contributor

sjenning commented Sep 5, 2025

e2e failure is a flake, ready for review

@sjenning
Copy link
Contributor

sjenning commented Sep 5, 2025

/lgtm

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Sep 5, 2025
@sjenning
Copy link
Contributor

sjenning commented Sep 5, 2025

/jira refresh

@openshift-ci-robot openshift-ci-robot added the jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. label Sep 5, 2025
@openshift-ci-robot
Copy link

@sjenning: This pull request references Jira Issue OCPBUGS-61218, which is valid. The bug has been moved to the POST state.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.21.0) matches configured target version for branch (4.21.0)
  • bug is in the state New, which is one of the valid states (NEW, ASSIGNED, POST)

No GitHub users were found matching the public email listed for the QA contact in Jira (jiezhao@redhat.com), skipping review request.

Details

In response to this:

/jira refresh

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.

@openshift-ci-robot openshift-ci-robot removed the jira/invalid-bug Indicates that a referenced Jira bug is invalid for the branch this PR is targeting. label Sep 5, 2025
@csrwng csrwng marked this pull request as ready for review September 5, 2025 19:31
@openshift-ci openshift-ci bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Sep 5, 2025
@csrwng
Copy link
Contributor Author

csrwng commented Sep 5, 2025

/verified by e2e-test

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Sep 5, 2025
@openshift-ci-robot
Copy link

@csrwng: This PR has been marked as verified by e2e-test.

Details

In response to this:

/verified by e2e-test

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.

@openshift-ci openshift-ci bot requested review from bryan-cox and muraee September 5, 2025 19:32
@openshift-ci-robot
Copy link

@csrwng: This pull request references Jira Issue OCPBUGS-61218, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.21.0) matches configured target version for branch (4.21.0)
  • bug is in the state POST, which is one of the valid states (NEW, ASSIGNED, POST)

No GitHub users were found matching the public email listed for the QA contact in Jira (jiezhao@redhat.com), skipping review request.

Details

In response to this:

What this PR does / why we need it:
Add WaitForControlPlaneComponentRollout function to ensure control plane components complete rollout before proceeding with upgrade validation. This includes:

  • New test step to wait for control plane component rollout completion
  • Support for ControlPlaneComponent conditions in the eventually utility
  • 30-minute timeout with 3-second polling interval for efficient validation

Which issue(s) this PR fixes (optional, use fixes #<issue_number>(, fixes #<issue_number>, ...) format, where issue_number might be a GitHub issue, or a Jira story:
Fixes #OCPBUGS-61218

Checklist

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes unit tests.

Summary by CodeRabbit

  • Tests
  • Enhanced upgrade e2e coverage to explicitly wait for control plane components to complete rollout, using the detected starting version as a baseline.
  • Validates that components progress beyond the initial version and report rollout-complete before continuing the flow.
  • Expanded condition handling to include control plane components for more accurate readiness checks.
  • Improves reliability and signal of upgrade validations without impacting runtime behavior.

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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
test/e2e/util/util.go (1)

584-617: Harden rollout wait: add in-function version gate, clearer count check, and focused condition dump

  • Add an in-function AtLeast(Version420) guard to avoid 30m timeouts if used from older suites.
  • Make the component-count predicate explicit and message include the observed count.
  • Filter condition dumps to the rollout condition to reduce log noise on failures.
 func WaitForControlPlaneComponentRollout(t *testing.T, ctx context.Context, client crclient.Client, hostedCluster *hyperv1.HostedCluster, initialVersion string) {
+	// Guard misuse on pre-4.20 where ControlPlaneComponent CRD doesn't exist.
+	AtLeast(t, Version420)
 	controlPlaneComponents := &hyperv1.ControlPlaneComponentList{}
 	controlPlaneNamespace := manifests.HostedControlPlaneNamespace(hostedCluster.Namespace, hostedCluster.Name)
 	EventuallyObjects(t, ctx, "control plane components to complete rollout",
 		func(ctx context.Context) ([]*hyperv1.ControlPlaneComponent, error) {
 			err := client.List(ctx, controlPlaneComponents, crclient.InNamespace(controlPlaneNamespace))
 			items := make([]*hyperv1.ControlPlaneComponent, len(controlPlaneComponents.Items))
 			for i := range controlPlaneComponents.Items {
 				items[i] = &controlPlaneComponents.Items[i]
 			}
 			return items, err
 		},
 		[]Predicate[[]*hyperv1.ControlPlaneComponent]{
 			func(cpComponents []*hyperv1.ControlPlaneComponent) (done bool, reasons string, err error) {
-				return len(cpComponents) > 10, "expecting more than 10 control plane components", nil
+				const minComponents = 10
+				if len(cpComponents) >= minComponents {
+					return true, "", nil
+				}
+				return false, fmt.Sprintf("expecting at least %d control plane components, got %d", minComponents, len(cpComponents)), nil
 			},
 		},
 		[]Predicate[*hyperv1.ControlPlaneComponent]{
 			ConditionPredicate[*hyperv1.ControlPlaneComponent](Condition{
 				Type:   string(hyperv1.ControlPlaneComponentRolloutComplete),
 				Status: metav1.ConditionTrue,
 			}),
 			func(cpComponent *hyperv1.ControlPlaneComponent) (done bool, reasons string, err error) {
 				if initialVersion != "" && cpComponent.Status.Version == initialVersion {
 					return false, fmt.Sprintf("component %s is still on version %s", cpComponent.Name, cpComponent.Status.Version), nil
 				}
 				return true, fmt.Sprintf("component %s has version: %s", cpComponent.Name, cpComponent.Status.Version), nil
 			},
 		},
 		WithTimeout(30*time.Minute),
 		WithInterval(10*time.Second),
+		WithFilteredConditionDump(Condition{Type: string(hyperv1.ControlPlaneComponentRolloutComplete)}),
 	)
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge Base: Disabled due to Reviews > Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between e18ca4b and c10bcee.

📒 Files selected for processing (3)
  • test/e2e/control_plane_upgrade_test.go (2 hunks)
  • test/e2e/util/eventually.go (1 hunks)
  • test/e2e/util/util.go (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Red Hat Konflux / hypershift-operator-main-on-pull-request
🔇 Additional comments (2)
test/e2e/util/eventually.go (1)

479-480: Add ControlPlaneComponent to Conditions: LGTM

The adaptation follows the existing pattern and enables predicates on ControlPlaneComponent. No issues.

test/e2e/control_plane_upgrade_test.go (1)

62-66: Rollout wait subtest: LGTM

Good placement and gating; aligns with upgrade flow.

Comment on lines +37 to +41
var startingVersion string
if len(hostedCluster.Status.Version.History) > 0 {
startingVersion = hostedCluster.Status.Version.History[0].Version
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix potential nil-pointer dereference on HostedCluster.Status.Version

Status.Version is a pointer; if nil, accessing History panics. Guard it like elsewhere (e.g., WaitForImageRollout).

-		var startingVersion string
-		if len(hostedCluster.Status.Version.History) > 0 {
-			startingVersion = hostedCluster.Status.Version.History[0].Version
-		}
+		var startingVersion string
+		if hostedCluster.Status.Version != nil && len(hostedCluster.Status.Version.History) > 0 {
+			startingVersion = hostedCluster.Status.Version.History[0].Version
+		}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var startingVersion string
if len(hostedCluster.Status.Version.History) > 0 {
startingVersion = hostedCluster.Status.Version.History[0].Version
}
var startingVersion string
if hostedCluster.Status.Version != nil && len(hostedCluster.Status.Version.History) > 0 {
startingVersion = hostedCluster.Status.Version.History[0].Version
}
🤖 Prompt for AI Agents
In test/e2e/control_plane_upgrade_test.go around lines 37 to 41, the code
accesses hostedCluster.Status.Version.History without checking if Status.Version
is nil which can cause a nil-pointer panic; update the logic to first check if
hostedCluster.Status.Version != nil and only then inspect Version.History (and
its length) to set startingVersion, otherwise leave startingVersion empty or
handle the absent version path the same way other tests do (e.g.,
WaitForImageRollout) to avoid dereferencing a nil pointer.

@openshift-ci-robot
Copy link

/retest-required

Remaining retests: 0 against base HEAD c1c848a and 2 for PR HEAD c10bcee in total

@openshift-ci-robot
Copy link

/retest-required

Remaining retests: 0 against base HEAD d29713d and 1 for PR HEAD c10bcee in total

},
[]Predicate[*hyperv1.ControlPlaneComponent]{
ConditionPredicate[*hyperv1.ControlPlaneComponent](Condition{
Type: string(hyperv1.ControlPlaneComponentRolloutComplete),
Copy link
Member

@enxebre enxebre Sep 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fwiw a component can only be at version if roll out has completed for it.
we'll want to check controlPlaneUptoda once this merges #6300

@enxebre
Copy link
Member

enxebre commented Sep 8, 2025

/test e2e-aks

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 8, 2025

@csrwng: all tests passed!

Full PR test history. Your PR dashboard.

Details

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. I understand the commands that are listed here.

@openshift-merge-bot openshift-merge-bot bot merged commit 537c6ae into openshift:main Sep 8, 2025
18 checks passed
@openshift-ci-robot
Copy link

@csrwng: Jira Issue Verification Checks: Jira Issue OCPBUGS-61218
✔️ This pull request was pre-merge verified.
✔️ All associated pull requests have merged.
✔️ All associated, merged pull requests were pre-merge verified.

Jira Issue OCPBUGS-61218 has been moved to the MODIFIED state and will move to the VERIFIED state when the change is available in an accepted nightly payload. 🕓

Details

In response to this:

What this PR does / why we need it:
Add WaitForControlPlaneComponentRollout function to ensure control plane components complete rollout before proceeding with upgrade validation. This includes:

  • New test step to wait for control plane component rollout completion
  • Support for ControlPlaneComponent conditions in the eventually utility
  • 30-minute timeout with 3-second polling interval for efficient validation

Which issue(s) this PR fixes (optional, use fixes #<issue_number>(, fixes #<issue_number>, ...) format, where issue_number might be a GitHub issue, or a Jira story:
Fixes #OCPBUGS-61218

Checklist

  • Subject and description added to both, commit and PR.
  • Relevant issues have been referenced.
  • This change includes unit tests.

Summary by CodeRabbit

  • Tests
  • Enhanced upgrade e2e coverage to explicitly wait for control plane components to complete rollout, using the detected starting version as a baseline.
  • Validates that components progress beyond the initial version and report rollout-complete before continuing the flow.
  • Expanded condition handling to include control plane components for more accurate readiness checks.
  • Improves reliability and signal of upgrade validations without impacting runtime behavior.

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.

sjenning added a commit to sjenning/hypershift that referenced this pull request Sep 17, 2025
PR openshift#6767 added a check for component rollout only in
TestUpgradeControlPlane after the upgrade had been triggered.

However, we need to check this on _all_ rollouts in all tests.
WaitForImageRollout() is the function used for that.

This moves the new component rollout check into WaitForImageRollout()
so that we do it for all HC rollouts in all tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/testing Indicates the PR includes changes for e2e testing jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants