foreman_puppet 0.0.1 → 1.0.0.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +61 -7
  3. data/app/controllers/concerns/foreman_puppet/environments_import.rb +1 -1
  4. data/app/controllers/concerns/foreman_puppet/extensions/api_base_controller.rb +28 -0
  5. data/app/controllers/concerns/foreman_puppet/extensions/api_template_combinations_controller.rb +1 -1
  6. data/app/controllers/concerns/foreman_puppet/extensions/hostgroups_controller_extensions.rb +1 -1
  7. data/app/controllers/concerns/foreman_puppet/extensions/hosts_controller_extensions.rb +1 -1
  8. data/app/controllers/concerns/foreman_puppet/extensions/parameters_host.rb +3 -10
  9. data/app/controllers/concerns/foreman_puppet/parameters/puppetclass_lookup_key.rb +2 -2
  10. data/app/controllers/foreman_puppet/api/v2/config_groups_controller.rb +9 -1
  11. data/app/controllers/foreman_puppet/api/v2/environments_controller.rb +5 -2
  12. data/app/controllers/foreman_puppet/api/v2/host_classes_controller.rb +9 -1
  13. data/app/controllers/foreman_puppet/api/v2/hostgroup_classes_controller.rb +9 -1
  14. data/app/controllers/foreman_puppet/api/v2/override_values_controller.rb +1 -2
  15. data/app/controllers/foreman_puppet/api/v2/{base_controller.rb → puppet_base_controller.rb} +2 -3
  16. data/app/controllers/foreman_puppet/api/v2/{lookups_common_controller.rb → puppet_lookups_common_controller.rb} +6 -2
  17. data/app/controllers/foreman_puppet/api/v2/puppetclasses_controller.rb +5 -1
  18. data/app/controllers/foreman_puppet/api/v2/smart_class_parameters_controller.rb +1 -2
  19. data/app/controllers/foreman_puppet/config_groups_controller.rb +4 -0
  20. data/app/controllers/foreman_puppet/puppet_smart_proxies_controller.rb +4 -0
  21. data/app/controllers/foreman_puppet/puppetclass_lookup_keys_controller.rb +2 -2
  22. data/app/controllers/foreman_puppet/puppetclasses_controller.rb +12 -4
  23. data/app/graphgl/concerns/foreman_puppet/mutations/hosts/create_extensions.rb +29 -0
  24. data/app/graphgl/concerns/foreman_puppet/types/host_extensions.rb +13 -0
  25. data/app/graphgl/concerns/foreman_puppet/types/hostgroup_extensions.rb +13 -0
  26. data/app/graphgl/concerns/foreman_puppet/types/interface_attributes_input_extensions.rb +9 -0
  27. data/app/graphgl/concerns/foreman_puppet/types/location_extensions.rb +14 -0
  28. data/app/graphgl/concerns/foreman_puppet/types/organization_extensions.rb +14 -0
  29. data/app/graphgl/foreman_puppet/types/environment.rb +20 -0
  30. data/app/graphgl/foreman_puppet/types/puppetclass.rb +20 -0
  31. data/app/helpers/foreman_puppet/environments_helper.rb +1 -1
  32. data/app/helpers/foreman_puppet/hosts_helper.rb +15 -0
  33. data/app/helpers/foreman_puppet/puppetclass_lookup_keys_helper.rb +2 -2
  34. data/app/helpers/foreman_puppet/puppetclasses_and_environments_helper.rb +1 -1
  35. data/app/helpers/foreman_puppet/puppetclasses_helper.rb +2 -2
  36. data/app/models/concerns/foreman_puppet/extensions/host.rb +24 -9
  37. data/app/models/concerns/foreman_puppet/extensions/host_common.rb +17 -0
  38. data/app/models/concerns/foreman_puppet/extensions/hostgroup.rb +13 -7
  39. data/app/models/concerns/foreman_puppet/extensions/operatingsystem.rb +1 -1
  40. data/app/models/concerns/foreman_puppet/extensions/provisioning_template.rb +19 -13
  41. data/app/models/concerns/foreman_puppet/extensions/report.rb +18 -0
  42. data/app/models/concerns/foreman_puppet/extensions/taxonomy.rb +1 -1
  43. data/app/models/concerns/foreman_puppet/extensions/template_combination.rb +1 -1
  44. data/app/models/concerns/foreman_puppet/extensions/user.rb +19 -12
  45. data/app/models/foreman_puppet/environment.rb +2 -0
  46. data/app/models/foreman_puppet/environment_class.rb +1 -1
  47. data/app/models/foreman_puppet/host_class.rb +1 -1
  48. data/app/models/foreman_puppet/host_puppet_facet.rb +5 -4
  49. data/app/models/foreman_puppet/hostgroup_puppet_facet.rb +1 -1
  50. data/app/models/{concerns/foreman_puppet/host_common.rb → foreman_puppet/puppet_facet_common.rb} +1 -1
  51. data/app/models/foreman_puppet/puppetclass.rb +15 -1
  52. data/app/{views/api/v2/template_combinations/base.json.erb → prepend_views/api/v2/template_combinations/base.json.rabl} +0 -0
  53. data/app/services/foreman_puppet/host_info_providers/config_groups_info.rb +2 -0
  54. data/app/services/foreman_puppet/puppet_class_importer.rb +17 -18
  55. data/app/views/foreman_puppet/common/_puppetclasses_or_envs_changed.html.erb +62 -0
  56. data/app/views/foreman_puppet/config_groups/index.html.erb +2 -2
  57. data/app/views/foreman_puppet/config_groups/welcome.html.erb +12 -11
  58. data/app/views/foreman_puppet/environments/index.html.erb +1 -1
  59. data/app/views/foreman_puppet/environments/welcome.html.erb +3 -15
  60. data/app/views/foreman_puppet/puppetclass_lookup_keys/welcome.html.erb +10 -8
  61. data/app/views/foreman_puppet/puppetclasses/_classes.html.erb +1 -1
  62. data/app/views/foreman_puppet/puppetclasses/_selected_classes.html.erb +1 -1
  63. data/app/views/foreman_puppet/puppetclasses/index.html.erb +1 -1
  64. data/app/views/hosts/_form_puppet_enc_tab.html.erb +1 -1
  65. data/app/views/hosts/select_multiple_environment.html.erb +1 -1
  66. data/app/views/smart_proxies/plugins/_puppet_ca.html.erb +44 -0
  67. data/config/initializers/api_reroute.rb +13 -0
  68. data/db/migrate/20200803113903_migrate_host_type_in_host_config_groups.foreman_puppet.rb +37 -12
  69. data/db/migrate/20201125113903_migrate_puppetclasses_to_facets.foreman_puppet.rb +13 -1
  70. data/lib/foreman_puppet.rb +3 -3
  71. data/lib/foreman_puppet/engine.rb +68 -19
  72. data/lib/foreman_puppet/register.rb +7 -2
  73. data/lib/foreman_puppet/version.rb +1 -1
  74. data/locale/Makefile +1 -1
  75. data/locale/action_names.rb +4 -4
  76. data/locale/en/LC_MESSAGES/foreman_puppet.mo +0 -0
  77. data/locale/en/foreman_puppet.edit.po +19 -3
  78. data/locale/en/foreman_puppet.po +18 -6
  79. data/locale/en/foreman_puppet.pox +0 -0
  80. data/locale/foreman_puppet.pot +19 -3
  81. data/locale/messages.mo +0 -0
  82. data/package.json +45 -0
  83. data/test/controllers/foreman_puppet/api/v2/config_groups_controller_test.rb +7 -3
  84. data/test/controllers/foreman_puppet/api/v2/environments_controller_test.rb +18 -16
  85. data/test/controllers/foreman_puppet/api/v2/hosts_controller_test.rb +3 -2
  86. data/test/controllers/foreman_puppet/api/v2/lookups_common_controller_test.rb +1 -1
  87. data/test/controllers/foreman_puppet/api/v2/provisioning_templates_controller_test.rb +32 -0
  88. data/test/controllers/foreman_puppet/api/v2/puppetclasses_controller_test.rb +3 -0
  89. data/test/controllers/foreman_puppet/api/v2/smart_class_parameters_controller_test.rb +7 -1
  90. data/test/controllers/foreman_puppet/api/v2/template_combinations_controller_test.rb +2 -2
  91. data/test/controllers/foreman_puppet/config_groups_controller_test.rb +7 -3
  92. data/test/controllers/foreman_puppet/environments_controller_test.rb +2 -2
  93. data/test/controllers/foreman_puppet/puppetclass_lookup_keys_controller_test.rb +2 -2
  94. data/test/controllers/foreman_puppet/puppetclasses_controller_test.rb +5 -6
  95. data/test/factories/foreman_puppet_factories.rb +3 -0
  96. data/test/factories/host_puppet_enhancements.rb +6 -6
  97. data/test/graphql/mutations/hosts/create_mutation_test.rb +87 -0
  98. data/test/graphql/queries/environment_query_test.rb +54 -0
  99. data/test/graphql/queries/environments_query_test.rb +43 -0
  100. data/test/{qraphql → graphql}/queries/host_puppet_query_test.rb +3 -8
  101. data/test/{qraphql → graphql}/queries/hostgroup_puppet_query_test.rb +1 -6
  102. data/test/graphql/queries/location_query_test.rb +52 -0
  103. data/test/graphql/queries/organization_query_test.rb +52 -0
  104. data/test/graphql/queries/puppetclass_query_test.rb +68 -0
  105. data/test/graphql/queries/puppetclasses_query_test.rb +43 -0
  106. data/test/integration/foreman_puppet/environment_js_test.rb +4 -1
  107. data/test/integration/foreman_puppet/host_js_test.rb +1 -1
  108. data/test/integration/foreman_puppet/puppetclass_js_test.rb +4 -0
  109. data/test/models/foreman_puppet/config_group_class_test.rb +3 -1
  110. data/test/models/foreman_puppet/environment_test.rb +2 -0
  111. data/test/models/foreman_puppet/host_puppet_facet_test.rb +34 -1
  112. data/test/models/foreman_puppet/host_test.rb +4 -3
  113. data/test/models/foreman_puppet/hostgroup_puppet_facet_test.rb +2 -3
  114. data/test/models/foreman_puppet/provisioning_template_test.rb +14 -7
  115. data/test/models/foreman_puppet/report_test.rb +21 -0
  116. data/test/models/foreman_puppet/smart_proxy_test.rb +1 -1
  117. data/test/models/foreman_puppet/user_test.rb +37 -0
  118. data/test/services/foreman_puppet/host_info_providers/config_groups_info_test.rb +35 -0
  119. data/test/services/foreman_puppet/host_info_providers/puppet_info_test.rb +159 -197
  120. data/test/unit/foreman_puppet/puppet_class_importer_test.rb +16 -2
  121. data/webpack/index.js +3 -4
  122. data/webpack/src/Components/Environments/Welcome.js +37 -0
  123. metadata +54 -14
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Mutations
5
+ module Hosts
6
+ module CreateExtensions
7
+ PUPPET_PARAMS = %i[
8
+ environment
9
+ puppetclasses
10
+ ].freeze
11
+
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ argument :environment_id, GraphQL::Types::ID, loads: ForemanPuppet::Types::Environment
16
+ argument :puppetclass_ids, [GraphQL::Types::ID], loads: ForemanPuppet::Types::Puppetclass, as: :puppetclasses
17
+
18
+ private
19
+
20
+ def initialize_object(params)
21
+ host = super(params.except(*PUPPET_PARAMS))
22
+ host.build_puppet(params.slice(*PUPPET_PARAMS))
23
+ host
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Types
5
+ module HostExtensions
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to :environment, ForemanPuppet::Types::Environment
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Types
5
+ module HostgroupExtensions
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to :environment, ForemanPuppet::Types::Environment
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Types
5
+ module InterfaceAttributesInputExtensions
6
+ delegate :with_indifferent_access, to: :to_h
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Types
5
+ module LocationExtensions
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ has_many :environments, ForemanPuppet::Types::Environment
10
+ has_many :puppetclasses, ForemanPuppet::Types::Puppetclass
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanPuppet
4
+ module Types
5
+ module OrganizationExtensions
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ has_many :environments, ForemanPuppet::Types::Environment
10
+ has_many :puppetclasses, ForemanPuppet::Types::Puppetclass
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module ForemanPuppet
2
+ module Types
3
+ class Environment < ::Types::BaseObject
4
+ model_class ForemanPuppet::Environment
5
+ description 'An Environment'
6
+
7
+ global_id_field :id
8
+ timestamps
9
+ field :name, String
10
+
11
+ has_many :locations, ::Types::Location
12
+ has_many :organizations, ::Types::Organization
13
+ has_many :puppetclasses, ForemanPuppet::Types::Puppetclass
14
+
15
+ def self.graphql_definition
16
+ super.tap { |type| type.instance_variable_set(:@name, 'ForemanPuppet::Environment') }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module ForemanPuppet
2
+ module Types
3
+ class Puppetclass < ::Types::BaseObject
4
+ model_class ForemanPuppet::Puppetclass
5
+ description 'A Puppetclass'
6
+
7
+ global_id_field :id
8
+ timestamps
9
+ field :name, String
10
+
11
+ has_many :environments, ForemanPuppet::Types::Environment
12
+ has_many :locations, ::Types::Location
13
+ has_many :organizations, ::Types::Organization
14
+
15
+ def self.graphql_definition
16
+ super.tap { |type| type.instance_variable_set(:@name, 'ForemanPuppet::Puppetclass') }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -9,7 +9,7 @@ module ForemanPuppet
9
9
  end
10
10
 
11
11
  def environments_title_actions
12
- title_actions import_proxy_select(hash_for_import_environments_environments_path),
12
+ title_actions import_proxy_select(hash_for_import_environments_environments_path.merge(engine: foreman_puppet)),
13
13
  button_group(new_link(_('Create Puppet Environment'), engine: foreman_puppet)),
14
14
  button_group(help_button)
15
15
  end
@@ -4,6 +4,7 @@ module ForemanPuppet
4
4
  multiple_actions_provider :puppet_host_multiple_actions
5
5
  # otherwise registered twice
6
6
  overview_buttons_provider :puppet_host_overview_buttons if ForemanPuppet.extracted_from_core?
7
+ overview_fields_provider :puppet_host_overview_fields if ForemanPuppet.extracted_from_core?
7
8
  end
8
9
 
9
10
  def puppet_host_multiple_actions
@@ -28,5 +29,19 @@ module ForemanPuppet
28
29
  end
29
30
  buttons
30
31
  end
32
+
33
+ def puppet_host_overview_fields(host)
34
+ fields = []
35
+ if host.environment.present?
36
+ fields << {
37
+ field: [
38
+ _('Puppet Environment'),
39
+ link_to(host.puppet.environment, hosts_path(search: "environment = #{host.puppet.environment}")),
40
+ ],
41
+ priority: 650,
42
+ }
43
+ end
44
+ fields
45
+ end
31
46
  end
32
47
  end
@@ -2,8 +2,8 @@ module ForemanPuppet
2
2
  module PuppetclassLookupKeysHelper
3
3
  def puppetclass_lookup_keys_breadcrumbs
4
4
  breadcrumbs(resource_url: api_smart_class_parameters_path,
5
- name_field: 'parameter',
6
- switcher_item_url: '/puppetclass_lookup_keys/:id-:name/edit')
5
+ name_field: 'parameter',
6
+ switcher_item_url: '/puppetclass_lookup_keys/:id-:name/edit')
7
7
  end
8
8
 
9
9
  # ------ Host(group) Form Helpers -----
@@ -42,7 +42,7 @@ module ForemanPuppet
42
42
  mod_name,
43
43
  rel: 'popover',
44
44
  data: { content: mod_classes[mod_name].sort.join('<br>').html_safe,
45
- "original-title": format(n_('%{name} has %{num_tag} class', '%{name} has %{num_tag} classes', num), name: mod_name, num_tag: num_tag),
45
+ 'original-title': format(n_('%{name} has %{num_tag} class', '%{name} has %{num_tag} classes', num), name: mod_name, num_tag: num_tag),
46
46
  trigger: 'focus',
47
47
  container: 'body',
48
48
  html: true },
@@ -30,7 +30,7 @@ module ForemanPuppet
30
30
 
31
31
  def link_to_remove_function(text, options)
32
32
  options.delete_if { |key, _value| !options[key].to_s } # otherwise error during template render
33
- title = (_('Click to remove %s') % options[:"data-class-name"])
33
+ title = (_('Click to remove %s') % options[:'data-class-name'])
34
34
  link_to_function(text, 'tfm.classEditor.removePuppetClass(this)', options.merge!('data-original-title': title))
35
35
  end
36
36
 
@@ -43,7 +43,7 @@ module ForemanPuppet
43
43
 
44
44
  def link_to_add_function(text, options)
45
45
  link_to_function(text, 'tfm.classEditor.addPuppetClass(this)',
46
- options.merge('data-original-title': _('Click to add %s') % options[:"data-class-name"]))
46
+ options.merge('data-original-title': _('Click to add %s') % options[:'data-class-name']))
47
47
  end
48
48
 
49
49
  def options_for_puppetclass_selection(klass, type)
@@ -3,21 +3,30 @@ module ForemanPuppet
3
3
  module Host
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ include ForemanPuppet::Extensions::HostCommon if ForemanPuppet.extracted_from_core?
7
+
6
8
  included do
7
9
  prepend PrependedMethods
8
10
 
9
- env_assoc = reflect_on_association(:environment)
10
- env_assoc&.instance_variable_set(:@class_name, 'ForemanPuppet::Environment')
11
+ if ForemanPuppet.extracted_from_core?
12
+ has_one :environment, through: :puppet, class_name: 'ForemanPuppet::Environment'
13
+ else
14
+ env_assoc = reflect_on_association(:environment)
15
+ env_assoc&.instance_variable_set(:@class_name, 'ForemanPuppet::Environment')
16
+
17
+ host_classes_assoc = reflect_on_association(:host_classes)
18
+ host_classes_assoc&.instance_variable_set(:@class_name, 'ForemanPuppet::HostClass')
19
+ end
11
20
 
12
21
  include_in_clone puppet: %i[config_groups host_config_groups host_classes]
13
22
 
14
23
  scoped_search relation: :environment, on: :name, complete_value: true, rename: :environment
15
24
  scoped_search relation: :puppetclasses, on: :name, complete_value: true, rename: :class, only_explicit: true, operators: ['= ', '~ '],
16
- ext_method: :search_by_deprecated_class
25
+ ext_method: :search_by_deprecated_class
17
26
  scoped_search relation: :puppetclasses, on: :name, complete_value: true, rename: :puppetclass, only_explicit: true, operators: ['= ', '~ '],
18
- ext_method: :search_by_puppetclass
27
+ ext_method: :search_by_puppetclass
19
28
  scoped_search relation: :config_groups, on: :name, complete_value: true, rename: :config_group, only_explicit: true, operators: ['= ', '~ '],
20
- ext_method: :search_by_config_group
29
+ ext_method: :search_by_config_group
21
30
  end
22
31
 
23
32
  class_methods do
@@ -61,6 +70,12 @@ module ForemanPuppet
61
70
  end
62
71
 
63
72
  module PrependedMethods
73
+ # TODO: we can drop this once extracted_from_core?
74
+ def validate_association_taxonomy(association_name)
75
+ return if association_name.to_sym == :environment
76
+ super
77
+ end
78
+
64
79
  def provisioning_template(opts = {})
65
80
  opts[:environment_id] ||= puppet&.environment_id
66
81
  super(opts)
@@ -69,10 +84,10 @@ module ForemanPuppet
69
84
  def available_template_kinds(provisioning = nil)
70
85
  kinds = template_kinds(provisioning)
71
86
  kinds.map do |kind|
72
- ProvisioningTemplate.find_template({ kind: kind.name,
73
- operatingsystem_id: operatingsystem_id,
74
- hostgroup_id: hostgroup_id,
75
- environment_id: puppet&.environment_id })
87
+ ::ProvisioningTemplate.find_template({ kind: kind.name,
88
+ operatingsystem_id: operatingsystem_id,
89
+ hostgroup_id: hostgroup_id,
90
+ environment_id: puppet&.environment_id })
76
91
  end.compact
77
92
  end
78
93
 
@@ -0,0 +1,17 @@
1
+ module ForemanPuppet
2
+ module Extensions
3
+ module HostCommon
4
+ extend ActiveSupport::Concern
5
+
6
+ def all_puppetclasses(env = environment)
7
+ return ForemanPuppet::Puppetclass.none unless puppet
8
+ puppet.all_puppetclasses(env)
9
+ end
10
+
11
+ def puppetclasses
12
+ return ForemanPuppet::Puppetclass.none unless puppet
13
+ puppet.puppetclasses
14
+ end
15
+ end
16
+ end
17
+ end
@@ -3,13 +3,19 @@ module ForemanPuppet
3
3
  module Hostgroup
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ include ForemanPuppet::Extensions::HostCommon if ForemanPuppet.extracted_from_core?
7
+
6
8
  included do
7
9
  class << self
8
10
  prepend PatchedClassMethods
9
11
  end
10
12
 
11
- env_assoc = reflect_on_association(:environment)
12
- env_assoc.instance_variable_set(:@class_name, 'ForemanPuppet::Environment')
13
+ if ForemanPuppet.extracted_from_core?
14
+ has_one :environment, through: :puppet, class_name: 'ForemanPuppet::Environment'
15
+ else
16
+ env_assoc = reflect_on_association(:environment)
17
+ env_assoc&.instance_variable_set(:@class_name, 'ForemanPuppet::Environment')
18
+ end
13
19
 
14
20
  include_in_clone puppet: %i[host_config_groups config_groups hostgroup_classes]
15
21
 
@@ -17,11 +23,11 @@ module ForemanPuppet
17
23
  scoped_search relation: :environment, on: :name, complete_value: true, rename: :environment, only_explicit: true
18
24
  scoped_search relation: :puppetclasses, on: :name, complete_value: true, rename: :class, only_explicit: true, operators: ['= ', '~ ']
19
25
  scoped_search relation: :config_groups, on: :name,
20
- complete_value: true,
21
- rename: :config_group,
22
- only_explicit: true,
23
- operators: ['= ', '~ '],
24
- ext_method: :search_by_config_group
26
+ complete_value: true,
27
+ rename: :config_group,
28
+ only_explicit: true,
29
+ operators: ['= ', '~ '],
30
+ ext_method: :search_by_config_group
25
31
  end
26
32
 
27
33
  # Temporary, can be ordinary class_methods do, when removed from core
@@ -4,7 +4,7 @@ module ForemanPuppet
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- has_and_belongs_to_many :puppetclasses
7
+ has_and_belongs_to_many :puppetclasses, class_name: 'ForemanPuppet::Puppetclass'
8
8
  end
9
9
  end
10
10
  end
@@ -6,11 +6,11 @@ module ForemanPuppet
6
6
  included do
7
7
  if ForemanPuppet.extracted_from_core?
8
8
  has_many :environments, through: :template_combinations
9
- before_destroy EnsureNotUsedBy.new(:environments)
9
+ before_destroy ActiveRecord::Base::EnsureNotUsedBy.new(:environments)
10
10
 
11
11
  scoped_search relation: :environments, on: :name, rename: :environment, complete_value: true
12
12
 
13
- class << base
13
+ class << self
14
14
  prepend PrependedClassMethods
15
15
  end
16
16
 
@@ -24,23 +24,29 @@ module ForemanPuppet
24
24
  module PrependedClassMethods
25
25
  def templates_by_template_combinations(templates, hosts_or_conditions)
26
26
  if hosts_or_conditions.is_a?(Hash)
27
- conditions = hosts_or_conditions
28
- conditions[:hostgroup_id] = Array.wrap(conditions[:hostgroup_id]) | [nil]
29
- conditions[:environment_id] = Array.wrap(conditions[:environment_id]) | [nil]
27
+ conditions = []
28
+ if hosts_or_conditions[:hostgroup_id] && hosts_or_conditions[:environment_id]
29
+ conditions << { hostgroup_id: Array.wrap(hosts_or_conditions[:hostgroup_id]), environment_id: Array.wrap(hosts_or_conditions[:environment_id]) }
30
+ end
31
+ conditions << { hostgroup_id: Array.wrap(hosts_or_conditions[:hostgroup_id]), environment_id: [nil] } if hosts_or_conditions[:hostgroup_id]
32
+ conditions << { hostgroup_id: [nil], environment_id: Array.wrap(hosts_or_conditions[:environment_id]) } if hosts_or_conditions[:environment_id]
30
33
  else
31
- conditions = {}
32
- conditions[:hostgroup_id] = hosts_or_conditions.pluck(:hostgroup_id) | [nil]
33
- conditions[:environment_id] = hosts_or_conditions.pluck(:environment_id) | [nil]
34
+ conditions = [{
35
+ hostgroup_id: hosts_or_conditions.pluck(:hostgroup_id) | [nil],
36
+ environment_id: hosts_or_conditions.joins(:puppet).pluck('host_puppet_facets.environment_id') | [nil],
37
+ }]
34
38
  end
35
- at = TemplateCombination.arel_table
36
- arel = at[:hostgroup_id].in(conditions[:hostgroup_id])
37
- arel = arel.and(at[:environment_id].in(conditions[:environment_id]))
38
- templates.joins(:template_combinations).where(arel).distinct
39
+ tpls = templates.where('1=0')
40
+ conditions.each do |cond|
41
+ tpls = templates.joins(:template_combinations).where(template_combinations: cond).distinct
42
+ return tpls if tpls.any?
43
+ end
44
+ tpls
39
45
  end
40
46
 
41
47
  def template_includes
42
48
  includes = super
43
- tc_include = includes.detect { |i| i.key?(:template_combinations) }
49
+ tc_include = includes.detect { |i| i.is_a?(Hash) && i.key?(:template_combinations) }
44
50
  tc_include ||= includes << {}
45
51
  tc_include[:template_combinations] = %i[hostgroup environment]
46
52
  includes
@@ -5,6 +5,24 @@ module ForemanPuppet
5
5
 
6
6
  included do
7
7
  has_one :environment, through: :host
8
+
9
+ # for cases when class already inherit before we apply the patch
10
+ self.class.subclasses.each do |subclass|
11
+ add_environment_search_to(subclass)
12
+ end
13
+ end
14
+
15
+ class_methods do
16
+ def inherited(child)
17
+ add_environment_search_to(child)
18
+ super
19
+ end
20
+
21
+ def add_environment_search_to(klass)
22
+ klass.instance_eval do
23
+ scoped_search relation: :environment, on: :name, complete_value: true, rename: :environment
24
+ end
25
+ end
8
26
  end
9
27
  end
10
28
  end
@@ -6,7 +6,7 @@ module ForemanPuppet
6
6
  included do
7
7
  has_many :environments, through: :taxable_taxonomies, source: :taxable, source_type: 'ForemanPuppet::Environment'
8
8
 
9
- has_many :puppetclasses, through: :environments
9
+ has_many :puppetclasses, through: :environments, class_name: 'ForemanPuppet::Puppetclass'
10
10
  end
11
11
 
12
12
  def dup