Skip to content

Move BMCSettings mock redfish_local method into go mock server#790

Merged
afritzler merged 10 commits into
mainfrom
moveToMock
Apr 22, 2026
Merged

Move BMCSettings mock redfish_local method into go mock server#790
afritzler merged 10 commits into
mainfrom
moveToMock

Conversation

@nagadeesh-nagaraja
Copy link
Copy Markdown
Contributor

@nagadeesh-nagaraja nagadeesh-nagaraja commented Apr 8, 2026

Proposed Changes

Move mocked unit test methods into go mock server

Fixes #789

Summary by CodeRabbit

  • New Features

    • Added BMC settings management with immediate vs pending apply semantics and a new BMC attribute registry exposing supported attributes and metadata.
  • Bug Fixes

    • Updated BMC reset behavior to clear locks and apply pending settings reliably instead of manipulating power state.
  • Chores

    • Consolidated mock server setup and standardized test data/version naming across suites; added test utilities to reset/inspect BIOS/BMC settings and use dynamic mock endpoints.

@nagadeesh-nagaraja nagadeesh-nagaraja self-assigned this Apr 8, 2026
@nagadeesh-nagaraja nagadeesh-nagaraja requested a review from a team as a code owner April 8, 2026 14:18
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 8, 2026

Caution

Review failed

Pull request was closed or merged during review

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

Walkthrough

Added a BMC Settings resource and attribute registry to the mock server, implemented immediate-vs-pending BMC settings semantics and lock-driven reset/apply behavior, updated Redfish client to PATCH the Settings endpoint, and migrated tests to use a shared mockServer with dynamic endpoints and reset helper APIs.

Changes

Cohort / File(s) Summary
Mock Server Data Resources
bmc/mock/server/data/Managers/BMC/Settings/index.json, bmc/mock/server/data/Managers/BMC/index.json, bmc/mock/server/data/Registries/BMCAttributeRegistry/index.json, bmc/mock/server/data/Registries/index.json
Added BMC Settings resource and BMCAttributeRegistry (attributes: abc, fooreboot, composite); updated Registries collection membership and manager Attributes to reference Settings.
Mock Server Implementation
bmc/mock/server/server.go
Introduced BMC attribute semantics: registry-driven immediate vs pending application, applyBMCSettings/applyPendingBMCSettings, lock-based reset behavior, PATCH flow changes, startup registry scanning for no-reboot attributes, and exported test helpers GetBMCSettingAttr, ResetBMCSettings, ResetBIOSSettings.
Redfish Local BMC Client
bmc/redfish_local.go
Replaced in-process ResetManager with HTTP PATCH to SettingsObject in SetBMCAttributesImmediately; updated attribute fetchers to read current/pending values from server resources and to load registry entries from server (integer handling added).
Test Suite Initialization
internal/controller/suite_test.go
Added package-level shared mockServer and renamed default mock version vars to mockUpServerBiosVersion / mockUpServerBMCVersion; default runnable now reuses shared mockServer.
BIOS Tests
internal/controller/biossettings_controller_test.go, internal/controller/biossettingsset_controller_test.go, internal/controller/biosversion_controller_test.go
Replaced direct UnitTestMockUps resets with mockServer.ResetBIOSSettings(...); updated test data to use mockUpServerBiosVersion.
BMC Tests
internal/controller/bmcsettings_controller_test.go, internal/controller/bmcsettingsset_controller_test.go, internal/controller/bmcversion_controller_test.go
Switched teardown to mockServer.ResetBMCSettings("BMC"), updated assertions to use mockServer.GetBMCSettingAttr("BMC"), and switched tests to use dynamically computed MockServerIPAddrs for inline endpoints.

Sequence Diagram(s)

sequenceDiagram
    actor Client
    participant Server as Mock Server
    participant BMCMgr as BMC Manager (Current)
    participant BMCSet as BMC Settings (Pending)

    Client->>Server: PATCH /redfish/v1/Managers/BMC/Settings\nAttributes + `@Redfish.SettingsApplyTime`
    Server->>Server: Load BMCAttributeRegistry\nDetermine immediate (ResetRequired==false) keys
    alt BMC unlocked
        Server->>BMCMgr: Apply immediate attributes to current Manager
        Server->>BMCSet: Persist remaining attributes as pending
    else BMC locked
        Server->>BMCSet: Persist all attributes as pending
    end
    Server-->>Client: 200 / 202 / 204

    Client->>Server: Trigger BMC Reset
    Server->>Server: Clear BMC lock
    Server->>BMCSet: Read pending Attributes
    Server->>BMCMgr: Move pending Attributes into current Manager
    Server->>BMCSet: Clear pending Attributes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • nagadeesh-nagaraja
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: moving BMCSettings mock redfish_local methods into the Go mock server.
Description check ✅ Passed The description follows the template with proposed changes listed and issue reference provided, though the bulleted changes list is minimal.
Linked Issues check ✅ Passed The PR successfully implements the primary objective from issue #789 by moving BMCSettings test methods from redfish_local into the Go mock server with comprehensive refactoring.
Out of Scope Changes check ✅ Passed All changes are directly related to the stated objective of moving BMCSettings methods into the mock server, including associated test updates and data file additions.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 moveToMock

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 and usage tips.

Copy link
Copy Markdown
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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
bmc/mock/server/data/Registries/index.json (1)

5-15: ⚠️ Potential issue | 🟡 Minor

Update Members@odata.count to reflect the actual member count.

The Members@odata.count field is 1 but there are now 3 members in the array. This inconsistency could cause issues if Redfish clients rely on the count for iteration or validation.

Proposed fix
-    "Members@odata.count": 1,
+    "Members@odata.count": 3,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@bmc/mock/server/data/Registries/index.json` around lines 5 - 15, The
Members@odata.count value is incorrect (currently 1) and must match the actual
number of entries in the Members array; update the "Members@odata.count" field
in Registries/index.json to 3 so it reflects the three "@odata.id" entries in
"Members" (e.g., "/redfish/v1/Registries/Base.1.5.0",
"/redfish/v1/Registries/BiosAttributeRegistry.v1_0_0",
"/redfish/v1/Registries/BMCAttributeRegistry").
🧹 Nitpick comments (1)
bmc/redfish_kube.go (1)

238-246: Resolve the settings URI from the selected manager instead of hardcoding it.

Both methods ignore the requested BMC UUID and assume the settings resource is always /redfish/v1/Managers/BMC/Settings. The local implementation in bmc/redfish_local.go already follows the manager-advertised @Redfish.Settings.SettingsObject; reusing that pattern here would also let you send the same @Redfish.SettingsApplyTime payload.

Also applies to: 295-300

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@bmc/redfish_kube.go` around lines 238 - 246, The patch hardcodes
"/redfish/v1/Managers/BMC/Settings" in SetBMCAttributesImmediately (in
RedfishKubeBMC) instead of resolving the manager's advertised settings URI;
update this method (and the corresponding apply/settings method around the
295-300 region) to locate the selected manager by the requested BMC UUID, read
its `@Redfish.Settings.SettingsObject` (the pattern used in the local
implementation in bmc/redfish_local.go), use that SettingsObject URI as the
PATCH target, and support sending the same `@Redfish.SettingsApplyTime` payload as
the local implementation does.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@bmc/mock/server/server.go`:
- Around line 56-57: The immediate-apply whitelist variable noRebootBMCSettings
is missing the "composite" attribute listed as ResetRequired:false in the BMC
attribute registry; update the slice to include "composite" (e.g., var
noRebootBMCSettings = []string{"abc", "composite"}) so PATCHes for composite are
applied immediately; optionally note for future work to derive this list
programmatically from the BMCAttributeRegistry index to avoid drift.
- Around line 459-473: The reset path (doBMCReset) flips the resource lock via
setLocked but applyPendingBMCSettings/applyBMCSettings never checks that lock,
allowing PATCHes during the reset sleep to be accepted and applied; modify
applyPendingBMCSettings and the PATCH handling code to check the same lock state
(e.g., call an isLocked(bmcPath) helper or inspect the overrides[bmcPath] locked
flag) and return/reject with an error when the resource is locked, so any
incoming PATCHes while doBMCReset has setLocked(..., true) are refused rather
than queued/applied.

In `@bmc/redfish_kube.go`:
- Around line 244-250: The PATCH response from c.Patch in bmc/redfish_kube.go
(the resp returned by c.Patch("/redfish/v1/Managers/BMC/Settings", payload)) is
not being closed; after checking err != nil add a defer resp.Body.Close() to
ensure the response body is closed and connection-pool resources are freed
(place the defer immediately after the nil-error check in the same block where
resp is available).

---

Outside diff comments:
In `@bmc/mock/server/data/Registries/index.json`:
- Around line 5-15: The Members@odata.count value is incorrect (currently 1) and
must match the actual number of entries in the Members array; update the
"Members@odata.count" field in Registries/index.json to 3 so it reflects the
three "@odata.id" entries in "Members" (e.g.,
"/redfish/v1/Registries/Base.1.5.0",
"/redfish/v1/Registries/BiosAttributeRegistry.v1_0_0",
"/redfish/v1/Registries/BMCAttributeRegistry").

---

Nitpick comments:
In `@bmc/redfish_kube.go`:
- Around line 238-246: The patch hardcodes "/redfish/v1/Managers/BMC/Settings"
in SetBMCAttributesImmediately (in RedfishKubeBMC) instead of resolving the
manager's advertised settings URI; update this method (and the corresponding
apply/settings method around the 295-300 region) to locate the selected manager
by the requested BMC UUID, read its `@Redfish.Settings.SettingsObject` (the
pattern used in the local implementation in bmc/redfish_local.go), use that
SettingsObject URI as the PATCH target, and support sending the same
`@Redfish.SettingsApplyTime` payload as the local implementation does.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: fcf2b889-3a5e-4ded-a4a0-9f63d2f35f36

📥 Commits

Reviewing files that changed from the base of the PR and between 1fb6e38 and 7c319f4.

📒 Files selected for processing (13)
  • bmc/mock/server/data/Managers/BMC/Settings/index.json
  • bmc/mock/server/data/Managers/BMC/index.json
  • bmc/mock/server/data/Registries/BMCAttributeRegistry/index.json
  • bmc/mock/server/data/Registries/index.json
  • bmc/mock/server/server.go
  • bmc/mockup.go
  • bmc/redfish_kube.go
  • bmc/redfish_local.go
  • internal/controller/biossettings_controller_test.go
  • internal/controller/bmcsettings_controller_test.go
  • internal/controller/bmcsettingsset_controller_test.go
  • internal/controller/helper.go
  • internal/controller/suite_test.go
💤 Files with no reviewable changes (1)
  • bmc/mockup.go

Comment thread bmc/mock/server/server.go Outdated
Comment thread bmc/mock/server/server.go
Comment thread bmc/redfish_kube.go Outdated
Comment thread bmc/mock/server/server.go Outdated
@afritzler afritzler added the enhancement New feature or request label Apr 8, 2026
Copy link
Copy Markdown
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: 2

♻️ Duplicate comments (1)
bmc/mock/server/server.go (1)

536-540: ⚠️ Potential issue | 🟠 Major

Reject settings PATCHes while the BMC is reset-locked.

Returning nil here still lets handlePatch persist the body to /Managers/BMC/Settings and answer 204, so writes made during the simulated offline window are queued and then applied by applyPendingBMCSettings(). The lock is therefore not actually blocking mutations.

🔒 Minimal fix
 	// If the BMC is mid-reset (locked), leave the immediate settings in attrs
-	// so they are written to the pending Settings resource and picked up by
-	// applyPendingBMCSettings once the reset completes.
+	// reject the PATCH so writes are not accepted while the BMC is offline.
 	if s.isLocked(bmcBase) {
-		return nil
+		return errLocked
 	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@bmc/mock/server/server.go` around lines 536 - 540, The branch that checks
s.isLocked(bmcBase) currently returns nil which allows handlePatch to continue
and persist the PATCH body; change it to reject the request immediately when the
BMC is reset-locked by returning an error/HTTP 423-style response from the same
check so handlePatch does not write to /Managers/BMC/Settings or return 204;
update the code around s.isLocked(bmcBase) to short-circuit with an appropriate
error value (so pending writes are not queued) and ensure
applyPendingBMCSettings remains the mechanism that applies queued changes after
unlock.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@bmc/mock/server/server.go`:
- Around line 56-85: The current loadNoRebootAttrs silently returns nil on
dataFS.ReadFile or json.Unmarshal errors causing silent behavior changes; update
loadNoRebootAttrs (used by init() to set noRebootSettings and
noRebootBMCSettings) to fail fast by panicking (or returning an error and making
init handle it) when ReadFile or Unmarshal fail, including the registryPath and
the underlying error in the panic/log message so the process exits with a clear
diagnostic instead of silently emptying the allowlist.
- Around line 623-642: The helper resetAttributesFromEmbeddedLocked currently
only replaces Attributes and can leave stale fields (like resourceLock) behind;
instead, read the embedded JSON via dataFS.ReadFile, unmarshal into a
map[string]any (as already done into defaults), and replace the entire in-memory
resource with that defaults map (i.e. assign overrides[filePath] = defaults)
rather than setting only current[attributesKey]; update usages of
loadResourceLocked/overrides accordingly so the full embedded resource (not just
Attributes) is restored in resetAttributesFromEmbeddedLocked.

---

Duplicate comments:
In `@bmc/mock/server/server.go`:
- Around line 536-540: The branch that checks s.isLocked(bmcBase) currently
returns nil which allows handlePatch to continue and persist the PATCH body;
change it to reject the request immediately when the BMC is reset-locked by
returning an error/HTTP 423-style response from the same check so handlePatch
does not write to /Managers/BMC/Settings or return 204; update the code around
s.isLocked(bmcBase) to short-circuit with an appropriate error value (so pending
writes are not queued) and ensure applyPendingBMCSettings remains the mechanism
that applies queued changes after unlock.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8adadbed-ab98-4f6f-a429-3b808fa2faa0

📥 Commits

Reviewing files that changed from the base of the PR and between 7c319f4 and ae7a36b.

📒 Files selected for processing (3)
  • bmc/mock/server/server.go
  • internal/controller/biossettings_controller_test.go
  • internal/controller/bmcsettings_controller_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • internal/controller/biossettings_controller_test.go

Comment thread bmc/mock/server/server.go
Comment thread bmc/mock/server/server.go Outdated
Comment thread internal/controller/suite_test.go Outdated
Copy link
Copy Markdown
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 (2)
bmc/mock/server/server.go (1)

44-47: Hardcoded BMC manager ID couples the mock to a single manager.

bmcFilePath / bmcSettingsFilePath and the URL-suffix check strings.Contains(urlPath, "Managers/BMC/Settings") bake the manager ID "BMC" into applyBMCSettings / applyPendingBMCSettings, while ResetBMCSettings(managerID) already takes it as a parameter. If a future test uses a different manager folder name, PATCH handling will silently skip BMC-settings logic and applyPendingBMCSettings will read/write the wrong resource. Consider deriving the manager path from the request URL (e.g. parse the manager segment from urlPath before /Settings) so the mock scales to additional managers without matching the BIOS pattern that takes a basePath.

Also applies to: 508-511

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@bmc/mock/server/server.go` around lines 44 - 47, The code hardcodes the
manager ID "BMC" via bmcFilePath/bmcSettingsFilePath and a
strings.Contains(urlPath, "Managers/BMC/Settings"), which breaks
applyBMCSettings and applyPendingBMCSettings for other managers; update these
functions to extract the manager ID from the incoming request URL (parse the
segment between "Managers/" and "/Settings") and construct the resource paths
dynamically (e.g., fmt.Sprintf("data/Managers/%s/index.json", managerID) and the
Settings path) instead of using bmcFilePath/bmcSettingsFilePath; ensure
ResetBMCSettings(managerID) remains compatible by using the same
managerID-derived path logic and replace the strings.Contains checks with the
parsed-manager comparison.
internal/controller/suite_test.go (1)

57-57: Clear mockServer when using custom mock servers.

mockServer is package-level and only overwritten in the default-server branch. If a custom-server spec runs after a default-server spec, the global still points at the previous default instance, which is easy to misuse because MockServer carries mutable overrides state.

♻️ Proposed defensive cleanup
 	if len(redfishMockServers) > 0 {
+		mockServer = nil
 		for _, serverAddr := range redfishMockServers {
 			By(fmt.Sprintf("Starting the mock Redfish servers %v", serverAddr))
 			Expect(k8sManager.Add(manager.RunnableFunc(func(ctx context.Context) error {

Also applies to: 345-359

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/controller/suite_test.go` at line 57, The package-level variable
mockServer (*server.MockServer) retains mutable overrides between specs; when
you create or tear down a default-server instance you must explicitly nil out
mockServer so custom-server specs don't inherit state. Update the default-server
setup/teardown code paths to set mockServer = nil after stopping or before
replacing the instance (and likewise ensure any helper that assigns mockServer
clears it on failure), and apply the same defensive cleanup around the other
occurrences referenced (the block around lines 345–359) so MockServer.overrides
cannot leak between specs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@bmc/mock/server/server.go`:
- Around line 596-624: The Open call on dataFS in ResetBMCSettings and
ResetBIOSSettings leaks file handles; replace the existence probe that uses
dataFS.Open(filePath) with a non-leaking check (e.g., use fs.ReadFile or
fs.Stat) or simply remove the pre-check entirely and rely on
resetResourceFromEmbeddedLocked to read the file and log errors; update the
functions ResetBMCSettings and ResetBIOSSettings accordingly (touching the same
filePath and settingsFilePath variables) so no fs.File is left unclosed.

---

Nitpick comments:
In `@bmc/mock/server/server.go`:
- Around line 44-47: The code hardcodes the manager ID "BMC" via
bmcFilePath/bmcSettingsFilePath and a strings.Contains(urlPath,
"Managers/BMC/Settings"), which breaks applyBMCSettings and
applyPendingBMCSettings for other managers; update these functions to extract
the manager ID from the incoming request URL (parse the segment between
"Managers/" and "/Settings") and construct the resource paths dynamically (e.g.,
fmt.Sprintf("data/Managers/%s/index.json", managerID) and the Settings path)
instead of using bmcFilePath/bmcSettingsFilePath; ensure
ResetBMCSettings(managerID) remains compatible by using the same
managerID-derived path logic and replace the strings.Contains checks with the
parsed-manager comparison.

In `@internal/controller/suite_test.go`:
- Line 57: The package-level variable mockServer (*server.MockServer) retains
mutable overrides between specs; when you create or tear down a default-server
instance you must explicitly nil out mockServer so custom-server specs don't
inherit state. Update the default-server setup/teardown code paths to set
mockServer = nil after stopping or before replacing the instance (and likewise
ensure any helper that assigns mockServer clears it on failure), and apply the
same defensive cleanup around the other occurrences referenced (the block around
lines 345–359) so MockServer.overrides cannot leak between specs.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e39c62e3-486d-4a8c-9359-e69d4867383c

📥 Commits

Reviewing files that changed from the base of the PR and between ae7a36b and 3213b97.

📒 Files selected for processing (10)
  • bmc/mock/server/data/Registries/index.json
  • bmc/mock/server/server.go
  • bmc/redfish_local.go
  • internal/controller/biossettings_controller_test.go
  • internal/controller/biossettingsset_controller_test.go
  • internal/controller/biosversion_controller_test.go
  • internal/controller/bmcsettings_controller_test.go
  • internal/controller/bmcsettingsset_controller_test.go
  • internal/controller/bmcversion_controller_test.go
  • internal/controller/suite_test.go
✅ Files skipped from review due to trivial changes (1)
  • bmc/mock/server/data/Registries/index.json
🚧 Files skipped from review as they are similar to previous changes (3)
  • internal/controller/biossettings_controller_test.go
  • internal/controller/bmcsettingsset_controller_test.go
  • internal/controller/bmcsettings_controller_test.go

Comment thread bmc/mock/server/server.go
@afritzler
Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 2026

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

@afritzler afritzler merged commit 66996aa into main Apr 22, 2026
16 checks passed
@afritzler afritzler deleted the moveToMock branch April 22, 2026 22:50
@github-project-automation github-project-automation Bot moved this to Done in Roadmap Apr 22, 2026
davidgrun pushed a commit that referenced this pull request Apr 24, 2026
* Move BMCSettings redfish_local into go mock server

* Review comments

* amend server fail logic

* fix reset to default logic

* fix the data count lenght in mocked data

* Rename variable

* fix redundant check

* fix newer tests workflow from main branch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Move BMCSettings test to mock server

3 participants