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,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