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,14 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ module InputType
5
+ class PuppetParameterInputTest < ActiveSupport::TestCase
6
+ let(:template_input) { FactoryBot.build(:template_input) }
7
+
8
+ context 'puppet parameter input' do
9
+ before { template_input.input_type = 'puppet_parameter' }
10
+ it { assert_equal template_input.input_type_instance.class.humanized_name, _('Puppet parameter') }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+
4
+ # Add plugin to FactoryBot's paths
5
+ FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
6
+ FactoryBot.reload
7
+
8
+ # rubocop:disable Style/ClassAndModuleChildren
9
+ class ActionController::TestCase
10
+ # used in basic_rest_response_test and is undefined with our paths
11
+ def root_url
12
+ '/'
13
+ end
14
+
15
+ def json_response
16
+ ActiveSupport::JSON.decode(@response.body)
17
+ end
18
+ end
19
+ # rubocop:enable Style/ClassAndModuleChildren
20
+
21
+ module ForemanPuppet
22
+ module StubPuppetProxyFeature
23
+ def stub_smart_proxy_v2_features_and_statuses
24
+ super
25
+ ForemanPuppet::ProxyStatus::Puppet.any_instance.stubs(:environment_stats).returns({})
26
+ end
27
+ end
28
+ end
29
+
30
+ ActiveSupport::TestCase.prepend(ForemanPuppet::StubPuppetProxyFeature)
@@ -0,0 +1,16 @@
1
+ require 'test_puppet_helper'
2
+ require 'unit/shared/access_permissions_test_base'
3
+
4
+ # Permissions are added in AccessPermissions with lists of controllers and
5
+ # actions that they enable access to. For non-admin users, we need to test
6
+ # that there are permissions available that cover every controller action, else
7
+ # it can't be delegated and this will lead to parts of the application that
8
+ # aren't functional for non-admin users.
9
+ #
10
+ # In particular, it's important that actions for AJAX requests are added to
11
+ # an appropriate permission so views using those requests function.
12
+ class AccessPermissionsTest < ActiveSupport::TestCase
13
+ include AccessPermissionsTestBase
14
+
15
+ check_routes(ForemanPuppet::Engine.routes, [])
16
+ end
@@ -0,0 +1,247 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class PuppetClassImporterTest < ActiveSupport::TestCase
5
+ def setup
6
+ ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[foreman-testing foreman-testing-1])
7
+ ProxyAPI::Puppet.any_instance.stubs(:classes).returns(mocked_classes)
8
+ User.current = users(:admin)
9
+ end
10
+
11
+ let(:proxy) { FactoryBot.create(:puppet_smart_proxy) }
12
+ let(:importer) { PuppetClassImporter.new(url: proxy.url) }
13
+ let(:importer_with_proxy_api) do
14
+ classes = {
15
+ 'ignored-class' => {},
16
+ 'not-ignored-class' => {},
17
+ }
18
+ proxy_api = ProxyAPI::Puppet.new(url: proxy.url)
19
+ proxy_api.stubs(:classes).returns(classes)
20
+ PuppetClassImporter.new(proxy: proxy_api)
21
+ end
22
+
23
+ test 'should support providing proxy' do
24
+ klass = PuppetClassImporter.new(proxy: ProxyAPI::Puppet.new(url: proxy.url))
25
+ assert_kind_of ProxyAPI::Puppet, klass.send(:proxy)
26
+ end
27
+
28
+ test 'should support providing url' do
29
+ klass = PuppetClassImporter.new(url: proxy.url)
30
+ assert_kind_of ProxyAPI::Puppet, klass.send(:proxy)
31
+ end
32
+
33
+ describe '#changes' do
34
+ context 'a sepecific environment is set' do
35
+ let(:importer) { PuppetClassImporter.new(url: proxy.url, env: 'foreman-testing') }
36
+
37
+ test 'should contain only the specified environment in changes' do
38
+ changes = importer.changes['new']
39
+
40
+ assert_includes changes, 'foreman-testing'
41
+ assert_not_includes changes, 'foreman-testing-1'
42
+ end
43
+ end
44
+
45
+ context 'has ignored environments' do
46
+ test 'it returns them' do
47
+ importer.stubs(:ignored_environments).returns(['ignored-env'])
48
+
49
+ assert_not_nil importer.changes['ignored']
50
+ assert_not_nil importer.changes['ignored']['ignored-env']
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#changes_for_environment' do
56
+ test 'it calls for new, updated, obsolete and ignored classes' do
57
+ environment_name = 'foreman-testing'
58
+ changes = { 'new' => {}, 'obsolete' => {}, 'updated' => {}, 'ignored' => {} }
59
+
60
+ importer.expects(:updated_classes_for).with(environment_name).once.returns({})
61
+ importer.expects(:new_classes_for).with(environment_name).once.returns({})
62
+ importer.expects(:removed_classes_for).with(environment_name).once.returns({})
63
+ importer.expects(:ignored_classes_for).with(environment_name).once.returns({})
64
+
65
+ importer.changes_for_environment(environment_name, changes)
66
+ end
67
+ end
68
+
69
+ describe '#ignored_classes_for' do
70
+ test 'returns an array of classes' do
71
+ environment = 'foreman-testing'
72
+ importer_with_proxy_api.stubs(:ignored_classes).returns([Regexp.new(/^ignored-class$/)])
73
+ assert_equal ['ignored-class'], importer_with_proxy_api.ignored_classes_for(environment)
74
+ end
75
+
76
+ context 'has ignored environments' do
77
+ test 'it returns them' do
78
+ importer.stubs(:ignored_environments).returns(['ignored-env'])
79
+
80
+ assert_not_nil importer.changes['ignored']
81
+ assert_not_nil importer.changes['ignored']['ignored-env']
82
+ end
83
+ end
84
+ end
85
+
86
+ describe '#changes_for_environment' do
87
+ test 'it calls for new, updated, obsolete and ignored classes' do
88
+ environment_name = 'foreman-testing'
89
+ changes = { 'new' => {}, 'obsolete' => {}, 'updated' => {}, 'ignored' => {} }
90
+
91
+ importer.expects(:updated_classes_for).with(environment_name).once.returns({})
92
+ importer.expects(:new_classes_for).with(environment_name).once.returns({})
93
+ importer.expects(:removed_classes_for).with(environment_name).once.returns({})
94
+ importer.expects(:ignored_classes_for).with(environment_name).once.returns({})
95
+
96
+ importer.changes_for_environment(environment_name, changes)
97
+ end
98
+ end
99
+
100
+ describe '#ignored_boolean_environment_names?' do
101
+ test 'is true when an environment name is resulting in "true"' do
102
+ importer_with_proxy_api.stubs(:ignored_environments).returns([true, 'test', 'another'])
103
+ assert importer_with_proxy_api.ignored_boolean_environment_names?
104
+ end
105
+
106
+ test 'is true when an environment name is resulting in "false"' do
107
+ importer_with_proxy_api.stubs(:ignored_environments).returns([false, 'test'])
108
+ assert importer_with_proxy_api.ignored_boolean_environment_names?
109
+ end
110
+ end
111
+
112
+ test 'should return list of envs' do
113
+ assert_kind_of Array, importer.db_environments
114
+ end
115
+
116
+ test 'should return list of actual puppet envs' do
117
+ assert_kind_of Array, importer.actual_environments
118
+ end
119
+
120
+ test 'should return list of classes' do
121
+ assert_kind_of ActiveRecord::Relation, importer.db_classes(importer.db_environments.first)
122
+ end
123
+
124
+ test 'should return list of actual puppet classes' do
125
+ assert_kind_of Hash, importer.actual_classes(importer.actual_environments.first)
126
+ end
127
+
128
+ test 'should obey config/ignored_environments.yml' do
129
+ as_admin do
130
+ hostgroups(:inherited).destroy # needs to be deleted first, since it has ancestry
131
+ Hostgroup.destroy_all # to satisfy FK contraints when deleting Environments
132
+ Environment.destroy_all
133
+ end
134
+
135
+ importer.stubs(:ignored_environments).returns(['foreman-testing'])
136
+ assert_not importer.actual_environments.include?('foreman-testing')
137
+ end
138
+
139
+ test 'should save parameter when importing with a different default_value' do
140
+ env = FactoryBot.build(:environment)
141
+ pc = FactoryBot.build(:puppetclass, environments: [env])
142
+ lk = FactoryBot.build(:puppetclass_lookup_key, default_value: 'first', puppetclass: pc)
143
+
144
+ updated = importer.send(:update_classes_in_foreman, env.name,
145
+ { pc.name => { 'updated' => [lk.key] } })
146
+ assert_not_nil updated
147
+ end
148
+
149
+ test 'should not override parameter when default_value is empty' do
150
+ env = FactoryBot.create(:environment)
151
+ pc = FactoryBot.create(:puppetclass, environments: [env])
152
+
153
+ importer.send(:update_classes_in_foreman, env.name,
154
+ { pc.name => { 'new' => { 'test_nil_param' => nil } } })
155
+ lk = PuppetclassLookupKey.where(key: 'test_nil_param').first
156
+ assert_not lk.override
157
+ assert_not lk.required
158
+ end
159
+
160
+ test 'should change default_value when importing from 2 environments' do
161
+ envs = FactoryBot.create_list(:environment, 2)
162
+ pc = FactoryBot.create(:puppetclass, environments: envs)
163
+
164
+ importer.send(:update_classes_in_foreman, envs.first.name,
165
+ { pc.name => { 'new' => { '2_env_param' => 'first' } } })
166
+ assert_equal 'first', PuppetclassLookupKey.where(key: '2_env_param').first.default_value
167
+
168
+ importer.send(:update_classes_in_foreman, envs.last.name,
169
+ { pc.name => { 'updated' => { '2_env_param' => 'last' } } })
170
+ assert_equal 'last', PuppetclassLookupKey.where(key: '2_env_param').first.default_value
171
+ end
172
+
173
+ context '#update_classes_in_foreman removes parameters' do
174
+ let(:environments) { FactoryBot.create_list(:environment, 2) }
175
+ let(:puppetclass) { FactoryBot.create(:puppetclass, environments: environments) }
176
+
177
+ test 'from one environment' do
178
+ lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, puppetclass: puppetclass)
179
+ importer.send(:update_classes_in_foreman, environments.first.name,
180
+ { puppetclass.name => { 'obsolete' => [lks.first.key] } })
181
+ assert_equal [environments.last], lks.first.environments
182
+ assert_equal environments.to_a.sort, lks.last.environments.to_a.sort
183
+ end
184
+
185
+ test 'when overridden' do
186
+ lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, :with_override, puppetclass: puppetclass)
187
+ importer.send(:update_classes_in_foreman, environments.first.name,
188
+ { puppetclass.name => { 'obsolete' => [lks.first.key] } })
189
+ assert_equal [environments.last], lks.first.environments
190
+ assert_equal environments.to_a.sort, lks.last.environments.sort
191
+ end
192
+
193
+ test 'deletes the key from all environments' do
194
+ lks = FactoryBot.create_list(:puppetclass_lookup_key, 2, :with_override, puppetclass: puppetclass)
195
+ lval = lks.first.lookup_values.first
196
+ importer.send(:update_classes_in_foreman, environments.first.name,
197
+ { puppetclass.name => { 'obsolete' => [lks.first.key] } })
198
+ importer.send(:update_classes_in_foreman, environments.last.name,
199
+ { puppetclass.name => { 'obsolete' => [lks.first.key] } })
200
+ assert_not PuppetclassLookupKey.find_by(id: lks.first.id)
201
+ assert_not LookupValue.find_by(id: lval.id)
202
+ assert_equal environments.to_a.sort, lks.last.environments.to_a.sort
203
+ end
204
+ end
205
+
206
+ test 'should detect correct environments for import' do
207
+ org_a = FactoryBot.create(:organization, name: 'OrgA')
208
+ loc_a = FactoryBot.create(:location, name: 'LocA')
209
+ org_b = FactoryBot.create(:organization, name: 'OrgB')
210
+ loc_b = FactoryBot.create(:location, name: 'LocB')
211
+ b_role = roles(:manager).clone name: 'b_role'
212
+ b_role.add_permissions! %i[destroy_external_parameters edit_external_parameters create_external_parameters view_external_parameters]
213
+ a_user = FactoryBot.create(:user, organizations: [org_a], locations: [loc_a], roles: [roles(:manager)], login: 'a_user')
214
+ b_user = FactoryBot.create(:user, organizations: [org_b], locations: [loc_b], roles: [b_role], login: 'b_user')
215
+ proxy = FactoryBot.build(:puppet_smart_proxy, organizations: [org_a, org_b], locations: [loc_a, loc_b])
216
+ importer = PuppetClassImporter.new(url: proxy.url)
217
+ FactoryBot.create(:environment, name: 'env_a', organizations: [org_a], locations: [loc_a])
218
+ ProxyAPI::Puppet.any_instance.stubs(:environments).returns(%w[env_a b_env_new])
219
+ User.current = b_user
220
+ changes = importer.changes
221
+
222
+ assert changes['new']['b_env_new']
223
+ assert_not changes['new']['env_a']
224
+ assert_not changes['updated']['env_a']
225
+
226
+ changes['new']['b_env_new'] = changes['new']['b_env_new'].to_json
227
+
228
+ importer.obsolete_and_new(changes)
229
+ assert Environment.find_by(name: 'b_env_new')
230
+ User.current = a_user
231
+ assert_not Environment.find_by(name: 'b_env_new')
232
+ end
233
+
234
+ private
235
+
236
+ def mocked_classes
237
+ pcs = [{
238
+ 'apache::service' => {
239
+ 'name' => 'service',
240
+ 'params' => { 'port' => '80', 'version' => '2.0' },
241
+ 'module' => 'apache',
242
+ },
243
+ }]
244
+ Hash[pcs.map { |k| [k.keys.first, Foreman::ImporterPuppetclass.new(k.values.first)] }]
245
+ end
246
+ end
247
+ end
@@ -0,0 +1,20 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class TemplateRenderingTest < ActiveSupport::TestCase
5
+ let(:host) { FactoryBot.build_stubbed(:host, :with_puppet_enc) }
6
+ let(:template) { OpenStruct.new(name: 'Test', template: 'Test') }
7
+ let(:source) { Foreman::Renderer::Source::Database.new(template) }
8
+ let(:scope) do
9
+ Class.new(Foreman::Renderer::Scope::Base) do
10
+ include Foreman::Renderer::Scope::Macros::HostTemplate
11
+ end.send(:new, host: host, source: source)
12
+ end
13
+
14
+ describe '#host_puppet_classes' do
15
+ test 'should render puppetclasses using host_puppetclasses helper' do
16
+ assert_equal host.puppet.puppetclasses.pluck(:id), scope.host_puppet_classes.map(&:id)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_puppet_helper'
2
+
3
+ class ForemanPuppetTest < ActiveSupport::TestCase
4
+ setup do
5
+ User.current = User.find_by(login: 'admin')
6
+ end
7
+
8
+ test 'the truth' do
9
+ assert true
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ export { sprintf } from 'jed';
2
+
3
+ export const translate = s => s;
4
+
5
+ export const ngettext = s => s;
6
+
7
+ export const documentLocale = () => 'en';
@@ -0,0 +1,2 @@
1
+ export const showLoading = () => jest.fn();
2
+ export const hideLoading = () => jest.fn();
@@ -0,0 +1,11 @@
1
+ For testing components which have imported foreman-core components,
2
+ a mock file is required in this folder.
3
+
4
+ ### Example: Mocking ForemanModal component
5
+ ```js
6
+ // __mocks__/foremanReact/components/ForemanModal/index.js
7
+ const ForemanModal = () => jest.fn();
8
+ ForemanModal.Header = () => jest.fn();
9
+ ForemanModal.Footer = () => jest.fn();
10
+ export default ForemanModal;
11
+ ```
@@ -0,0 +1,10 @@
1
+ export const selectAPIResponse = (state, key) => ({
2
+ data: {
3
+ text: 'some-data',
4
+ key,
5
+ },
6
+ });
7
+
8
+ export const selectAPIStatus = (state, key) => 'PENDING';
9
+ export const selectAPIByKey = (state, key) => state[key];
10
+ export const selectAPIError = (state, key) => ({ error: `${key} ERRROR` });
@@ -0,0 +1,10 @@
1
+ export const API = {
2
+ get: jest.fn(),
3
+ put: jest.fn(),
4
+ post: jest.fn(),
5
+ delete: jest.fn(),
6
+ patch: jest.fn(),
7
+ };
8
+
9
+ export const get = data => ({ type: 'get-some-type', ...data });
10
+ export const post = data => ({ type: 'post-some-type', ...data });
@@ -0,0 +1,8 @@
1
+ export const addToast = toast => ({
2
+ type: 'TOASTS_ADD',
3
+ payload: {
4
+ message: toast,
5
+ },
6
+ });
7
+
8
+ export default addToast;
@@ -0,0 +1 @@
1
+ export const store = { dispatch: jest.fn() };
@@ -0,0 +1,5 @@
1
+ export const stopInterval = () => ({
2
+ type: 'stop',
3
+ });
4
+
5
+ export const withInterval = (object, interval) => ({ ...object, interval });
@@ -0,0 +1,30 @@
1
+ import $ from 'jquery';
2
+
3
+ import * as classEditor from './src/foreman_class_edit';
4
+ import * as hostForm from './src/foreman_puppet_host_form';
5
+
6
+ window.tfm = Object.assign(window.tfm || {}, {
7
+ classEditor,
8
+ puppetEnc: {
9
+ hostForm,
10
+ },
11
+ });
12
+
13
+ // TODO: the checkForUnavailablePuppetclasses is very nasty
14
+ $(document)
15
+ .on('change', '.hostgroup-select', evt => {
16
+ const form = $('form.host-form')[0];
17
+ if (form && form.dataset.id) hostForm.updatePuppetclasses(evt.target);
18
+ })
19
+ .on('change', '.interface_domain', evt => {
20
+ hostForm.reloadPuppetclassParams();
21
+ })
22
+ .on('change', '.host-architecture-os-select', evt => {
23
+ hostForm.reloadPuppetclassParams();
24
+ })
25
+ .on('ContentLoad', evt => {
26
+ hostForm.checkForUnavailablePuppetclasses();
27
+ });
28
+ $(window).on('load', evt => {
29
+ hostForm.checkForUnavailablePuppetclasses();
30
+ });