foreman_puppet 1.0.1 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/foreman_puppet/extensions/hostgroups_controller_extensions.rb +4 -2
- data/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb +1 -1
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_host.rb +41 -32
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_hostgroup.rb +42 -33
- data/app/helpers/foreman_puppet/puppet_smart_proxies_helper.rb +4 -0
- data/app/models/foreman_puppet/host_puppet_facet.rb +1 -1
- data/app/models/foreman_puppet/hostgroup_puppet_facet.rb +2 -0
- data/app/services/concerns/foreman_puppet/extensions/host_counter.rb +17 -0
- data/app/views/hosts/_form_puppet_enc_tab.html.erb +3 -4
- data/db/migrate/20200803113803_migrate_environment_to_puppet_facet.foreman_puppet.rb +2 -2
- data/db/migrate/20200803113903_migrate_host_type_in_host_config_groups.foreman_puppet.rb +36 -20
- data/db/migrate/20211112130803_cleanup_environment_from_core_tables.foreman_puppet.rb +10 -0
- data/lib/foreman_puppet/engine.rb +2 -0
- data/lib/foreman_puppet/version.rb +1 -1
- data/locale/cs_CZ/foreman_puppet.edit.po +1085 -0
- data/locale/cs_CZ/foreman_puppet.po.time_stamp +0 -0
- data/locale/en/foreman_puppet.edit.po +317 -162
- data/test/controllers/foreman_puppet/hostgroups_controller_test.rb +72 -52
- data/test/factories/host_puppet_enhancements.rb +3 -0
- data/test/helpers/foreman_puppet/hosts_and_hostgroups_helper_test.rb +70 -31
- data/test/models/foreman_puppet/host_puppet_facet_test.rb +7 -1
- data/test/services/foreman_puppet/host_counter_test.rb +17 -0
- data/webpack/src/Components/Environments/Welcome.js +2 -2
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f8a5c7b68f8d77f54787c4c9de924bc02f27d7a0f957fc6539b5b4aa6c64b49
|
4
|
+
data.tar.gz: 6cd563d9cc2f56c22186bbbb0fb9d3c9679c8718e965d7fd952bbed3efacf222
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a09cf7ff50545983f0e472b3c03f0708087dddf8d2136dc32978f49a1fd76ba7ca4c716db6e6b3add3055279745754b2d2eddf2cd1630a91e75187ba9683c1e
|
7
|
+
data.tar.gz: 5c4bb18d77784e2a9c43c7f102adc9df6469b739525fee007d1c89bf635713e1dd051140489101ebeb9d66298100195f56571fa5fb55a1a179c8381cac56a65b
|
@@ -23,7 +23,9 @@ module ForemanPuppet
|
|
23
23
|
module Actions
|
24
24
|
def nest
|
25
25
|
super
|
26
|
-
|
26
|
+
return unless @parent.puppet
|
27
|
+
puppet = @hostgroup.puppet || @hostgroup.build_puppet
|
28
|
+
puppet.puppetclasses = @parent.puppet.puppetclasses
|
27
29
|
end
|
28
30
|
|
29
31
|
def environment_selected
|
@@ -36,7 +38,7 @@ module ForemanPuppet
|
|
36
38
|
|
37
39
|
puppet.puppetclasses = ForemanPuppet::Puppetclass.where(id: params[:hostgroup][:puppetclass_ids])
|
38
40
|
puppet.config_groups = ForemanPuppet::ConfigGroup.where(id: params[:hostgroup][:config_group_ids])
|
39
|
-
render partial: 'hosts/form_puppet_enc_tab', locals: {
|
41
|
+
render partial: 'hosts/form_puppet_enc_tab', locals: { subject: @hostgroup, resource_type: :hostgroup }
|
40
42
|
end
|
41
43
|
|
42
44
|
def puppetclass_parameters
|
@@ -41,7 +41,7 @@ module ForemanPuppet
|
|
41
41
|
set_class_variables(@host)
|
42
42
|
::Taxonomy.as_taxonomy @organization, @location do
|
43
43
|
if @environment || @hostgroup
|
44
|
-
render partial: 'hosts/form_puppet_enc_tab', locals: {
|
44
|
+
render partial: 'hosts/form_puppet_enc_tab', locals: { subject: @host, resource_type: :host }
|
45
45
|
else
|
46
46
|
logger.info 'environment_id or hostgroup_id is required to render puppetclasses'
|
47
47
|
end
|
@@ -14,12 +14,7 @@ module ForemanPuppet
|
|
14
14
|
module PatchedClassMethods
|
15
15
|
def host_params_filter
|
16
16
|
super.tap do |filter|
|
17
|
-
filter
|
18
|
-
config_groups: [], config_group_ids: [], config_group_names: [],
|
19
|
-
puppetclasses: [], puppetclass_ids: [], puppetclass_names: []
|
20
|
-
|
21
|
-
# TODO: bring to core - this is what facets should do, but does not
|
22
|
-
filter.permit(puppet_attributes: {})
|
17
|
+
add_host_puppet_params_filter(filter)
|
23
18
|
end
|
24
19
|
end
|
25
20
|
end
|
@@ -27,40 +22,54 @@ module ForemanPuppet
|
|
27
22
|
module PatchedMethods
|
28
23
|
def host_params(*attrs)
|
29
24
|
params = super(*attrs)
|
30
|
-
|
31
|
-
process_deprecated_environment_params!(params)
|
32
|
-
process_deprecated_attributes!(params)
|
25
|
+
process_deprecated_puppet_params!(params)
|
33
26
|
params
|
34
27
|
end
|
28
|
+
end
|
35
29
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
return unless env_id || env_name || env
|
42
|
-
::Foreman::Deprecation.api_deprecation_warning('param host[environment_*] has been deprecated in favor of host[puppet_attributes][environment_*]')
|
30
|
+
class_methods do
|
31
|
+
def add_host_puppet_params_filter(filter)
|
32
|
+
filter.permit :environment_id, :environment_name, :environment,
|
33
|
+
config_groups: [], config_group_ids: [], config_group_names: [],
|
34
|
+
puppetclasses: [], puppetclass_ids: [], puppetclass_names: []
|
43
35
|
|
44
|
-
|
45
|
-
|
46
|
-
params[:puppet_attributes][:environment_name] ||= env_name if env_name
|
47
|
-
params[:puppet_attributes][:environment] ||= env if env
|
36
|
+
# TODO: bring to core - this is what facets should do, but does not
|
37
|
+
filter.permit(puppet_attributes: {})
|
48
38
|
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_deprecated_puppet_params!(params, top_level_hash = controller_name.singularize)
|
42
|
+
process_deprecated_environment_params!(params, top_level_hash)
|
43
|
+
process_deprecated_attributes!(params, top_level_hash)
|
44
|
+
end
|
49
45
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
plains = params.delete(relation.pluralize.to_sym)
|
46
|
+
def process_deprecated_environment_params!(params, top_level_hash = 'host')
|
47
|
+
env_id = params.delete(:environment_id)
|
48
|
+
env_name = params.delete(:environment_name)
|
49
|
+
env = params.delete(:environment)
|
55
50
|
|
56
|
-
|
57
|
-
|
51
|
+
return unless env_id || env_name || env
|
52
|
+
::Foreman::Deprecation.api_deprecation_warning("param #{top_level_hash}[environment_*] has been deprecated in favor of #{top_level_hash}[puppet_attributes][environment_*]")
|
58
53
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
54
|
+
params[:puppet_attributes] ||= {}
|
55
|
+
params[:puppet_attributes][:environment_id] ||= env_id if env_id
|
56
|
+
params[:puppet_attributes][:environment_name] ||= env_name if env_name
|
57
|
+
params[:puppet_attributes][:environment] ||= env if env
|
58
|
+
end
|
59
|
+
|
60
|
+
def process_deprecated_attributes!(params, top_level_hash = 'host')
|
61
|
+
%w[puppetclass config_group].each do |relation|
|
62
|
+
ids = params.delete("#{relation}_ids".to_sym)
|
63
|
+
names = params.delete("#{relation}_names".to_sym)
|
64
|
+
plains = params.delete(relation.pluralize.to_sym)
|
65
|
+
|
66
|
+
next unless ids || names || plains
|
67
|
+
::Foreman::Deprecation.api_deprecation_warning("param #{top_level_hash}[#{relation}_*] has been deprecated in favor of #{top_level_hash}[puppet_attributes][#{relation}_*]")
|
68
|
+
|
69
|
+
params[:puppet_attributes] ||= {}
|
70
|
+
params[:puppet_attributes]["#{relation}_ids".to_sym] ||= ids if ids
|
71
|
+
params[:puppet_attributes]["#{relation}_names".to_sym] ||= names if names
|
72
|
+
params[:puppet_attributes][relation.pluralize.to_sym] ||= plains if plains
|
64
73
|
end
|
65
74
|
end
|
66
75
|
end
|
@@ -14,12 +14,7 @@ module ForemanPuppet
|
|
14
14
|
module PatchedClassMethods
|
15
15
|
def hostgroup_params_filter
|
16
16
|
super.tap do |filter|
|
17
|
-
filter
|
18
|
-
config_group_ids: [], config_group_names: [],
|
19
|
-
puppetclass_ids: [], puppetclass_names: []
|
20
|
-
|
21
|
-
# TODO: bring to core - this is what facets should do, but does not
|
22
|
-
filter.permit(puppet_attributes: {})
|
17
|
+
add_hostgroup_puppet_params_filter(filter)
|
23
18
|
end
|
24
19
|
end
|
25
20
|
end
|
@@ -27,42 +22,56 @@ module ForemanPuppet
|
|
27
22
|
module PatchedMethods
|
28
23
|
def hostgroup_params(*attrs)
|
29
24
|
params = super(*attrs)
|
30
|
-
|
31
|
-
process_deprecated_hostgroup_environment_params!(params)
|
32
|
-
process_deprecated_hostgroup_attributes!(params)
|
25
|
+
process_deprecated_hostgroup_puppet_params!(params)
|
33
26
|
params
|
34
27
|
end
|
28
|
+
end
|
35
29
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
else
|
42
|
-
env_id = params[:environment_id]
|
43
|
-
env_name = params[:environment_name]
|
44
|
-
end
|
30
|
+
class_methods do
|
31
|
+
def add_hostgroup_puppet_params_filter(filter)
|
32
|
+
filter.permit :environment_id, :environment_name,
|
33
|
+
config_group_ids: [], config_group_names: [],
|
34
|
+
puppetclass_ids: [], puppetclass_names: []
|
45
35
|
|
46
|
-
|
47
|
-
|
36
|
+
# TODO: bring to core - this is what facets should do, but does not
|
37
|
+
filter.permit(puppet_attributes: {})
|
38
|
+
end
|
39
|
+
end
|
48
40
|
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
def process_deprecated_hostgroup_puppet_params!(params, top_level_hash = 'hostgroup')
|
42
|
+
process_deprecated_hostgroup_environment_params!(params, top_level_hash)
|
43
|
+
process_deprecated_hostgroup_attributes!(params, top_level_hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_deprecated_hostgroup_environment_params!(params, top_level_hash = 'hostgroup')
|
47
|
+
env_id = env_name = nil
|
48
|
+
if ForemanPuppet.extracted_from_core?
|
49
|
+
env_id = params.delete(:environment_id)
|
50
|
+
env_name = params.delete(:environment_name)
|
51
|
+
else
|
52
|
+
env_id = params[:environment_id]
|
53
|
+
env_name = params[:environment_name]
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
ids = params.delete("#{relation}_ids")
|
57
|
-
names = params.delete("#{relation}_names")
|
56
|
+
return unless env_id || env_name
|
57
|
+
::Foreman::Deprecation.api_deprecation_warning("param #{top_level_hash}[environment_*] has been deprecated in favor of #{top_level_hash}[puppet_attributes][environment_*]")
|
58
58
|
|
59
|
-
|
60
|
-
|
59
|
+
params[:puppet_attributes] ||= {}
|
60
|
+
params[:puppet_attributes][:environment_id] ||= env_id if env_id
|
61
|
+
params[:puppet_attributes][:environment_name] ||= env_name if env_name
|
62
|
+
end
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def process_deprecated_hostgroup_attributes!(params, top_level_hash = 'hostgroup')
|
65
|
+
%w[puppetclass config_group].each do |relation|
|
66
|
+
ids = params.delete("#{relation}_ids")
|
67
|
+
names = params.delete("#{relation}_names")
|
68
|
+
|
69
|
+
next unless ids || names
|
70
|
+
::Foreman::Deprecation.api_deprecation_warning("param #{top_level_hash}[#{relation}_*] has been deprecated in favor of #{top_level_hash}[puppet_attributes][#{relation}_*]")
|
71
|
+
|
72
|
+
params[:puppet_attributes] ||= {}
|
73
|
+
params[:puppet_attributes]["#{relation}_ids".to_sym] ||= ids if ids
|
74
|
+
params[:puppet_attributes]["#{relation}_names".to_sym] ||= names if names
|
66
75
|
end
|
67
76
|
end
|
68
77
|
end
|
@@ -48,6 +48,8 @@ module ForemanPuppet
|
|
48
48
|
Hostgroup.sort_by_ancestry(hostgroup.ancestors.joins(:puppet).where(HostgroupPuppetFacet.arel_table[attr.to_sym].not_eq(nil))).last&.puppet.try(attr)
|
49
49
|
end
|
50
50
|
|
51
|
+
delegate :parent_id, to: :hostgroup
|
52
|
+
|
51
53
|
# and helpers
|
52
54
|
def parent_facet_id
|
53
55
|
parent_facet&.id
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ForemanPuppet
|
2
|
+
module Extensions
|
3
|
+
module HostCounter
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def counted_hosts
|
7
|
+
case @association.to_s
|
8
|
+
when 'environment'
|
9
|
+
hosts_scope = ::Host::Managed.reorder('').joins(:puppet)
|
10
|
+
hosts_scope.authorized(:view_hosts).group(HostPuppetFacet.arel_table[:environment_id]).count
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
<% resource_type ||= pagelet.opts[:resource_type] %>
|
2
|
-
<%
|
3
|
-
<% obj = (host_or_hostgroup.puppet || host_or_hostgroup.build_puppet) if %i[host hostgroup].include?(resource_type) %>
|
2
|
+
<% obj = (subject.puppet || subject.build_puppet) if %i[host hostgroup].include?(resource_type) %>
|
4
3
|
<% if resource_type == :host %>
|
5
4
|
<span id="puppet_klasses_reload_url" data-url="<%= foreman_puppet.hostgroup_or_environment_selected_hosts_path %>"></span>
|
6
5
|
<% elsif resource_type == :hostgroup %>
|
@@ -18,7 +17,7 @@
|
|
18
17
|
text: _('Please select an environment first')) %>
|
19
18
|
<% end %>
|
20
19
|
|
21
|
-
<fieldset id="puppet_klasses_parameters" data-url="<%= foreman_puppet.url_for(action: :puppetclass_parameters, only_path: true) %>">
|
20
|
+
<fieldset id="puppet_klasses_parameters" data-url="<%= foreman_puppet.url_for(controller: resource_type.to_s.pluralize.to_sym, action: :puppetclass_parameters, only_path: true) %>">
|
22
21
|
<h2><%= _('Puppet Class Parameters') %></h2>
|
23
|
-
<%= render 'foreman_puppet/puppetclasses/classes_parameters', obj:
|
22
|
+
<%= render 'foreman_puppet/puppetclasses/classes_parameters', obj: subject %>
|
24
23
|
</fieldset>
|
@@ -2,11 +2,11 @@ class MigrateEnvironmentToPuppetFacet < ActiveRecord::Migration[6.0]
|
|
2
2
|
def up
|
3
3
|
puppet_hostgroups = ::Hostgroup.unscoped.where.not(environment_id: nil).pluck(:id, :environment_id)
|
4
4
|
puppet_hostgroups.map! { |hg_id, env_id| { hostgroup_id: hg_id, environment_id: env_id } }
|
5
|
-
ForemanPuppet::HostgroupPuppetFacet.insert_all(puppet_hostgroups) if puppet_hostgroups.any?
|
5
|
+
ForemanPuppet::HostgroupPuppetFacet.insert_all!(puppet_hostgroups) if puppet_hostgroups.any?
|
6
6
|
|
7
7
|
puppet_hosts = Host::Managed.unscoped.where.not(environment_id: nil).pluck(:id, :environment_id)
|
8
8
|
puppet_hosts.map! { |host_id, env_id| { host_id: host_id, environment_id: env_id } }
|
9
|
-
ForemanPuppet::HostPuppetFacet.insert_all(puppet_hosts) if puppet_hosts.any?
|
9
|
+
ForemanPuppet::HostPuppetFacet.insert_all!(puppet_hosts) if puppet_hosts.any?
|
10
10
|
end
|
11
11
|
|
12
12
|
def down
|
@@ -13,26 +13,8 @@ class MigrateHostTypeInHostConfigGroups < ActiveRecord::Migration[6.0]
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def up
|
16
|
-
|
17
|
-
|
18
|
-
host_facet_id = ForemanPuppet::HostPuppetFacet.where(host_id: host_id).pick(:id)
|
19
|
-
host_groups = FakeHostConfigGroup.for_host.where(host_id: host_id)
|
20
|
-
if host_facet_id
|
21
|
-
host_groups.update_all(host_type: 'ForemanPuppet::HostPuppetFacet', host_id: host_facet_id)
|
22
|
-
else
|
23
|
-
deleted_groups = FakeConfigGroup.where(id: host_groups.pluck(:config_group_id)).pluck(:name)
|
24
|
-
say "deleting groups #{deleted_groups.join(', ')} from Host (id=#{host_id}) because it has no environment"
|
25
|
-
host_groups.delete_all
|
26
|
-
end
|
27
|
-
end
|
28
|
-
hostgroup_config_group_ids = FakeHostConfigGroup.for_hostgroup.pluck(:host_id).uniq
|
29
|
-
hostgroup_config_group_ids.each do |hostgroup_id|
|
30
|
-
hostgroup_facet_id = ForemanPuppet::HostgroupPuppetFacet.where(hostgroup_id: hostgroup_id).pick(:id)
|
31
|
-
hostgroup_facet_id ||= ForemanPuppet::HostgroupPuppetFacet.create!(hostgroup: Hostgroup.unscoped.find(hostgroup_id)).id
|
32
|
-
FakeHostConfigGroup.for_hostgroup
|
33
|
-
.where(host_id: hostgroup_id)
|
34
|
-
.update_all(host_type: 'ForemanPuppet::HostgroupPuppetFacet', host_id: hostgroup_facet_id)
|
35
|
-
end
|
16
|
+
migrate_host_data_to_facets
|
17
|
+
migrate_hostgroup_data_to_facets
|
36
18
|
end
|
37
19
|
|
38
20
|
def down
|
@@ -51,4 +33,38 @@ class MigrateHostTypeInHostConfigGroups < ActiveRecord::Migration[6.0]
|
|
51
33
|
.update_all(host_type: 'Hostgroup', host_id: hostgroup_facet_ids[hostgroup_facet_id])
|
52
34
|
end
|
53
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def migrate_host_data_to_facets
|
40
|
+
host_config_group_ids = FakeHostConfigGroup.for_host.pluck(:host_id).uniq
|
41
|
+
host_config_group_ids.each do |host_id|
|
42
|
+
host_facet_id = ForemanPuppet::HostPuppetFacet.where(host_id: host_id).pick(:id)
|
43
|
+
host_groups = FakeHostConfigGroup.for_host.where(host_id: host_id)
|
44
|
+
if host_facet_id
|
45
|
+
host_groups.update_all(host_type: 'ForemanPuppet::HostPuppetFacet', host_id: host_facet_id)
|
46
|
+
else
|
47
|
+
deleted_groups = FakeConfigGroup.where(id: host_groups.pluck(:config_group_id)).pluck(:name)
|
48
|
+
say "Deleting Config groups #{deleted_groups.join(', ')} from Host (id=#{host_id}) because the Host doesn't exist or has no environment"
|
49
|
+
host_groups.delete_all
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def migrate_hostgroup_data_to_facets
|
55
|
+
hostgroup_config_group_ids = FakeHostConfigGroup.for_hostgroup.pluck(:host_id).uniq
|
56
|
+
hostgroup_config_group_ids.each do |hostgroup_id|
|
57
|
+
hostgroup = Hostgroup.unscoped.find_by(id: hostgroup_id)
|
58
|
+
hostgroup_groups = FakeHostConfigGroup.for_hostgroup.where(host_id: hostgroup_id)
|
59
|
+
if hostgroup
|
60
|
+
hostgroup_facet_id = ForemanPuppet::HostgroupPuppetFacet.where(hostgroup_id: hostgroup_id).pick(:id)
|
61
|
+
hostgroup_facet_id ||= ForemanPuppet::HostgroupPuppetFacet.create!(hostgroup: hostgroup).id
|
62
|
+
hostgroup_groups.update_all(host_type: 'ForemanPuppet::HostgroupPuppetFacet', host_id: hostgroup_facet_id)
|
63
|
+
else
|
64
|
+
deleted_groups = FakeConfigGroup.where(id: hostgroup_groups.pluck(:config_group_id)).pluck(:name)
|
65
|
+
say "Deleting Config groups #{deleted_groups.join(', ')} from Hostgroup (id=#{hostgroup_id}) because Hostgroup doesn't exist"
|
66
|
+
hostgroup_groups.delete_all
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
54
70
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CleanupEnvironmentFromCoreTables < ActiveRecord::Migration[6.0]
|
2
|
+
def up
|
3
|
+
::Hostgroup.update_all(environment_id: nil) if column_exists?(:hostgroups, :environment_id)
|
4
|
+
Host::Managed.update_all(environment_id: nil) if column_exists?(:hosts, :environment_id)
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
# nothing to do
|
9
|
+
end
|
10
|
+
end
|
@@ -79,6 +79,8 @@ module ForemanPuppet
|
|
79
79
|
::TemplateCombination.include ForemanPuppet::Extensions::TemplateCombination
|
80
80
|
::ProvisioningTemplate.include ForemanPuppet::Extensions::ProvisioningTemplate
|
81
81
|
|
82
|
+
::HostCounter.prepend ForemanPuppet::Extensions::HostCounter
|
83
|
+
|
82
84
|
::Api::V2::BaseController.include ForemanPuppet::Extensions::ApiBaseController
|
83
85
|
::Api::V2::HostsController.include ForemanPuppet::Extensions::ApiV2HostsController
|
84
86
|
::Api::V2::HostgroupsController.include ForemanPuppet::Extensions::ApiHostgroupsController
|