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,288 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class HostTest < ActiveSupport::TestCase
5
+ test 'should read the Puppetserver URL from its proxy settings' do
6
+ host = FactoryBot.build_stubbed(:host)
7
+ assert_nil host.puppet_server_uri
8
+ assert_empty host.puppetmaster
9
+
10
+ proxy = FactoryBot.create(:puppet_smart_proxy, url: 'https://smartproxy.example.com:8443')
11
+ host.puppet_proxy = proxy
12
+ assert_equal 'https://smartproxy.example.com:8140', host.puppet_server_uri.to_s
13
+ assert_equal 'smartproxy.example.com', host.puppetmaster
14
+
15
+ features = {
16
+ 'puppet' => {
17
+ settings: { puppet_url: 'https://puppet.example.com:8140' },
18
+ },
19
+ }
20
+ SmartProxyFeature.import_features(proxy, features)
21
+ assert_equal 'https://puppet.example.com:8140', host.puppet_server_uri.to_s
22
+ assert_equal 'puppet.example.com', host.puppetmaster
23
+ end
24
+
25
+ test 'should find smart proxy ids' do
26
+ host = FactoryBot.create(:host, :with_puppet_enc)
27
+ puppet_id = host.puppet_proxy_id
28
+
29
+ res = Host.smart_proxy_ids(Host.where(id: [host.id]))
30
+
31
+ assert_includes res, puppet_id
32
+ end
33
+
34
+ describe '#search_for' do
35
+ let(:host) { FactoryBot.create(:host, :with_puppet_enc, :with_puppetclass) }
36
+
37
+ test 'can search hosts by smart proxy' do
38
+ proxy = FactoryBot.create(:puppet_and_ca_smart_proxy)
39
+ results = Host.search_for("smart_proxy = #{proxy.name}")
40
+ assert_equal 0, results.count
41
+ host.update(puppet_proxy_id: proxy.id)
42
+ results = Host.search_for("smart_proxy = #{proxy.name}")
43
+ assert_equal 1, results.count
44
+ assert_includes results, host
45
+ # the results should not change even if the host has multiple connections to same proxy
46
+ host.update(puppet_ca_proxy_id: proxy.id)
47
+ results2 = Host.search_for("smart_proxy = #{proxy.name}")
48
+ assert_equal results, results2
49
+ end
50
+
51
+ test 'can be found by puppetclass' do
52
+ host
53
+ result = Host.search_for("class = #{host.puppet.puppetclass_names.first}")
54
+ assert_includes result, host
55
+ end
56
+
57
+ test 'search by puppetclass returns only host within that puppetclass' do
58
+ host
59
+ puppetclass = FactoryBot.create(:puppetclass)
60
+ result = Host.search_for("class = #{puppetclass.name}")
61
+ assert_not_includes result, host
62
+ end
63
+
64
+ test 'search hosts by inherited puppetclass from a hostgroup' do
65
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_puppetclass)
66
+ host_with_hg = FactoryBot.create(:host, hostgroup: hostgroup)
67
+ result = Host.search_for("class = #{hostgroup.puppet.puppetclass_names.first}")
68
+ assert_includes result, host_with_hg
69
+ end
70
+
71
+ test 'can search hosts by inherited puppet class from a parent hostgroup' do
72
+ parent_hg = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_puppetclass)
73
+ hg = FactoryBot.create(:hostgroup, parent: parent_hg)
74
+ host = FactoryBot.create(:host, hostgroup: hg)
75
+ result = Host.search_for("class = #{parent_hg.puppet.puppetclass_names.first}")
76
+ assert_equal 1, result.count
77
+ assert_includes result, host
78
+ end
79
+
80
+ test 'can search hosts by puppet class from config group in parent hostgroup' do
81
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc)
82
+ host = FactoryBot.create(:host, :with_puppet_enc, hostgroup: hostgroup, environment: hostgroup.environment)
83
+ config_group = FactoryBot.create(:config_group, :with_puppetclass)
84
+ hostgroup.puppet.config_groups << config_group
85
+ result = Host.search_for("class = #{config_group.puppetclass_names.first}")
86
+ assert_equal 1, result.count
87
+ assert_includes result, host
88
+ end
89
+
90
+ test 'can be found by config group' do
91
+ host.puppet.config_groups << FactoryBot.create(:config_group)
92
+ result = Host.search_for("config_group = #{host.puppet.config_group_names.first}")
93
+ assert_includes result, host
94
+ end
95
+
96
+ test 'search by config group returns only host within that config group' do
97
+ host
98
+ config_group = FactoryBot.create(:config_group)
99
+ result = Host.search_for("config_group = #{config_group.name}")
100
+ assert_not_includes result, host
101
+ end
102
+
103
+ test 'search by config_group of hostgroup' do
104
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_config_group)
105
+ host_with_hg = FactoryBot.create(:host, hostgroup: hostgroup)
106
+ result = Host.search_for("config_group = #{hostgroup.puppet.config_group_names.first}")
107
+ assert_includes result, host_with_hg
108
+ assert_equal [host_with_hg.name], result.map(&:name)
109
+ end
110
+ end
111
+
112
+ describe '#info puppet bits' do
113
+ test 'ENC YAML uses Classification::ClassParam for parameterized output' do
114
+ skip 'No idea whats wrong here'
115
+ host = FactoryBot.build_stubbed(:host, :with_environment)
116
+ classes = { 'myclass' => { 'myparam' => 'myvalue' } }
117
+ ForemanPuppet::HostInfoProviders::PuppetInfo.any_instance.expects(:puppetclass_parameters).returns(classes)
118
+ enc = host.info
119
+ assert_kind_of Hash, enc
120
+ assert_equal classes, enc['classes']
121
+ end
122
+
123
+ test '#info ENC YAML contains config_groups' do
124
+ host = FactoryBot.create(:host, :with_puppet_enc, :with_config_group)
125
+ enc = host.info
126
+ assert_includes(enc['parameters'].keys, 'foreman_config_groups')
127
+ assert_includes(enc['parameters']['foreman_config_groups'], host.puppet.config_group_names.first)
128
+ end
129
+
130
+ test '#info ENC YAML contains parent hostgroup config_groups' do
131
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_config_group)
132
+ host = FactoryBot.create(:host, :with_puppet_enc, :with_config_group, hostgroup: hostgroup)
133
+ enc = host.info
134
+ assert_equal(enc['parameters']['foreman_config_groups'], [host.puppet.config_group_names.first, hostgroup.puppet.config_group_names.first])
135
+ end
136
+ end
137
+
138
+ describe '#clone' do
139
+ test '#classes etc. on cloned host return the same' do
140
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_config_group, :with_puppetclass)
141
+ host = FactoryBot.create(:host, :with_puppet_enc, :with_config_group, :with_puppetclass, :with_parameter, hostgroup: hostgroup, environment: hostgroup.environment)
142
+ copy = host.clone
143
+ assert_equal host.puppet.individual_puppetclasses.map(&:id), copy.puppet.individual_puppetclasses.map(&:id)
144
+ assert_equal host.puppet.classes_in_groups.map(&:id), copy.puppet.classes_in_groups.map(&:id)
145
+ assert_equal host.puppet.classes.map(&:id), copy.puppet.classes.map(&:id)
146
+ assert_equal host.puppet.available_puppetclasses.map(&:id), copy.puppet.available_puppetclasses.map(&:id)
147
+ assert_equal host.puppet.host_classes.map(&:puppetclass_id), copy.puppet.host_classes.map(&:puppetclass_id)
148
+ assert_equal host.puppet.host_config_groups.map(&:config_group_id), copy.puppet.host_config_groups.map(&:config_group_id)
149
+ end
150
+ end
151
+
152
+ test 'should import from external nodes output' do
153
+ # create a dummy node
154
+ Parameter.destroy_all
155
+ env = FactoryBot.create(:environment)
156
+ host = FactoryBot.create(:host, :with_puppet_enc, environment: env, ip: '3.3.4.12')
157
+ pc1 = FactoryBot.create(:puppetclass, environments: [env], parameter_count: 1)
158
+ pc2 = FactoryBot.create(:puppetclass, environments: [env], parameter_count: 1)
159
+
160
+ classes_params = { pc1.name => { pc1.class_params.first.key => 'abcdef' },
161
+ pc2.name => { pc2.class_params.first.key => 'secret' } }
162
+ # dummy external node info
163
+ nodeinfo = { 'environment' => env.name,
164
+ 'parameters' => { 'puppetmaster' => 'puppet', 'MYVAR' => 'value', 'port' => '80',
165
+ 'ssl_port' => '443', 'foreman_env' => 'production', 'owner_name' => 'Admin User',
166
+ 'root_pw' => 'xybxa6JUkz63w', 'owner_email' => 'admin@someware.com',
167
+ 'foreman_subnets' =>
168
+ [{ 'network' => '3.3.4.0',
169
+ 'name' => 'two',
170
+ 'gateway' => nil,
171
+ 'mask' => '255.255.255.0',
172
+ 'dns_primary' => nil,
173
+ 'dns_secondary' => nil,
174
+ 'from' => nil,
175
+ 'to' => nil,
176
+ 'boot_mode' => 'DHCP',
177
+ 'vlanid' => '41',
178
+ 'ipam' => 'DHCP' }],
179
+ 'foreman_interfaces' =>
180
+ [{ 'mac' => 'aa:bb:ac:dd:ee:ff',
181
+ 'ip' => '3.3.4.12',
182
+ 'type' => 'Interface',
183
+ 'name' => 'myfullhost.mydomain.net',
184
+ 'attrs' => {},
185
+ 'virtual' => false,
186
+ 'link' => true,
187
+ 'identifier' => nil,
188
+ 'managed' => true,
189
+ 'primary' => true,
190
+ 'provision' => true,
191
+ 'subnet' => { 'network' => '3.3.4.0',
192
+ 'mask' => '255.255.255.0',
193
+ 'name' => 'two',
194
+ 'gateway' => nil,
195
+ 'dns_primary' => nil,
196
+ 'dns_secondary' => nil,
197
+ 'from' => nil,
198
+ 'to' => nil,
199
+ 'boot_mode' => 'DHCP',
200
+ 'vlanid' => '41',
201
+ 'ipam' => 'DHCP' } }] },
202
+ 'classes' => classes_params }
203
+
204
+ host.importNode nodeinfo
205
+ nodeinfo['parameters']['special_info'] = 'secret' # smart variable on apache
206
+
207
+ info = host.info
208
+ assert_includes info.keys, 'environment'
209
+ assert_equal env.name, host.puppet.environment.name
210
+ assert_includes info.keys, 'parameters'
211
+ assert_includes info.keys, 'classes'
212
+ # This worked in core, but it's beyond me how could have :shrug:
213
+ # assert_equal(classes_params, info['classes'])
214
+ # We are only importing classes in the method
215
+ assert_equal(classes_params.keys.sort, info['classes'].keys.sort)
216
+ parameters = info['parameters']
217
+ assert_equal 'puppet', parameters['puppetmaster']
218
+ assert_equal 'xybxa6JUkz63w', parameters['root_pw']
219
+ assert_includes parameters.keys, 'foreman_subnets'
220
+ assert_includes parameters.keys, 'foreman_interfaces'
221
+ assert_equal '3.3.4.12', parameters['foreman_interfaces'].first['ip']
222
+ end
223
+
224
+ test 'should import from non-parameterized external nodes output' do
225
+ host = FactoryBot.create(:host, :with_puppet_enc)
226
+ env = host.puppet.environment
227
+ pc1, pc2 = FactoryBot.create_list(:puppetclass, 2, environments: [env])
228
+ host.importNode('environment' => env.name, 'classes' => [pc1.name, pc2.name], 'parameters' => {})
229
+
230
+ assert_equal [pc1.name, pc2.name].sort, host.info['classes'].keys.sort
231
+ end
232
+
233
+ test 'does not assign a host to environment with incorrect taxonomies' do
234
+ host = FactoryBot.build(:host, managed: false)
235
+ env_with_tax = FactoryBot.create(:environment, organizations: [host.organization], locations: [host.location])
236
+ env_with_other_tax = FactoryBot.create(:environment, organizations: [FactoryBot.create(:organization)],
237
+ locations: [FactoryBot.create(:location)])
238
+ host.build_puppet
239
+ host.puppet.environment = env_with_tax
240
+ assert host.valid?
241
+
242
+ host.puppet.environment = env_with_other_tax
243
+ assert_not host.valid?
244
+ assert_match(/is not assigned/, host.errors[:environment_id].first)
245
+ end
246
+
247
+ test 'when saving a host, require puppet environment if puppet master is set' do
248
+ h = FactoryBot.build_stubbed(:host, :with_puppet_enc)
249
+ h.puppet.environment = nil
250
+ assert_not h.valid?
251
+ end
252
+
253
+ test 'host puppet classes must belong to the host environment' do
254
+ h = FactoryBot.create(:host, :with_puppet_enc)
255
+ pc = FactoryBot.create(:puppetclass)
256
+ h.puppet.puppetclasses << pc
257
+ assert_not h.puppet.environment.puppetclasses.map(&:id).include?(pc.id)
258
+ assert_not h.puppet.valid?
259
+ assert_equal ["#{pc} does not belong to the #{h.puppet.environment} environment"], h.puppet.errors[:puppetclasses]
260
+ end
261
+
262
+ test 'when changing host environment, its puppet classes should be verified' do
263
+ h = FactoryBot.create(:host, :with_puppet_enc)
264
+ pc = FactoryBot.create(:puppetclass, environments: [h.puppet.environment])
265
+ h.puppet.puppetclasses << pc
266
+ h.puppet.environment = FactoryBot.create(:environment)
267
+ assert_not h.puppet.save
268
+ assert_equal ["#{pc} does not belong to the #{h.puppet.environment} environment"], h.puppet.errors[:puppetclasses]
269
+ end
270
+
271
+ test 'when setting host environment to nil, its puppet classes should be removed' do
272
+ h = FactoryBot.create(:host, :with_puppet_enc, :with_puppetclass)
273
+ h.puppet_proxy = nil
274
+ h.puppet.environment = nil
275
+ h.puppet.save!
276
+ assert_empty h.puppet.puppetclasses
277
+ end
278
+
279
+ test 'when setting host environment to nil, its config groups should be removed' do
280
+ h = FactoryBot.create(:host, :with_puppet_enc, :with_config_group)
281
+ assert h.save
282
+ h.puppet_proxy = nil
283
+ h.puppet.environment = nil
284
+ h.save!
285
+ assert_empty h.puppet.config_groups
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,200 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class HostgroupPuppetFacetTest < ActiveSupport::TestCase
5
+ let(:environment) { FactoryBot.create(:environment) }
6
+ let(:hostgroup) { FactoryBot.create(:hostgroup, :with_puppet_enc, :with_puppetclass, :with_config_group, environment: environment) }
7
+ let(:child_hostgroup) do
8
+ FactoryBot.create(:hostgroup,
9
+ :with_puppet_enc,
10
+ :with_puppetclass,
11
+ :with_config_group,
12
+ :with_parent,
13
+ parent: hostgroup, environment: environment)
14
+ end
15
+ let(:standalone_puppetclass) { FactoryBot.create(:puppetclass) }
16
+
17
+ test 'should inherit parent classes' do
18
+ child_all_classes = child_hostgroup.puppet.classes
19
+ hostgroup.puppet.classes do |puppet_class|
20
+ assert_include puppet_class, child_all_classes
21
+ end
22
+ end
23
+
24
+ test 'changing environment should preserve puppetclasses' do
25
+ skip 'Something fishy on env update, try once extracted' unless ForemanPuppet.extracted_from_core?
26
+ new_environment = FactoryBot.create(:environment)
27
+ old_puppetclass_ids = hostgroup.puppet.puppetclass_ids
28
+
29
+ hostgroup.puppet.update!(environment: new_environment)
30
+ hostgroup.reload
31
+
32
+ assert_equal new_environment, hostgroup.puppet.environment
33
+ assert_equal old_puppetclass_ids.sort, hostgroup.puppet.puppetclass_ids.sort
34
+ end
35
+
36
+ test 'should return all classes for environment only' do
37
+ config_group1 = hostgroup.puppet.config_groups.first
38
+ config_group1.puppetclasses << FactoryBot.create(:puppetclass, environments: [environment]) unless config_group1.puppetclasses.any?
39
+ config_group2 = FactoryBot.create(:config_group, :with_puppetclass, class_environments: [FactoryBot.create(:environment)])
40
+ hostgroup.puppet.config_groups << config_group2
41
+
42
+ all_classes = hostgroup.puppet.classes
43
+ env_puppetclasses = hostgroup.puppet.puppetclasses.to_a + hostgroup.puppet.config_groups.first.puppetclasses.to_a
44
+ assert_equal(2, all_classes.count)
45
+ assert_equal env_puppetclasses.map(&:id).sort, all_classes.map(&:id).sort
46
+ end
47
+
48
+ describe '#available_puppetclasses' do
49
+ setup do
50
+ standalone_puppetclass
51
+ end
52
+
53
+ test 'should return all if no environment' do
54
+ hostgroup.puppet.update(environment_id: nil)
55
+ assert_equal ForemanPuppet::Puppetclass.all, hostgroup.puppet.available_puppetclasses
56
+ end
57
+
58
+ test 'should return environment-specific classes' do
59
+ FactoryBot.create(:puppetclass, environments: [environment])
60
+ assert_not_include hostgroup.puppet.available_puppetclasses, standalone_puppetclass
61
+ assert_equal environment.puppetclasses.sort, hostgroup.puppet.available_puppetclasses.sort
62
+ end
63
+
64
+ test 'should return environment-specific classes (and that are NOT already inherited by parent)' do
65
+ assert_not_include child_hostgroup.puppet.available_puppetclasses, standalone_puppetclass
66
+ assert_not_equal environment.puppetclasses.sort, child_hostgroup.puppet.available_puppetclasses.sort
67
+ assert_equal (environment.puppetclasses - child_hostgroup.puppet.parent_classes).sort, child_hostgroup.puppet.available_puppetclasses.sort
68
+ end
69
+ end
70
+
71
+ describe '#individual_puppetclasses' do
72
+ context 'updating environment' do
73
+ test 'should return correctly, when updating environment for a new (or cloned) hostgroup' do
74
+ # ?????
75
+ cloned = Hostgroup.new
76
+ cloned.build_puppet.puppetclasses = hostgroup.puppet.puppetclasses
77
+ assert_equal cloned.puppet.individual_puppetclasses, hostgroup.puppet.individual_puppetclasses
78
+ end
79
+ end
80
+
81
+ context 'has NOT set an environment' do
82
+ test 'returns all classes' do
83
+ assert_includes hostgroup.puppet.individual_puppetclasses.all, hostgroup.puppet.puppetclasses.first
84
+ end
85
+ end
86
+
87
+ context 'has an environment set' do
88
+ setup do
89
+ hostgroup.puppet.puppetclasses << standalone_puppetclass
90
+ end
91
+
92
+ test 'returns classes regardless of environment by default' do
93
+ assert_includes hostgroup.puppet.individual_puppetclasses, hostgroup.puppet.puppetclasses.first
94
+ assert_includes hostgroup.puppet.individual_puppetclasses, standalone_puppetclass
95
+ end
96
+ end
97
+
98
+ test 'puppetclasses added to hostgroup (that can be removed) does not include classes that are included by config group' do
99
+ config_group = FactoryBot.create(:config_group, :with_puppetclass, class_environments: [environment])
100
+ hostgroup.puppet.config_groups << config_group
101
+
102
+ assert_includes hostgroup.puppet.all_puppetclasses, config_group.puppetclasses.first
103
+ assert_not_includes hostgroup.puppet.individual_puppetclasses, config_group.puppetclasses.first
104
+ end
105
+ end
106
+
107
+ describe '#classes_in_groups' do
108
+ test 'should return the puppetclasses of a config group only if it is in hostgroup environment' do
109
+ config_group1 = hostgroup.puppet.config_groups.first
110
+ config_group1.puppetclasses << FactoryBot.create(:puppetclass, environments: [environment]) unless config_group1.puppetclasses.any?
111
+ config_group2 = FactoryBot.create(:config_group, :with_puppetclass, class_environments: [FactoryBot.create(:environment)])
112
+ hostgroup.puppet.config_groups << config_group2
113
+
114
+ group_classes = hostgroup.puppet.classes_in_groups
115
+ assert_equal 2, (config_group1.puppetclasses + config_group2.puppetclasses).uniq.count
116
+ # but only 1 is in hostgroup environment.
117
+ assert_equal 1, group_classes.count
118
+ assert_equal config_group1.puppetclasses.pluck(:id).sort, group_classes.map(&:id).sort
119
+ end
120
+ end
121
+
122
+ describe '#parent_classes' do
123
+ test 'should return parent classes if hostgroup has parent and environment are the same' do
124
+ assert_equal child_hostgroup.puppet.parent_classes, hostgroup.puppet.classes
125
+ end
126
+
127
+ test 'should not return parent classes that do not match environment' do
128
+ new_environment = FactoryBot.create(:environment)
129
+ new_pc = FactoryBot.create(:puppetclass, environments: [environment, new_environment])
130
+ hostgroup.puppet.config_groups.first.puppetclasses << new_pc
131
+ hostgroup.reload
132
+ child_hostgroup.puppet.update(environment: new_environment)
133
+ child_hostgroup.reload
134
+ assert_not_empty child_hostgroup.puppet.parent_classes
135
+ assert_not_equal child_hostgroup.puppet.parent_classes, hostgroup.puppet.classes
136
+ end
137
+
138
+ test 'should be empty if hostgroup does not have parent' do
139
+ assert_empty hostgroup.puppet.parent_classes
140
+ end
141
+ end
142
+
143
+ describe '#parent_config_groups' do
144
+ test 'should return empty array if hostgroup does not has parent' do
145
+ assert_empty hostgroup.puppet.parent_config_groups
146
+ end
147
+
148
+ test 'should return parent config_groups if hostgroup has parent - 2 levels' do
149
+ assert child_hostgroup.parent
150
+ assert_equal child_hostgroup.puppet.parent_config_groups, hostgroup.puppet.config_groups
151
+ end
152
+
153
+ test 'should return parent config_groups if hostgroup has parent - 3 levels' do
154
+ hg = FactoryBot.create(:hostgroup, name: 'third level', parent_id: child_hostgroup.id)
155
+ hg.create_puppet
156
+ groups = (hg.parent.puppet.config_groups + hg.parent.parent.puppet.config_groups).uniq.sort
157
+ assert_equal groups, hg.puppet.parent_config_groups.sort
158
+ end
159
+ end
160
+
161
+ describe 'Hostgroup#clone' do
162
+ test 'should clone puppet classes' do
163
+ cloned = hostgroup.clone('new_name')
164
+ assert_equal hostgroup.puppet.hostgroup_classes.map(&:puppetclass_id), cloned.puppet.hostgroup_classes.map(&:puppetclass_id)
165
+ end
166
+
167
+ test '#classes etc. on cloned group return the same' do
168
+ cloned = child_hostgroup.clone('cloned')
169
+ cloned_puppet = cloned.puppet
170
+ group_puppet = child_hostgroup.puppet
171
+ assert_equal group_puppet.individual_puppetclasses.map(&:id), cloned_puppet.individual_puppetclasses.map(&:id)
172
+ assert_equal group_puppet.classes_in_groups.map(&:id), cloned_puppet.classes_in_groups.map(&:id)
173
+ assert_equal group_puppet.classes.map(&:id), cloned_puppet.classes.map(&:id)
174
+ assert_equal group_puppet.available_puppetclasses.map(&:id), cloned_puppet.available_puppetclasses.map(&:id)
175
+ assert_valid cloned
176
+ end
177
+
178
+ test 'without save makes no changes' do
179
+ FactoryBot.create(:puppetclass_lookup_key, :with_override, path: "hostgroup\ncomment",
180
+ puppetclass: hostgroup.puppet.puppetclasses.first,
181
+ overrides: { hostgroup.lookup_value_matcher => 'test' })
182
+ ActiveRecord::Base.any_instance.expects(:destroy).never
183
+ ActiveRecord::Base.any_instance.expects(:save).never
184
+ hostgroup.clone
185
+ end
186
+
187
+ test 'clone with config group should run validations once' do
188
+ cloned = hostgroup.clone
189
+ assert_not cloned.valid?
190
+ assert_equal 1, cloned.errors[:name].size
191
+ end
192
+
193
+ test 'clone should clone config groups as well' do
194
+ cg_ids = hostgroup.puppet.config_groups.pluck(:id)
195
+ cloned = hostgroup.clone('new_name')
196
+ assert_equal cg_ids.sort, cloned.puppet.config_groups.map(&:id).sort
197
+ end
198
+ end
199
+ end
200
+ end