foreman_puppet 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ });