Skip to content

OCPBUGS-92182: OCPBUGS-99219: Use providerSpec.Template in vSphere machineset reconciliation - #6234

Merged
openshift-merge-bot[bot] merged 2 commits into
openshift:mainfrom
djoshy:vsphere-fd-fix
Aug 4, 2026
Merged

OCPBUGS-92182: OCPBUGS-99219: Use providerSpec.Template in vSphere machineset reconciliation#6234
openshift-merge-bot[bot] merged 2 commits into
openshift:mainfrom
djoshy:vsphere-fd-fix

Conversation

@djoshy

@djoshy djoshy commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

When a new failure domain is added, the controller always looked up the template by the computed name, ignoring providerSpec.Template, causing reconciliation to fail. Fix by checking providerSpec.Template first, using errors.As for NotFoundError, and creating the template from OVA when none exists. I broke out the resolution step into a separate function to reduce the cyclomatic complexity as the lint check failed(which is fair 😄).

An additional RBAC manifest was added as the MCC needs to lookup the cluster-config-v1 configmap in the kube-system namespace to recover the original install time configuration for the template.

I also rolled in the fix for https://redhat.atlassian.net/browse/OCPBUGS-99219 to this PR, since it is somewhat related.

- How to verify it
A machineset with a non standard vsphere template name(not matching the old name the MCO compute from the infra object) should be successfully reconciled.

Existing vSphere boot image e2es should also continue to pass.

Summary by CodeRabbit

  • New Features

    • Improved vSphere boot image recovery for new and existing failure domains.
    • Automatically restores rollback templates or creates missing templates when needed.
    • Supports disk type configuration from the cluster configuration.
  • Permissions

    • Added the required access for the Machine Config Controller to read cluster configuration.
  • Reliability

    • Improved template resolution and handling when provider and infrastructure settings differ.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@openshift-ci-robot openshift-ci-robot added jira/severity-important Referenced Jira bug's severity is important for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. labels Jun 25, 2026
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@djoshy: This pull request references Jira Issue OCPBUGS-92182, 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 (5.0.0) matches configured target version for branch (5.0.0)
  • bug is in the state New, which is one of the valid states (NEW, ASSIGNED, POST)

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

Details

In response to this:

When a new failure domain is added, the controller always looked up the template by the computed name, ignoring providerSpec.Template, causing reconciliation to fail. Fix by checking providerSpec.Template first, using errors.As for NotFoundError, and creating the template from OVA when none exists. I broke out the resolution step into a separate function to reduce the cyclomatic complexity as the lint check failed(which is fair 😄 )

- How to verify it
A machineset with a non standard vsphere template name(not matching the old name the MCO compute from the infra object) should be successfully reconciled.

Existing vSphere boot image e2es should also continue to pass.

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

Copy link
Copy Markdown
Contributor

@djoshy: This pull request references Jira Issue OCPBUGS-92182, which is valid.

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

In response to this:

When a new failure domain is added, the controller always looked up the template by the computed name, ignoring providerSpec.Template, causing reconciliation to fail. Fix by checking providerSpec.Template first, using errors.As for NotFoundError, and creating the template from OVA when none exists. I broke out the resolution step into a separate function to reduce the cyclomatic complexity as the lint check failed(which is fair 😄).

- How to verify it
A machineset with a non standard vsphere template name(not matching the old name the MCO compute from the infra object) should be successfully reconciled.

Existing vSphere boot image e2es should also continue to pass.

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

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

MachineConfigController now reads vSphere disk configuration from the install-config ConfigMap and gains RBAC for that access. vSphere template reconciliation resolves existing, rollback, or newly created templates and propagates the resolved name through divergence handling.

Changes

vSphere template recovery

Layer / File(s) Summary
Install-config RBAC access
manifests/machineconfigcontroller/install-config-role.yaml, manifests/machineconfigcontroller/install-config-rolebinding.yaml, pkg/operator/sync.go
Adds and applies RBAC allowing the MachineConfigController to read kube-system/cluster-config-v1.
Template resolution and recovery
pkg/controller/bootimage/vsphere_helpers.go
Reads platform.vsphere.diskType and resolves templates using provider or infrastructure names, rollback VM renaming, or OVA creation.
Reconciliation wiring and resolved-name handling
pkg/controller/bootimage/platform_helpers.go, pkg/controller/bootimage/vsphere_helpers.go
Passes kubeClient through vSphere reconciliation and uses the resolved template name for validation, creation, and divergence checks.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ReconcileVSphereProviderSpec
  participant KubeClient
  participant ResolveExistingTemplateVM
  participant VSphere
  ReconcileVSphereProviderSpec->>KubeClient: Fetch cluster-config-v1 and vSphere credentials
  KubeClient-->>ResolveExistingTemplateVM: Provide diskType and client access
  ResolveExistingTemplateVM->>VSphere: Look up provider or infrastructure template
  VSphere-->>ResolveExistingTemplateVM: Return existing VM or not found
  ResolveExistingTemplateVM->>VSphere: Rename rollback VM or create template from OVA
  ResolveExistingTemplateVM-->>ReconcileVSphereProviderSpec: Return resolvedName and created
Loading

Possibly related issues

  • openshift/vcf-migration-operator#68 — Addresses vSphere RHCOS template naming, lookup, rollback recovery, and creation by failure domain.

Suggested reviewers: sergiordlr, ptalgulk01

🚥 Pre-merge checks | ✅ 15
✅ Passed checks (15 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed No Ginkgo tests were added or modified; the PR only changes helpers, RBAC manifests, and sync wiring, with no test titles to audit.
Test Structure And Quality ✅ Passed No Ginkgo test code was added or modified in this PR, so the test-structure checklist is not applicable.
Microshift Test Compatibility ✅ Passed No new Ginkgo tests were added; the commit only changes controller/manifests, with no *_test.go files or Ginkgo constructs present.
Single Node Openshift (Sno) Test Compatibility ✅ Passed No new Ginkgo e2e tests were added; the diff only changes helpers/controllers and RBAC manifests, so SNO compatibility is not applicable.
Topology-Aware Scheduling Compatibility ✅ Passed The PR only adds bootimage lookup/RBAC updates; changed code contains no new node selectors, affinity, spread constraints, replicas, or topology assumptions.
Ote Binary Stdout Contract ✅ Passed The PR only adds helper-level klog logging and RBAC manifests; no main/init/TestMain/BeforeSuite/RunSpecs setup or stdout writes were added.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No Ginkgo e2e tests were added in the PR; changed files are controller code and manifests only.
No-Weak-Crypto ✅ Passed No banned algorithms or secret/token comparisons appear in the diff; the only crypto use is existing sha256 VM-name hashing.
Container-Privileges ✅ Passed Changed files add only RBAC and code wiring; no privileged, hostPID/Network/IPC, SYS_ADMIN, root, or allowPrivilegeEscalation fields appear.
No-Sensitive-Data-In-Logs ✅ Passed No passwords, tokens, PII, or raw config data are logged; new klog lines only mention vSphere template/failure-domain names and error context.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly reflects the main vSphere reconciliation change around using providerSpec.Template.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci
openshift-ci Bot requested review from ptalgulk01 and sergiordlr June 25, 2026 16:15
@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jun 25, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@pkg/controller/bootimage/vsphere_helpers.go`:
- Around line 262-283: The rollback VM lookup in createTemplateForFailureDomain
treats any oldErr from finder.VirtualMachine as if the VM does not exist, which
can hide real vCenter failures and incorrectly trigger OVA recreation. Update
this branch to only take the “no existing template” path for a
*find.NotFoundError, matching the computed-name lookup behavior, and return
other errors immediately so transient lookup failures are surfaced instead of
falling back to createNewVMTemplateWithNameForFailureDomain.
🪄 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: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e445c5ba-c20b-48d5-9b12-d660d0468c8a

📥 Commits

Reviewing files that changed from the base of the PR and between 60b01ff and e4c4d7d.

📒 Files selected for processing (1)
  • pkg/controller/bootimage/vsphere_helpers.go

Comment thread pkg/controller/bootimage/vsphere_helpers.go Outdated
@djoshy

djoshy commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

/retest-required

1 similar comment
@djoshy

djoshy commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

/retest-required

@jcpowermac

Copy link
Copy Markdown
Contributor

@djoshy surprised that there are no unit tests

jcpowermac

This comment was marked as duplicate.

jcpowermac

This comment was marked as outdated.

@jcpowermac jcpowermac left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review by Claude (AI Reviewer)

This review was performed by Claude Code (claude-opus-4-6) on behalf of @jcpowermac. I am the reviewer.

The refactor into resolveExistingTemplateVM is clean — extracting the resolution logic reduces cyclomatic complexity and the errors.As fix correctly handles govmomi error types. The create-from-OVA path for new failure domains fills the missing gap.

However there is a critical issue with what happens after the providerSpec.Template lookup succeeds — the caller still returns the computed name, which will patch the MachineSet to point at a VM that doesn't exist. See inline comments for details.

Findings summary:

  1. 🔴 Critical: providerSpec.Template lookup succeeds but caller overwrites with non-existent computed name
  2. 🟡 Silent error swallowing on providerSpec.Template lookup failure
  3. 🟡 Hardcoded "thin" disk type for new templates
  4. ⚪ Typo in doc comment

Comment thread pkg/controller/bootimage/vsphere_helpers.go Outdated
// already has a valid template doesn't fail just because the infra computed name isn't there yet.
if providerSpec.Template != "" && providerSpec.Template != name {
if tmplVM, tmplErr := finder.VirtualMachine(ctx, providerSpec.Template); tmplErr == nil {
return tmplVM, false, nil

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[Claude Review — Critical] When this branch succeeds and returns the VM found via providerSpec.Template, the caller in createNewVMTemplate still has name set to the computed {infraID}-rhcos-{failureDomainName}. The caller proceeds to check the RHCOS version and at line 621-623 does:

if providerSpec.Template != name {
    return name, true, nil
}

This patches the MachineSet's template to the computed name — but no VM with that name exists in vSphere. The MachineSet gets updated to reference a non-existent template, which will cause the same failure on the next reconciliation.

The fix needs to either:

  1. Return the resolved name alongside the VM (e.g. add a resolvedName string return), so the caller uses the name that actually matched, or
  2. Have the caller skip the providerSpec.Template != name divergence check when the template was resolved via providerSpec.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated.

if providerSpec.Template != "" && providerSpec.Template != name {
if tmplVM, tmplErr := finder.VirtualMachine(ctx, providerSpec.Template); tmplErr == nil {
return tmplVM, false, nil
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[Claude Review] If finder.VirtualMachine fails with a non-NotFoundError (e.g., permission denied, network timeout), the error is silently swallowed and we fall through to the computed name lookup. This could mask real infrastructure issues and make debugging harder. Consider at least logging:

klog.Warningf("Failed to look up providerSpec.Template %s, falling back to computed name: %v", providerSpec.Template, tmplErr)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is valid.

vCenter won't always be available (upgrade - maintenance, etc.)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated with a log line.

return nil, false, fmt.Errorf("failed to download %s: %w", ova.Location, ovaErr)
}
if createErr := createNewVMTemplateWithNameForFailureDomain(ctx, providerSpec, failureDomain, finder, client, tagManager, name, ovaPath, infraID, "thin"); createErr != nil {
return nil, false, createErr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[Claude Review] The existing update path uses getDiskTypeFromExistingVM(vmMo) to preserve the disk type from the current template. Hardcoding "thin" here for new failure domains may not match the cluster's convention (e.g., thick or eagerZeroedThick). Might be fine as a default but worth either a comment explaining why, or reading the disk type from a sibling failure domain's existing template if one was already processed in this loop.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I suppose in this scenario no template exists anywhere. I am unsure if we should select disk type for a user.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, should we just error out instead of creating a new VM?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[Claude Review] I checked the API types — disk type is not persisted anywhere in the OpenShift API. It is not in VSphereMachineProviderSpec, Infrastructure spec, or the failure domain topology. The install-config diskType is consumed by the installer at template creation time but never written to a cluster object that MCO can read.

So getDiskTypeFromExistingVM() is the only way to determine disk type at runtime — by inspecting an existing VM backing. For a brand new failure domain with no template, the options are:

  1. Read it from a sibling failure domain template — createNewVMTemplate loops over all failure domains, so if one was already resolved earlier in the loop with an existing VM, its disk type could be captured and reused here. This preserves whatever the installer originally set.
  2. Error out rather than guessing — force the user to ensure the template exists before adding the failure domain, since MCO cannot know the intended disk type.

Given that picking the wrong disk type could have real storage/performance implications and MCO should not be making that choice for the user, erroring out (option 2) with a clear message seems safer. Alternatively, option 1 is reasonable if we can assume all failure domains in a cluster use the same disk type.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@djoshy I am concerned about erroring, I have seen issues in testing when mco goes degraded for the entire cluster, other operators themselves become degraded as a result - I need to investigate this further.

@djoshy djoshy Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hi @jcpowermac no rush - any additional thoughts on how to handle this?

@djoshy

djoshy commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@djoshy surprised that there are no unit tests

It probably wasn't trivial to unit test govmomi calls without additional vendors when it was originally written. E2Es are required for feature promotion, so we probably decided to prioritize those instead. Although at this point, the amount of vSphere carveouts in the boot image controller warrants it 😅 ....but I'd rather not block this bug fix on that.

@vr4manta

Copy link
Copy Markdown
Contributor

/test ?

@vr4manta

Copy link
Copy Markdown
Contributor

/test e2e-vsphere e2e-vsphere-ovn-zones e2e-vsphere-ovn-upi

@jcpowermac jcpowermac left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review by @jcallen — two inline comments on error handling and disk type defaults.

Comment thread pkg/controller/bootimage/vsphere_helpers.go
Comment thread pkg/controller/bootimage/vsphere_helpers.go
@djoshy
djoshy force-pushed the vsphere-fd-fix branch 2 times, most recently from b34fcbd to 04eedf6 Compare July 14, 2026 18:17
@jcpowermac

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jul 14, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aws-ovn
/test e2e-aws-ovn-upgrade
/test e2e-gcp-op-ocl-part1
/test e2e-gcp-op-ocl-part2
/test e2e-gcp-op-part1
/test e2e-gcp-op-part2
/test e2e-gcp-op-single-node
/test e2e-hypershift

@djoshy

djoshy commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

/retest-required

@djoshy

djoshy commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

/pipeline required

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aws-ovn
/test e2e-aws-ovn-upgrade
/test e2e-gcp-op-ocl-part1
/test e2e-gcp-op-ocl-part2
/test e2e-gcp-op-part1
/test e2e-gcp-op-part2
/test e2e-gcp-op-single-node
/test e2e-hypershift
/test tls-pqc-readiness


return "", false, nil
return "", false, fmt.Errorf("providerSpec workspace (server: %s, datacenter: %s, datastore: %s, resourcePool: %s, vmGroup: %s) does not match any vCenter/failure domain in the Infrastructure object",
providerSpec.Workspace.Server, providerSpec.Workspace.Datacenter, providerSpec.Workspace.Datastore, providerSpec.Workspace.ResourcePool, providerSpec.Workspace.VMGroup)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated the message to account for this, I believe the underlying check was already in place:

// A failure domain is abstract and doesn't exist in vSphere. It represents a logical grouping of infrastructure components used to place and manage virtual machines in a way that ensures high availability and fault tolerance.
vmGroup := ""
if failureDomain.ZoneAffinity != nil {
if failureDomain.ZoneAffinity.HostGroup != nil {
if failureDomain.ZoneAffinity.HostGroup.VMGroup != "" {
vmGroup = failureDomain.ZoneAffinity.HostGroup.VMGroup
}
}
}

workspaceFolder, folderErr := finder.Folder(ctx, providerSpec.Workspace.Folder)
if folderErr != nil {
klog.Warningf("failed to resolve workspace folder %q; cannot verify template VM locality this reconcile, proceeding with name-based lookup only: %v", providerSpec.Workspace.Folder, folderErr)
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Dropped this down to a warning

@jcpowermac

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Aug 3, 2026
@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aws-ovn
/test e2e-aws-ovn-upgrade
/test e2e-gcp-op-ocl-part1
/test e2e-gcp-op-ocl-part2
/test e2e-gcp-op-part1
/test e2e-gcp-op-part2
/test e2e-gcp-op-single-node
/test e2e-hypershift
/test tls-pqc-readiness

@openshift-ci

openshift-ci Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: djoshy, jcpowermac

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

@djoshy

djoshy commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

/retest-required

@sergiordlr

Copy link
Copy Markdown
Contributor

Verified using IPI on vspehere multi-vcenter cluster.

The cluster was created using prow workflow periodic-ci-openshift-openshift-tests-private-release-5.0-amd64-nightly-vsphere-ipi-multi-vcenter-f28

The following verifications were executed using machinesets using both vcenters in the cluster:

Verify that custom templates out of the Machineset's folder are not deleted

  1. Create a machineset using a custom 4.17 template located out of the machineset's folder
$ oc get machineset -oyaml 
....
          template: mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova
          userDataSecret:
            name: user-data-mco-tc-89097-cloned
          workspace:
            datacenter: cidatacenter-2
            datastore: /cidatacenter-2/datastore/vsanDatastore
            folder: /cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc
            resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
            server: vcenter-1.ci.ibmc.devcluster.openshift.com
            
sh-5.1$ govc find / -type m -name "mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova"
/cidatacenter-2/vm/mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova
  1. Check that the machineset is updated and that the custom template out of the VM's folder is not removed

After update:

          template: ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon
          userDataSecret:
            name: user-data-mco-tc-89097-cloned
          workspace:
            datacenter: cidatacenter-2
            datastore: /cidatacenter-2/datastore/vsanDatastore
            folder: /cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc
            resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
            server: vcenter-1.ci.ibmc.devcluster.openshift.com
status:
  availableReplicas: 1
  fullyLabeledReplicas: 1
  labelSelector: machine.openshift.io/cluster-api-cluster=ci-op-jmbt6xwt-0c95e-rkcdc,machine.openshift.io/cluster-api-machineset=mco-tc-89097-cloned
  observedGeneration: 5
  readyReplicas: 1
  replicas: 1

sh-5.1$ govc find / -type m -name "ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon"
/cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc/ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon <-- NEW TEMPLATE

sh-5.1$ govc find / -type m -name "mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova"
/cidatacenter-2/vm/mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova  <-- OLD TEMPLATE NOT REMOVED

Verify that non-existent templates can be updated when the default template doesn't exist

Verification steps:

  1. Disable bootimages
  2. Delete the default template
  3. Configure an non-existent template
  4. Enable bootimages
I0722 12:58:06.244685       1 vsphere_helpers.go:302] providerSpec.Template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen-1 not found in vSphere; falling back to computed name ci-op-jzp
jwqxq-0c95e-9drkl-rhcos-pensive-roentgen
I0722 12:58:06.440042       1 vsphere_helpers.go:325] No existing template found for failure domain pensive-roentgen; creating new template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen
 from OVA
I0722 12:58:06.440093       1 cache.go:58] The file was found in cache: /tmp/imagebased/image_cache/rhcos-9.8.20260428-0-vmware.x86_64.ova. Reusing...
I0722 12:58:07.729127       1 vsphere_helpers.go:204] VM Template with name ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen does not already exists
I0722 12:58:07.929722       1 vsphere_helpers.go:134] using ESXi ci-vmware-host-1.ci.ibmc.devcluster.openshift.com to import the OVA image
I0722 12:58:57.369896       1 vsphere_helpers.go:603] VM Template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen created
I0722 12:58:57.373362       1 ms_helpers.go:211] Patching MAPI machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-1
I0722 12:58:57.384188       1 ms_helpers.go:281] Successfully patched machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-1
I0722 12:58:57.385219       1 boot_image_controller.go:314] MachineSet ci-op-jzpjwqxq-0c95e-9drkl-worker-1 updated, reconciling enrolled machineset resources

Result:

The default template is uploaded and the machineset is configured to use the default template.

Verify that custom existing templates are updated when the default template doesn't exist and there is no machineset using the default template

  1. Disable bootimages
  2. Create a 4.22 machineset and scale to 2
  3. Delete the default machineset
  4. Delete the default template
  5. Enable bootimages
I0716 15:47:48.206740       1 boot_image_controller.go:483] Bootimages management configuration has been updated, reconciling enrolled machine resources
I0716 15:47:48.206784       1 cpms_helpers.go:72] No ControlPlaneMachineSet was enrolled, so no ControlPlaneMachineSet will be enqueued.
I0716 15:47:48.254702       1 ms_helpers.go:302] No architecture annotation found on machineset mco-tc-89097-cloned, defaulting to control plane architecture
I0716 15:47:48.254723       1 platform_helpers.go:77] Reconciling MAPI machineset mco-tc-89097-cloned on VSphere, with arch x86_64
I0716 15:47:48.409651       1 vsphere_helpers.go:704] Existing RHCOS v9.8.20260520-0 does not match current RHCOS v9.8.20260428-0. Starting reconciliation process.
I0716 15:47:48.409817       1 cache.go:129] Downloading bootimage to /tmp/imagebased/image_cache/rhcos-9.8.20260428-0-vmware.x86_64.ova
I0716 15:47:52.545411       1 vsphere_helpers.go:134] using ESXi devqe-vmware-host-20.devqe.ibmc.devcluster.openshift.com to import the OVA image
I0716 15:48:35.875631       1 vsphere_helpers.go:397] VM Template with name mcotest-rhcos-9.8.20260520-0-vmware.x86_64.ova already exists, swapping atomically
I0716 15:48:36.466793       1 vsphere_helpers.go:421] VM mcotest-rhcos-9.8.20260520-0-vmware.x86_64.ova successfully replaced
I0716 15:48:36.474458       1 ms_helpers.go:211] Patching MAPI machineset mco-tc-89097-cloned
I0716 15:48:36.489168       1 ms_helpers.go:281] Successfully patched machineset mco-tc-89097-cloned

Result:

The default template atomically swapped and updated with the correct version.

Verify that and error is raised when a machineset is configured to use a wrong failure domain

  1. Configure a wrong server in the machineset workload.server field
...
          userDataSecret:
            name: worker-user-data
          workspace:
            datacenter: cidatacenter-2
            datastore: /cidatacenter-2/datastore/vsanDatastore
            folder: /cidatacenter-2/vm/ci-op-jzpjwqxq-0c95e-9drkl
            resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
            server: vcenter-1.ci.ibmc.devcluster.openshift.fake.com  <---- FAKE SERVER
  1. Check that an error is reported
oc get machineconfiguration cluster -oyaml
....
  - lastTransitionTime: "2026-07-22T12:22:04Z"
    message: '1 Degraded MAPI MachineSets | 0 Degraded ControlPlaneMachineSets | 0
      Degraded CAPI MachineSets | 0 Degraded CAPI MachineDeployments | Error(s): error
      syncing MAPI MachineSet ci-op-jzpjwqxq-0c95e-9drkl-worker-0x: failed to reconcile
      machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-0x, err: providerSpec workspace
      (server: vcenter-1.ci.ibmc.devcluster.openshift.fake.com, datacenter: cidatacenter-2,
      datastore: /cidatacenter-2/datastore/vsanDatastore, resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters,
      vmGroup: ) does not match any vCenter/failure domain in the Infrastructure object'
    reason: BootImageUpdateConfigurationUpdated
    status: "True"
    type: BootImageUpdateDegraded

/verified by @sergiordlr

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Aug 4, 2026
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@sergiordlr: This PR has been marked as verified by @sergiordlr.

Details

In response to this:

Verified using IPI on vspehere multi-vcenter cluster.

The cluster was created using prow workflow periodic-ci-openshift-openshift-tests-private-release-5.0-amd64-nightly-vsphere-ipi-multi-vcenter-f28

The following verifications were executed using machinesets using both vcenters in the cluster:

Verify that custom templates out of the Machineset's folder are not deleted

  1. Create a machineset using a custom 4.17 template located out of the machineset's folder
$ oc get machineset -oyaml 
....
         template: mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova
         userDataSecret:
           name: user-data-mco-tc-89097-cloned
         workspace:
           datacenter: cidatacenter-2
           datastore: /cidatacenter-2/datastore/vsanDatastore
           folder: /cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc
           resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
           server: vcenter-1.ci.ibmc.devcluster.openshift.com
           
sh-5.1$ govc find / -type m -name "mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova"
/cidatacenter-2/vm/mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova
  1. Check that the machineset is updated and that the custom template out of the VM's folder is not removed

After update:

         template: ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon
         userDataSecret:
           name: user-data-mco-tc-89097-cloned
         workspace:
           datacenter: cidatacenter-2
           datastore: /cidatacenter-2/datastore/vsanDatastore
           folder: /cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc
           resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
           server: vcenter-1.ci.ibmc.devcluster.openshift.com
status:
 availableReplicas: 1
 fullyLabeledReplicas: 1
 labelSelector: machine.openshift.io/cluster-api-cluster=ci-op-jmbt6xwt-0c95e-rkcdc,machine.openshift.io/cluster-api-machineset=mco-tc-89097-cloned
 observedGeneration: 5
 readyReplicas: 1
 replicas: 1

sh-5.1$ govc find / -type m -name "ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon"
/cidatacenter-2/vm/ci-op-jmbt6xwt-0c95e-rkcdc/ci-op-jmbt6xwt-0c95e-rkcdc-rhcos-funny-solomon <-- NEW TEMPLATE

sh-5.1$ govc find / -type m -name "mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova"
/cidatacenter-2/vm/mcotest-rhcos-417.94.202601272318-0-vmware.x86_64.ova  <-- OLD TEMPLATE NOT REMOVED

Verify that non-existent templates can be updated when the default template doesn't exist

Verification steps:

  1. Disable bootimages
  2. Delete the default template
  3. Configure an non-existent template
  4. Enable bootimages
I0722 12:58:06.244685       1 vsphere_helpers.go:302] providerSpec.Template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen-1 not found in vSphere; falling back to computed name ci-op-jzp
jwqxq-0c95e-9drkl-rhcos-pensive-roentgen
I0722 12:58:06.440042       1 vsphere_helpers.go:325] No existing template found for failure domain pensive-roentgen; creating new template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen
from OVA
I0722 12:58:06.440093       1 cache.go:58] The file was found in cache: /tmp/imagebased/image_cache/rhcos-9.8.20260428-0-vmware.x86_64.ova. Reusing...
I0722 12:58:07.729127       1 vsphere_helpers.go:204] VM Template with name ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen does not already exists
I0722 12:58:07.929722       1 vsphere_helpers.go:134] using ESXi ci-vmware-host-1.ci.ibmc.devcluster.openshift.com to import the OVA image
I0722 12:58:57.369896       1 vsphere_helpers.go:603] VM Template ci-op-jzpjwqxq-0c95e-9drkl-rhcos-pensive-roentgen created
I0722 12:58:57.373362       1 ms_helpers.go:211] Patching MAPI machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-1
I0722 12:58:57.384188       1 ms_helpers.go:281] Successfully patched machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-1
I0722 12:58:57.385219       1 boot_image_controller.go:314] MachineSet ci-op-jzpjwqxq-0c95e-9drkl-worker-1 updated, reconciling enrolled machineset resources

Result:

The default template is uploaded and the machineset is configured to use the default template.

Verify that custom existing templates are updated when the default template doesn't exist and there is no machineset using the default template

  1. Disable bootimages
  2. Create a 4.22 machineset and scale to 2
  3. Delete the default machineset
  4. Delete the default template
  5. Enable bootimages
I0716 15:47:48.206740       1 boot_image_controller.go:483] Bootimages management configuration has been updated, reconciling enrolled machine resources
I0716 15:47:48.206784       1 cpms_helpers.go:72] No ControlPlaneMachineSet was enrolled, so no ControlPlaneMachineSet will be enqueued.
I0716 15:47:48.254702       1 ms_helpers.go:302] No architecture annotation found on machineset mco-tc-89097-cloned, defaulting to control plane architecture
I0716 15:47:48.254723       1 platform_helpers.go:77] Reconciling MAPI machineset mco-tc-89097-cloned on VSphere, with arch x86_64
I0716 15:47:48.409651       1 vsphere_helpers.go:704] Existing RHCOS v9.8.20260520-0 does not match current RHCOS v9.8.20260428-0. Starting reconciliation process.
I0716 15:47:48.409817       1 cache.go:129] Downloading bootimage to /tmp/imagebased/image_cache/rhcos-9.8.20260428-0-vmware.x86_64.ova
I0716 15:47:52.545411       1 vsphere_helpers.go:134] using ESXi devqe-vmware-host-20.devqe.ibmc.devcluster.openshift.com to import the OVA image
I0716 15:48:35.875631       1 vsphere_helpers.go:397] VM Template with name mcotest-rhcos-9.8.20260520-0-vmware.x86_64.ova already exists, swapping atomically
I0716 15:48:36.466793       1 vsphere_helpers.go:421] VM mcotest-rhcos-9.8.20260520-0-vmware.x86_64.ova successfully replaced
I0716 15:48:36.474458       1 ms_helpers.go:211] Patching MAPI machineset mco-tc-89097-cloned
I0716 15:48:36.489168       1 ms_helpers.go:281] Successfully patched machineset mco-tc-89097-cloned

Result:

The default template atomically swapped and updated with the correct version.

Verify that and error is raised when a machineset is configured to use a wrong failure domain

  1. Configure a wrong server in the machineset workload.server field
...
         userDataSecret:
           name: worker-user-data
         workspace:
           datacenter: cidatacenter-2
           datastore: /cidatacenter-2/datastore/vsanDatastore
           folder: /cidatacenter-2/vm/ci-op-jzpjwqxq-0c95e-9drkl
           resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters
           server: vcenter-1.ci.ibmc.devcluster.openshift.fake.com  <---- FAKE SERVER
  1. Check that an error is reported
oc get machineconfiguration cluster -oyaml
....
 - lastTransitionTime: "2026-07-22T12:22:04Z"
   message: '1 Degraded MAPI MachineSets | 0 Degraded ControlPlaneMachineSets | 0
     Degraded CAPI MachineSets | 0 Degraded CAPI MachineDeployments | Error(s): error
     syncing MAPI MachineSet ci-op-jzpjwqxq-0c95e-9drkl-worker-0x: failed to reconcile
     machineset ci-op-jzpjwqxq-0c95e-9drkl-worker-0x, err: providerSpec workspace
     (server: vcenter-1.ci.ibmc.devcluster.openshift.fake.com, datacenter: cidatacenter-2,
     datastore: /cidatacenter-2/datastore/vsanDatastore, resourcePool: /cidatacenter-2/host/cicluster-3/Resources/ipi-ci-clusters,
     vmGroup: ) does not match any vCenter/failure domain in the Infrastructure object'
   reason: BootImageUpdateConfigurationUpdated
   status: "True"
   type: BootImageUpdateDegraded

/verified by @sergiordlr

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.

@djoshy

djoshy commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

/retest-required

@openshift-ci

openshift-ci Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@djoshy: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-vsphere 00c29d8 link false /test e2e-vsphere

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.

@djoshy

djoshy commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

/override ci/prow/bootstrap-unit

Has passed on this commit before, seems to be flaking now

@openshift-ci

openshift-ci Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@djoshy: Overrode contexts on behalf of djoshy: ci/prow/bootstrap-unit

Details

In response to this:

/override ci/prow/bootstrap-unit

Has passed on this commit before, seems to be flaking now

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.

@openshift-merge-bot
openshift-merge-bot Bot merged commit 513f906 into openshift:main Aug 4, 2026
18 checks passed
@openshift-ci-robot

Copy link
Copy Markdown
Contributor

@djoshy: Jira Issue Verification Checks: Jira Issue OCPBUGS-92182
✔️ 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-92182 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:

When a new failure domain is added, the controller always looked up the template by the computed name, ignoring providerSpec.Template, causing reconciliation to fail. Fix by checking providerSpec.Template first, using errors.As for NotFoundError, and creating the template from OVA when none exists. I broke out the resolution step into a separate function to reduce the cyclomatic complexity as the lint check failed(which is fair 😄).

An additional RBAC manifest was added as the MCC needs to lookup the cluster-config-v1 configmap in the kube-system namespace to recover the original install time configuration for the template.

I also rolled in the fix for https://redhat.atlassian.net/browse/OCPBUGS-99219 to this PR, since it is somewhat related.

- How to verify it
A machineset with a non standard vsphere template name(not matching the old name the MCO compute from the infra object) should be successfully reconciled.

Existing vSphere boot image e2es should also continue to pass.

Summary by CodeRabbit

  • New Features

  • Improved vSphere boot image recovery for new and existing failure domains.

  • Automatically restores rollback templates or creates missing templates when needed.

  • Supports disk type configuration from the cluster configuration.

  • Permissions

  • Added the required access for the Machine Config Controller to read cluster configuration.

  • Reliability

  • Improved template resolution and handling when provider and infrastructure settings differ.

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.

@djoshy

djoshy commented Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

/cherry-pick release-4.22 release-4.21 release-4.20

@openshift-cherrypick-robot

Copy link
Copy Markdown

@djoshy: #6234 failed to apply on top of branch "release-4.22":

Applying: bootimage: fix vSphere new fd reconciliation
Using index info to reconstruct a base tree...
M	pkg/controller/bootimage/platform_helpers.go
M	pkg/controller/bootimage/vsphere_helpers.go
M	pkg/operator/sync.go
Falling back to patching base and 3-way merge...
Auto-merging pkg/controller/bootimage/platform_helpers.go
CONFLICT (content): Merge conflict in pkg/controller/bootimage/platform_helpers.go
Auto-merging pkg/controller/bootimage/vsphere_helpers.go
CONFLICT (content): Merge conflict in pkg/controller/bootimage/vsphere_helpers.go
Auto-merging pkg/operator/sync.go
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Patch failed at 0001 bootimage: fix vSphere new fd reconciliation

Details

In response to this:

/cherry-pick release-4.22 release-4.21 release-4.20

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.

jcpowermac added a commit to jcpowermac/machine-config-operator that referenced this pull request Aug 4, 2026
…Center/multi-FD

Covers the highest-bug-history function in the vSphere boot-image path:
matching a providerSpec to the correct vCenter+failure domain while
skipping others (including a real multi-vCenter, multi-failure-domain
scenario), the version-match no-op path, a full real OVA rebuild via
vcsim, providerSpec.Template divergence from the computed name (the
PR openshift#6234 bug class - reconciles the name without touching vSphere),
mid-swap crash recovery via the mco-old-* rollback VM, the two
RHCOS-version-undeterminable error paths, and the 80-character name
limit.

Also fixes two govmomi v0.45.1 simulator quirks surfaced by running two
vcsim instances at once in the same test binary:

- vim25 SOAP request handling is routed through the package-level
  simulator.Map global regardless of which simulated vCenter's HTTP
  server received the request, so a second live vCenter can silently
  redirect lookups meant for the first. Added simulatedVCenter.activate()
  (vsphere_simulator_test.go) to explicitly re-pin the global to the
  intended vCenter before any vim25 call, and applied it wherever
  createTestVM or a cross-vCenter assertion runs.
- createTestVM previously built its fixture VM via the real OVA import
  path (createNewVMTemplateWithNameForFailureDomain), which stages new
  VMs under a name-derived "mco-tmp-<hash>" temp name before renaming;
  since vcsim's Rename doesn't relocate the underlying datastore folder,
  a later real import reusing that same deterministic temp name (as the
  code under test does on a version-mismatch rebuild) would fail with
  FileAlreadyExists. Switched the fixture to build directly under its
  final name via folder.CreateVM, sidestepping the temp-name collision
  entirely (vsphere_object_helpers_test.go).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jcpowermac added a commit to jcpowermac/machine-config-operator that referenced this pull request Aug 4, 2026
…te names

Closes the vSphere e2e gap around PR openshift#6234's bug class: vSphere is the
only platform where providerSpec.Template names a vCenter object
directly, so it's the only platform where the boot image controller has
to resolve/preserve an existing template referenced by an arbitrary,
non-standard name rather than one it computed itself.

Uploads the current RHCOS OVA under a custom template name, points a
cloned MachineSet's providerSpec.Template directly at it, and asserts
the controller recognizes it as already valid (no Degraded/Progressing
conditions, CheckCurrentOSImageIsUpdated passes) and leaves the custom
name in place rather than renaming it back to the name it would have
computed itself.

Verified with `go build ./test/extended-priv/...` (this test package
builds as part of the main module) - not run against a live cluster.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@openshift-merge-robot

Copy link
Copy Markdown
Contributor

Fix included in release 5.0.0-0.nightly-2026-08-05-033721

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. jira/severity-important Referenced Jira bug's severity is important for the branch this PR is targeting. 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.

7 participants