Skip to content

Add Puppet proxy (CA) bulk actions#429

Open
nadjaheitmann wants to merge 1 commit intomasterfrom
new_all_hosts_page_puppet_proxy_actions
Open

Add Puppet proxy (CA) bulk actions#429
nadjaheitmann wants to merge 1 commit intomasterfrom
new_all_hosts_page_puppet_proxy_actions

Conversation

@nadjaheitmann
Copy link
Copy Markdown
Collaborator

@nadjaheitmann nadjaheitmann commented Sep 24, 2025

@adamruzicka @jeremylenz I have created a draft for the Puppet Proxy update bulk action. It is not more than a draft and I know there is a bunch of things missing (e.g. clearing proxy, CA proxy, tests, ...). I basically took code from Foreman and Katello and mixed it into this. Do you mind checking whether the general approach is the direction we want to go. UI wise, I think this is straight forward, but I was not sure whether

  • extending the BulkHostManager
  • adding a new API endpoint to the HostsBulkActionsController
  • adding the API endpoint itself to the Foreman rather than the foreman_puppet namespace

is the way to go.

I appreciate your opinions.

Copy link
Copy Markdown
Contributor

@adamruzicka adamruzicka left a comment

Choose a reason for hiding this comment

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

Left some notes inline, can't speak much to the frontend


api :PUT, "/hosts/bulk/change_puppet_proxy", N_("Change Puppet Proxy")
param_group :bulk_host_ids
param :proxy_id, :number, :required => true, :desc => N_("ID of the Puppet proxy to reassign the hosts to")
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 being required means it can be used to reassign the host to a different proxy, but this cannot be used to unassign it, correct?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Correct. I have not yet implemented the unassign method, so the implementation details about that one are still open.

Comment on lines +11 to +15
host.puppet_ca_proxy = proxy
else
host.puppet_proxy = proxy
end
host.save(:validate => false)
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.

Do we need callbacks to be run or could we take a shortcut and assign the proxy with a single update query?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Not sure, if we need callbacks to be honest. The original action does run some validations about validating the proxy I think: https://github.com/theforeman/foreman_puppet/blob/master/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb#L143

Can the update command also take the validate => false parameter?

Comment thread app/services/concerns/foreman_puppet/extensions/bulk_hosts_manager.rb Outdated
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch from e2b1c7f to c7dd83c Compare September 24, 2025 12:15
Copy link
Copy Markdown
Collaborator Author

@nadjaheitmann nadjaheitmann left a comment

Choose a reason for hiding this comment

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

Thanks @adamruzicka !


api :PUT, "/hosts/bulk/change_puppet_proxy", N_("Change Puppet Proxy")
param_group :bulk_host_ids
param :proxy_id, :number, :required => true, :desc => N_("ID of the Puppet proxy to reassign the hosts to")
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Correct. I have not yet implemented the unassign method, so the implementation details about that one are still open.

Comment thread app/services/concerns/foreman_puppet/extensions/bulk_hosts_manager.rb Outdated
Comment on lines +11 to +15
host.puppet_ca_proxy = proxy
else
host.puppet_proxy = proxy
end
host.save(:validate => false)
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Not sure, if we need callbacks to be honest. The original action does run some validations about validating the proxy I think: https://github.com/theforeman/foreman_puppet/blob/master/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb#L143

Can the update command also take the validate => false parameter?

@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 2 times, most recently from ac62ab7 to e980546 Compare September 24, 2025 12:48
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 3 times, most recently from 11c8919 to 4512e86 Compare October 13, 2025 07:52
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch from 4512e86 to 2eb2f1a Compare January 21, 2026 17:09
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 3 times, most recently from 4bb7ef6 to 0faf7d6 Compare February 10, 2026 10:44
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 3 times, most recently from 75e0f00 to 7d7c810 Compare February 18, 2026 13:40
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch from d68caaf to 0caaa68 Compare March 2, 2026 09:21
Copy link
Copy Markdown
Contributor

@jeremylenz jeremylenz left a comment

Choose a reason for hiding this comment

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

Did a quick read of the frontend code, a couple comments below

Comment thread webpack/src/Extends/Hosts/ActionsBar/index.js Outdated
Comment thread webpack/src/Extends/Hosts/ActionsBar/index.js Outdated
Comment thread webpack/src/Extends/Hosts/ActionsBar/index.js Outdated
Comment thread webpack/src/Extends/Hosts/ActionsBar/index.js Outdated
@nadjaheitmann
Copy link
Copy Markdown
Collaborator Author

This PR uses theforeman/foreman@40938e4 , so it will only work with Foreman 3.19+

@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 9 times, most recently from 98fdd79 to dfb9239 Compare April 10, 2026 12:35
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch from dfb9239 to 8bc4dc2 Compare April 10, 2026 13:32
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 7 times, most recently from 9208a4c to d6fd7f8 Compare April 24, 2026 12:39
@nadjaheitmann
Copy link
Copy Markdown
Collaborator Author

nadjaheitmann commented Apr 24, 2026

@jeremylenz @adamruzicka Can you please re-review the PR? It is not completely in line with what the Bulk actions in Foreman core do/return but it could be implemented in a follow-up. (it does not return a nice link to the failed hosts)

image

Copy link
Copy Markdown
Contributor

@jeremylenz jeremylenz left a comment

Choose a reason for hiding this comment

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

JS changes LGTM, did not test. 👍

Comment thread webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/index.js Outdated
Comment thread webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/index.js Outdated
Comment thread webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetProxy/index.js Outdated
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds draft bulk actions for Puppet Proxy and Puppet CA Proxy on the Hosts index, including new React modals and a new backend bulk API/controller to apply the changes to selected hosts.

Changes:

  • Adds Hosts index “Puppet” bulk-action menu items plus four bulk-action modals (change/remove proxy + change/remove CA proxy).
  • Introduces shared React “common” components and Redux API actions for change/remove operations.
  • Adds a new ForemanPuppet API controller/routes plus a BulkHostsManager extension and accompanying Ruby tests.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
webpack/src/Extends/Hosts/BulkActions/BulkRemovePuppetProxy/index.js Scene wiring for “Remove Puppet proxy” modal.
webpack/src/Extends/Hosts/BulkActions/BulkRemovePuppetProxy/tests/index.test.js Unit test ensuring correct props passed to common remove modal.
webpack/src/Extends/Hosts/BulkActions/BulkRemovePuppetCAProxy/index.js Scene wiring for “Remove Puppet CA proxy” modal.
webpack/src/Extends/Hosts/BulkActions/BulkRemovePuppetCAProxy/tests/index.test.js Unit test ensuring correct CA props/messages passed.
webpack/src/Extends/Hosts/BulkActions/BulkRemoveProxyCommon/index.js Shared “remove proxy” confirmation modal + API dispatch.
webpack/src/Extends/Hosts/BulkActions/BulkRemoveProxyCommon/actions.js Redux API action for bulk remove endpoint.
webpack/src/Extends/Hosts/BulkActions/BulkRemoveProxyCommon/tests/actions.test.js Unit tests validating APIActions.put usage.
webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetProxy/index.js Scene wiring for “Change Puppet proxy” modal.
webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetProxy/tests/index.test.js Unit test ensuring correct props passed to common change modal.
webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/index.js Scene wiring for “Change Puppet CA proxy” modal.
webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/tests/index.test.js Unit test ensuring correct CA props/messages passed.
webpack/src/Extends/Hosts/BulkActions/BulkChangeProxyCommon/index.js Shared “change proxy” modal with Smart Proxy select + bulk change dispatch.
webpack/src/Extends/Hosts/BulkActions/BulkChangeProxyCommon/actions.js Redux API actions for fetching proxies + bulk change endpoint.
webpack/src/Extends/Hosts/BulkActions/BulkChangeProxyCommon/tests/actions.test.js Unit tests validating APIActions.get/put usage.
webpack/src/Extends/Hosts/ActionsBar/index.js Adds “Puppet” flyout under Hosts index kebab with 4 actions.
webpack/src/Extends/Hosts/ActionsBar/ActionsBar.scss Styles intended for disabled menu description content.
webpack/global_index.js Registers fills: Hosts index kebab section + modal fills.
test/services/foreman_puppet/bulk_hosts_manager_test.rb Unit tests for BulkHostsManager puppet proxy updates.
test/controllers/foreman_puppet/api/v2/hosts_bulk_actions_controller_test.rb Controller tests for change/remove endpoints and error cases.
lib/foreman_puppet/register.rb Adds RBAC permission mappings for the new API actions.
lib/foreman_puppet/engine.rb Includes the BulkHostsManager extension concern into core manager.
config/api_routes.rb Adds new API routes for bulk change/remove puppet proxy.
app/services/concerns/foreman_puppet/extensions/bulk_hosts_manager.rb Implements the bulk host update logic for puppet proxy fields.
app/controllers/foreman_puppet/api/v2/hosts_bulk_actions_controller.rb Implements the bulk API endpoints and response handling.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread webpack/src/Extends/Hosts/ActionsBar/index.js Outdated
Comment on lines +124 to +129
included: {
search: fetchBulkParams(),
},
proxy_id: smartProxyId.split('-')[0],
ca_proxy: isCAProxy,
};
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

smartProxyId is stored as a combined string ("<id>-<name>") and later parsed via split('-')[0]. This is brittle (depends on a delimiter and forces string parsing). Prefer using the proxy id itself as the Select value (and keep the label separately) so proxy_id can be sent without parsing.

Copilot uses AI. Check for mistakes.
Comment thread config/api_routes.rb
Comment thread webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/index.js Outdated
Comment on lines +10 to +18
host.puppet_ca_proxy = proxy
else
host.puppet_proxy = proxy
end
host.save(validate: false)
rescue StandardError => e
message = format(_('Failed to set proxy for %{host}.'), host: host)
Foreman::Logging.exception(message, e)
error_hosts << host.id
Copy link

Copilot AI Apr 24, 2026

Choose a reason for hiding this comment

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

host.save(validate: false) can return false (e.g., aborted callbacks) without raising, so failures may be silently treated as success and never added to error_hosts. Consider using save! (and rescuing) or explicitly checking the boolean return value and pushing the host id into error_hosts when the save fails.

Copilot uses AI. Check for mistakes.
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.

One could argue that with validate: false this shouldn't really happen?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I would assume it just works. Not sure what would happen if you e.g. assign a proxy and it is deleted between the check in the API and call the to host.save.

Copy link
Copy Markdown
Collaborator Author

@nadjaheitmann nadjaheitmann May 6, 2026

Choose a reason for hiding this comment

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

@adamruzicka Any preference what to do with this code? The validation is in line with the original implementation: https://github.com/theforeman/foreman_puppet/blob/master/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb#L73

Not sure what would happen if we change the behavior now. I agree that having the error catching does not make much sense from this perspective. However, removing it also feels wrong somehow.

Can you please take another look? I would like to finish this up and it just keeps growing and growing :)

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'd be fine with keeping it as it was. Sometimes copilot gets overly zealous

Comment thread webpack/src/Extends/Hosts/BulkActions/BulkChangePuppetCAProxy/index.js Outdated
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 3 times, most recently from 1268415 to 7db72d3 Compare April 27, 2026 12:06
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch 2 times, most recently from 0c74440 to 44484fc Compare May 6, 2026 08:38
Copy link
Copy Markdown
Contributor

@adamruzicka adamruzicka left a comment

Choose a reason for hiding this comment

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

I currently don't have an environment to test this, but code wise it looks good.

Comment thread config/api_routes.rb
Assisted-by: OpenAI Codex <codex@openai.com>
@nadjaheitmann nadjaheitmann force-pushed the new_all_hosts_page_puppet_proxy_actions branch from 44484fc to f3e13d0 Compare May 6, 2026 09:25
@nadjaheitmann nadjaheitmann requested a review from adamruzicka May 6, 2026 09:37
@nadjaheitmann
Copy link
Copy Markdown
Collaborator Author

environ

Thanks @adamruzicka . I accidentally requested another review from you, feel free to ignore that.

@nadjaheitmann nadjaheitmann changed the title Draft: Add Puppet proxy (CA) bulk actions Add Puppet proxy (CA) bulk actions May 7, 2026
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.

4 participants