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,61 @@
1
+ FactoryBot.modify do
2
+ factory :host do
3
+ trait :with_puppetclass do
4
+ transient do
5
+ environment
6
+ puppetclasses { [FactoryBot.create(:puppetclass, environments: [environment])] }
7
+ end
8
+ end
9
+
10
+ trait :with_config_group do
11
+ transient do
12
+ environment
13
+ config_groups { [FactoryBot.create(:config_group, :with_puppetclass, class_environments: [environment])] }
14
+ end
15
+ end
16
+
17
+ trait :with_puppet_enc do
18
+ transient do
19
+ environment
20
+ puppetclasses { [] }
21
+ config_groups { [] }
22
+ end
23
+ puppet { association :host_puppet_facet, environment: environment, puppetclasses: puppetclasses, config_groups: config_groups }
24
+ puppet_proxy do
25
+ FactoryBot.create(:smart_proxy, features: [FactoryBot.create(:feature, :puppet)])
26
+ end
27
+ end
28
+ end
29
+
30
+ factory :hostgroup do
31
+ trait :with_puppetclass do
32
+ transient do
33
+ environment
34
+ puppetclasses { [FactoryBot.create(:puppetclass, environments: [environment])] }
35
+ end
36
+ end
37
+
38
+ trait :with_puppet_enc do
39
+ transient do
40
+ environment
41
+ puppetclasses { [] }
42
+ config_groups { [] }
43
+ end
44
+ puppet { association :hostgroup_puppet_facet, :with_config_group, environment: environment, puppetclasses: puppetclasses, config_groups: config_groups }
45
+ puppet_proxy do
46
+ FactoryBot.create(:smart_proxy, features: [FactoryBot.create(:feature, :puppet)])
47
+ end
48
+ end
49
+
50
+ trait :with_config_group do
51
+ transient do
52
+ environment
53
+ config_groups { [FactoryBot.create(:config_group, :with_puppetclass, class_environments: [environment])] }
54
+ end
55
+ end
56
+ end
57
+
58
+ factory :template_combination do
59
+ environment
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ FactoryBot.modify do
2
+ factory :feature do
3
+ trait :puppet do
4
+ name { 'Puppet' }
5
+ end
6
+ end
7
+
8
+ factory :smart_proxy_feature do
9
+ trait :puppet do
10
+ association :feature, :puppet
11
+ end
12
+ end
13
+ end
14
+
15
+ FactoryBot.factories.instance_variable_get('@items').delete(:puppet_smart_proxy) if FactoryBot.factories.registered?(:puppet_smart_proxy)
16
+ FactoryBot.factories.instance_variable_get('@items').delete(:puppet_and_ca_smart_proxy) if FactoryBot.factories.registered?(:puppet_and_ca_smart_proxy)
17
+ FactoryBot.define do
18
+ factory :puppet_smart_proxy, parent: :smart_proxy do
19
+ before(:create, :build, :build_stubbed) do
20
+ ProxyAPI::V2::Features.any_instance.stubs(:features).returns(puppet: { 'state' => 'running' })
21
+ end
22
+ after(:build) do |smart_proxy, _evaluator|
23
+ smart_proxy.smart_proxy_features << FactoryBot.build(:smart_proxy_feature, :puppet, smart_proxy: smart_proxy)
24
+ end
25
+ end
26
+
27
+ factory :puppet_and_ca_smart_proxy, parent: :smart_proxy do
28
+ after(:build) do |smart_proxy, _evaluator|
29
+ smart_proxy.smart_proxy_features << FactoryBot.build(:smart_proxy_feature, :puppet, smart_proxy: smart_proxy)
30
+ smart_proxy.smart_proxy_features << FactoryBot.build(:smart_proxy_feature, :puppetca, smart_proxy: smart_proxy)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,65 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class HostsAndHostgroupsHelperTest < ActionView::TestCase
5
+ include ::ApplicationHelper
6
+ include ::FormHelper
7
+ include ::HostsHelper
8
+
9
+ include HostsAndHostgroupsHelper
10
+
11
+ describe 'puppet environment field' do
12
+ setup do
13
+ @host = mock('host')
14
+ puppet = mock('puppet')
15
+ @host.stubs(:hostgroup)
16
+ @host.stubs(:puppet).returns(puppet)
17
+ @host.stubs(:id).returns(999)
18
+ @f = mock('f')
19
+ @f.stubs(:object).returns(@host)
20
+ @fields = mock('fields')
21
+ @fields.stubs(:object).returns(puppet)
22
+ @f.stubs(:fields_for).yields(@fields)
23
+ end
24
+
25
+ test 'it adds new first level attributes' do
26
+ @fields.expects(:collection_select).with do |*attrs|
27
+ select_options, html_options = extract_collection_options(attrs)
28
+ select_options[:test_select_option] == 'test_value1' &&
29
+ html_options[:test_html_option] == 'test_value2'
30
+ end
31
+
32
+ host_puppet_environment_field(@f, { test_select_option: 'test_value1' }, { test_html_option: 'test_value2' })
33
+ end
34
+
35
+ test 'it adds new data attributes' do
36
+ @fields.expects(:collection_select).with do |*attrs|
37
+ select_options, html_options = extract_collection_options(attrs)
38
+ select_options[:test_select_option] == 'test_value1' &&
39
+ html_options[:data][:test] == 'test_value2'
40
+ end
41
+
42
+ host_puppet_environment_field(@f, { test_select_option: 'test_value1' }, { data: { test: 'test_value2' } })
43
+ end
44
+
45
+ test 'it overrides existing attributes' do
46
+ @fields.expects(:collection_select).with do |*attrs|
47
+ html_options = attrs.pop
48
+ html_options[:data][:test] == 'some_test_value' &&
49
+ html_options[:data][:url] == '/test/url'
50
+ end.returns('')
51
+
52
+ html = host_puppet_environment_field(@f, { disable_button: false }, { data: { url: '/test/url', test: 'some_test_value' } })
53
+
54
+ assert_no_match(/btn/, html)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def extract_collection_options(attrs)
61
+ html_opts = attrs.pop
62
+ [attrs.pop, html_opts]
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_puppet_helper'
2
+
3
+ module ForemanPuppet
4
+ class PuppetclassesHelperTest < ActionView::TestCase
5
+ include PuppetclassesHelper
6
+
7
+ describe '.overridden?' do
8
+ setup do
9
+ @env = FactoryBot.create(:environment)
10
+ end
11
+
12
+ it 'returns true when all params are overridden' do
13
+ pc = FactoryBot.create(:puppetclass, :with_parameters, environments: [@env])
14
+ pc.class_params.first.update(override: true)
15
+ assert pc.class_params.first.override
16
+ assert overridden?(pc)
17
+ end
18
+
19
+ it "returns false when one parameter isn't overridden" do
20
+ pc = FactoryBot.create(:puppetclass, :with_parameters, parameter_count: 2, environments: [@env])
21
+ pc.class_params.first.update(override: true)
22
+ assert pc.class_params.first.override
23
+ assert_not pc.class_params.last.override
24
+ assert_not overridden?(pc)
25
+ end
26
+
27
+ it 'returns false when no parameters' do
28
+ pc = FactoryBot.create(:puppetclass)
29
+ assert_not overridden?(pc)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_puppet_helper'
2
+ require 'integration_test_helper'
3
+
4
+ module ForemanPuppet
5
+ class EnvironmentJSTest < IntegrationTestWithJavascript
6
+ include ForemanPuppet::Engine.routes.url_helpers
7
+
8
+ test 'index page' do
9
+ assert_index_page(environments_path, 'Environments', 'Create Puppet Environment')
10
+ end
11
+
12
+ test 'create new page' do
13
+ assert_new_button(environments_path, 'Create Puppet Environment', new_environment_path)
14
+ fill_in 'environment_name', with: 'golive'
15
+ assert_submit_button(environments_path)
16
+ assert page.has_link? 'golive'
17
+ end
18
+
19
+ test 'edit page' do
20
+ visit environments_path
21
+ click_link 'production'
22
+ fill_in 'environment_name', with: 'production222'
23
+ assert_submit_button(environments_path)
24
+ assert page.has_link? 'production222'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,371 @@
1
+ require 'test_puppet_helper'
2
+ require 'integration_test_helper'
3
+ require 'integration/shared/host_finders'
4
+ require 'integration/shared/host_orchestration_stubs'
5
+
6
+ module ForemanPuppet
7
+ class HostJSTest < IntegrationTestWithJavascript
8
+ include HostFinders
9
+ include HostOrchestrationStubs
10
+
11
+ let(:host) { FactoryBot.create(:host, :with_puppet_enc, :managed) }
12
+ let(:org) { Organization.find_by(name: 'Organization 1') }
13
+ let(:loc) { Location.find_by(name: 'Location 1') }
14
+
15
+ describe 'new host page' do
16
+ test 'choosing a hostgroup overrides other host attributes' do
17
+ original_hostgroup = FactoryBot
18
+ .create(:hostgroup, :with_puppet_enc, environment: FactoryBot.create(:environment))
19
+ overridden_hostgroup = FactoryBot
20
+ .create(:hostgroup, :with_puppet_enc, environment: FactoryBot.create(:environment))
21
+
22
+ visit new_host_path
23
+ select2(original_hostgroup.name, from: 'host_hostgroup_id')
24
+ wait_for_ajax
25
+ click_on_inherit('puppet_attributes_environment')
26
+ select2(overridden_hostgroup.name, from: 'host_hostgroup_id')
27
+ assert page.find('#s2id_host_puppet_attributes_environment_id .select2-chosen').has_text? overridden_hostgroup.puppet.environment.name
28
+ end
29
+
30
+ test 'sets fields to "inherit" when hostgroup is selected' do
31
+ env1 = FactoryBot.create(:environment, organizations: [org], locations: [loc])
32
+ env2 = FactoryBot.create(:environment, organizations: [org], locations: [loc])
33
+ hg = FactoryBot.create(:hostgroup, :with_puppet_enc, environment: env2)
34
+ os = FactoryBot.create(:ubuntu14_10, :with_associations)
35
+ disable_orchestration
36
+ visit new_host_path
37
+
38
+ fill_in 'host_name', with: 'myhost1'
39
+ select2 'Organization 1', from: 'host_organization_id'
40
+ wait_for_ajax
41
+ select2 'Location 1', from: 'host_location_id'
42
+ wait_for_ajax
43
+ select2 env1.name, from: 'host_puppet_attributes_environment_id'
44
+ select2 hg.name, from: 'host_hostgroup_id'
45
+ wait_for_ajax
46
+
47
+ click_link 'Operating System'
48
+ select2 os.architectures.first.name, from: 'host_architecture_id'
49
+ select2 os.title, from: 'host_operatingsystem_id'
50
+ uncheck('host_build')
51
+
52
+ select2 os.media.first.name, from: 'host_medium_id'
53
+ select2 os.ptables.first.name, from: 'host_ptable_id'
54
+ fill_in 'host_root_pass', with: '12345678'
55
+
56
+ switch_form_tab_to_interfaces
57
+ click_button 'Edit'
58
+ select2 domains(:mydomain).name, from: 'host_interfaces_attributes_0_domain_id'
59
+ fill_in 'host_interfaces_attributes_0_mac', with: '00:11:11:11:11:11'
60
+ fill_in 'host_interfaces_attributes_0_ip', with: '2.3.4.44'
61
+
62
+ close_interfaces_modal
63
+
64
+ click_on_submit
65
+
66
+ host = Host::Managed.search_for('name ~ "myhost1"').first
67
+ assert_equal env2.name, host.puppet.environment.name
68
+ end
69
+
70
+ test 'saves correct values for inherited fields without hostgroup' do
71
+ env = FactoryBot.create(:environment, organizations: [org], locations: [loc])
72
+ os = FactoryBot.create(:ubuntu14_10, :with_associations)
73
+ Nic::Managed.any_instance.stubs(:dns_conflict_detected?).returns(true)
74
+ visit new_host_path
75
+
76
+ fill_in 'host_name', with: 'myhost1'
77
+ select2 'Organization 1', from: 'host_organization_id'
78
+ wait_for_ajax
79
+ select2 'Location 1', from: 'host_location_id'
80
+ wait_for_ajax
81
+ select2 env.name, from: 'host_puppet_attributes_environment_id'
82
+
83
+ click_link 'Operating System'
84
+ wait_for_ajax
85
+ select2 os.architectures.first.name, from: 'host_architecture_id'
86
+ select2 os.title, from: 'host_operatingsystem_id'
87
+ uncheck('host_build')
88
+ select2 os.media.first.name, from: 'host_medium_id'
89
+ select2 os.ptables.first.name, from: 'host_ptable_id'
90
+ fill_in 'host_root_pass', with: '12345678'
91
+
92
+ switch_form_tab_to_interfaces
93
+ click_button 'Edit'
94
+ select2 domains(:mydomain).name, from: 'host_interfaces_attributes_0_domain_id'
95
+ fill_in 'host_interfaces_attributes_0_mac', with: '00:11:11:11:11:11'
96
+ fill_in 'host_interfaces_attributes_0_ip', with: '1.1.1.1'
97
+ close_interfaces_modal
98
+ click_on_submit
99
+ find('#host-show') # wait for host details page
100
+
101
+ host = Host::Managed.search_for('name ~ "myhost1"').first
102
+ assert_equal env.name, host.puppet.environment.name
103
+ end
104
+ end
105
+
106
+ describe 'edit page' do
107
+ test 'environment is not inherited on edit' do
108
+ env1 = FactoryBot.create(:environment, organizations: [org], locations: [loc])
109
+ env2 = FactoryBot.create(:environment, organizations: [org], locations: [loc])
110
+ hg = FactoryBot.create(:hostgroup, :with_puppet_enc, environment: env2)
111
+ host = FactoryBot.create(:host, :with_puppet_enc, hostgroup: hg)
112
+ visit edit_host_path(host)
113
+
114
+ select2 env1.name, from: 'host_puppet_attributes_environment_id'
115
+ click_on_submit
116
+ assert_current_path(host_path(host), ignore_query: true)
117
+
118
+ host.reload
119
+ assert_equal env1.name, host.puppet.environment.name
120
+ end
121
+
122
+ test 'choosing a hostgroup does not override other host attributes' do
123
+ original_hostgroup = FactoryBot
124
+ .create(:hostgroup, :with_puppet_enc, environment: FactoryBot.create(:environment),
125
+ puppet_proxy: FactoryBot.create(:puppet_smart_proxy))
126
+
127
+ # Make host inherit hostgroup environment
128
+ host.attributes = host.apply_inherited_attributes(
129
+ 'hostgroup_id' => original_hostgroup.id
130
+ )
131
+ host.save
132
+
133
+ overridden_hostgroup = FactoryBot
134
+ .create(:hostgroup, :with_puppet_enc, environment: FactoryBot.create(:environment))
135
+
136
+ visit edit_host_path(host)
137
+ select2(original_hostgroup.name, from: 'host_hostgroup_id')
138
+
139
+ assert_equal original_hostgroup.puppet_proxy.name, find('#s2id_host_puppet_proxy_id .select2-chosen').text
140
+
141
+ click_on_inherit('puppet_proxy')
142
+ select2(overridden_hostgroup.name, from: 'host_hostgroup_id')
143
+
144
+ assert find('#s2id_host_puppet_attributes_environment_id .select2-chosen').has_text? original_hostgroup.environment.name
145
+
146
+ # On host group change, the disabled select will be reset to an empty value - disabled select2 is invisible on chrome
147
+ assert find('#s2id_host_puppet_proxy_id .select2-chosen', visible: :all).has_text? ''
148
+ end
149
+
150
+ context 'has inherited Puppetclasses' do
151
+ test 'has the hostgroup inherited parameters visible' do
152
+ hostgroup = FactoryBot.create(:hostgroup, :with_puppet_enc, :with_puppetclass)
153
+ host = FactoryBot.create(:host, :with_puppet_enc, hostgroup: hostgroup, environment: hostgroup.puppet.environment)
154
+
155
+ visit edit_host_path(host)
156
+ switch_form_tab('Puppet ENC')
157
+
158
+ header_element = page.find('#puppet_enc_tab .panel h3 a')
159
+ assert header_element.text =~ /#{hostgroup.name}$/
160
+ header_element.click
161
+
162
+ class_element = page.find('#inherited_ids > li')
163
+ assert_equal hostgroup.puppet.puppetclasses.first.name, class_element.text
164
+ end
165
+ end
166
+
167
+ describe 'Puppetclass Params' do
168
+ let(:host) { FactoryBot.create(:host, :with_puppet_enc, :with_puppetclass) }
169
+
170
+ test 'shows errors on invalid lookup values' do
171
+ lookup_key = FactoryBot.create(:puppetclass_lookup_key,
172
+ key_type: 'real', default_value: true, path: "fqdn\ncomment",
173
+ puppetclass: host.puppet.puppetclasses.first, overrides: { host.lookup_value_matcher => false })
174
+
175
+ visit edit_host_path(host)
176
+ switch_form_tab('Puppet ENC')
177
+ assert page.has_no_selector?('#puppet_klasses_parameters td.has-error')
178
+
179
+ fill_in "host_lookup_values_attributes_#{lookup_key.id}_value", with: 'invalid'
180
+ click_button('Submit')
181
+ assert page.has_selector?('#puppet_klasses_parameters td.has-error')
182
+ end
183
+
184
+ test 'correctly show hash type overrides' do
185
+ FactoryBot.create(:puppetclass_lookup_key, :hash,
186
+ default_value: 'a: b', path: "fqdn\ncomment",
187
+ puppetclass: host.puppet.puppetclasses.first,
188
+ overrides: { host.lookup_value_matcher => 'a: c' })
189
+
190
+ visit edit_host_path(host)
191
+ switch_form_tab('Puppet ENC')
192
+ assert_equal("a: c\n", puppetclass_params.find('textarea').value)
193
+ end
194
+
195
+ test 'class parameters and overrides are displayed correctly for booleans' do
196
+ lookup_key = FactoryBot.create(:puppetclass_lookup_key,
197
+ key_type: 'boolean', default_value: 'false', path: 'fqdn',
198
+ puppetclass: host.puppet.puppetclasses.first, overrides: { host.lookup_value_matcher => 'false' })
199
+ visit edit_host_path(host)
200
+ switch_form_tab('Puppet ENC')
201
+ assert puppetclass_params.has_selector?("a[data-tag='remove']", visible: :visible)
202
+ assert puppetclass_params.has_selector?("a[data-tag='override']", visible: :hidden)
203
+ assert_equal('false', find("#s2id_host_lookup_values_attributes_#{lookup_key.id}_value .select2-chosen").text)
204
+ select2 'true', from: "host_lookup_values_attributes_#{lookup_key.id}_value"
205
+ click_on_submit
206
+
207
+ visit edit_host_path(host)
208
+ switch_form_tab('Puppet ENC')
209
+ assert_equal('true', find("#s2id_host_lookup_values_attributes_#{lookup_key.id}_value .select2-chosen").text)
210
+ end
211
+
212
+ test 'class parameters and overrides are displayed correctly for strings' do
213
+ FactoryBot.create(:puppetclass_lookup_key, default_value: 'default', path: 'fqdn',
214
+ puppetclass: host.puppet.puppetclasses.first, overrides: { host.lookup_value_matcher => 'hostOverride' })
215
+ visit edit_host_path(host)
216
+ switch_form_tab('Puppet ENC')
217
+ assert_equal('hostOverride', puppetclass_params.find('textarea').value)
218
+ assert puppetclass_params.find('textarea:enabled')
219
+ puppetclass_params.find("a[data-tag='remove']").click
220
+ assert puppetclass_params.find('textarea:disabled')
221
+ click_on_submit
222
+
223
+ visit edit_host_path(host)
224
+ switch_form_tab('Puppet ENC')
225
+ assert_equal('default', puppetclass_params.find('textarea').value)
226
+ assert puppetclass_params.find('textarea:disabled')
227
+ puppetclass_params.find("a[data-tag='override']").click
228
+ assert puppetclass_params.find('textarea:enabled')
229
+ puppetclass_params.find('textarea').set('userCustom')
230
+ click_on_submit
231
+
232
+ visit edit_host_path(host)
233
+ switch_form_tab('Puppet ENC')
234
+ assert_equal('userCustom', puppetclass_params.find('textarea').value)
235
+ assert puppetclass_params.find('textarea:enabled')
236
+ end
237
+
238
+ test 'can override puppetclass lookup values' do
239
+ FactoryBot.create(:puppetclass_lookup_key, default_value: 'default', path: 'fqdn',
240
+ puppetclass: host.puppet.puppetclasses.first, overrides: { host.lookup_value_matcher => 'hostOverride' })
241
+
242
+ visit edit_host_path(host)
243
+ switch_form_tab('Puppet ENC')
244
+ assert puppetclass_params.has_selector?("a[data-tag='remove']", visible: :visible)
245
+ assert puppetclass_params.has_selector?("a[data-tag='override']", visible: :hidden)
246
+ assert_equal('hostOverride', puppetclass_params.find('textarea').value)
247
+ assert puppetclass_params.find('textarea:enabled')
248
+
249
+ puppetclass_params.find("a[data-tag='remove']").click
250
+ assert puppetclass_params.has_selector?("a[data-tag='remove']", visible: :hidden)
251
+ assert puppetclass_params.has_selector?("a[data-tag='override']", visible: :visible)
252
+ assert_equal('default', puppetclass_params.find('textarea').value)
253
+ assert puppetclass_params.find('textarea:disabled')
254
+
255
+ puppetclass_params.find("a[data-tag='override']").click
256
+ assert puppetclass_params.has_selector?("a[data-tag='remove']", visible: :visible)
257
+ assert puppetclass_params.has_selector?("a[data-tag='override']", visible: :hidden)
258
+ assert_equal('default', puppetclass_params.find('textarea').value)
259
+ assert puppetclass_params.find('textarea:enabled')
260
+ end
261
+
262
+ context 'with non-admin user' do
263
+ test 'user without edit_params permission can save host with params' do
264
+ FactoryBot.create(:puppetclass_lookup_key,
265
+ default_value: 'string1', path: "fqdn\ncomment",
266
+ puppetclass: host.puppet.puppetclasses.first,
267
+ overrides: { host.lookup_value_matcher => 'string2' })
268
+ user = FactoryBot.create(:user, :with_mail, roles: roles(:viewer, :edit_hosts))
269
+ assert_not user.can? 'edit_params'
270
+ set_request_user(user)
271
+ visit edit_host_path(host)
272
+ switch_form_tab('Puppet ENC')
273
+ assert puppetclass_params.find('textarea').disabled?
274
+ click_button('Submit')
275
+ assert page.has_link?('Edit')
276
+ end
277
+ end
278
+
279
+ test 'selecting domain updates puppetclass parameters' do
280
+ disable_orchestration
281
+ domain = FactoryBot.create(:domain)
282
+ FactoryBot.create(:puppetclass_lookup_key, path: "fqdn\ndomain\ncomment",
283
+ puppetclass: host.puppet.puppetclasses.first, default_value: 'default',
284
+ overrides: { "domain=#{domain.name}" => 'domain' })
285
+
286
+ visit edit_host_path(host)
287
+ switch_form_tab('Puppet ENC')
288
+ assert_equal('default', puppetclass_params.find('textarea').value)
289
+
290
+ switch_form_tab_to_interfaces
291
+ table.first(:button, 'Edit').click
292
+
293
+ select2 domain.name, from: 'host_interfaces_attributes_0_domain_id'
294
+ modal.find(:button, 'Ok').click
295
+
296
+ switch_form_tab('Puppet ENC')
297
+ assert_equal 'domain', puppetclass_params.find('textarea').value
298
+ end
299
+ end
300
+ end
301
+
302
+ describe 'clone page' do
303
+ test 'clones lookup values' do
304
+ host = FactoryBot.create(:host, :with_puppet_enc, :with_puppetclass)
305
+ lookup_key = FactoryBot.create(:puppetclass_lookup_key, puppetclass: host.puppet.puppetclasses.first,
306
+ path: "fqdn\ncomment",
307
+ overrides: { host.lookup_value_matcher => 'abc' })
308
+ visit clone_host_path(host)
309
+ switch_form_tab('Puppet ENC')
310
+ a = page.find("#host_lookup_values_attributes_#{lookup_key.id}_value")
311
+ assert_equal 'abc', a.value
312
+ end
313
+ end
314
+
315
+ describe 'hosts index multiple actions' do
316
+ setup do
317
+ @entries = Setting[:entries_per_page]
318
+ hosts
319
+ end
320
+
321
+ teardown do
322
+ Setting[:entries_per_page] = @entries
323
+ end
324
+
325
+ let(:environment) { FactoryBot.create(:environment) }
326
+ let(:hosts) { FactoryBot.create_list(:host, 3) }
327
+
328
+ test 'apply bulk action, change environment on all hosts' do
329
+ environment
330
+ Setting[:entries_per_page] = 3
331
+ visit hosts_path(per_page: 2)
332
+ check 'check_all'
333
+ find('#multiple-alert > .text > a').click
334
+ find('#submit_multiple').click
335
+ find('a', text: /\AChange Environment\z/).click
336
+ find('#environment_id').find("option[value='#{environment.id}']").select_option
337
+ find('button', text: /\ASubmit\z/).click
338
+ assert page.has_text?(:all, 'Updated hosts: changed environment')
339
+ end
340
+
341
+ test 'redirect js' do
342
+ visit hosts_path
343
+ check 'check_all'
344
+
345
+ # Ensure and wait for all hosts to be checked, and that no unchecked hosts remain
346
+ assert page.has_no_selector?('input.host_select_boxes:not(:checked)')
347
+
348
+ # Hosts are added to cookie
349
+ host_ids_on_cookie = JSON.parse(CGI.unescape(get_me_the_cookie('_ForemanSelectedhosts')&.fetch(:value)))
350
+ assert_includes(host_ids_on_cookie, hosts.first.id)
351
+
352
+ page.execute_script("tfm.hosts.table.buildRedirect('#{foreman_puppet.select_multiple_environment_hosts_path}')")
353
+ assert_current_path(foreman_puppet.select_multiple_environment_hosts_path, ignore_query: true)
354
+
355
+ assert page.has_selector?('td', text: hosts.first.name)
356
+ end
357
+ end
358
+
359
+ private
360
+
361
+ def puppetclass_params
362
+ page.find('#puppet_klasses_parameters_table')
363
+ end
364
+
365
+ # TODO: unless ForemanPuppet.extracted_from_core?
366
+ def switch_form_tab_to_interfaces
367
+ switch_form_tab('Interfaces')
368
+ disable_interface_modal_animation
369
+ end
370
+ end
371
+ end