Skip to content

Eviction: Support parallel VM migrations while draining a hypervisor - #353

Open
notandy wants to merge 1 commit into
mainfrom
eviction-parallelism
Open

Eviction: Support parallel VM migrations while draining a hypervisor#353
notandy wants to merge 1 commit into
mainfrom
eviction-parallelism

Conversation

@notandy

@notandy notandy commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Previously a hypervisor drain migrated VMs strictly one at a time. This adds a configurable concurrency limit so multiple migrations can run in flight, cutting drain time on hosts with many instances while keeping the safe serial behavior as the default.

  • --eviction-concurrency sets the default maximum concurrent migrations. Defaults to 1, preserving the historical one-at-a-time behavior.
  • --eviction-trait-concurrency takes TRAIT=N overrides (e.g. CUSTOM_HANA_EXCLUSIVE_HOST=1) so exclusive-host classes can be forced to drain serially. The lowest matching trait limit wins, resolved per host via global.ResolveConcurrency.
  • evictNext now scans the entire outstanding set each pass: it counts in-flight (MIGRATING/RESIZE/terminating) instances, removes completed or gone ones regardless of their queue position, and starts fresh migrations only up to the limit. removeInstance replaces the old tail-drop since completions are no longer ordered.
  • The eviction controller moves into its own internal/controller/eviction package, and the poll/retry requeue intervals are shared as constants in internal/global.

Summary by CodeRabbit

  • New Features

    • Added configurable global eviction concurrency.
    • Added per-trait concurrency overrides.
    • Added validation for invalid concurrency settings before startup.
    • Evictions can process multiple instances concurrently while respecting configured limits.
    • Added support for exclusive traits that require serial migration.
  • Bug Fixes

    • Improved handling of migration, resizing, termination, missing instances, and error states.
    • Preserved migration failures until all affected instances complete.
    • Standardized controller polling and retry intervals.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The change adds CLI-configurable eviction concurrency with trait-specific limits. It adds shared polling settings and replaces sequential eviction with bounded concurrent processing. Tests cover queue operations, migration states, concurrency limits, trait overrides, and envtest setup.

Changes

Eviction concurrency

Layer / File(s) Summary
Concurrency configuration and CLI validation
internal/global/global.go, internal/global/global_test.go, cmd/main.go, internal/controller/constants.go, internal/controller/traits_controller.go
Shared polling intervals and concurrency settings are added. Trait overrides use the lowest matching limit. CLI input is validated before startup.
Bounded eviction processing
internal/controller/eviction/controller.go
Eviction processing resolves per-hypervisor limits, tracks candidates, handles instance states concurrently, aggregates errors, and updates migration conditions.
Eviction wiring and validation
cmd/main.go, internal/controller/eviction/controller_test.go, internal/controller/eviction/suite_test.go
The manager uses the dedicated eviction package. Tests cover queue operations, migration outcomes, bounded migration, exclusive-trait serialization, and envtest setup.

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

Possibly related PRs

Suggested reviewers: mchristianl

Sequence Diagram(s)

sequenceDiagram
  participant EvictionReconciler
  participant GlobalConfig
  participant HypervisorAPI
  participant KubernetesAPI
  EvictionReconciler->>GlobalConfig: ResolveConcurrency(hypervisor traits)
  EvictionReconciler->>HypervisorAPI: inspect outstanding instances
  EvictionReconciler->>HypervisorAPI: start migrations up to the resolved limit
  EvictionReconciler->>KubernetesAPI: persist status once per pass
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: configurable parallel VM migrations during hypervisor draining.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch eviction-parallelism

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

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

@notandy
notandy force-pushed the eviction-parallelism branch from 278ecfa to 802169f Compare August 11, 2026 20:41

@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: 4

🧹 Nitpick comments (2)
cmd/main.go (1)

176-180: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Pass entry as a structured field instead of concatenating it into the error string.

Static analysis flags this as log injection. The exploitability is low here: entry comes from a process flag that the operator controls, and the process exits right after. The structured form is still the idiomatic logr pattern and keeps the log parseable.

♻️ Proposed refactor
 		if !ok || trait == "" || err != nil || n < 1 {
-			setupLog.Error(errors.New("invalid --eviction-trait-concurrency entry: "+entry),
-				"invalid configuration", "expected", "TRAIT=N with N >= 1")
+			setupLog.Error(errors.New("invalid --eviction-trait-concurrency entry"),
+				"invalid configuration", "entry", entry, "expected", "TRAIT=N with N >= 1")
 			os.Exit(1)
 		}
🤖 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 `@cmd/main.go` around lines 176 - 180, Update the validation error in the
eviction-trait concurrency parsing block to keep the static error message
constant and pass the raw entry through the structured logging fields. Preserve
the existing “invalid configuration” context and expected-format field, and
retain the immediate exit behavior.

Source: Linters/SAST tools

internal/controller/eviction/controller_test.go (1)

625-635: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

The mock never reports MIGRATING, so the in-flight accounting is untested.

A VM flips directly from this host to another host as soon as a migrate call lands. The case "MIGRATING", "RESIZE" branch in evictNext never runs. The tests therefore verify only the started counter within a single pass, not the inFlight + started >= limit bound that enforces the limit across passes. That bound is the core of this feature.

Add a state where a VM reports MIGRATING on the host for one or more passes before it moves, so a later pass must count it as in flight.

♻️ Suggested mock change
 			fakeServer.Mux.HandleFunc("GET /servers/{server_id}", func(w http.ResponseWriter, r *http.Request) {
 				serverID := r.PathValue("server_id")
 				hvHost := hypervisorName + ".example.local"
-				if migrateCalls[serverID] > 0 {
+				status := "ACTIVE"
+				// Report MIGRATING on the source host for `settleDelay` polls so
+				// the reconciler must count the VM as in flight before it moves.
+				switch {
+				case migrateCalls[serverID] == 0:
+				case polls[serverID] < settleDelay:
+					polls[serverID]++
+					status = "MIGRATING"
+				default:
 					hvHost = "other-host.example.local"
 				}
 				w.Header().Add("Content-Type", "application/json")
 				w.WriteHeader(http.StatusOK)
-				_, err := fmt.Fprintf(w, serverTpl, serverID, "ACTIVE", hvHost)
+				_, err := fmt.Fprintf(w, serverTpl, serverID, status, hvHost)
 				Expect(err).NotTo(HaveOccurred())
 			})
🤖 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 `@internal/controller/eviction/controller_test.go` around lines 625 - 635,
Update the GET /servers/{server_id} mock in the eviction tests so a migrated VM
reports the existing hypervisor with state “MIGRATING” for at least one polling
pass before switching to the other host as “ACTIVE”. Ensure migrateCalls-based
responses exercise evictNext’s “MIGRATING”, “RESIZE” branch and validate the
inFlight + started limit across passes.
🤖 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 `@internal/controller/eviction/controller_test.go`:
- Around line 731-732: Strengthen the exclusive-trait spec’s migration
assertions by verifying each VM’s migrate call count equals one, matching the
per-VM assertion used in the first spec. Update the assertions around
migrateCalls so duplicate migrations cannot pass merely because the map contains
four entries, while preserving the existing resource status and total-entry
checks.

In `@internal/controller/eviction/controller.go`:
- Around line 321-333: Update internal/controller/eviction/controller.go lines
321-333 and 359-371 to replace moveToBack calls with a helper that moves the
specific uuid being processed to the end of OutstandingInstances, preserving
queue order during full-queue scans. In
internal/controller/eviction/controller_test.go lines 456-460, revise the
outdated moveToBack comment and add coverage asserting the resulting order when
two ERROR instances are present.
- Around line 270-277: Update removeGone to route the migration condition
through the shared setMigrationCompleted helper instead of writing a succeeded
condition directly. Extract or reuse the sticky-failure guard currently in
setMigrationSucceeded so a Failed condition remains while outstanding instances
exist, and have setMigrationSucceeded delegate to that helper with its existing
message.
- Around line 156-157: Update handleRunning before calling evictNext to require
the hypervisor’s TraitsUpdated condition to be True, returning without draining
when traits are stale or the traits controller reports failure. Only resolve the
concurrency limit from hypervisor.Status.Traits and invoke evictNext after that
condition is satisfied.

---

Nitpick comments:
In `@cmd/main.go`:
- Around line 176-180: Update the validation error in the eviction-trait
concurrency parsing block to keep the static error message constant and pass the
raw entry through the structured logging fields. Preserve the existing “invalid
configuration” context and expected-format field, and retain the immediate exit
behavior.

In `@internal/controller/eviction/controller_test.go`:
- Around line 625-635: Update the GET /servers/{server_id} mock in the eviction
tests so a migrated VM reports the existing hypervisor with state “MIGRATING”
for at least one polling pass before switching to the other host as “ACTIVE”.
Ensure migrateCalls-based responses exercise evictNext’s “MIGRATING”, “RESIZE”
branch and validate the inFlight + started limit across passes.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 90777f3a-506b-4cf7-9260-8ed8607cd549

📥 Commits

Reviewing files that changed from the base of the PR and between 60e2c72 and 278ecfa.

📒 Files selected for processing (8)
  • cmd/main.go
  • internal/controller/constants.go
  • internal/controller/eviction/controller.go
  • internal/controller/eviction/controller_test.go
  • internal/controller/eviction/suite_test.go
  • internal/controller/traits_controller.go
  • internal/global/global.go
  • internal/global/global_test.go

Comment thread internal/controller/eviction/controller_test.go
Comment on lines +156 to +157
limit := global.ResolveConcurrency(hypervisor.Status.Traits)
return r.evictNext(ctx, eviction, limit)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Trace population of Hypervisor Status.Traits and any eviction-time gating on it.
set -euo pipefail

# Where Status.Traits is assigned.
rg -nP --type=go -C4 '\.Status\.Traits\s*=' 

# Whether any eviction path checks the traits condition before draining.
rg -nP --type=go -C4 'ConditionTypeTraitsUpdated'

Repository: cobaltcore-dev/openstack-hypervisor-operator

Length of output: 182


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- candidate files ---'
git ls-files | rg '(^|/)(controller|api|types|hypervisor|eviction).*\.go$' | head -200

printf '%s\n' '--- all trait references ---'
rg -n -i --type=go -C3 'traits|TraitsUpdated|ResolveConcurrency|handleRunning|evictNext' . | head -400

Repository: cobaltcore-dev/openstack-hypervisor-operator

Length of output: 33446


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- eviction controller outline ---'
ast-grep outline internal/controller/eviction/controller.go

printf '%s\n' '--- traits controller outline ---'
ast-grep outline internal/controller/traits_controller.go

printf '%s\n' '--- eviction controller ---'
sed -n '1,260p' internal/controller/eviction/controller.go

printf '%s\n' '--- traits controller ---'
sed -n '1,280p' internal/controller/traits_controller.go

printf '%s\n' '--- lifecycle and eviction references ---'
rg -n --type=go -C5 'EvictionInProgress|WaitingForTraits|ConditionTypeEviction|handleRunning|eviction' internal/controller api/v1 | head -500

Repository: cobaltcore-dev/openstack-hypervisor-operator

Length of output: 50400


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- concurrency resolver and tests ---'
rg -n -C8 'func ResolveConcurrency|ResolveConcurrency|exclusive|Trait' internal/global internal/controller/eviction

printf '%s\n' '--- maintenance reconcile flow ---'
sed -n '58,220p' internal/controller/hypervisor_maintenance_controller.go

printf '%s\n' '--- onboarding handover and termination flow ---'
sed -n '280,370p' internal/controller/onboarding_controller.go
sed -n '90,180p' internal/controller/hypervisor_controller.go

printf '%s\n' '--- all production uses of traits conditions and waiting reason ---'
rg -n -C6 --type=go 'ConditionTypeTraitsUpdated|ConditionReasonWaitingForTraits|Status\.Traits' \
  internal/controller api/v1 --glob '!**/*_test.go'

Repository: cobaltcore-dev/openstack-hypervisor-operator

Length of output: 33060


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- controller registration order ---'
sed -n '330,390p' cmd/main.go

printf '%s\n' '--- maintenance and onboarding condition tests ---'
rg -n -C8 --type=go \
  'MaintenanceTermination|ConditionTypeOnboarding|ConditionTypeTraitsUpdated|Status\.Traits' \
  internal/controller/hypervisor_maintenance_controller_test.go \
  internal/controller/onboarding_controller_test.go \
  internal/controller/traits_controller_test.go

printf '%s\n' '--- deterministic guard check ---'
python3 - <<'PY'
from pathlib import Path

maintenance = Path("internal/controller/hypervisor_maintenance_controller.go").read_text()
eviction = Path("internal/controller/eviction/controller.go").read_text()
onboarding = Path("internal/controller/onboarding_controller.go").read_text()

checks = {
    "maintenance blocks while onboarding is true":
        'if meta.IsStatusConditionTrue(hv.Status.Conditions, kvmv1.ConditionTypeOnboarding)' in maintenance,
    "maintenance does not check TraitsUpdated":
        'ConditionTypeTraitsUpdated' not in maintenance,
    "eviction handleRunning resolves from Status.Traits":
        'global.ResolveConcurrency(hypervisor.Status.Traits)' in eviction,
    "eviction does not check TraitsUpdated":
        'ConditionTypeTraitsUpdated' not in eviction,
    "onboarding completion requires TraitsUpdated":
        'meta.IsStatusConditionTrue(hv.Status.Conditions, kvmv1.ConditionTypeTraitsUpdated)' in onboarding,
}
for name, value in checks.items():
    print(f"{name}: {value}")
PY

Repository: cobaltcore-dev/openstack-hypervisor-operator

Length of output: 40704


Gate eviction on TraitsUpdated=True.

Onboarding gates only initial eviction. After onboarding, maintenance can create an eviction while Status.Traits is stale or while TraitsController reports an update failure. handleRunning can then apply the global limit instead of the trait-specific limit. Wait for TraitsUpdated=True before draining.

🤖 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 `@internal/controller/eviction/controller.go` around lines 156 - 157, Update
handleRunning before calling evictNext to require the hypervisor’s TraitsUpdated
condition to be True, returning without draining when traits are stale or the
traits controller reports failure. Only resolve the concurrency limit from
hypervisor.Status.Traits and invoke evictNext after that condition is satisfied.

Comment thread internal/controller/eviction/controller.go
Comment thread internal/controller/eviction/controller.go
@notandy
notandy force-pushed the eviction-parallelism branch from 802169f to f88f0cb Compare August 11, 2026 20:58
@notandy
notandy requested a review from mchristianl August 11, 2026 21:06
@notandy
notandy force-pushed the eviction-parallelism branch from f88f0cb to abd5299 Compare August 11, 2026 21:12
@notandy

notandy commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the review findings in the amended commit (abd5299):

  • moveToBack after the full-queue-scan switch (Major): replaced with deprioritize(instances, uuid) which moves the specific ERROR/terminating instance to the back of the queue, instead of rotating whatever happened to be the tail element. Both call sites (ERROR and deleting branches) now pass the processed uuid. Added helper unit tests.
  • removeGone bypassing the sticky-failure guard (Minor): removeGone now records its success condition via setMigrationSucceeded, so a NotFound no longer overwrites a sticky Failed Migration condition while instances are still outstanding.

Also fixed a separate concurrency-limit overshoot (freshly-triggered migrations weren't counted as in-flight until nova flipped their status to MIGRATING, so the loop could exceed the limit — verified live with 3 concurrent migrations at limit 2). Now counts instances with a migration task_state as in-flight. Regression test added.

Copilot AI 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.

Pull request overview

Adds configurable parallel VM migration during hypervisor eviction while preserving serial defaults.

Changes:

  • Adds global and trait-specific concurrency limits.
  • Refactors eviction logic to track multiple migrations.
  • Moves eviction controller into a dedicated package and expands tests.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
cmd/main.go Adds concurrency flags and validation.
internal/global/global.go Defines limits, resolution, and retry intervals.
internal/global/global_test.go Tests concurrency resolution.
internal/controller/constants.go Shares the global polling interval.
internal/controller/traits_controller.go Uses the shared polling interval.
internal/controller/eviction/controller.go Implements parallel eviction.
internal/controller/eviction/controller_test.go Tests helpers and parallel migrations.
internal/controller/eviction/suite_test.go Bootstraps the relocated test suite.
Suppressed comments (2)

internal/controller/eviction/controller.go:446

  • Returning a non-nil joined error discards this RequeueAfter in controller-runtime. Because this pass can successfully start migrations and also collect an error from another VM (for example, an existing ERROR VM or one failed POST), the request may be retried immediately before Nova exposes a migration task state, causing duplicate migration actions; persistent VM errors then drive exponential backoff and delay the healthy migrations. Separate fatal reconciliation/status errors from per-VM blocked errors, and preserve the poll delay whenever migrations were started or remain in flight; only return an error when no progress can safely continue.
    internal/controller/eviction/controller.go:315
  • This scans from index 0, while deprioritize and its tests define index 0 as the back of a queue processed from the tail. Consequently the serial limit now starts the opposite end of the historical queue, and a VM moved to index 0 after an error is selected first as soon as it becomes eligible instead of remaining deprioritized. Iterate the snapshot from the tail so candidate ordering matches the queue contract while still scanning every VM.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Previously a hypervisor drain migrated one VM at a time. This adds a
configurable concurrency limit so multiple migrations can run in flight.

- --eviction-concurrency sets the default max concurrent migrations (1 = serial, preserving prior behavior).
- --eviction-trait-concurrency allows per-trait overrides (e.g. CUSTOM_HANA_EXCLUSIVE_HOST=1); the lowest matching limit wins.
- evictNext scans the whole outstanding set each pass, counts in-flight migrations, and starts new ones only up to the limit; completed and gone instances are removed regardless of queue position.
- Move the eviction controller into its own package and share poll/retry interval constants via internal/global.

Signed-off-by: Andrew Karpow <andrew.karpow@sap.com>
@notandy
notandy force-pushed the eviction-parallelism branch from abd5299 to 3f42690 Compare August 12, 2026 18:22

@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.

♻️ Duplicate comments (1)
internal/controller/eviction/controller_test.go (1)

843-844: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Restore the per-VM migration-count assertion.

Line 844 only checks that four VM IDs were called. A duplicate call to one VM still passes when all four IDs exist. Assert that every migrateCalls value equals one.

Proposed fix
 				Expect(resource.Status.OutstandingInstances).To(BeEmpty())
+				for id, c := range migrateCalls {
+					Expect(c).To(Equal(1), "VM %s migrated exactly once", id)
+				}
 				Expect(migrateCalls).To(HaveLen(4))
🤖 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 `@internal/controller/eviction/controller_test.go` around lines 843 - 844,
Update the assertions in the test around migrateCalls to verify each VM ID has
exactly one migration call, not just that four IDs are present. Retain the
existing length assertion if useful, and add per-entry count validation so
duplicate calls to any VM fail.
🤖 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.

Duplicate comments:
In `@internal/controller/eviction/controller_test.go`:
- Around line 843-844: Update the assertions in the test around migrateCalls to
verify each VM ID has exactly one migration call, not just that four IDs are
present. Retain the existing length assertion if useful, and add per-entry count
validation so duplicate calls to any VM fail.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72421bb6-ff78-48f3-a5fe-002e455e31f2

📥 Commits

Reviewing files that changed from the base of the PR and between 278ecfa and 3f42690.

📒 Files selected for processing (2)
  • internal/controller/eviction/controller.go
  • internal/controller/eviction/controller_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • internal/controller/eviction/controller.go

@github-actions

Copy link
Copy Markdown

Merging this branch will increase overall coverage

Impacted Packages Coverage Δ 🤖
github.com/cobaltcore-dev/openstack-hypervisor-operator/cmd 0.00% (ø)
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller 70.47% (+1.56%) 👍
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/eviction 67.54% (+67.54%) 🌟
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/global 100.00% (+100.00%) 🌟

Coverage by file

Changed files (no unit tests)

Changed File Coverage Δ Total Covered Missed 🤖
github.com/cobaltcore-dev/openstack-hypervisor-operator/cmd/main.go 0.00% (ø) 0 0 0
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/constants.go 0.00% (ø) 0 0 0
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/eviction/controller.go 67.54% (+67.54%) 191 (+191) 129 (+129) 62 (+62) 🌟
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/traits_controller.go 73.44% (ø) 64 47 17
github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/global/global.go 100.00% (+100.00%) 7 (+7) 7 (+7) 0 🌟

Please note that the "Total", "Covered", and "Missed" counts above refer to code statements instead of lines of code. The value in brackets refers to the test coverage of that file in the old version of the code.

Changed unit test files

  • github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/eviction/controller_test.go
  • github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/controller/eviction/suite_test.go
  • github.com/cobaltcore-dev/openstack-hypervisor-operator/internal/global/global_test.go

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants