foreman_puppet 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +619 -0
- data/README.md +38 -0
- data/Rakefile +31 -0
- data/app/assets/stylesheets/foreman_puppet.scss +117 -0
- data/app/controllers/concerns/foreman_puppet/api/import_puppetclasses_common_controller.rb +139 -0
- data/app/controllers/concerns/foreman_puppet/environments_import.rb +61 -0
- data/app/controllers/concerns/foreman_puppet/extensions/api_hostgroups_controller.rb +40 -0
- data/app/controllers/concerns/foreman_puppet/extensions/api_template_combinations_controller.rb +23 -0
- data/app/controllers/concerns/foreman_puppet/extensions/api_v2_hosts_controller.rb +48 -0
- data/app/controllers/concerns/foreman_puppet/extensions/hostgroups_controller_extensions.rb +58 -0
- data/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb +228 -0
- data/app/controllers/concerns/foreman_puppet/extensions/operatingsystems_controller.rb +11 -0
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_host.rb +75 -0
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_hostgroup.rb +70 -0
- data/app/controllers/concerns/foreman_puppet/extensions/parameters_template_combination.rb +21 -0
- data/app/controllers/concerns/foreman_puppet/parameters/config_group.rb +17 -0
- data/app/controllers/concerns/foreman_puppet/parameters/environment.rb +21 -0
- data/app/controllers/concerns/foreman_puppet/parameters/puppetclass.rb +24 -0
- data/app/controllers/concerns/foreman_puppet/parameters/puppetclass_lookup_key.rb +24 -0
- data/app/controllers/foreman_puppet/api/v2/base_controller.rb +26 -0
- data/app/controllers/foreman_puppet/api/v2/config_groups_controller.rb +57 -0
- data/app/controllers/foreman_puppet/api/v2/environments_controller.rb +91 -0
- data/app/controllers/foreman_puppet/api/v2/host_classes_controller.rb +59 -0
- data/app/controllers/foreman_puppet/api/v2/hostgroup_classes_controller.rb +46 -0
- data/app/controllers/foreman_puppet/api/v2/lookups_common_controller.rb +114 -0
- data/app/controllers/foreman_puppet/api/v2/override_values_controller.rb +99 -0
- data/app/controllers/foreman_puppet/api/v2/puppetclasses_controller.rb +99 -0
- data/app/controllers/foreman_puppet/api/v2/smart_class_parameters_controller.rb +76 -0
- data/app/controllers/foreman_puppet/config_groups_controller.rb +46 -0
- data/app/controllers/foreman_puppet/environments_controller.rb +51 -0
- data/app/controllers/foreman_puppet/puppet_smart_proxies_controller.rb +39 -0
- data/app/controllers/foreman_puppet/puppetclass_lookup_keys_controller.rb +33 -0
- data/app/controllers/foreman_puppet/puppetclasses_controller.rb +113 -0
- data/app/controllers/foreman_puppet/react_controller.rb +19 -0
- data/app/helpers/concerns/foreman_puppet/template_renderer_scope.rb +14 -0
- data/app/helpers/foreman_puppet/environments_helper.rb +17 -0
- data/app/helpers/foreman_puppet/hosts_and_hostgroups_helper.rb +96 -0
- data/app/helpers/foreman_puppet/hosts_helper.rb +32 -0
- data/app/helpers/foreman_puppet/puppet_smart_proxies_helper.rb +8 -0
- data/app/helpers/foreman_puppet/puppetclass_lookup_keys_helper.rb +135 -0
- data/app/helpers/foreman_puppet/puppetclasses_and_environments_helper.rb +55 -0
- data/app/helpers/foreman_puppet/puppetclasses_helper.rb +59 -0
- data/app/helpers/foreman_puppet/template_combinations_helper.rb +33 -0
- data/app/models/concerns/foreman_puppet/extensions/host.rb +88 -0
- data/app/models/concerns/foreman_puppet/extensions/hostgroup.rb +40 -0
- data/app/models/concerns/foreman_puppet/extensions/nic_managed.rb +11 -0
- data/app/models/concerns/foreman_puppet/extensions/operatingsystem.rb +11 -0
- data/app/models/concerns/foreman_puppet/extensions/provisioning_template.rb +64 -0
- data/app/models/concerns/foreman_puppet/extensions/report.rb +11 -0
- data/app/models/concerns/foreman_puppet/extensions/taxonomy.rb +19 -0
- data/app/models/concerns/foreman_puppet/extensions/template_combination.rb +23 -0
- data/app/models/concerns/foreman_puppet/extensions/user.rb +22 -0
- data/app/models/concerns/foreman_puppet/host_common.rb +90 -0
- data/app/models/concerns/foreman_puppet/puppet_lookup_value_extensions.rb +13 -0
- data/app/models/foreman_puppet/config_group.rb +45 -0
- data/app/models/foreman_puppet/config_group_class.rb +19 -0
- data/app/models/foreman_puppet/environment.rb +63 -0
- data/app/models/foreman_puppet/environment_class.rb +40 -0
- data/app/models/foreman_puppet/host_class.rb +23 -0
- data/app/models/foreman_puppet/host_config_group.rb +15 -0
- data/app/models/foreman_puppet/host_puppet_facet.rb +130 -0
- data/app/models/foreman_puppet/hostgroup_class.rb +23 -0
- data/app/models/foreman_puppet/hostgroup_puppet_facet.rb +98 -0
- data/app/models/foreman_puppet/puppetclass.rb +132 -0
- data/app/models/foreman_puppet/puppetclass_lookup_key.rb +58 -0
- data/app/services/foreman_puppet/host_info_providers/config_groups_info.rb +10 -0
- data/app/services/foreman_puppet/host_info_providers/puppet_info.rb +92 -0
- data/app/services/foreman_puppet/input_type/puppet_parameter_input.rb +35 -0
- data/app/services/foreman_puppet/proxy_status/puppet.rb +17 -0
- data/app/services/foreman_puppet/puppet_class_importer.rb +355 -0
- data/app/views/api/v2/template_combinations/base.json.erb +9 -0
- data/app/views/foreman_puppet/api/v2/config_groups/base.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/config_groups/create.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/config_groups/index.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/config_groups/main.json.rabl +8 -0
- data/app/views/foreman_puppet/api/v2/config_groups/show.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/config_groups/update.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/environments/base.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/environments/create.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/environments/index.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/environments/main.json.rabl +5 -0
- data/app/views/foreman_puppet/api/v2/environments/show.json.rabl +15 -0
- data/app/views/foreman_puppet/api/v2/environments/update.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/host_puppet_facets/base.json.rabl +1 -0
- data/app/views/foreman_puppet/api/v2/host_puppet_facets/host_single.json.rabl +17 -0
- data/app/views/foreman_puppet/api/v2/host_puppet_facets/show.json.rabl +11 -0
- data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/base.json.rabl +5 -0
- data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/hostgroup_single.json.rabl +16 -0
- data/app/views/foreman_puppet/api/v2/hostgroup_puppet_facets/show.json.rabl +11 -0
- data/app/views/foreman_puppet/api/v2/import_puppetclasses/index.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/import_puppetclasses/show.json.rabl +36 -0
- data/app/views/foreman_puppet/api/v2/override_values/create.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/override_values/index.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/override_values/show.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/override_values/update.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/base.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/create.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/index.json.rabl +4 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/list.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/main.json.rabl +5 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/show.json.rabl +15 -0
- data/app/views/foreman_puppet/api/v2/puppetclasses/update.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/base.json.rabl +4 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/create.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/destroy.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/index.json.rabl +3 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/main.json.rabl +23 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/show.json.rabl +19 -0
- data/app/views/foreman_puppet/api/v2/smart_class_parameters/update.json.rabl +3 -0
- data/app/views/foreman_puppet/config_groups/_config_group.html.erb +34 -0
- data/app/views/foreman_puppet/config_groups/_config_groups_selection.html.erb +36 -0
- data/app/views/foreman_puppet/config_groups/_form.html.erb +9 -0
- data/app/views/foreman_puppet/config_groups/edit.html.erb +3 -0
- data/app/views/foreman_puppet/config_groups/index.html.erb +31 -0
- data/app/views/foreman_puppet/config_groups/new.html.erb +3 -0
- data/app/views/foreman_puppet/config_groups/welcome.html.erb +12 -0
- data/app/views/foreman_puppet/environments/_form.html.erb +20 -0
- data/app/views/foreman_puppet/environments/edit.html.erb +8 -0
- data/app/views/foreman_puppet/environments/index.html.erb +32 -0
- data/app/views/foreman_puppet/environments/new.html.erb +7 -0
- data/app/views/foreman_puppet/environments/welcome.html.erb +16 -0
- data/app/views/foreman_puppet/layouts/application_react.html.erb +15 -0
- data/app/views/foreman_puppet/puppet_smart_proxies/_dashboard.html.erb +9 -0
- data/app/views/foreman_puppet/puppet_smart_proxies/_environments.html.erb +30 -0
- data/app/views/foreman_puppet/puppetclass_lookup_keys/edit.html.erb +3 -0
- data/app/views/foreman_puppet/puppetclass_lookup_keys/index.html.erb +22 -0
- data/app/views/foreman_puppet/puppetclass_lookup_keys/welcome.html.erb +9 -0
- data/app/views/foreman_puppet/puppetclasses/_class_parameters.html.erb +37 -0
- data/app/views/foreman_puppet/puppetclasses/_class_selection.html.erb +70 -0
- data/app/views/foreman_puppet/puppetclasses/_classes.html.erb +22 -0
- data/app/views/foreman_puppet/puppetclasses/_classes_in_groups.html.erb +5 -0
- data/app/views/foreman_puppet/puppetclasses/_classes_parameters.html.erb +16 -0
- data/app/views/foreman_puppet/puppetclasses/_form.html.erb +62 -0
- data/app/views/foreman_puppet/puppetclasses/_selected_classes.html.erb +4 -0
- data/app/views/foreman_puppet/puppetclasses/edit.html.erb +4 -0
- data/app/views/foreman_puppet/puppetclasses/index.html.erb +47 -0
- data/app/views/hosts/_form_puppet_enc_tab.html.erb +24 -0
- data/app/views/hosts/foreman_puppet/_form_main_tab_fields.html.erb +1 -0
- data/app/views/hosts/select_multiple_environment.html.erb +8 -0
- data/app/views/provisioning_templates/_combination.html.erb +5 -0
- data/app/views/provisioning_templates/_combinations.html.erb +6 -0
- data/app/views/smart_proxies/plugins/_puppet.html.erb +24 -0
- data/config/api_routes.rb +81 -0
- data/config/routes.rb +89 -0
- data/db/migrate/20101121140000_add_environment_to_template_combinations.foreman_puppet.rb +9 -0
- data/db/migrate/20200720123005_migrate_puppet_core_types.foreman_puppet.rb +19 -0
- data/db/migrate/20200722171017_create_host_puppet_facet.foreman_puppet.rb +10 -0
- data/db/migrate/20200803113531_create_hostgroup_puppet_facet.foreman_puppet.rb +10 -0
- data/db/migrate/20200803113803_migrate_environment_to_puppet_facet.foreman_puppet.rb +22 -0
- data/db/migrate/20200803113903_migrate_host_type_in_host_config_groups.foreman_puppet.rb +29 -0
- data/db/migrate/20201125113903_migrate_puppetclasses_to_facets.foreman_puppet.rb +47 -0
- data/db/migrate_foreman/20090722141107_create_environments.rb +17 -0
- data/db/migrate_foreman/20120905095532_create_environment_classes.rb +15 -0
- data/db/migrate_foreman/20140407161817_create_config_groups.rb +9 -0
- data/db/migrate_foreman/20140407162007_create_config_group_classes.rb +10 -0
- data/db/migrate_foreman/20140407162059_create_host_config_groups.rb +11 -0
- data/db/migrate_foreman/20161205142618_delete_orphaned_smart_class_parameters.rb +10 -0
- data/db/migrate_foreman/20170109115157_fix_lookup_key_auditable_type.rb +15 -0
- data/db/migrate_foreman/20180816134832_cast_lookup_key_values.rb +35 -0
- data/db/migrate_foreman/20181023112532_add_environment_puppetclass_id.rb +7 -0
- data/db/migrate_foreman/20181224174419_add_index_to_environment_class_by_lookup_key_and_puppetclass.rb +6 -0
- data/db/seeds.d/111_puppet_proxy_feature.rb +8 -0
- data/lib/foreman_puppet.rb +10 -0
- data/lib/foreman_puppet/engine.rb +82 -0
- data/lib/foreman_puppet/register.rb +218 -0
- data/lib/foreman_puppet/version.rb +3 -0
- data/lib/tasks/foreman_puppet_tasks.rake +31 -0
- data/locale/Makefile +60 -0
- data/locale/action_names.rb +5 -0
- data/locale/en/foreman_puppet.edit.po +911 -0
- data/locale/en/foreman_puppet.po +690 -0
- data/locale/en/foreman_puppet.po.time_stamp +0 -0
- data/locale/foreman_puppet.pot +1076 -0
- data/locale/gemspec.rb +2 -0
- data/test/controllers/foreman_puppet/api/v2/config_groups_controller_test.rb +28 -0
- data/test/controllers/foreman_puppet/api/v2/environments_controller_test.rb +346 -0
- data/test/controllers/foreman_puppet/api/v2/host_classes_controller_test.rb +48 -0
- data/test/controllers/foreman_puppet/api/v2/hostgroup_classes_controller_test.rb +41 -0
- data/test/controllers/foreman_puppet/api/v2/hostgroups_controller_test.rb +79 -0
- data/test/controllers/foreman_puppet/api/v2/hosts_controller_test.rb +101 -0
- data/test/controllers/foreman_puppet/api/v2/lookups_common_controller_test.rb +29 -0
- data/test/controllers/foreman_puppet/api/v2/override_values_controller_test.rb +169 -0
- data/test/controllers/foreman_puppet/api/v2/puppetclasses_controller_test.rb +144 -0
- data/test/controllers/foreman_puppet/api/v2/smart_class_parameters_controller_test.rb +557 -0
- data/test/controllers/foreman_puppet/api/v2/template_combinations_controller_test.rb +81 -0
- data/test/controllers/foreman_puppet/config_groups_controller_test.rb +47 -0
- data/test/controllers/foreman_puppet/environments_controller_test.rb +230 -0
- data/test/controllers/foreman_puppet/hostgroups_controller_test.rb +72 -0
- data/test/controllers/foreman_puppet/hosts_controller_test.rb +346 -0
- data/test/controllers/foreman_puppet/puppet_smart_proxies_controller_test.rb +29 -0
- data/test/controllers/foreman_puppet/puppetclass_lookup_keys_controller_test.rb +59 -0
- data/test/controllers/foreman_puppet/puppetclasses_controller_test.rb +235 -0
- data/test/controllers/provisioning_templates_controller_test.rb +70 -0
- data/test/factories/foreman_puppet_factories.rb +134 -0
- data/test/factories/host_puppet_enhancements.rb +61 -0
- data/test/factories/proxy_puppet_enhancements.rb +33 -0
- data/test/helpers/foreman_puppet/hosts_and_hostgroups_helper_test.rb +65 -0
- data/test/helpers/foreman_puppet/puppetclasses_helper_test.rb +33 -0
- data/test/integration/foreman_puppet/environment_js_test.rb +27 -0
- data/test/integration/foreman_puppet/host_js_test.rb +371 -0
- data/test/integration/foreman_puppet/hostgroup_js_test.rb +100 -0
- data/test/integration/foreman_puppet/puppetclass_js_test.rb +37 -0
- data/test/integration/foreman_puppet/smartclass_parameter_js_test.rb +84 -0
- data/test/models/foreman_puppet/config_group_class_test.rb +9 -0
- data/test/models/foreman_puppet/config_group_test.rb +8 -0
- data/test/models/foreman_puppet/environment_test.rb +92 -0
- data/test/models/foreman_puppet/host_config_group_test.rb +39 -0
- data/test/models/foreman_puppet/host_puppet_facet_test.rb +116 -0
- data/test/models/foreman_puppet/host_test.rb +288 -0
- data/test/models/foreman_puppet/hostgroup_puppet_facet_test.rb +200 -0
- data/test/models/foreman_puppet/hostgroup_test.rb +14 -0
- data/test/models/foreman_puppet/lookup_value_test.rb +69 -0
- data/test/models/foreman_puppet/provisioning_template_test.rb +124 -0
- data/test/models/foreman_puppet/puppetclass_lookup_key_test.rb +81 -0
- data/test/models/foreman_puppet/puppetclass_test.rb +144 -0
- data/test/models/foreman_puppet/smart_proxy_test.rb +28 -0
- data/test/qraphql/queries/host_puppet_query_test.rb +36 -0
- data/test/qraphql/queries/hostgroup_puppet_query_test.rb +36 -0
- data/test/services/foreman_puppet/host_info_providers/puppet_info_test.rb +791 -0
- data/test/services/foreman_puppet/input_type/puppet_parameter_input_test.rb +14 -0
- data/test/test_puppet_helper.rb +30 -0
- data/test/unit/foreman_puppet/access_permissions_test.rb +16 -0
- data/test/unit/foreman_puppet/puppet_class_importer_test.rb +247 -0
- data/test/unit/foreman_puppet/template_rendering_test.rb +20 -0
- data/test/unit/foreman_puppet_test.rb +11 -0
- data/webpack/__mocks__/foremanReact/common/I18n.js +7 -0
- data/webpack/__mocks__/foremanReact/components/Layout/LayoutActions.js +2 -0
- data/webpack/__mocks__/foremanReact/readme.md +11 -0
- data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
- data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
- data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
- data/webpack/__mocks__/foremanReact/redux/index.js +1 -0
- data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
- data/webpack/fills_index.js +30 -0
- data/webpack/index.js +18 -0
- data/webpack/src/ForemanPuppet.js +11 -0
- data/webpack/src/Router/__snapshots__/routes.test.js.snap +3 -0
- data/webpack/src/Router/index.js +14 -0
- data/webpack/src/Router/routes.js +3 -0
- data/webpack/src/Router/routes.test.js +16 -0
- data/webpack/src/foreman_class_edit.js +224 -0
- data/webpack/src/foreman_puppet_host_form.js +140 -0
- data/webpack/src/foreman_puppet_host_form.test.js +65 -0
- data/webpack/src/index.js +1 -0
- data/webpack/src/reducers.js +7 -0
- 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
|