Skip to content

Conversation

@spesnova717
Copy link

@spesnova717 spesnova717 commented Jun 4, 2025

Bug #3073 is caused by 3 things:

  1. Foreman core doesn't call BMC proxy's API correctly
    • Changing power state to 'Reboot' via Web GUI calls BMC proxy's 'soft' power action
    • Changing power state to 'Reset' via Web GUI calls BMC proxy's 'cycle' power action
  2. Foreman BMC proxy doesn't support reboot at all BMC provider
  3. Foreman BMC proxy doesn't support reset(powerreset) at Redfish provider

This PR fixes first item.

Modifications in this PR

(1) Removal of Incorrect Power Action Mappings

In bmc.rb, the :reboot and :reset actions were incorrectly mapped to soft and cycle, respectively.
These incorrect mappings are removed to eliminate the discrepancy between the Web UI representation and the actual behavior.

(2) Implement Reboot and Reset Actions

In the power method of proxy_api/bmc.rb, the reboot and reset actions were not previously implemented.
These actions are implemented, enabling Foreman Core to send reboot and reset power control requests to the Smart Proxy.

@spesnova717
Copy link
Author

spesnova717 commented Jun 16, 2025

@lzap san

The content of the closed PR #9082 is addressed in the new PR #10561.
As this change also requires updates on the smart-proxy side, we created the following related ticket & PRs:

All three PRs (one in Foreman and two in smart-proxy) are ready for review.
Your feedback would be greatly appreciated.

Copy link
Member

@ekohl ekohl left a comment

Choose a reason for hiding this comment

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

I'm thinking about compatibility here. Leaving this on the PR here, but it will apply to the Smart Proxy too.

We support running Foreman with older Smart Proxies so I'd like to detect if the proxy actually supports these (in other words, runs with or without your bug fixes). There's a mechanism with capabilities and in https://theforeman.org/2019/04/smart-proxy-capabilities-explained.html I've tried to describe how it works.

On the Smart Proxy side it will be easy: simply add a capability statement to signal it supports these. On the Foreman side you can use proxy.has_capability?(:BMC, :my_capability) to detect it.

Do you think you could take a look at this?

@lzap
Copy link
Member

lzap commented Jun 16, 2025

I will leave the review on my colleagues. Thank you so much for your contribution!

@spesnova717
Copy link
Author

@ekohl san

Thank you for your comment.
I'll proceed with the necessary modifications.
I'd appreciate it if you clarify the following points:

1. Support policy of version mixing

According to Foreman's release policy, if latest Foreman release is 3.x, 3.x and 3.x-1 is supported.

Then, following combination of Foreman core & smart proxy is also supported, is this correct?

  • Foreman core 3.x ― Smart Proxy 3.x
  • Foreman core 3.x ― Smart Proxy 3.x-1

But this isn't supported, right?

  • Foreman core 3.x-1 ― Smart Proxy 3.x

2. Should capability continue to remain in code, even after all supported version of Foreman core&proxy apply our modification?

We'll follow your advice and will add capability (e.g., proxy.has_capability?(:BMC, :<my_capability>)) to Foreman.

If our modification is included at Foreman version 3.x and when 3.x+2 is released, all supported version of Foreman core and smart proxy (3.x+1 & 3.x+2) includes our modification.
At this point, can we remove capability & related code (e.g. if something.has_capability? line) from source code of Foreman core and smart proxy? Or should we let that capability related code remains in code forever?

3. What is expected behavior regarding compatibility?

At current Foreman (before our PR is merged), pushing Reboot at GUI leads to soft & pushing Reset at GUI leads to cycle.

Regarding compatibility, expected behavior is following, right?

If our modification is merged at 3.x, Foreman core (version 3.x) behavior:

  • Against smart proxy which includes our modification (version 3.x, with <my_capability>)
    • pushing Reboot at GUI leads to Reboot
    • pushing Reset at GUI leads to Reset (powerreset)
  • Against smart proxy which doesn't have our modification (version 3.x-1, without <my_capability>)
    • pushing Reboot at GUI leads to soft
    • pushing Reset at GUI leads to cycle

Thank you.

@ekohl
Copy link
Member

ekohl commented Jun 17, 2025

1. Support policy of version mixing

According to Foreman's release policy, if latest Foreman release is 3.x, 3.x and 3.x-1 is supported.

Then, following combination of Foreman core & smart proxy is also supported, is this correct?

* Foreman core `3.x` ― Smart Proxy `3.x`

* Foreman core `3.x` ― Smart Proxy `3.x-1`

But this isn't supported, right?

* Foreman core `3.x-1` ― Smart Proxy `3.x`

That is correct: we only support Foreman >= Smart Proxy.

  1. Should capability continue to remain in code, even after all supported version of Foreman core&proxy apply our modification?

We have a downstream called Red Hat Satellite that has a wider support cycle. There can be 4 versions difference. That's why it's probably best to keep it for some time. I'd consider it sufficient to leave a code comment in Foreman that's something like Smart Proxy x.y introduced capability C so in the future we don't need to dig too deep.

If our modification is merged at 3.x, Foreman core (version 3.x) behavior:

* Against smart proxy which includes our modification (version `3.x`, with `<my_capability>`)
  
  * pushing `Reboot` at GUI leads to `Reboot`
  * pushing `Reset` at GUI leads to `Reset` (powerreset)

* Against smart proxy which doesn't have our modification (version `3.x-1`, without `<my_capability>`)
  
  * pushing `Reboot` at GUI leads to `soft`
  * pushing `Reset` at GUI leads to `cycle`

That sounds good. I'd also accept a clear error message that the requested operation is not supported. I'll admit I'm not too familiar with the exact BMC implementation(s) to say what's best.

@spesnova717
Copy link
Author

Thank you for your response.
All clear now.
Thank you.

@spesnova717 spesnova717 force-pushed the fix_3073_bmc_reboot_reset_patch1 branch from 0ce97e8 to 230bb3b Compare July 1, 2025 10:28
@spesnova717 spesnova717 force-pushed the fix_3073_bmc_reboot_reset_patch1 branch from 230bb3b to 99b5afb Compare July 1, 2025 10:33
@spesnova717 spesnova717 changed the title Fixes #3073 - Fix mismatched and missing Reboot/Reset power actions [WIP] Fixes #3073 - Fix mismatched and missing Reboot/Reset power actions Jul 1, 2025
@spesnova717 spesnova717 changed the title [WIP] Fixes #3073 - Fix mismatched and missing Reboot/Reset power actions Fixes #3073 - Fix mismatched and missing Reboot/Reset power actions Jul 1, 2025
@spesnova717
Copy link
Author

@ekohl

Thank you for the feedback.
Yes, I understand the importance of maintaining compatibility with older Smart Proxies.
To address this:

  • On the Smart Proxy side, I’ve added the poweraction_fix_3_16 capability in bmc_plugin.rb. This will be included as part of Fixes #38498 - Add support for Reset (powerreset) via Redfish provider.
  • On the Foreman side, I implemented capability detection using has_capability?(:BMC, :poweraction_fix_3_16) within PowerManager::BMC. Based on the presence of this capability, the reboot and reset actions are conditionally mapped to do_reboot / do_reset or fallback to soft / cycle.

This ensures proper behavior with both updated and legacy proxies, maintaining backward compatibility while enabling the new functionality where supported.
Please let me know if you have further suggestions or if anything needs to be adjusted.

The CI error originates from the test:katello job and is not caused by the changes in this PR. Similar failures are currently occurring in other PRs as well:
https://github.com/theforeman/foreman/actions/runs/16010470304

Thank you for your support.

@spesnova717 spesnova717 force-pushed the fix_3073_bmc_reboot_reset_patch1 branch 4 times, most recently from 1835536 to c0179de Compare July 22, 2025 00:21
@spesnova717
Copy link
Author

Hi @ekohl, @lzap

This is a gentle ping for review on the following PRs:
PR #10561,
PR #916,
PR #917

These address mismatched and missing Reboot / Reset BMC power actions.

Although the CI currently shows ❌, the failure appears to be unrelated to this PR.
Specifically, the error is a Timeout::Error: execution expired in a multiselect-related JS integration test,
which is not affected by the changes in this PR.
It seems likely that this is a temporary CI-side issue.

If someone reviews it, it would be much appreciated.

If there’s anything blocking the review or merge process,
please let me know — I would like to help you if possible.

I look forward to hearing from you.

@spesnova717 spesnova717 force-pushed the fix_3073_bmc_reboot_reset_patch1 branch 2 times, most recently from 4a44ff3 to 3136dfb Compare September 2, 2025 00:40
@evgeni
Copy link
Member

evgeni commented Sep 10, 2025

Hi,

I am currently looking into this topic together with @stejskalleos and must admit I am a bit lost on vocabulary, so hoped you can help me a bit here.

Looking at our current BMC API in the Smart Proxy, we support two "reset" options: cycle and reset.
In Foreman, we currently map the "Reset" action to cycle, and "Reboot" is wrongly mapped to soft (shutdown).

What I am lost is what these words supposed to mean.
I assume (!) "Reboot" means a soft reboot (like when you type reboot in a root shell, or press Ctrl-Alt-Delete) and a "Reset" is a hard reset (like when you cut power to the device)?

Skimming the IPMI 2.0 spec, especially chapter "Chassis Control Command", I see that there is an command of "power cycle" and one for "hard reset", with the former being marked as optional. Both are exposed in our IPMI implementation on the Smart Proxy.

Now, looking at Redfish Resource and Schema Guide, especially ResetType property, it can have ForceRestart, GracefulRestart and PowerCycle. I guess GracefulRestart is something that IPMI has no matching command for? Our Redfish implementation in the Smart Proxy only does ForceRestart but exposes it as powercycle (???)

We also have "Shell" and "SSH" pseudo-BMCs, that only expose powercycle by calling shutdown -r

Do we agree on the meaning of "Reboot" (soft) and "Reset" (hard)?
Then I think the mapping could to be:

  • IPMI: Reboot: reset (unless there is a way to implement soft reboot, which I don't see), Reset: reset
  • Redfish: Reboot: GracefulRestart, Reset: ForceRestart or PowerCycle -- not sure which one is better

And based on that, we could define the new proxy capability as powerreboot and let the implementations call what they think is needed there?

Edit: after talking to friends from OpenStack - we could do a "soft off, on" sequence for the soft reboot on IPMI?

@vanou
Copy link
Contributor

vanou commented Sep 10, 2025

Hello, @evgeni and @stejskalleos. Thanks for review this PR.

(Edit: Sorry, I could not afford to write down root cause/detailed explanation in text format at the time when I post this comment. So I added/modified following)

--- Addition/modification Start ---------
Actually, this is bit complex problem. As you said, followings are bit confusing area

  • What does each term in IPMI specification & Redfish specification mean (e.g. Reboot, Reset, Powercycle, etc.)
  • Complex relationship (and misbehavior) in following things
    • Foreman core behavior & how Foreman core calls BMC API at Smart Proxy
    • BMC API at Smart Proxy
    • IPMI/Redfish implementation at Smart Proxy

So I created following table with hope that it explains the situation well.
Please ask any question if this is not helpful.

In brief, this is not only about vocabulary, it is about vocabulary & wrong implementation of Foreman core/Proxy, I think. So we named capability as poweraction_fix_3_17.

What I am lost is what these words supposed to mean.
I assume (!) "Reboot" means a soft reboot (like when you type reboot in a root shell, or press Ctrl-Alt-Delete) and a "Reset" is a hard reset (like when you cut power to the device)?

I agree with you about what "Reboot" and "Reset" means.

About Reboot at IPMI Provider
My opinion for Reboot operation at IPMI provider is "not implement Reboot against IPMI provider" (at least) in this PRs.

"soft off, on" sequence is good approach to Reboot on IPMI, but it is bit complex & expensive operation:

  • We need to wait until/detect node is completely shutdown before triggering 'on'. Or if it wrongly trigger 'on' during node is shutting down, instruction of 'on' does not work in expected way.)
  • To detect node is completely shutdown, BMC Smart Proxy needs to periodically communicate with server's BMC. If we trigger 'reboot' against many nodes through Foreman power operation, BMC Smart Proxy's tapping against many nodes affects network traffic quality.

If we decide to implement Reboot functionality against IPMI, it should be good to make another PR because above requirements for Reboot on IPMI is bit complex.

--- Addition/modification End ---------

Power action which Foreman UI supports[1] Corresponding IPMI chassis control command[2] Corresponding Redfish ResetType[3] What power action current Foreman core determines to call[4] What current Foreman core actually calls against BMC Proxy API[5] What current BMC proxy API listening on & what provder method is called[6] What method current IPMI provider implements[7] What method current Redfish provider implements[8]
Start 1h
(power up)
On on on on -> @bmc.poweron poweron poweron
Stop 0h
(power down)
ForceOff off off off -> @bmc.poweroff poweroff poweroff
Poweroff 0h
(power down)
ForceOff off off off -> @bmc.poweroff poweroff poweroff
Reboot none
(there isn't corresponding power operation in IPMI)
GracefullRestart soft
(wrong, should be reboot)
Fixed by [PR10561]
soft
(wrong, should be reboot)
Fixed by [PR10561]
none
(not implemented, should be implemented: reboot -> @bmc.powerreboot)
Fixed by [PR917]
none
(because IPMI doesn't support this, corresponding method should not be implemented)
none
(not implemented, corresponding method powerreboot should be implemeted)
Fixed by [PR917]
Reset 3h
(hard reset)
ForceRestart cycle
(wrong, should be reset)
Fixed by [PR10561]
cycle
(wrong, should be reset)
Fixed by [PR10561]
reset -> @bmc.powerreset powerreset none
(not implemented, corresponding method powerreset should be implemented)
Fixed by [PR916]
Soft 5h
(initiate a soft-shutdown)
GracefulShutdown soft
(via [d])
soft soft -> @bmc.poweroff(true) poweroff(true) poweroff(true)
Cycle 2h
(power cycle)
PowerCycle cycle
(via [d])
cycle cycle -> @bmc.powercycle powercycle powercycle
(powercycle method is implemented, but internal implementation is wrong: current internal implementation calls ForceRestart but should call PowerCycle)
Fixed by [PR919]


attr_reader :proxy

def has_poweraction_fix_3_17?
Copy link
Contributor

@stejskalleos stejskalleos Sep 11, 2025

Choose a reason for hiding this comment

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

I don't know if mentioning the 3_17 version in the code is a good practice.
What if we named it power_action_v2 and put deprecation methods in the original power_action?

That way, we can in follow-up releases remove the deprecated method and keep only one.

Copy link
Member

Choose a reason for hiding this comment

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

This matches the new capability defined in the smart-proxy PRs, but I've been thinking to suggest two destinct capabilities reboot and reset that then can be used if available (falling back to cycle for setups not having the capability yet)?

Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks for comment.
Naming of capability is bit kind of preference. But whether to create 1 capability or 2 capabilities is important point.
If we create 2 separate capabilities, determination logic at [1] becomes bit complex, I think. So we made 1 capability because we expect all PRs[2][3][4][5] here will be merged at one Foreman release version, and not expecting cherry-picking part of these PRs at downstream.

[1] https://github.com/theforeman/foreman/pull/10561/files#diff-ff81ee231c9e9f24cd1650ca805a5fc1d6991ab0598234c6ea05764099420e3fR30-R31
[2] #10561
[3] theforeman/smart-proxy#916
[4] theforeman/smart-proxy#917
[5] theforeman/smart-proxy#919

Copy link
Contributor

Choose a reason for hiding this comment

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

We had a discussion with colleagues about putting the Foreman version into the function names, and the general consensus was that it's not a good practice.

Please rename it to something else. My suggestion is power_action_v2

@evgeni
Copy link
Member

evgeni commented Sep 11, 2025

Thanks @vanou!

Yeah, I agree, "soft off, on" for a soft reboot on IPMI is quite some work to get right, so I'd skip that for now too.

And huge thanks for the overview table and links, this helps a lot in understanding the facets of this issue.

One thing I noticed, powerreset is not defined in Proxy::BMC::Base, only in Proxy::BMC::IPMI (so calling this today on a Redfish machine would cause a NoMethod error, not an NotImplemented one), we probably can fix that as part of theforeman/smart-proxy#916.

@vanou
Copy link
Contributor

vanou commented Sep 11, 2025

Yeah, I agree, "soft off, on" for a soft reboot on IPMI is quite some work to get right, so I'd skip that for now too.

Thanks you.

And huge thanks for the overview table and links, this helps a lot in understanding the facets of this issue.

I'm glad to help understanding this complex issue.

One thing I noticed, powerreset is not defined in Proxy::BMC::Base, only in Proxy::BMC::IPMI (so calling this today on a Redfish machine would cause a NoMethod error, not an NotImplemented one), we probably can fix that as part of theforeman/smart-proxy#916.

Thanks. Actually, at theforeman/smart-proxy#916, we define powerreset against Proxy::BMC::Base at [1].

[1] https://github.com/theforeman/smart-proxy/pull/916/files#diff-3d798e561908cf5ee7f4daf59f379deea3dc8abda25f7fd55c311a476d2aac87R49-R52

@vanou
Copy link
Contributor

vanou commented Sep 12, 2025

Thanks @stejskalleos for review. I'll reply to your comment at Sep. 16 because Sep. 15 is national holiday.

@evgeni
Copy link
Member

evgeni commented Sep 12, 2025

Found another place where this is mixed up:

param :power_action, String, :required => true, :desc => N_("power action, valid actions are (on/start), (off/stop), (soft/reboot), (cycle/reset), (state/status)")

The way the API doc is written implies soft and reboot are considered the same, and cycle and reset too.

@evgeni
Copy link
Member

evgeni commented Sep 12, 2025

And another one:

export const BMC_POWER_STATES = { soft: __('Reboot'), cycle: __('Reset') };

(those constants are currently unused tho)

@vanou
Copy link
Contributor

vanou commented Sep 16, 2025

Found another place where this is mixed up:

param :power_action, String, :required => true, :desc => N_("power action, valid actions are (on/start), (off/stop), (soft/reboot), (cycle/reset), (state/status)")

The way the API doc is written implies soft and reboot are considered the same, and cycle and reset too.

And another one:

export const BMC_POWER_STATES = { soft: __('Reboot'), cycle: __('Reset') };

(those constants are currently unused tho)

@evgeni
Thanks for comment. We'll fix them in this PR too.

@spesnova717 spesnova717 force-pushed the fix_3073_bmc_reboot_reset_patch1 branch from 3136dfb to e9344c1 Compare September 17, 2025 09:25
@github-actions github-actions bot added the UI label Sep 17, 2025
@spesnova717
Copy link
Author

@stejskalleos @evgeni

Thank you for your review.
I have updated the code based on the discussion.
I’d appreciate your review to confirm the changes.


attr_reader :proxy

def has_poweraction_fix_3_17?
Copy link
Contributor

Choose a reason for hiding this comment

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

We had a discussion with colleagues about putting the Foreman version into the function names, and the general consensus was that it's not a good practice.

Please rename it to something else. My suggestion is power_action_v2

Comment on lines 17 to 39
nic = host.bmc_nic

case nic&.subnet&.bmc&.has_capability?(:BMC, :poweraction_fix_3_17)
in nil
Foreman::Logging.logger('app').error(
"Failed to determine capability of BMC proxy. Cancel power operation against #{host.name} because associated BMC NIC, Subnet or BMC Proxy is not found."
)
raise ::Foreman::BMCFeatureException.new(
N_("BMC NIC associated to %{host}, or Subnet/BMC Proxy associated to the BMC NIC not found.") %
{ host: host.name }
)
in true
true
in false
false
end
rescue ActiveRecord::ActiveRecordError => e
Foreman::Logging.exception(
"Failed to determine capability of BMC proxy. Cancel power operation against #{host.name} due to unexpected ActiveRecord behavior.",
e,
level: :error
)
raise
Copy link
Contributor

Choose a reason for hiding this comment

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

Although a defensive approach is a good way to go, I don't think we need the nil check here.

Calling host.power.action:

  • If the host doesn't have an associated power, the error will be catched ERF42-9958 [Foreman::Exception]: Unknown power management support - can't continue
  • If the subnet doesn't have an BMC proxy, the error is Foreman::BMCFeatureException: ERF88-9474 [Foreman::BMCFeatureException]: There is no proxy with BMC feature set up. Associate a BMC feature with a subnet.
Suggested change
nic = host.bmc_nic
case nic&.subnet&.bmc&.has_capability?(:BMC, :poweraction_fix_3_17)
in nil
Foreman::Logging.logger('app').error(
"Failed to determine capability of BMC proxy. Cancel power operation against #{host.name} because associated BMC NIC, Subnet or BMC Proxy is not found."
)
raise ::Foreman::BMCFeatureException.new(
N_("BMC NIC associated to %{host}, or Subnet/BMC Proxy associated to the BMC NIC not found.") %
{ host: host.name }
)
in true
true
in false
false
end
rescue ActiveRecord::ActiveRecordError => e
Foreman::Logging.exception(
"Failed to determine capability of BMC proxy. Cancel power operation against #{host.name} due to unexpected ActiveRecord behavior.",
e,
level: :error
)
raise
smart_proxy = host.smart_proxies.with_features(:BMC).first
return false unless smart_proxy
return smart_proxy.has_capability?(:BMC, :poweraction_fix_3_17)

What do you think?

@vanou
Copy link
Contributor

vanou commented Sep 19, 2025

@stejskalleos
Thanks for comment & suggestion. We discussed and agreed that your suggested code is reasonable.
So we modified this PR code based on your suggestion & consensus between you and your colleagues.

I'd appreciate your review. Thank you.

Copy link
Contributor

@stejskalleos stejskalleos left a comment

Choose a reason for hiding this comment

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

There are a few missing rename changes, and the smart proxy PRs also need to be updated; otherwise, the PR is ready for merge.

assert host.power.reset
end

test "should fallback to soft and cycle when poweraction_fix_3_17 is not supported" do
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
test "should fallback to soft and cycle when poweraction_fix_3_17 is not supported" do
test "should fallback to soft and cycle when power_action_v2 is not supported" do

smart_proxy = host.smart_proxies.with_features(:BMC).first

return false unless smart_proxy
smart_proxy.has_capability?(:BMC, :poweraction_fix_3_17)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
smart_proxy.has_capability?(:BMC, :poweraction_fix_3_17)
smart_proxy.has_capability?(:BMC, :power_action_v2)

We should rename the method in the smart proxy as well (theforeman/smart-proxy#916 & theforeman/smart-proxy#917)

actions.uniq
end

test "should call reboot and reset directly when poweraction_fix_3_17 is supported" do
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
test "should call reboot and reset directly when poweraction_fix_3_17 is supported" do
test "should call reboot and reset directly when power_action_v2 is supported" do

… actions

Bug theforeman#3073 is caused by 3 things:
1. Foreman core doesn't call BMC proxy's API correctly
   - Changing power state to 'Reboot' via Web GUI calls BMC proxy's 'soft'
     power action
   - Changing power state to 'Reset' via Web GUI calls BMC proxy's 'cycle'
     power action
2. Foreman BMC proxy doesn't support reboot at all BMC provider
3. Foreman BMC proxy doesn't support reset(powerreset) at Redfish provider

This PR fixes first item.

For backward compatibility, power_action_v2 capability will be
introduced to smart proxy at PRs related to #38498. And this commit
introduces logic to determine if smart proxy supports that capability.

Co-Authored-By: Vanou Ishii <ishii.vanou@fujitsu.com>
@vanou
Copy link
Contributor

vanou commented Sep 22, 2025

@stejskalleos
Thank you for comment on overlooked things. Now I fix things you told in code & commit message at this PR & PRs of smart-proxy.

Huge thanks for kind review and comment!

attr_reader :proxy

def power_action_v2
smart_proxy = host.smart_proxies.with_features(:BMC).first
Copy link
Contributor

Choose a reason for hiding this comment

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

Found a bug #10697, the smart_proxies method does not include Proxies that are assigned as BMC only.

Copy link
Contributor

@stejskalleos stejskalleos left a comment

Choose a reason for hiding this comment

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

🍏 LGTM

Tested two scenarios:

  1. #10561 with theforeman/smart-proxy#916
[2025-09-23 13:35:00,183] INFO in main: System "202ca45a-09eb-4906-a0ef-926697668b44" power state set to "ForceRestart"
  1. #10561 with theforeman/smart-proxy#917
[2025-09-23 13:30:19,953] INFO in main: System "202ca45a-09eb-4906-a0ef-926697668b44" power state set to "GracefulRestart"

Both scenarios meet expectations and work well. I found one issue during testing, #10697, which was not caused by these changes.

🍏 Works as expected
🍏 Code LGTM
🍏 Tests
🍏 CI is green

@stejskalleos stejskalleos merged commit 21b5c2c into theforeman:develop Sep 23, 2025
107 of 111 checks passed
@stejskalleos
Copy link
Contributor

Thanks @spesnova717 @vanou @evgeni

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants