foreman_puppet 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) 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} +3 -4
  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 +6 -5
  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/engine.rb +68 -20
  71. data/lib/foreman_puppet/register.rb +7 -2
  72. data/lib/foreman_puppet/version.rb +1 -1
  73. data/lib/foreman_puppet.rb +3 -3
  74. data/locale/Makefile +1 -1
  75. data/locale/en/LC_MESSAGES/foreman_puppet.mo +0 -0
  76. data/locale/en/foreman_puppet.edit.po +19 -3
  77. data/locale/en/foreman_puppet.po +18 -6
  78. data/locale/en/foreman_puppet.pox +0 -0
  79. data/locale/foreman_puppet.pot +19 -3
  80. data/locale/messages.mo +0 -0
  81. data/test/controllers/foreman_puppet/api/v2/config_groups_controller_test.rb +7 -3
  82. data/test/controllers/foreman_puppet/api/v2/environments_controller_test.rb +18 -16
  83. data/test/controllers/foreman_puppet/api/v2/hosts_controller_test.rb +3 -2
  84. data/test/controllers/foreman_puppet/api/v2/lookups_common_controller_test.rb +1 -1
  85. data/test/controllers/foreman_puppet/api/v2/provisioning_templates_controller_test.rb +32 -0
  86. data/test/controllers/foreman_puppet/api/v2/puppetclasses_controller_test.rb +3 -0
  87. data/test/controllers/foreman_puppet/api/v2/smart_class_parameters_controller_test.rb +7 -1
  88. data/test/controllers/foreman_puppet/api/v2/template_combinations_controller_test.rb +2 -2
  89. data/test/controllers/foreman_puppet/config_groups_controller_test.rb +7 -3
  90. data/test/controllers/foreman_puppet/environments_controller_test.rb +2 -2
  91. data/test/controllers/foreman_puppet/puppetclass_lookup_keys_controller_test.rb +2 -2
  92. data/test/controllers/foreman_puppet/puppetclasses_controller_test.rb +5 -6
  93. data/test/factories/foreman_puppet_factories.rb +3 -0
  94. data/test/factories/host_puppet_enhancements.rb +6 -6
  95. data/test/graphql/mutations/hosts/create_mutation_test.rb +87 -0
  96. data/test/graphql/queries/environment_query_test.rb +54 -0
  97. data/test/graphql/queries/environments_query_test.rb +43 -0
  98. data/test/{qraphql → graphql}/queries/host_puppet_query_test.rb +3 -8
  99. data/test/{qraphql → graphql}/queries/hostgroup_puppet_query_test.rb +1 -6
  100. data/test/graphql/queries/location_query_test.rb +52 -0
  101. data/test/graphql/queries/organization_query_test.rb +52 -0
  102. data/test/graphql/queries/puppetclass_query_test.rb +68 -0
  103. data/test/graphql/queries/puppetclasses_query_test.rb +43 -0
  104. data/test/integration/foreman_puppet/environment_js_test.rb +4 -1
  105. data/test/integration/foreman_puppet/host_js_test.rb +1 -1
  106. data/test/integration/foreman_puppet/puppetclass_js_test.rb +4 -0
  107. data/test/models/foreman_puppet/config_group_class_test.rb +3 -1
  108. data/test/models/foreman_puppet/environment_test.rb +2 -0
  109. data/test/models/foreman_puppet/host_puppet_facet_test.rb +34 -1
  110. data/test/models/foreman_puppet/host_test.rb +4 -3
  111. data/test/models/foreman_puppet/hostgroup_puppet_facet_test.rb +2 -3
  112. data/test/models/foreman_puppet/provisioning_template_test.rb +14 -7
  113. data/test/models/foreman_puppet/report_test.rb +21 -0
  114. data/test/models/foreman_puppet/smart_proxy_test.rb +1 -1
  115. data/test/models/foreman_puppet/user_test.rb +37 -0
  116. data/test/services/foreman_puppet/host_info_providers/config_groups_info_test.rb +35 -0
  117. data/test/services/foreman_puppet/host_info_providers/puppet_info_test.rb +159 -197
  118. data/test/unit/foreman_puppet/puppet_class_importer_test.rb +16 -2
  119. data/webpack/index.js +3 -4
  120. data/webpack/src/Components/Environments/Welcome.js +37 -0
  121. metadata +51 -12
@@ -5,7 +5,7 @@ module ForemanPuppet
5
5
 
6
6
  included do
7
7
  if ForemanPuppet.extracted_from_core?
8
- belongs_to :environment
8
+ belongs_to :environment, class_name: 'ForemanPuppet::Environment'
9
9
 
10
10
  validates :environment_id, uniqueness: { scope: %i[hostgroup_id provisioning_template_id] }
11
11
 
@@ -3,19 +3,26 @@ module ForemanPuppet
3
3
  module User
4
4
  extend ActiveSupport::Concern
5
5
 
6
- def visible_environments
7
- authorized_scope = Environment.unscoped.authorized(:view_environments)
8
- authorized_scope = authorized_scope
9
- .joins(:taxable_taxonomies)
10
- .where('taxable_taxonomies.taxonomy_id' => taxonomy_ids[:organizations] + taxonomy_ids[:locations])
11
- result = authorized_scope.distinct.pluck(:name)
12
- if User.current.admin?
13
- # Admin users can also see Environments that do not have any organization or location, even when
14
- # organizations and locations are enabled.
15
- untaxed_environments = Environment.unscoped.where.not(id: TaxableTaxonomy.where(taxable_type: 'ForemanPuppet::Environment').distinct.select(:taxable_id)).pluck(:name)
16
- result += untaxed_environments
6
+ included do
7
+ prepend PatchedMethods
8
+ end
9
+
10
+ module PatchedMethods
11
+ def visible_environments
12
+ authorized_scope = ForemanPuppet::Environment.unscoped.authorized(:view_environments)
13
+ authorized_scope = authorized_scope
14
+ .joins(:taxable_taxonomies)
15
+ .where('taxable_taxonomies.taxonomy_id' => taxonomy_ids[:organizations] + taxonomy_ids[:locations])
16
+ result = authorized_scope.distinct.pluck(:name)
17
+ if ::User.current.admin?
18
+ # Admin users can also see Environments that do not have any organization or location, even when
19
+ # organizations and locations are enabled.
20
+ untaxed_env_ids = TaxableTaxonomy.where(taxable_type: 'ForemanPuppet::Environment').distinct.select(:taxable_id)
21
+ untaxed_environments = ForemanPuppet::Environment.unscoped.where.not(id: untaxed_env_ids).pluck(:name)
22
+ result += untaxed_environments
23
+ end
24
+ result
17
25
  end
18
- result
19
26
  end
20
27
  end
21
28
  end
@@ -2,6 +2,8 @@ module ForemanPuppet
2
2
  class Environment < ApplicationRecord
3
3
  self.table_name = 'environments'
4
4
 
5
+ graphql_type 'ForemanPuppet::Types::Environment'
6
+
5
7
  audited
6
8
  extend FriendlyId
7
9
  friendly_id :name, reserved_words: []
@@ -6,7 +6,7 @@ module ForemanPuppet
6
6
  belongs_to :puppetclass, inverse_of: :environment_classes
7
7
  belongs_to :puppetclass_lookup_key, inverse_of: :environment_classes, class_name: 'ForemanPuppet::PuppetclassLookupKey'
8
8
  validates :puppetclass_lookup_key_id, uniqueness: { scope: %i[environment_id puppetclass_id] }
9
- validates :puppetclass_id, :environment_id, presence: true
9
+ validates :puppetclass, :environment, presence: true
10
10
  after_destroy :delete_orphaned_lookup_keys
11
11
 
12
12
  scope :parameters_for_class, lambda { |puppetclasses_ids, environment_id|
@@ -6,7 +6,7 @@ module ForemanPuppet
6
6
  include Authorizable
7
7
 
8
8
  validates_lengths_from_database
9
- belongs_to :puppetclass
9
+ belongs_to :puppetclass, class_name: 'ForemanPuppet::Puppetclass'
10
10
  belongs_to :host_puppet_facet
11
11
  has_one :host, through: :host_puppet_facet
12
12
 
@@ -4,9 +4,9 @@ module ForemanPuppet
4
4
  audited associated_with: :host
5
5
 
6
6
  include Facets::Base
7
- include ForemanPuppet::HostCommon
7
+ include ForemanPuppet::PuppetFacetCommon
8
8
 
9
- has_many :host_classes, dependent: :destroy
9
+ has_many :host_classes, dependent: :destroy, class_name: 'ForemanPuppet::HostClass'
10
10
  has_many :puppetclasses, through: :host_classes
11
11
 
12
12
  validates :environment_id, presence: true, unless: ->(facet) { facet.host.puppet_proxy_id.blank? }
@@ -18,10 +18,11 @@ module ForemanPuppet
18
18
  type ||= 'puppet'
19
19
  return unless type == 'puppet'
20
20
 
21
+ facet = host.puppet || host.build_puppet
21
22
  if Setting[:update_environment_from_facts]
22
- host.set_non_empty_values parser, [:environment]
23
+ facet.environment = parser.environment if parser.environment.present?
23
24
  elsif parser.environment.present?
24
- self.environment ||= parser.environment
25
+ facet.environment ||= parser.environment
25
26
  end
26
27
 
27
28
  # if proxy authentication is enabled and we have no puppet proxy set and the upload came from puppet,
@@ -42,7 +43,7 @@ module ForemanPuppet
42
43
  # the environment used by #clases nees to be self.environment and not self.parent.environment
43
44
  def parent_classes
44
45
  return [] unless host.hostgroup
45
- host.hostgroup.puppet&.classes(environment)
46
+ host.hostgroup.puppet&.classes(environment) || []
46
47
  end
47
48
 
48
49
  def parent_config_groups
@@ -61,7 +61,7 @@ module ForemanPuppet
61
61
  audited associated_with: :hostgroup
62
62
  self.table_name = 'hostgroup_puppet_facets'
63
63
 
64
- include ForemanPuppet::HostCommon
64
+ include ForemanPuppet::PuppetFacetCommon
65
65
  include Facets::HostgroupFacet
66
66
 
67
67
  has_many :hostgroup_classes, dependent: :destroy
@@ -1,7 +1,7 @@
1
1
  module ForemanPuppet
2
2
  # Common methods between host and hostgroup
3
3
  # mostly for template rendering consistency
4
- module HostCommon
4
+ module PuppetFacetCommon
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
@@ -2,6 +2,8 @@ module ForemanPuppet
2
2
  class Puppetclass < ApplicationRecord
3
3
  self.table_name = 'puppetclasses'
4
4
 
5
+ graphql_type 'ForemanPuppet::Types::Puppetclass'
6
+
5
7
  audited
6
8
  include Authorizable
7
9
  include ScopedSearchExtensions
@@ -29,6 +31,7 @@ module ForemanPuppet
29
31
  has_many :config_groups, through: :config_group_classes
30
32
 
31
33
  has_many :class_params, -> { distinct }, through: :environment_classes, source: :puppetclass_lookup_key
34
+ accepts_nested_attributes_for :environment_classes
32
35
  accepts_nested_attributes_for :class_params, reject_if: ->(a) { a[:key].blank? }, allow_destroy: true
33
36
 
34
37
  validates :name, uniqueness: true, presence: true, no_whitespace: true
@@ -72,6 +75,17 @@ module ForemanPuppet
72
75
  hash
73
76
  end
74
77
 
78
+ # For Audits to be correctly taxed for Puppetclass creation
79
+ # Puppetclass gets saved before the environment class and thus taxonomy ids are empty
80
+ # We collect the ids from unsaved environment_classes for the Audits correct taxation
81
+ def location_ids
82
+ environment_classes.select(&:new_record?).flat_map { |ec| ec.environment.location_ids }.concat(super).uniq
83
+ end
84
+
85
+ def organization_ids
86
+ environment_classes.select(&:new_record?).flat_map { |ec| ec.environment.organization_ids }.concat(super).uniq
87
+ end
88
+
75
89
  # returns module name (excluding of the class name)
76
90
  # if class separator does not exists (the "::" chars), then returns the whole class name
77
91
  def module_name
@@ -106,7 +120,7 @@ module ForemanPuppet
106
120
  # We are going through two associations, so we are on our own to define modifiers
107
121
  def hostgroup_ids=(hg_ids)
108
122
  hg_ids = Array(hg_ids).reject(&:blank?)
109
- hg_to_facets_ids = Hash[HostgroupPuppetFacet.where(hostgroup_id: hg_ids).pluck(:hostgroup_id, :id)]
123
+ hg_to_facets_ids = HostgroupPuppetFacet.where(hostgroup_id: hg_ids).pluck(:hostgroup_id, :id).to_h
110
124
  missing_facet_ids = hg_ids.map(&:to_i) - hg_to_facets_ids.keys
111
125
  new_facet_ids = missing_facet_ids.map { |hg_id| HostgroupPuppetFacet.create(hostgroup_id: hg_id).id }
112
126
  self.hostgroup_puppet_facet_ids = hg_to_facets_ids.values + new_facet_ids
@@ -2,6 +2,8 @@ module ForemanPuppet
2
2
  module HostInfoProviders
3
3
  class ConfigGroupsInfo < HostInfo::Provider
4
4
  def host_info
5
+ return {} unless host.puppet
6
+
5
7
  config_groups = (host.puppet.config_groups + host.puppet.parent_config_groups).uniq.map(&:name)
6
8
  { 'parameters' => { 'foreman_config_groups' => config_groups } }
7
9
  end
@@ -162,7 +162,7 @@ module ForemanPuppet
162
162
  end
163
163
 
164
164
  def db_environments
165
- @db_environments ||= (Environment.pluck('environments.name') - ignored_environments)
165
+ @db_environments ||= (Environment.pluck(:name) - ignored_environments)
166
166
  end
167
167
 
168
168
  def actual_environments
@@ -248,15 +248,11 @@ module ForemanPuppet
248
248
  end
249
249
 
250
250
  def add_classes_to_foreman(env_name, klasses)
251
- env = find_or_create_env env_name
252
- # look for Puppet class in all scopes to make sure we do not try to create a new record
253
- # with a name that already exists and hit the uniqueness constraint on name
254
- new_classes = klasses.map { |k| find_or_create_puppetclass(name: k[0]) }
251
+ env = find_or_create_env env_name
255
252
 
256
- new_classes.each do |new_class|
257
- EnvironmentClass.find_or_create_by! puppetclass_id: new_class.id, environment_id: env.id
258
- class_params = klasses[new_class.to_s]
259
- add_new_parameter(env, new_class, class_params) if class_params.any?
253
+ klasses.each do |klass_name, klass_params|
254
+ puppetclass = find_or_create_puppetclass_for_env(klass_name, env)
255
+ add_new_parameter(env, puppetclass, klass_params) if klass_params.any?
260
256
  end
261
257
  end
262
258
 
@@ -302,7 +298,7 @@ module ForemanPuppet
302
298
  changed_params['new'].map do |param_name, value|
303
299
  param = find_or_create_puppet_class_param klass, param_name, value
304
300
  EnvironmentClass.find_or_create_by! puppetclass_id: klass.id, environment_id: env.id,
305
- puppetclass_lookup_key_id: param.id
301
+ puppetclass_lookup_key_id: param.id
306
302
  end
307
303
  end
308
304
 
@@ -317,10 +313,9 @@ module ForemanPuppet
317
313
  Host.where(environment_id: env).update_all(environment_id: nil)
318
314
  Hostgroup.where(environment_id: env).update_all(environment_id: nil)
319
315
  # rubocop:enable Rails/SkipsModelValidations
320
-
321
- # we can't guaranty that the env would be removed as it might have hosts attached to it.
322
- env.destroy if klasses.include? '_destroy_'
323
316
  end
317
+ # we can't guaranty that the env would be removed as it might have hosts attached to it.
318
+ env.destroy if klasses.include? '_destroy_'
324
319
  # remove all klasses that have no environment now
325
320
  classes.not_in_any_environment.destroy_all
326
321
  end
@@ -331,8 +326,8 @@ module ForemanPuppet
331
326
 
332
327
  def find_or_create_env(env)
333
328
  user_visible_environment(env) || Environment.create!(name: env,
334
- organizations: User.current.my_organizations,
335
- locations: User.current.my_locations)
329
+ organizations: User.current.my_organizations,
330
+ locations: User.current.my_locations)
336
331
  end
337
332
 
338
333
  def user_visible_environment(env)
@@ -343,11 +338,15 @@ module ForemanPuppet
343
338
  def find_or_create_puppet_class_param(klass, param_name, value)
344
339
  klass.class_params.where(key: param_name).first ||
345
340
  PuppetclassLookupKey.create!(key: param_name, default_value: value,
346
- key_type: Foreman::ImporterPuppetclass.suggest_key_type(value))
341
+ key_type: Foreman::ImporterPuppetclass.suggest_key_type(value))
347
342
  end
348
343
 
349
- def find_or_create_puppetclass(name:)
350
- puppetclass = Puppetclass.unscoped.find_or_create_by!(name: name)
344
+ def find_or_create_puppetclass_for_env(klass_name, env)
345
+ # look for Puppet class in all scopes to make sure we do not try to create a new record
346
+ # with a name that already exists and hit the uniqueness constraint on name
347
+ puppetclass = Puppetclass.find_or_initialize_by(name: klass_name)
348
+ puppetclass.environment_classes.find_or_initialize_by(environment_id: env.id)
349
+ puppetclass.save
351
350
  raise Foreman::Exception.new('Failed to create Puppetclass: %s', puppetclass.errors.full_messages.to_sentence) unless puppetclass.errors.empty?
352
351
  puppetclass
353
352
  end
@@ -0,0 +1,62 @@
1
+ <% title _("Changed environments") %>
2
+ <%= form_tag controller.send("obsolete_and_new_#{controller_name}_path") do %>
3
+ <h4><%= _("Select the changes you want to apply to Foreman") %></h4>
4
+ <h6>
5
+ <%= _("Toggle") %>:
6
+ <%= link_to_function(icon_text("check", _("New")),
7
+ "toggleCheckboxesBySelector('.env_select_boxes_new')",
8
+ :title => _("Check/Uncheck new")) %> |
9
+ <%= link_to_function(icon_text("check", _("Updated")),
10
+ "toggleCheckboxesBySelector('.env_select_boxes_updated')",
11
+ :title => _("Check/Uncheck updated")) %> |
12
+ <%= link_to_function(icon_text("check", _("Obsolete")),
13
+ "toggleCheckboxesBySelector('.env_select_boxes_obsolete')",
14
+ :title => _("Check/Uncheck obsolete")) %>
15
+ </h6>
16
+ <table class="<%= table_css_classes %>">
17
+ <thead>
18
+ <tr>
19
+ <th class="ca">
20
+ <%= link_to_function(icon_text("check"),
21
+ "toggleCheckboxesBySelector('.env_select_boxes')",
22
+ :title => _("Check/Uncheck all")) %>
23
+ </th>
24
+ <th><%= _("Environment") %></th>
25
+ <th><%= _("Operation") %></th>
26
+ <th><%= _("Puppet Modules") %></th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <% for kind in ["new", "obsolete", "updated", "ignored"] %>
31
+ <% unless (envs = @changed[kind]).empty? %>
32
+ <% for env in envs.keys.sort %>
33
+ <tr>
34
+ <% unless kind == 'ignored' %>
35
+ <td>
36
+ <%= check_box_tag "changed[#{kind}][#{env}]", @changed[kind][env].to_json, false, :class => "env_select_boxes env_select_boxes_#{kind} env_select_boxes_env_#{env}" %>
37
+ </td>
38
+ <td>
39
+ <%= link_to_function("#{env}", "toggleCheckboxesBySelector('.env_select_boxes_env_#{env}')", :title => _("Check/Uncheck all %s changes") % env) %>
40
+ </td>
41
+ <% else %>
42
+ <td>&nbsp;</td>
43
+ <td><%= env %></td>
44
+ <% end %>
45
+ <td>
46
+ <%= {"new" => _("Add:"), "obsolete" => _("Remove:"), "updated" => _("Update:"), "ignored" => _("Ignored:")}[kind] %>
47
+ </td>
48
+ <td>
49
+ <% pcs = @changed[kind][env] %>
50
+ <%= class_update_text pcs, env %>
51
+ </td>
52
+ </tr>
53
+ <% end %>
54
+ <% end %>
55
+ <% end %>
56
+ </tbody>
57
+ </table>
58
+ <div>
59
+ <%= link_to _("Cancel"), controller.send("#{controller_name}_path"), :class => "btn btn-default" %>
60
+ <%= submit_tag _("Update"), :class => "btn btn-primary" %>
61
+ </div>
62
+ <% end %>
@@ -17,12 +17,12 @@
17
17
  <tbody>
18
18
  <% @config_groups.each do |config_group| %>
19
19
  <tr>
20
- <td class="ellipsis"><%= link_to_if_authorized config_group.name, hash_for_edit_config_group_path(config_group).merge(:auth_object => config_group, :authorizer => authorizer) %></td>
20
+ <td class="ellipsis"><%= link_to_if_authorized config_group.name, hash_for_edit_config_group_path(config_group).merge(engine: foreman_puppet, :auth_object => config_group, :authorizer => authorizer) %></td>
21
21
  <td><%= link_to config_group.puppetclasses.size, puppetclasses_path(:search => %Q{config_group = "#{config_group}"}) %></td>
22
22
  <td><%= link_to config_group.hosts_count, main_app.hosts_path(:search => %Q{config_group = "#{config_group}"}) %></td>
23
23
  <td><%= link_to config_group.hostgroups_count, main_app.hostgroups_path(:search => %Q{config_group = "#{config_group}"}) %></td>
24
24
  <td><%= action_buttons(
25
- display_delete_if_authorized(hash_for_config_group_path(config_group).merge(:auth_object => config_group, :authorizer => authorizer), :data => { :confirm => _('Delete %s?') % config_group.name }))%>
25
+ display_delete_if_authorized(hash_for_config_group_path(config_group).merge(engine: foreman_puppet, :auth_object => config_group, :authorizer => authorizer), :data => { :confirm => _('Delete %s?') % config_group.name }))%>
26
26
  </td>
27
27
  </tr>
28
28
  <% end %>
@@ -1,12 +1,13 @@
1
1
  <% title _("Config Groups") %>
2
- <div class="blank-slate-pf">
3
- <div class="blank-slate-pf-icon">
4
- <%= icon_text("object-group", "", kind: "fa") %>
5
- </div>
6
- <h1><%= _('Config Groups') %></h1>
7
- <p><%= _("A config group provides a one-step method of associating many Puppet classes to either a host or host group. Typically this would be used to add a particular application profile or stack in one step.") %></p>
8
- <p><%= link_to _('Learn more about this in the documentation.'), documentation_url("using-config-groups")%></p>
9
- <div class="blank-slate-pf-main-action">
10
- <%= new_link(_("Create Config Group"), { engine: foreman_puppet }, { class: 'btn-lg' }) %>
11
- </div>
12
- </div>
2
+
3
+ <%= webpacked_plugins_js_for :foreman_puppet %>
4
+ <% description = _("A config group provides a one-step method of associating many Puppet classes to either a host or host group. Typically this would be used to add a particular application profile or stack in one step.")%>
5
+ <% action = { :title => _("Create Config Group"), :url => new_config_group_path } if authorized_for(:action => :new)%>
6
+ <%= react_component('EmptyState', {
7
+ :icon => 'object-group',
8
+ :iconType => 'fa',
9
+ :header => _('Config Groups'),
10
+ :description => description,
11
+ :documentation => { :url => documentation_url("using-config-groups") },
12
+ :action => action
13
+ }) %>
@@ -20,7 +20,7 @@
20
20
  <td>
21
21
  <%= action_buttons(
22
22
  link_to(_('Classes'), puppetclasses_path(search: "environment = #{environment}")),
23
- import_proxy_links(hash_for_import_environments_environments_path(env: environment)),
23
+ import_proxy_links(hash_for_import_environments_environments_path(env: environment).merge(engine: foreman_puppet)),
24
24
  display_delete_if_authorized(hash_for_environment_path(environment).merge(engine: foreman_puppet, auth_object: environment, authorizer: authorizer),
25
25
  data: { confirm: "Delete #{environment.name}?" })
26
26
  ) %>
@@ -1,16 +1,4 @@
1
1
  <% content_for(:title, _("Puppet environments")) %>
2
- <div class="blank-slate-pf">
3
- <div class="blank-slate-pf-icon">
4
- <%= icon_text("th", '', kind: "fa") %>
5
- </div>
6
- <h1><%= _('Environments') %></h1>
7
- <p><%= _("If you are planning to use Foreman as an external node classifier you should provide information about one or more environments. This information is commonly imported from a pre-existing Puppet configuration by the use of the %{link_start}Puppet classes and environment importer%{link_end}.").html_safe % { link_start: tag(:a, href: documentation_url("4.2.2Classes"), rel: 'external'), link_end: '</a>'.html_safe } %>
8
- </p>
9
- <p><%= link_to(_('Learn more about this in the documentation.'), documentation_url("4.2.1Environments")) %></p>
10
- <div class="blank-slate-pf-main-action">
11
- <%= new_link(_('Create Puppet Environment'), { engine: foreman_puppet }, { class: "btn-lg" }) %>
12
- </div>
13
- <div class="blank-slate-pf-secondary-action">
14
- <%= import_proxy_select(hash_for_import_environments_environments_path) %>
15
- </div>
16
- </div>
2
+
3
+ <%= webpacked_plugins_js_for :foreman_puppet %>
4
+ <%= react_component('WelcomeEnv', {canCreate: authorized_for(action: :new)}) %>
@@ -1,9 +1,11 @@
1
1
  <% title _("Smart Class Parameters") %>
2
- <div class="blank-slate-pf">
3
- <div class="blank-slate-pf-icon">
4
- <%= icon_text("info-circle", "", :kind => "fa") %>
5
- </div>
6
- <h1><%= _('Smart Class Parameters') %></h1>
7
- <p><%= _("Parameterized class support permits detecting, importing, and supplying parameters directly to classes which support it, via the ENC and depending on a set of rules (Smart Matchers).") %></p>
8
- <p><%= link_to _('Learn more about this in the documentation.'), documentation_url("4.2.5ParameterizedClasses")%></p>
9
- </div>
2
+
3
+ <%= webpacked_plugins_js_for :foreman_puppet %>
4
+ <% description = _("Parameterized class support permits detecting, importing, and supplying parameters directly to classes which support it, via the ENC and depending on a set of rules (Smart Matchers).")%>
5
+ <%= react_component('EmptyState', {
6
+ :icon => 'info-circle',
7
+ :iconType => 'fa',
8
+ :header => _('Smart Class Parameters'),
9
+ :description => description,
10
+ :documentation => { :url => documentation_url("4.2.5ParameterizedClasses") },
11
+ }) %>
@@ -1,4 +1,4 @@
1
- <% Puppetclass.classes2hash(puppetclasses).sort.in_groups(2,nil) do |group| %>
1
+ <% ForemanPuppet::Puppetclass.classes2hash(puppetclasses).sort.in_groups(2,nil) do |group| %>
2
2
  <div class="col-md-6 classes">
3
3
  <% group.each do |list| %>
4
4
  <% next if list.nil? %>
@@ -1,4 +1,4 @@
1
- <%= content_tag :li, id: "selected_puppet_class_#{klass.id}", class: [dom_class(klass, 'selected'), cycle('even', 'odd'), ('unavailable' unless klass.environments.include?(@environment))] do %>
1
+ <%= content_tag :li, id: "selected_puppetclass_#{klass.id}", class: [dom_class(klass, 'selected'), cycle('even', 'odd'), ('unavailable' unless klass.environments.include?(@environment))] do %>
2
2
  <%= link_to_remove_puppetclass(klass, obj) %>
3
3
  <%= hidden_field_tag "#{resource_type}[puppetclass_ids][]", klass.id %>
4
4
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <% title _("Puppet Classes") %>
2
2
 
3
- <% title_actions import_proxy_select(hash_for_import_environments_puppetclasses_path),
3
+ <% title_actions import_proxy_select(hash_for_import_environments_puppetclasses_path.merge(engine: foreman_puppet)),
4
4
  documentation_button('4.2.2Classes') %>
5
5
 
6
6
  <table class="<%= table_css_classes 'table-fixed' %>">