foreman_puppet 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +38 -0
  4. data/Rakefile +31 -0
  5. data/app/assets/stylesheets/foreman_puppet.scss +117 -0
  6. data/app/controllers/concerns/foreman_puppet/api/import_puppetclasses_common_controller.rb +139 -0
  7. data/app/controllers/concerns/foreman_puppet/environments_import.rb +61 -0
  8. data/app/controllers/concerns/foreman_puppet/extensions/api_hostgroups_controller.rb +40 -0
  9. data/app/controllers/concerns/foreman_puppet/extensions/api_template_combinations_controller.rb +23 -0
  10. data/app/controllers/concerns/foreman_puppet/extensions/api_v2_hosts_controller.rb +48 -0
  11. data/app/controllers/concerns/foreman_puppet/extensions/hostgroups_controller_extensions.rb +58 -0
  12. data/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb +228 -0
  13. data/app/controllers/concerns/foreman_puppet/extensions/operatingsystems_controller.rb +11 -0
  14. data/app/controllers/concerns/foreman_puppet/extensions/parameters_host.rb +75 -0
  15. data/app/controllers/concerns/foreman_puppet/extensions/parameters_hostgroup.rb +70 -0
  16. data/app/controllers/concerns/foreman_puppet/extensions/parameters_template_combination.rb +21 -0
  17. data/app/controllers/concerns/foreman_puppet/parameters/config_group.rb +17 -0
  18. data/app/controllers/concerns/foreman_puppet/parameters/environment.rb +21 -0
  19. data/app/controllers/concerns/foreman_puppet/parameters/puppetclass.rb +24 -0
  20. data/app/controllers/concerns/foreman_puppet/parameters/puppetclass_lookup_key.rb +24 -0
  21. data/app/controllers/foreman_puppet/api/v2/base_controller.rb +26 -0
  22. data/app/controllers/foreman_puppet/api/v2/config_groups_controller.rb +57 -0
  23. data/app/controllers/foreman_puppet/api/v2/environments_controller.rb +91 -0
  24. data/app/controllers/foreman_puppet/api/v2/host_classes_controller.rb +59 -0
  25. data/app/controllers/foreman_puppet/api/v2/hostgroup_classes_controller.rb +46 -0
  26. data/app/controllers/foreman_puppet/api/v2/lookups_common_controller.rb +114 -0
  27. data/app/controllers/foreman_puppet/api/v2/override_values_controller.rb +99 -0
  28. data/app/controllers/foreman_puppet/api/v2/puppetclasses_controller.rb +99 -0
  29. data/app/controllers/foreman_puppet/api/v2/smart_class_parameters_controller.rb +76 -0
  30. data/app/controllers/foreman_puppet/config_groups_controller.rb +46 -0
  31. data/app/controllers/foreman_puppet/environments_controller.rb +51 -0
  32. data/app/controllers/foreman_puppet/puppet_smart_proxies_controller.rb +39 -0
  33. data/app/controllers/foreman_puppet/puppetclass_lookup_keys_controller.rb +33 -0
  34. data/app/controllers/foreman_puppet/puppetclasses_controller.rb +113 -0
  35. data/app/controllers/foreman_puppet/react_controller.rb +19 -0
  36. data/app/helpers/concerns/foreman_puppet/template_renderer_scope.rb +14 -0
  37. data/app/helpers/foreman_puppet/environments_helper.rb +17 -0
  38. data/app/helpers/foreman_puppet/hosts_and_hostgroups_helper.rb +96 -0
  39. data/app/helpers/foreman_puppet/hosts_helper.rb +32 -0
  40. data/app/helpers/foreman_puppet/puppet_smart_proxies_helper.rb +8 -0
  41. data/app/helpers/foreman_puppet/puppetclass_lookup_keys_helper.rb +135 -0
  42. data/app/helpers/foreman_puppet/puppetclasses_and_environments_helper.rb +55 -0
  43. data/app/helpers/foreman_puppet/puppetclasses_helper.rb +59 -0
  44. data/app/helpers/foreman_puppet/template_combinations_helper.rb +33 -0
  45. data/app/models/concerns/foreman_puppet/extensions/host.rb +88 -0
  46. data/app/models/concerns/foreman_puppet/extensions/hostgroup.rb +40 -0
  47. data/app/models/concerns/foreman_puppet/extensions/nic_managed.rb +11 -0
  48. data/app/models/concerns/foreman_puppet/extensions/operatingsystem.rb +11 -0
  49. data/app/models/concerns/foreman_puppet/extensions/provisioning_template.rb +64 -0
  50. data/app/models/concerns/foreman_puppet/extensions/report.rb +11 -0
  51. data/app/models/concerns/foreman_puppet/extensions/taxonomy.rb +19 -0
  52. data/app/models/concerns/foreman_puppet/extensions/template_combination.rb +23 -0
  53. data/app/models/concerns/foreman_puppet/extensions/user.rb +22 -0
  54. data/app/models/concerns/foreman_puppet/host_common.rb +90 -0
  55. data/app/models/concerns/foreman_puppet/puppet_lookup_value_extensions.rb +13 -0
  56. data/app/models/foreman_puppet/config_group.rb +45 -0
  57. data/app/models/foreman_puppet/config_group_class.rb +19 -0
  58. data/app/models/foreman_puppet/environment.rb +63 -0
  59. data/app/models/foreman_puppet/environment_class.rb +40 -0
  60. data/app/models/foreman_puppet/host_class.rb +23 -0
  61. data/app/models/foreman_puppet/host_config_group.rb +15 -0
  62. data/app/models/foreman_puppet/host_puppet_facet.rb +130 -0
  63. data/app/models/foreman_puppet/hostgroup_class.rb +23 -0
  64. data/app/models/foreman_puppet/hostgroup_puppet_facet.rb +98 -0
  65. data/app/models/foreman_puppet/puppetclass.rb +132 -0
  66. data/app/models/foreman_puppet/puppetclass_lookup_key.rb +58 -0
  67. data/app/services/foreman_puppet/host_info_providers/config_groups_info.rb +10 -0
  68. data/app/services/foreman_puppet/host_info_providers/puppet_info.rb +92 -0
  69. data/app/services/foreman_puppet/input_type/puppet_parameter_input.rb +35 -0
  70. data/app/services/foreman_puppet/proxy_status/puppet.rb +17 -0
  71. data/app/services/foreman_puppet/puppet_class_importer.rb +355 -0
  72. data/app/views/api/v2/template_combinations/base.json.erb +9 -0
  73. data/app/views/foreman_puppet/api/v2/config_groups/base.json.rabl +3 -0
  74. data/app/views/foreman_puppet/api/v2/config_groups/create.json.rabl +3 -0
  75. data/app/views/foreman_puppet/api/v2/config_groups/index.json.rabl +3 -0
  76. data/app/views/foreman_puppet/api/v2/config_groups/main.json.rabl +8 -0
  77. data/app/views/foreman_puppet/api/v2/config_groups/show.json.rabl +3 -0
  78. data/app/views/foreman_puppet/api/v2/config_groups/update.json.rabl +3 -0
  79. data/app/views/foreman_puppet/api/v2/environments/base.json.rabl +3 -0
  80. data/app/views/foreman_puppet/api/v2/environments/create.json.rabl +3 -0
  81. data/app/views/foreman_puppet/api/v2/environments/index.json.rabl +3 -0
  82. data/app/views/foreman_puppet/api/v2/environments/main.json.rabl +5 -0
  83. data/app/views/foreman_puppet/api/v2/environments/show.json.rabl +15 -0
  84. data/app/views/foreman_puppet/api/v2/environments/update.json.rabl +3 -0
  85. data/app/views/foreman_puppet/api/v2/host_puppet_facets/base.json.rabl +1 -0
  86. data/app/views/foreman_puppet/api/v2/host_puppet_facets/host_single.json.rabl +17 -0
  87. data/app/views/foreman_puppet/api/v2/host_puppet_facets/show.json.rabl +11 -0
  88. data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/base.json.rabl +5 -0
  89. data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/hostgroup_single.json.rabl +16 -0
  90. data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/show.json.rabl +11 -0
  91. data/app/views/foreman_puppet/api/v2/import_puppetclasses/index.json.rabl +3 -0
  92. data/app/views/foreman_puppet/api/v2/import_puppetclasses/show.json.rabl +36 -0
  93. data/app/views/foreman_puppet/api/v2/override_values/create.json.rabl +3 -0
  94. data/app/views/foreman_puppet/api/v2/override_values/index.json.rabl +3 -0
  95. data/app/views/foreman_puppet/api/v2/override_values/show.json.rabl +3 -0
  96. data/app/views/foreman_puppet/api/v2/override_values/update.json.rabl +3 -0
  97. data/app/views/foreman_puppet/api/v2/puppetclasses/base.json.rabl +3 -0
  98. data/app/views/foreman_puppet/api/v2/puppetclasses/create.json.rabl +3 -0
  99. data/app/views/foreman_puppet/api/v2/puppetclasses/index.json.rabl +4 -0
  100. data/app/views/foreman_puppet/api/v2/puppetclasses/list.json.rabl +3 -0
  101. data/app/views/foreman_puppet/api/v2/puppetclasses/main.json.rabl +5 -0
  102. data/app/views/foreman_puppet/api/v2/puppetclasses/show.json.rabl +15 -0
  103. data/app/views/foreman_puppet/api/v2/puppetclasses/update.json.rabl +3 -0
  104. data/app/views/foreman_puppet/api/v2/smart_class_parameters/base.json.rabl +4 -0
  105. data/app/views/foreman_puppet/api/v2/smart_class_parameters/create.json.rabl +3 -0
  106. data/app/views/foreman_puppet/api/v2/smart_class_parameters/destroy.json.rabl +3 -0
  107. data/app/views/foreman_puppet/api/v2/smart_class_parameters/index.json.rabl +3 -0
  108. data/app/views/foreman_puppet/api/v2/smart_class_parameters/main.json.rabl +23 -0
  109. data/app/views/foreman_puppet/api/v2/smart_class_parameters/show.json.rabl +19 -0
  110. data/app/views/foreman_puppet/api/v2/smart_class_parameters/update.json.rabl +3 -0
  111. data/app/views/foreman_puppet/config_groups/_config_group.html.erb +34 -0
  112. data/app/views/foreman_puppet/config_groups/_config_groups_selection.html.erb +36 -0
  113. data/app/views/foreman_puppet/config_groups/_form.html.erb +9 -0
  114. data/app/views/foreman_puppet/config_groups/edit.html.erb +3 -0
  115. data/app/views/foreman_puppet/config_groups/index.html.erb +31 -0
  116. data/app/views/foreman_puppet/config_groups/new.html.erb +3 -0
  117. data/app/views/foreman_puppet/config_groups/welcome.html.erb +12 -0
  118. data/app/views/foreman_puppet/environments/_form.html.erb +20 -0
  119. data/app/views/foreman_puppet/environments/edit.html.erb +8 -0
  120. data/app/views/foreman_puppet/environments/index.html.erb +32 -0
  121. data/app/views/foreman_puppet/environments/new.html.erb +7 -0
  122. data/app/views/foreman_puppet/environments/welcome.html.erb +16 -0
  123. data/app/views/foreman_puppet/layouts/application_react.html.erb +15 -0
  124. data/app/views/foreman_puppet/puppet_smart_proxies/_dashboard.html.erb +9 -0
  125. data/app/views/foreman_puppet/puppet_smart_proxies/_environments.html.erb +30 -0
  126. data/app/views/foreman_puppet/puppetclass_lookup_keys/edit.html.erb +3 -0
  127. data/app/views/foreman_puppet/puppetclass_lookup_keys/index.html.erb +22 -0
  128. data/app/views/foreman_puppet/puppetclass_lookup_keys/welcome.html.erb +9 -0
  129. data/app/views/foreman_puppet/puppetclasses/_class_parameters.html.erb +37 -0
  130. data/app/views/foreman_puppet/puppetclasses/_class_selection.html.erb +70 -0
  131. data/app/views/foreman_puppet/puppetclasses/_classes.html.erb +22 -0
  132. data/app/views/foreman_puppet/puppetclasses/_classes_in_groups.html.erb +5 -0
  133. data/app/views/foreman_puppet/puppetclasses/_classes_parameters.html.erb +16 -0
  134. data/app/views/foreman_puppet/puppetclasses/_form.html.erb +62 -0
  135. data/app/views/foreman_puppet/puppetclasses/_selected_classes.html.erb +4 -0
  136. data/app/views/foreman_puppet/puppetclasses/edit.html.erb +4 -0
  137. data/app/views/foreman_puppet/puppetclasses/index.html.erb +47 -0
  138. data/app/views/hosts/_form_puppet_enc_tab.html.erb +24 -0
  139. data/app/views/hosts/foreman_puppet/_form_main_tab_fields.html.erb +1 -0
  140. data/app/views/hosts/select_multiple_environment.html.erb +8 -0
  141. data/app/views/provisioning_templates/_combination.html.erb +5 -0
  142. data/app/views/provisioning_templates/_combinations.html.erb +6 -0
  143. data/app/views/smart_proxies/plugins/_puppet.html.erb +24 -0
  144. data/config/api_routes.rb +81 -0
  145. data/config/routes.rb +89 -0
  146. data/db/migrate/20101121140000_add_environment_to_template_combinations.foreman_puppet.rb +9 -0
  147. data/db/migrate/20200720123005_migrate_puppet_core_types.foreman_puppet.rb +19 -0
  148. data/db/migrate/20200722171017_create_host_puppet_facet.foreman_puppet.rb +10 -0
  149. data/db/migrate/20200803113531_create_hostgroup_puppet_facet.foreman_puppet.rb +10 -0
  150. data/db/migrate/20200803113803_migrate_environment_to_puppet_facet.foreman_puppet.rb +22 -0
  151. data/db/migrate/20200803113903_migrate_host_type_in_host_config_groups.foreman_puppet.rb +29 -0
  152. data/db/migrate/20201125113903_migrate_puppetclasses_to_facets.foreman_puppet.rb +47 -0
  153. data/db/migrate_foreman/20090722141107_create_environments.rb +17 -0
  154. data/db/migrate_foreman/20120905095532_create_environment_classes.rb +15 -0
  155. data/db/migrate_foreman/20140407161817_create_config_groups.rb +9 -0
  156. data/db/migrate_foreman/20140407162007_create_config_group_classes.rb +10 -0
  157. data/db/migrate_foreman/20140407162059_create_host_config_groups.rb +11 -0
  158. data/db/migrate_foreman/20161205142618_delete_orphaned_smart_class_parameters.rb +10 -0
  159. data/db/migrate_foreman/20170109115157_fix_lookup_key_auditable_type.rb +15 -0
  160. data/db/migrate_foreman/20180816134832_cast_lookup_key_values.rb +35 -0
  161. data/db/migrate_foreman/20181023112532_add_environment_puppetclass_id.rb +7 -0
  162. data/db/migrate_foreman/20181224174419_add_index_to_environment_class_by_lookup_key_and_puppetclass.rb +6 -0
  163. data/db/seeds.d/111_puppet_proxy_feature.rb +8 -0
  164. data/lib/foreman_puppet.rb +10 -0
  165. data/lib/foreman_puppet/engine.rb +82 -0
  166. data/lib/foreman_puppet/register.rb +218 -0
  167. data/lib/foreman_puppet/version.rb +3 -0
  168. data/lib/tasks/foreman_puppet_tasks.rake +31 -0
  169. data/locale/Makefile +60 -0
  170. data/locale/action_names.rb +5 -0
  171. data/locale/en/foreman_puppet.edit.po +911 -0
  172. data/locale/en/foreman_puppet.po +690 -0
  173. data/locale/en/foreman_puppet.po.time_stamp +0 -0
  174. data/locale/foreman_puppet.pot +1076 -0
  175. data/locale/gemspec.rb +2 -0
  176. data/test/controllers/foreman_puppet/api/v2/config_groups_controller_test.rb +28 -0
  177. data/test/controllers/foreman_puppet/api/v2/environments_controller_test.rb +346 -0
  178. data/test/controllers/foreman_puppet/api/v2/host_classes_controller_test.rb +48 -0
  179. data/test/controllers/foreman_puppet/api/v2/hostgroup_classes_controller_test.rb +41 -0
  180. data/test/controllers/foreman_puppet/api/v2/hostgroups_controller_test.rb +79 -0
  181. data/test/controllers/foreman_puppet/api/v2/hosts_controller_test.rb +101 -0
  182. data/test/controllers/foreman_puppet/api/v2/lookups_common_controller_test.rb +29 -0
  183. data/test/controllers/foreman_puppet/api/v2/override_values_controller_test.rb +169 -0
  184. data/test/controllers/foreman_puppet/api/v2/puppetclasses_controller_test.rb +144 -0
  185. data/test/controllers/foreman_puppet/api/v2/smart_class_parameters_controller_test.rb +557 -0
  186. data/test/controllers/foreman_puppet/api/v2/template_combinations_controller_test.rb +81 -0
  187. data/test/controllers/foreman_puppet/config_groups_controller_test.rb +47 -0
  188. data/test/controllers/foreman_puppet/environments_controller_test.rb +230 -0
  189. data/test/controllers/foreman_puppet/hostgroups_controller_test.rb +72 -0
  190. data/test/controllers/foreman_puppet/hosts_controller_test.rb +346 -0
  191. data/test/controllers/foreman_puppet/puppet_smart_proxies_controller_test.rb +29 -0
  192. data/test/controllers/foreman_puppet/puppetclass_lookup_keys_controller_test.rb +59 -0
  193. data/test/controllers/foreman_puppet/puppetclasses_controller_test.rb +235 -0
  194. data/test/controllers/provisioning_templates_controller_test.rb +70 -0
  195. data/test/factories/foreman_puppet_factories.rb +134 -0
  196. data/test/factories/host_puppet_enhancements.rb +61 -0
  197. data/test/factories/proxy_puppet_enhancements.rb +33 -0
  198. data/test/helpers/foreman_puppet/hosts_and_hostgroups_helper_test.rb +65 -0
  199. data/test/helpers/foreman_puppet/puppetclasses_helper_test.rb +33 -0
  200. data/test/integration/foreman_puppet/environment_js_test.rb +27 -0
  201. data/test/integration/foreman_puppet/host_js_test.rb +371 -0
  202. data/test/integration/foreman_puppet/hostgroup_js_test.rb +100 -0
  203. data/test/integration/foreman_puppet/puppetclass_js_test.rb +37 -0
  204. data/test/integration/foreman_puppet/smartclass_parameter_js_test.rb +84 -0
  205. data/test/models/foreman_puppet/config_group_class_test.rb +9 -0
  206. data/test/models/foreman_puppet/config_group_test.rb +8 -0
  207. data/test/models/foreman_puppet/environment_test.rb +92 -0
  208. data/test/models/foreman_puppet/host_config_group_test.rb +39 -0
  209. data/test/models/foreman_puppet/host_puppet_facet_test.rb +116 -0
  210. data/test/models/foreman_puppet/host_test.rb +288 -0
  211. data/test/models/foreman_puppet/hostgroup_puppet_facet_test.rb +200 -0
  212. data/test/models/foreman_puppet/hostgroup_test.rb +14 -0
  213. data/test/models/foreman_puppet/lookup_value_test.rb +69 -0
  214. data/test/models/foreman_puppet/provisioning_template_test.rb +124 -0
  215. data/test/models/foreman_puppet/puppetclass_lookup_key_test.rb +81 -0
  216. data/test/models/foreman_puppet/puppetclass_test.rb +144 -0
  217. data/test/models/foreman_puppet/smart_proxy_test.rb +28 -0
  218. data/test/qraphql/queries/host_puppet_query_test.rb +36 -0
  219. data/test/qraphql/queries/hostgroup_puppet_query_test.rb +36 -0
  220. data/test/services/foreman_puppet/host_info_providers/puppet_info_test.rb +791 -0
  221. data/test/services/foreman_puppet/input_type/puppet_parameter_input_test.rb +14 -0
  222. data/test/test_puppet_helper.rb +30 -0
  223. data/test/unit/foreman_puppet/access_permissions_test.rb +16 -0
  224. data/test/unit/foreman_puppet/puppet_class_importer_test.rb +247 -0
  225. data/test/unit/foreman_puppet/template_rendering_test.rb +20 -0
  226. data/test/unit/foreman_puppet_test.rb +11 -0
  227. data/webpack/__mocks__/foremanReact/common/I18n.js +7 -0
  228. data/webpack/__mocks__/foremanReact/components/Layout/LayoutActions.js +2 -0
  229. data/webpack/__mocks__/foremanReact/readme.md +11 -0
  230. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
  231. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  232. data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
  233. data/webpack/__mocks__/foremanReact/redux/index.js +1 -0
  234. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
  235. data/webpack/fills_index.js +30 -0
  236. data/webpack/index.js +18 -0
  237. data/webpack/src/ForemanPuppet.js +11 -0
  238. data/webpack/src/Router/__snapshots__/routes.test.js.snap +3 -0
  239. data/webpack/src/Router/index.js +14 -0
  240. data/webpack/src/Router/routes.js +3 -0
  241. data/webpack/src/Router/routes.test.js +16 -0
  242. data/webpack/src/foreman_class_edit.js +224 -0
  243. data/webpack/src/foreman_puppet_host_form.js +140 -0
  244. data/webpack/src/foreman_puppet_host_form.test.js +65 -0
  245. data/webpack/src/index.js +1 -0
  246. data/webpack/src/reducers.js +7 -0
  247. metadata +340 -0
@@ -0,0 +1,113 @@
1
+ module ForemanPuppet
2
+ class PuppetclassesController < ApplicationController
3
+ include Foreman::Controller::AutoCompleteSearch
4
+ include Foreman::Controller::Parameters::Host
5
+ include Foreman::Controller::Parameters::Hostgroup
6
+ include ForemanPuppet::Parameters::Environment
7
+ include ForemanPuppet::Parameters::Puppetclass
8
+
9
+ before_action :find_resource, only: %i[edit update destroy override]
10
+ before_action :setup_search_options, only: :index
11
+
12
+ helper ForemanPuppet::PuppetclassLookupKeysHelper
13
+
14
+ # TODO: extracted_from_core?
15
+ def host_params(top_level_hash = controller_name.singularize)
16
+ filter = self.class.host_params_filter
17
+ filter.permit(puppet_attributes: {})
18
+ filter.filter_params(params, parameter_filter_context, top_level_hash).tap do |normalized|
19
+ if parameter_filter_context.ui? && normalized['compute_attributes'] && normalized['compute_attributes']['scsi_controllers']
20
+ normalize_scsi_attributes(normalized['compute_attributes'])
21
+ end
22
+ end
23
+ end
24
+
25
+ def index
26
+ @puppetclasses = resource_base_search_and_page
27
+ allowed_hostgroup_ids = HostgroupPuppetFacet.joins(:hostgroup_classes)
28
+ .where(HostgroupClass.arel_table[:puppetclass_id].in(@puppetclasses.map(&:id)))
29
+ .pluck(:hostgroup_id).uniq
30
+ @hostgroups_authorizer = Authorizer.new(User.current, collection: allowed_hostgroup_ids)
31
+ end
32
+
33
+ def edit
34
+ end
35
+
36
+ def update
37
+ if @puppetclass.update(puppetclass_params)
38
+ process_success
39
+ else
40
+ process_error
41
+ end
42
+ end
43
+
44
+ def destroy
45
+ if @puppetclass.destroy
46
+ process_success
47
+ else
48
+ process_error
49
+ end
50
+ end
51
+
52
+ def override
53
+ if @puppetclass.class_params.present?
54
+ @puppetclass.class_params.each do |class_param|
55
+ class_param.update(override: params[:enable])
56
+ end
57
+ if [true, 'true'].include?(params[:enable])
58
+ success _('Successfully overridden all parameters of Puppet class %s') % @puppetclass.name
59
+ else
60
+ success _('Successfully reset all parameters of Puppet class %s to their default values') % @puppetclass.name
61
+ end
62
+ else
63
+ error _('No parameters to override for Puppet class %s') % @puppetclass.name
64
+ end
65
+ redirect_to puppetclasses_path
66
+ end
67
+
68
+ # form AJAX methods
69
+ def parameters
70
+ puppetclass = Puppetclass.find(params[:id])
71
+ render partial: 'foreman_puppet/puppetclasses/class_parameters',
72
+ locals: { puppetclass: puppetclass,
73
+ obj: find_host_or_hostgroup }
74
+ end
75
+
76
+ def resource_class
77
+ model_of_controller
78
+ end
79
+
80
+ private
81
+
82
+ def find_host_or_hostgroup
83
+ # params['host_id'] = 'undefined' if NEW since hosts/form and hostgroups/form has no data-id
84
+ host_id = params.delete(:host_id)
85
+ if host_id == 'undefined'
86
+ @obj = Host::Managed.new(host_params('host')) if params['host']
87
+ @obj ||= Hostgroup.new(hostgroup_params('hostgroup')) if params['hostgroup']
88
+ elsif params['host']
89
+ @obj = Host::Base.find(host_id)
90
+ unless @obj.is_a?(Host::Managed)
91
+ @obj = @obj.becomes(Host::Managed)
92
+ @obj.type = 'Host::Managed'
93
+ end
94
+ # puppetclass_ids and config_group_ids need to be removed so they don't cause automatic insertsgroup
95
+ @obj.attributes = host_params('host')
96
+ elsif params['hostgroup']
97
+ # hostgroup.id is assigned to params['host_id'] by host_edit.js#load_puppet_class_parameters
98
+ @obj = Hostgroup.find(host_id)
99
+ @obj.attributes = hostgroup_params('hostgroup')
100
+ end
101
+ @obj
102
+ end
103
+
104
+ def action_permission
105
+ case params[:action]
106
+ when 'override'
107
+ :edit
108
+ else
109
+ super
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,19 @@
1
+ module ForemanPuppet
2
+ class ReactController < ::ApplicationController
3
+ layout 'foreman_puppet/layouts/application_react'
4
+
5
+ def index
6
+ render html: nil, layout: true
7
+ end
8
+
9
+ private
10
+
11
+ def controller_permission
12
+ :foreman_puppet
13
+ end
14
+
15
+ def action_permission
16
+ :view
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module ForemanPuppet
2
+ module TemplateRendererScope
3
+ extend ActiveSupport::Concern
4
+ extend ApipieDSL::Module
5
+
6
+ apipie :method, 'Returns puppet classes assigned to the host' do
7
+ returns Array, desc: 'Puppet classes assigned to the host'
8
+ end
9
+ def host_puppet_classes
10
+ check_host
11
+ host.puppet&.puppetclasses || []
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module ForemanPuppet
2
+ module EnvironmentsHelper
3
+ include PuppetclassesAndEnvironmentsHelper
4
+
5
+ def url_for(*args)
6
+ super
7
+ rescue ActionController::UrlGenerationError => _e
8
+ foreman_puppet.url_for(*args)
9
+ end
10
+
11
+ def environments_title_actions
12
+ title_actions import_proxy_select(hash_for_import_environments_environments_path),
13
+ button_group(new_link(_('Create Puppet Environment'), engine: foreman_puppet)),
14
+ button_group(help_button)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,96 @@
1
+ module ForemanPuppet
2
+ module HostsAndHostgroupsHelper
3
+ # TODO: remove me - prevents the puppetclass tab duplication
4
+ # unless ForemanPuppet.extracted_from_core?
5
+ def puppetclasses_tab(puppetclasses_receiver)
6
+ end
7
+
8
+ def environment_inherited_by_default?(host)
9
+ return false unless host.hostgroup && host.hostgroup_id_was.nil?
10
+ return false if params[:action] == 'clone'
11
+ return true unless params[:host]
12
+ !params[:host].dig(:puppet_attributes, :environment_id)
13
+ end
14
+
15
+ # rubocop:disable Rails/HelperInstanceVariable
16
+ def user_set_environment?
17
+ # if the host has no hostgroup
18
+ return true unless @host&.hostgroup
19
+ # when editing a host, the values are specified explicitly
20
+ return true if params[:action] == 'edit'
21
+ return true if params[:action] == 'clone'
22
+ # check if the user set the field explicitly despite setting a hostgroup.
23
+ params[:host] && params[:host][:hostgroup_id] && params[:host].dig(:puppet_attributes, :environment_id)
24
+ end
25
+ # rubocop:enable Rails/HelperInstanceVariable
26
+
27
+ def host_puppet_environment_field(form, select_options = {}, html_options = {})
28
+ form.fields_for(:puppet, form.object.puppet || form.object.build_puppet, include_id: false) do |fields|
29
+ select_options = {
30
+ include_blank: true,
31
+ disable_button: _(::HostsAndHostgroupsHelper::INHERIT_TEXT),
32
+ disable_button_enabled: environment_inherited_by_default?(form.object),
33
+ user_set: user_set_environment?,
34
+ }.deep_merge(select_options)
35
+
36
+ html_options = {
37
+ data: {
38
+ host: {
39
+ id: form.object.id,
40
+ },
41
+ },
42
+ }.deep_merge(html_options)
43
+
44
+ puppet_environment_field(
45
+ fields,
46
+ accessible_resource(fields.object, 'ForemanPuppet::Environment', association: :environment),
47
+ select_options,
48
+ html_options
49
+ )
50
+ end
51
+ end
52
+
53
+ def hostgroup_puppet_environment_field(form, select_options = {}, html_options = {})
54
+ form.fields_for(:puppet, form.object.puppet || form.object.build_puppet, include_id: false) do |fields|
55
+ select_options = {
56
+ include_blank: blank_or_inherit_f(fields, :environment),
57
+ }.deep_merge(select_options)
58
+
59
+ puppet_environment_field(
60
+ fields,
61
+ accessible_resource(fields.object, 'ForemanPuppet::Environment', association: :environment),
62
+ select_options,
63
+ html_options
64
+ )
65
+ end
66
+ end
67
+
68
+ def puppet_environment_field(form, environments_choice, select_options = {}, html_options = {})
69
+ html_options = {
70
+ onchange: 'tfm.puppetEnc.hostForm.updatePuppetclasses(this)',
71
+ help_inline: :indicator,
72
+ }.deep_merge(html_options)
73
+
74
+ select_f(
75
+ form,
76
+ :environment_id,
77
+ environments_choice,
78
+ :id,
79
+ :to_label,
80
+ select_options,
81
+ html_options
82
+ )
83
+ end
84
+
85
+ def puppetclasses_with_parameters_for(obj)
86
+ classes = obj.all_puppetclasses
87
+ ids = classes.reorder(nil).pluck(:id)
88
+ class_vars = ForemanPuppet::PuppetclassLookupKey.reorder(nil)
89
+ .joins(:environment_classes)
90
+ .where(EnvironmentClass.arel_table[:puppetclass_id].in(ids))
91
+ .distinct
92
+ .pluck('environment_classes.puppetclass_id')
93
+ classes.where(id: class_vars)
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,32 @@
1
+ module ForemanPuppet
2
+ module HostsHelper
3
+ UI.register_host_description do
4
+ multiple_actions_provider :puppet_host_multiple_actions
5
+ # otherwise registered twice
6
+ overview_buttons_provider :puppet_host_overview_buttons if ForemanPuppet.extracted_from_core?
7
+ end
8
+
9
+ def puppet_host_multiple_actions
10
+ if ForemanPuppet.extracted_from_core?
11
+ actions = [{ action: [_('Change Environment'), foreman_puppet.select_multiple_environment_hosts_path], priority: 200 }]
12
+ if authorized_for(controller: :hosts, action: :edit) && SmartProxy.unscoped.authorized.with_features('Puppet').exists?
13
+ actions << { action: [_('Change Puppet Master'), foreman_puppet.select_multiple_puppet_proxy_hosts_path], priority: 1050 }
14
+ end
15
+ actions
16
+ else
17
+ []
18
+ end
19
+ end
20
+
21
+ def puppet_host_overview_buttons(host)
22
+ buttons = []
23
+ if SmartProxy.with_features('Puppet').any?
24
+ buttons << {
25
+ button: link_to(_('Puppet YAML'), foreman_puppet.externalNodes_host_path(name: host), title: _('Puppet external nodes YAML dump'),
26
+ class: 'btn btn-default'), priority: 400
27
+ }
28
+ end
29
+ buttons
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ module ForemanPuppet
2
+ module PuppetSmartProxiesHelper
3
+ # For dashboard chart to work
4
+ def hosts_path(*attrs)
5
+ main_app.hosts_path(*attrs)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,135 @@
1
+ module ForemanPuppet
2
+ module PuppetclassLookupKeysHelper
3
+ def puppetclass_lookup_keys_breadcrumbs
4
+ breadcrumbs(resource_url: api_smart_class_parameters_path,
5
+ name_field: 'parameter',
6
+ switcher_item_url: '/puppetclass_lookup_keys/:id-:name/edit')
7
+ end
8
+
9
+ # ------ Host(group) Form Helpers -----
10
+
11
+ def overridable_puppet_lookup_keys(klass, obj)
12
+ klass.class_params.override.where(environment_classes: { environment_id: obj.environment_id })
13
+ end
14
+
15
+ def hidden_puppet_lookup_value_fields(lookup_key, lookup_value, disabled)
16
+ return unless can_edit_params?
17
+ value_prefix = lookup_value_name_prefix(lookup_key.id)
18
+ hidden_field(value_prefix, :lookup_key_id, value: lookup_key.id,
19
+ disabled: disabled, class: 'send_to_remove') +
20
+ hidden_field(value_prefix, :id, value: lookup_value.id,
21
+ disabled: disabled, class: 'send_to_remove') +
22
+ hidden_field(value_prefix, :_destroy, value: false,
23
+ disabled: disabled, class: 'send_to_remove destroy')
24
+ end
25
+
26
+ def omit_puppet_lookup_check_box(lookup_key, lookup_value, disabled)
27
+ check_box(lookup_value_name_prefix(lookup_key.id), :omit,
28
+ value: lookup_value.id,
29
+ disabled: disabled || !can_edit_params?,
30
+ onchange: "toggleOmitValue(this, 'value')",
31
+ hidden: disabled,
32
+ title: _('Omit from classification output'),
33
+ checked: lookup_value.omit)
34
+ end
35
+
36
+ def puppet_override_toggle(overridden)
37
+ return unless can_edit_params?
38
+ link_to_function(icon_text('pencil-square-o', '', kind: 'fa'), 'tfm.puppetEnc.hostForm.overridePuppetclassParam(this)',
39
+ title: _('Override this value'),
40
+ 'data-tag': 'override',
41
+ class: "btn btn-default btn-md btn-override #{'hide' if overridden}") +
42
+ link_to_function(icon_text('times', '', kind: 'fa'), 'tfm.puppetEnc.hostForm.overridePuppetclassParam(this)',
43
+ title: _('Remove this override'),
44
+ 'data-tag': 'remove',
45
+ class: "btn btn-default btn-md btn-override #{'hide' unless overridden}")
46
+ end
47
+
48
+ def puppet_lookup_key_with_diagnostic(obj, lookup_key, lookup_value)
49
+ value, matcher = lookup_value_matcher(obj, lookup_key)
50
+ inherited_value = LookupKey.format_value_before_type_cast(value, lookup_key.key_type)
51
+ effective_value = lookup_value.lookup_key_id.nil? ? inherited_value.to_s : lookup_value.value_before_type_cast.to_s
52
+ warnings = lookup_key_warnings(lookup_key.required, effective_value.present?)
53
+ popover_value = lookup_key.hidden_value? ? lookup_key.hidden_value : inherited_value
54
+
55
+ parameter_value_content(
56
+ "#{parameters_receiver}_lookup_values_attributes_#{lookup_key.id}_value",
57
+ effective_value,
58
+ popover: diagnostic_popover(lookup_key, matcher, popover_value, warnings),
59
+ name: "#{lookup_value_name_prefix(lookup_key.id)}[value]",
60
+ disabled: !lookup_key.overridden?(obj) || lookup_value.omit || !can_edit_params?,
61
+ inherited_value: inherited_value,
62
+ lookup_key: lookup_key,
63
+ hidden_value?: lookup_key.hidden_value?,
64
+ lookup_key_type: lookup_key.key_type
65
+ )
66
+ end
67
+
68
+ def lookup_value_matcher(obj, lookup_key)
69
+ if parameters_receiver == 'host'
70
+ value = puppet_lookup_value_hash_host_cache(obj)[lookup_key.id]
71
+ value_for_key = value.try(:[], lookup_key.key)
72
+ if value_for_key.present?
73
+ [value_for_key[:value], "#{value_for_key[:element]} (#{value_for_key[:element_name]})"]
74
+ else
75
+ [lookup_key.default_value, _('Default value')]
76
+ end
77
+ else # hostgroup
78
+ obj.inherited_lookup_value(lookup_key)
79
+ end
80
+ end
81
+
82
+ # rubocop:disable Rails/HelperInstanceVariable
83
+ def puppet_lookup_value_hash_host_cache(host)
84
+ @puppet_lookup_value_hash_host_cache ||= {}
85
+ @puppet_lookup_value_hash_host_cache[host.id] ||= ForemanPuppet::HostInfoProviders::PuppetInfo.new(host).inherited_puppetclass_parameters
86
+ end
87
+ # rubocop:enable Rails/HelperInstanceVariable
88
+
89
+ def diagnostic_popover(lookup_key, matcher, inherited_value, warnings)
90
+ description = lookup_key_description(lookup_key, matcher, inherited_value)
91
+ popover('', description.prepend(warnings[:text]),
92
+ data: { placement: 'top' },
93
+ title: _('Original value info'),
94
+ icon: 'info-circle',
95
+ kind: 'fa')
96
+ end
97
+
98
+ def lookup_key_description(lookup_key, matcher, inherited_value)
99
+ format(_("<b>Description:</b> %{desc}<br/>
100
+ <b>Type:</b> %{type}<br/>
101
+ <b>Matcher:</b> %{matcher}<br/>
102
+ <b>Inherited value:</b> %{inherited_value}"),
103
+ desc: html_escape(lookup_key.description),
104
+ type: lookup_key.key_type,
105
+ matcher: html_escape(matcher),
106
+ inherited_value: html_escape(inherited_value))
107
+ end
108
+
109
+ def lookup_key_warnings(required, has_value)
110
+ return { text: '', icon: 'info' } if has_value
111
+
112
+ if required
113
+ { text: _('Required parameter without value.<br/><b>Please override!</b><br/>'),
114
+ icon: 'error-circle-o' }
115
+ else
116
+ { text: _('Optional parameter without value.<br/><i>Still managed by Foreman, the value will be empty.</i><br/>'),
117
+ icon: 'warning-triangle-o' }
118
+ end
119
+ end
120
+
121
+ # Input tags used to override lookup keys need a 'name' HTML attribute to
122
+ # tell Rails which lookup_value they belong to.
123
+ # This method returns the name attribute for any combination of lookup_key
124
+ # and host/hostgroup. Other objects that may receive parameters too will need
125
+ # to override this method in their respective helpers.
126
+ def lookup_value_name_prefix(lookup_key_id)
127
+ "#{parameters_receiver}[lookup_values_attributes][#{lookup_key_id}]"
128
+ end
129
+
130
+ def parameters_receiver
131
+ return 'host' if params.key?(:host) || params[:controller] == 'hosts'
132
+ 'hostgroup'
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,55 @@
1
+ module ForemanPuppet
2
+ module PuppetclassesAndEnvironmentsHelper
3
+ def class_update_text(pcs, env)
4
+ if pcs.empty?
5
+ _('Empty environment')
6
+ elsif pcs == ['_destroy_']
7
+ _('Deleted environment')
8
+ elsif pcs.delete '_destroy_'
9
+ format(_('Deleted environment %{env} and %{pcs}'), env: env, pcs: pcs.to_sentence)
10
+ elsif pcs == ['_ignored_']
11
+ _('Ignored environment')
12
+ else
13
+ module_puppetclasses(pcs.is_a?(Hash) ? pcs.keys : pcs)
14
+ end
15
+ end
16
+
17
+ def import_proxy_select(hash)
18
+ select_action_button(_('Import'), {}, import_proxy_links(hash, true))
19
+ end
20
+
21
+ def import_proxy_links(hash, import_env_text = false, classes = nil)
22
+ import_from_text = import_env_text ? _('Import environments from %s') : _('Import classes from %s')
23
+ SmartProxy.with_features('Puppet').map do |proxy|
24
+ display_link_if_authorized(import_from_text % proxy.name, hash.merge(proxy: proxy), { class: classes })
25
+ end.flatten
26
+ end
27
+
28
+ private
29
+
30
+ def module_puppetclasses(classes)
31
+ mod_classes = {}
32
+ classes.each do |klass|
33
+ if (mod = klass.gsub(/::.*/, ''))
34
+ mod_classes[mod] ||= []
35
+ mod_classes[mod] << klass
36
+ end
37
+ end
38
+ mod_classes.keys.sort.map do |mod_name|
39
+ num = mod_classes[mod_name].size
40
+ num_tag = tag.span(num.to_s, class: 'label label-info')
41
+ tag.a(
42
+ mod_name,
43
+ rel: 'popover',
44
+ data: { content: mod_classes[mod_name].sort.join('<br>').html_safe,
45
+ "original-title": format(n_('%{name} has %{num_tag} class', '%{name} has %{num_tag} classes', num), name: mod_name, num_tag: num_tag),
46
+ trigger: 'focus',
47
+ container: 'body',
48
+ html: true },
49
+ role: 'button',
50
+ tabindex: '-1'
51
+ )
52
+ end.to_sentence.html_safe
53
+ end
54
+ end
55
+ end