foreman_kernel_care 0.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -7
  3. data/Rakefile +2 -2
  4. data/app/controllers/concerns/foreman_kernel_care/foreman_tasks.rb +22 -0
  5. data/app/models/concerns/foreman_kernel_care/host_managed_extensions.rb +57 -2
  6. data/app/views/foreman_kernel_care/job_templates/kernel_version.erb +15 -0
  7. data/app/views/foreman_kernel_care/job_templates/update_kernel.erb +15 -0
  8. data/db/seeds.d/100_assign_features_with_templates.rb +28 -0
  9. data/db/seeds.d/70_job_templates.rb +28 -0
  10. data/lib/foreman_kernel_care/engine.rb +8 -32
  11. data/lib/foreman_kernel_care/remote_execution.rb +22 -0
  12. data/lib/foreman_kernel_care/version.rb +1 -1
  13. data/lib/tasks/foreman_kernel_care_tasks.rake +2 -12
  14. data/test/factories/foreman_kernel_care_factories.rb +14 -2
  15. data/test/test_plugin_helper.rb +4 -1
  16. data/test/unit/host_managed_extensions_test.rb +67 -0
  17. metadata +43 -33
  18. data/app/helpers/concerns/foreman_kernel_care/hosts_helper_extensions.rb +0 -13
  19. data/app/models/concerns/foreman_kernel_care/host_extensions.rb +0 -19
  20. data/app/views/dashboard/_foreman_kernel_care_widget.html.erb +0 -2
  21. data/app/views/foreman_kernel_care/layouts/layouts/new_layout.html.erb +0 -0
  22. data/app/views/foreman_kernel_care/layouts/new_layout.html.erb +0 -0
  23. data/config/routes.rb +0 -9
  24. data/locale/Makefile +0 -60
  25. data/locale/en/foreman_kernel_care.po +0 -19
  26. data/locale/foreman_kernel_care.pot +0 -19
  27. data/locale/gemspec.rb +0 -2
  28. data/package.json +0 -44
  29. data/test/unit/foreman_kernel_care_test.rb +0 -11
  30. data/webpack/global_index.js +0 -17
  31. data/webpack/global_test_setup.js +0 -11
  32. data/webpack/index.js +0 -8
  33. data/webpack/src/Components/EmptyState/Constants.js +0 -2
  34. data/webpack/src/Components/EmptyState/EmptyStateReducer.js +0 -19
  35. data/webpack/src/Components/EmptyState/ExtendedEmptyState.js +0 -43
  36. data/webpack/src/Components/EmptyState/__tests__/ExtendedEmptyState.test.js +0 -37
  37. data/webpack/src/Extends/index.js +0 -15
  38. data/webpack/src/Router/WelcomePage/Welcome.js +0 -9
  39. data/webpack/src/Router/WelcomePage/index.js +0 -1
  40. data/webpack/src/Router/routes.js +0 -12
  41. data/webpack/src/reducers.js +0 -10
  42. data/webpack/test_setup.js +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6d0461ccf8b6c5499dfad71c1a558c9624e38ca96736946a52418a08c29d5cb
4
- data.tar.gz: 1b048269ccdddc043d8dc5bbb35237ae32d1a3e3b8157d63abc3a5c8f1e3e189
3
+ metadata.gz: d1d0ef271076e4187e05dfbb9b3b46c15566c103e735e81edfbe864507664176
4
+ data.tar.gz: cbabb299ec2d3bd510f3828ac20713ceb065f8a551c0b5adec0310a26e0bfdd7
5
5
  SHA512:
6
- metadata.gz: d06f81902376cf81f5539a221080d9c10d4802e4412f0bd86ba9f988a6e1aae5e3a827918f0a1f7646508b1ccd4b129946df51517946f44f3f27556cb4ccac32
7
- data.tar.gz: 5451791474e1a65fc39a29571118f742ba6c205f51fbee6993d38ed6110bf47b4e548860b1bfb0dd842be62ba7919d8433e6e9a9c49de8445d69ac3bfc535e1e
6
+ metadata.gz: 68d4e8475ec10d76a71bf96adf0e20d832868b8263bcc613e685d36f0506e0eee809b2f8f02c968739dc4e6aeb9fe285dbc70a5821a3757f845e74e7e8fb129a
7
+ data.tar.gz: 1a6fc20bb8eb792f6bf4d85db1de7b2935f7b7a51b3ebbddcdc7da8994d5c21032e70cada23a526a73a555cfbeeb8df04ed377c8d1d1751492997d4522933c62
data/README.md CHANGED
@@ -1,27 +1,23 @@
1
1
  # ForemanKernelCare
2
2
 
3
- Plugin for KernelCare
3
+ This plugin removes kernel [trace](https://theforeman.org/plugins/katello/nightly/user_guide/tracer/index.html) and update the kernel package version if [KernelCare](https://www.kernelcare.com/product/) package is installed on host
4
4
 
5
5
  ## Installation
6
6
 
7
- See [How_to_Install_a_Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Plugin)
7
+ See [How_to_Install_a_Plugin](https://www.theforeman.org/plugins/#2.Installation)
8
8
  for how to install Foreman plugins
9
9
 
10
10
  ## Usage
11
11
 
12
12
  Nothing to do, just install plugin
13
13
 
14
- ## TODO
15
-
16
- - Check not only presence of the kernelcare package on host, but also the applied kernel version from kernelcare
17
-
18
14
  ## Contributing
19
15
 
20
16
  Fork and send a Pull Request. Thanks!
21
17
 
22
18
  ## Copyright
23
19
 
24
- Copyright (c) 2021 maccelf
20
+ Copyright (c) 2022 maccelf
25
21
 
26
22
  This program is free software: you can redistribute it and/or modify
27
23
  it under the terms of the GNU General Public License as published by
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
20
  rdoc.rdoc_files.include('lib/**/*.rb')
21
21
  end
22
22
 
23
- APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
23
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
24
24
 
25
25
  Bundler::GemHelper.install_tasks
26
26
 
@@ -38,7 +38,7 @@ task default: :test
38
38
  begin
39
39
  require 'rubocop/rake_task'
40
40
  RuboCop::RakeTask.new
41
- rescue => _
41
+ rescue StandardError => _e
42
42
  puts 'Rubocop not loaded.'
43
43
  end
44
44
 
@@ -0,0 +1,22 @@
1
+ module ForemanKernelCare
2
+ module ForemanTasks
3
+ def callback
4
+ callbacks = params.key?(:callback) ? Array(params) : params[:callbacks]
5
+ ids = callbacks.map { |payload| payload[:callback][:task_id] }
6
+ foreman_tasks = ::ForemanTasks::Task.where(:id => ids)
7
+ external_map = Hash[*foreman_tasks.pluck(:id, :external_id).flatten]
8
+ callbacks.each do |payload|
9
+ # We need to call .to_unsafe_h to unwrap the hash from ActionController::Parameters
10
+ callback = payload[:callback]
11
+ foreman_task = foreman_tasks.find { |task| task.id == callback[:task_id] }
12
+ if foreman_task.action.include?('Get patched kernel version')
13
+ version, release = payload[:data].to_unsafe_h['result'].first['output'].strip.split('-')
14
+ job_invocation = ::JobInvocation.where(:task_id => foreman_task.parent_task_id).first
15
+ job_invocation.targeting.hosts.each { |host| host.update_kernel_version(version, release) }
16
+ end
17
+ process_callback(external_map[callback[:task_id]], callback[:step_id].to_i, payload[:data].to_unsafe_h, :request_id => ::Logging.mdc['request'])
18
+ end
19
+ render :json => { :message => 'processing' }.to_json
20
+ end
21
+ end
22
+ end
@@ -1,19 +1,74 @@
1
1
  module ForemanKernelCare
2
2
  module HostManagedExtensions
3
+ def import_package_profile(simple_packages)
4
+ if kernelcare?
5
+ composer = ::JobInvocationComposer.for_feature(:kernel_version, self)
6
+ composer.triggering.mode = :future
7
+ composer.trigger!
8
+ end
9
+
10
+ found = import_package_profile_in_bulk(simple_packages)
11
+ sync_package_associations(found.map(&:id).uniq)
12
+ end
13
+
3
14
  def import_tracer_profile(tracer_profile)
4
15
  traces = []
5
16
  tracer_profile.each do |trace, attributes|
6
17
  next if attributes[:helper].blank?
7
18
 
8
- next if trace == 'kernel' && kernelcare?
19
+ if trace.to_s == 'kernel' && kernelcare?
20
+ composer = ::JobInvocationComposer.for_feature(:update_kernel, self)
21
+ composer.triggering.mode = :future
22
+ composer.trigger!
9
23
 
10
- traces << { host_id: self.id, application: trace, helper: attributes[:helper], app_type: attributes[:type] }
24
+ next
25
+ end
26
+
27
+ traces << { host_id: id, application: trace, helper: attributes[:helper], app_type: attributes[:type] }
11
28
  end
12
29
  host_traces.delete_all
13
30
  Katello::HostTracer.import(traces, validate: false)
14
31
  update_trace_status
15
32
  end
16
33
 
34
+ def update_kernel_version(version, release)
35
+ packages = ::Katello::InstalledPackage.where('name LIKE ?', '%kernel%').where.not(name: 'kernelcare').to_a
36
+ delete_ids = []
37
+ simple_packages = packages.map do |p|
38
+ delete_ids << p.id
39
+ ::Katello::Pulp::SimplePackage.new({
40
+ arch: p.arch,
41
+ epoch: p.epoch,
42
+ version: version,
43
+ release: release,
44
+ name: p.name
45
+ })
46
+ end
47
+ found = import_package_profile_in_bulk(simple_packages)
48
+ sync_kernel_associations(found.map(&:id).uniq, delete_ids)
49
+ end
50
+
51
+ def sync_kernel_associations(new_patched_kernel_ids, delete_ids)
52
+ ::Katello::Util::Support.active_record_retry do
53
+ table_name = host_installed_packages.table_name
54
+
55
+ queries = []
56
+
57
+ if delete_ids.any?
58
+ queries << "DELETE FROM #{table_name} WHERE host_id=#{id} AND installed_package_id IN (#{delete_ids.join(', ')})"
59
+ end
60
+
61
+ unless new_patched_kernel_ids.empty?
62
+ inserts = new_patched_kernel_ids.map { |unit_id| "(#{unit_id.to_i}, #{id.to_i})" }
63
+ queries << "INSERT INTO #{table_name} (installed_package_id, host_id) VALUES #{inserts.join(', ')}"
64
+ end
65
+
66
+ queries.each do |query|
67
+ ::ActiveRecord::Base.connection.execute(query)
68
+ end
69
+ end
70
+ end
71
+
17
72
  protected
18
73
 
19
74
  def kernelcare?
@@ -0,0 +1,15 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Kernel version
4
+ model: JobTemplate
5
+ job_category: Commands
6
+ description_format: "Get patched kernel version"
7
+ provider_type: SSH
8
+ feature: kernel_version
9
+ %>
10
+ <%
11
+ unless @host.installed_packages.select { |package| package.name == 'kernelcare' }.empty?
12
+ render_error(N_('Unsupported host.'))
13
+ end
14
+ %>
15
+ /usr/bin/kcarectl --uname
@@ -0,0 +1,15 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Update kernel
4
+ model: JobTemplate
5
+ job_category: Commands
6
+ description_format: "Run yum update kernel"
7
+ provider_type: SSH
8
+ feature: update_kernel
9
+ %>
10
+ <%
11
+ unless @host.operatingsystem.family == 'Redhat'
12
+ render_error(N_('Unsupported operating system for this host.'))
13
+ end
14
+ %>
15
+ yum update -y kernel*
@@ -0,0 +1,28 @@
1
+ User.as_anonymous_admin do
2
+ RemoteExecutionFeature.without_auditing do
3
+ if Rails.env.test? || Foreman.in_rake?
4
+ # If this file tries to import a template with a REX feature in a SeedsTest,
5
+ # it will fail - the REX feature isn't registered on SeedsTest because
6
+ # DatabaseCleaner truncates the db before every test.
7
+ # During db:seed, we also want to know the feature is registered before
8
+ # seeding the template
9
+ # kudos to dLobatog
10
+ ForemanKernelCare::Engine.register_rex_feature
11
+ end
12
+ JobTemplate.without_auditing do
13
+ module_template = JobTemplate.find_by(name: 'Update kernel')
14
+ if module_template && !Rails.env.test? && Setting[:remote_execution_sync_templates]
15
+ module_template.sync_feature('update_kernel')
16
+ module_template.organizations << Organization.unscoped.all if module_template.organizations.empty?
17
+ module_template.locations << Location.unscoped.all if module_template.locations.empty?
18
+ end
19
+
20
+ module_template = JobTemplate.find_by(name: 'Kernel version')
21
+ if module_template && !Rails.env.test? && Setting[:remote_execution_sync_templates]
22
+ module_template.sync_feature('kernel_version')
23
+ module_template.organizations << Organization.unscoped.all if module_template.organizations.empty?
24
+ module_template.locations << Location.unscoped.all if module_template.locations.empty?
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ organizations = Organization.unscoped.all
4
+ locations = Location.unscoped.all
5
+ User.as_anonymous_admin do
6
+ RemoteExecutionFeature.without_auditing do
7
+ if Rails.env.test? || Foreman.in_rake?
8
+ # If this file tries to import a template with a REX feature in a SeedsTest,
9
+ # it will fail - the REX feature isn't registered on SeedsTest because
10
+ # DatabaseCleaner truncates the db before every test.
11
+ # During db:seed, we also want to know the feature is registered before
12
+ # seeding the template
13
+ ForemanKernelCare::Engine.register_rex_feature
14
+ end
15
+ JobTemplate.without_auditing do
16
+ Dir[File.join("#{ForemanKernelCare::Engine.root}/app/views/"\
17
+ 'foreman_kernel_care/job_templates/**/*.erb')].each do |template|
18
+ sync = !Rails.env.test? && Setting[:remote_execution_sync_templates]
19
+ template = JobTemplate.import_raw!(File.read(template),
20
+ :default => true,
21
+ :lock => true,
22
+ :update => sync)
23
+ template.organizations = organizations if template.present?
24
+ template.locations = locations if template.present?
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,45 +1,27 @@
1
+ require 'foreman_kernel_care/remote_execution'
2
+
1
3
  module ForemanKernelCare
2
4
  class Engine < ::Rails::Engine
3
5
  isolate_namespace ForemanKernelCare
4
6
  engine_name 'foreman_kernel_care'
5
7
 
6
- config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
7
- config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
8
8
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
9
- config.autoload_paths += Dir["#{config.root}/app/overrides"]
10
-
11
- # Add any db migrations
12
- initializer 'foreman_kernel_care.load_app_instance_data' do |app|
13
- ForemanKernelCare::Engine.paths['db/migrate'].existent.each do |path|
14
- app.config.paths['db/migrate'] << path
15
- end
16
- end
17
9
 
18
10
  initializer 'foreman_kernel_care.register_plugin', :before => :finisher_hook do |_app|
19
11
  Foreman::Plugin.register :foreman_kernel_care do
20
- requires_foreman '>= 2.4.0'
21
-
22
- # Add Global files for extending foreman-core components and routes
23
- register_global_js_file 'global'
12
+ requires_foreman '>= 1.19.0'
24
13
 
25
14
  # Add a new role called 'Discovery' if it doesn't exist
26
- role 'ForemanKernelCare', [:view_foreman_kernel_care]
27
-
28
- # add dashboard widget
29
- widget 'foreman_kernel_care_widget', name: N_('KernelCare widget'), sizex: 4, sizey: 1
15
+ role 'Foreman KernelCare', [:view_job_templates]
30
16
  end
31
17
  end
32
18
 
33
19
  # Include concerns in this config.to_prepare block
34
20
  config.to_prepare do
35
-
36
- begin
37
- Host::Managed.send(:include, ForemanKernelCare::HostExtensions)
38
- HostsHelper.send(:include, ForemanKernelCare::HostsHelperExtensions)
39
- Katello::Concerns::HostManagedExtensions.send(:prepend, ForemanKernelCare::HostManagedExtensions)
40
- rescue => e
41
- Rails.logger.warn "ForemanKernelCare: skipping engine hook (#{e})"
42
- end
21
+ Katello::Concerns::HostManagedExtensions.prepend ForemanKernelCare::HostManagedExtensions
22
+ ForemanTasks::Api::TasksController.prepend ForemanKernelCare::ForemanTasks
23
+ rescue StandardError => e
24
+ Rails.logger.warn "ForemanKernelCare: skipping engine hook (#{e})"
43
25
  end
44
26
 
45
27
  rake_tasks do
@@ -47,11 +29,5 @@ module ForemanKernelCare
47
29
  ForemanKernelCare::Engine.load_seed
48
30
  end
49
31
  end
50
-
51
- initializer 'foreman_kernel_care.register_gettext', after: :load_config_initializers do |_app|
52
- locale_dir = File.join(File.expand_path('../../..', __FILE__), 'locale')
53
- locale_domain = 'foreman_kernel_care'
54
- Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
55
- end
56
32
  end
57
33
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'foreman_remote_execution'
4
+
5
+ module ForemanKernelCare
6
+ # Dependencies related with the remote execution plugin
7
+ class Engine < ::Rails::Engine
8
+ def self.register_rex_feature
9
+ RemoteExecutionFeature.register(
10
+ :update_kernel,
11
+ N_('Run Update kernel'),
12
+ :description => N_('Runs Update kernel')
13
+ )
14
+
15
+ RemoteExecutionFeature.register(
16
+ :kernel_version,
17
+ N_('Get patched kernel version'),
18
+ :description => N_('Get patched kernel version')
19
+ )
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module ForemanKernelCare
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -1,15 +1,5 @@
1
1
  require 'rake/testtask'
2
2
 
3
- # Tasks
4
- namespace :foreman_kernel_care do
5
- namespace :example do
6
- desc 'Example Task'
7
- task task: :environment do
8
- # Task goes here
9
- end
10
- end
11
- end
12
-
13
3
  # Tests
14
4
  namespace :test do
15
5
  desc 'Test ForemanKernelCare'
@@ -24,7 +14,7 @@ namespace :test do
24
14
  end
25
15
 
26
16
  namespace :foreman_kernel_care do
27
- task :rubocop do
17
+ task rubocop: :environment do
28
18
  begin
29
19
  require 'rubocop/rake_task'
30
20
  RuboCop::RakeTask.new(:rubocop_foreman_kernel_care) do |task|
@@ -32,7 +22,7 @@ namespace :foreman_kernel_care do
32
22
  "#{ForemanKernelCare::Engine.root}/lib/**/*.rb",
33
23
  "#{ForemanKernelCare::Engine.root}/test/**/*.rb"]
34
24
  end
35
- rescue
25
+ rescue StandardError
36
26
  puts 'Rubocop not loaded.'
37
27
  end
38
28
 
@@ -1,5 +1,17 @@
1
- FactoryBot.define do
1
+ FactoryBot.modify do
2
2
  factory :host do
3
- name 'foreman_kernel_care'
3
+ trait :with_kernelcare do
4
+ after(:create) do |host|
5
+ package_json = {
6
+ :name => 'kernelcare',
7
+ :version => '2.54',
8
+ :release => '1.el7',
9
+ :arch => 'x86_64',
10
+ :epoch => '1',
11
+ :nvra => 'kernelcare-2.54-1.el7.x86_64'
12
+ }
13
+ host.import_package_profile([::Katello::Pulp::SimplePackage.new(package_json)])
14
+ end
15
+ end
4
16
  end
5
17
  end
@@ -2,5 +2,8 @@
2
2
  require 'test_helper'
3
3
 
4
4
  # Add plugin to FactoryBot's paths
5
- FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
5
+ rex_factories_path = "#{ForemanRemoteExecution::Engine.root}/test/factories"
6
+ plugin_factories_path = File.join(File.dirname(__FILE__), 'factories')
7
+ FactoryBot.definition_file_paths << rex_factories_path
8
+ FactoryBot.definition_file_paths << plugin_factories_path
6
9
  FactoryBot.reload
@@ -0,0 +1,67 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanKernelCare
4
+ class HostManagedExtensionsTestBase < ActiveSupport::TestCase
5
+ end
6
+
7
+ class HostInstalledPackagesTest < HostManagedExtensionsTestBase
8
+ def setup
9
+ feature = RemoteExecutionFeature.register('kernel_version', 'Kernel version')
10
+ template = FactoryBot.create(:job_template, name: 'Kernel versionl')
11
+ template.sync_feature(feature.label)
12
+
13
+ @host = FactoryBot.create(:host, :with_kernelcare)
14
+ package_json = {:name => "kernel", :version => "1", :release => "1.el7", :arch => "x86_64", :epoch => "1",
15
+ :nvra => "kernel-1-1.el7.x86_64"}
16
+ @host.import_package_profile([::Katello::Pulp::SimplePackage.new(package_json)])
17
+ @nvra = 'kernel-1-1.el7.x86_64'
18
+ @host.reload
19
+ end
20
+
21
+ def test_update_kernel_version
22
+ version = '2'
23
+ release = '2.el7'
24
+ @host.update_kernel_version(version, release)
25
+ kernel_package = @host.installed_packages.where(name: 'kernel').first
26
+
27
+ assert_not_equal kernel_package.nvra, @nvra
28
+ assert_equal kernel_package.version, version
29
+ assert_equal kernel_package.release, release
30
+ end
31
+ end
32
+
33
+ class HostTracerTest < HostManagedExtensionsTestBase
34
+ def setup
35
+ feature = RemoteExecutionFeature.register('update_kernel', 'Update Kernel')
36
+ template = FactoryBot.create(:job_template, name: 'Update kernel')
37
+ template.sync_feature(feature.label)
38
+
39
+ @tracer_json = {
40
+ "kernel": {
41
+ "type": 'static',
42
+ "helper": 'You will have to reboot your computer'
43
+ }
44
+ }
45
+ end
46
+
47
+ def test_import_kerenl_trace_with_kernelcare
48
+ host = FactoryBot.create(:host, :with_kernelcare)
49
+ host.import_tracer_profile(@tracer_json)
50
+ host.reload
51
+
52
+ assert_empty host.host_traces.where(application: 'kernel')
53
+ assert_equal 1, JobInvocation.count
54
+ assert_equal 'Update kernel', JobInvocation.first.description
55
+ end
56
+
57
+ def test_import_kerenl_trace_without_kernelcare
58
+ host = FactoryBot.create(:host)
59
+ host.import_tracer_profile(@tracer_json)
60
+ host.reload
61
+
62
+ assert_equal 1, host.host_traces.count
63
+ assert_equal 'kernel', host.host_traces.first.application
64
+ assert_empty JobInvocation.all
65
+ end
66
+ end
67
+ end
metadata CHANGED
@@ -1,17 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_kernel_care
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxim Petukhov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-21 00:00:00.000000000 Z
11
+ date: 2022-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rubocop
14
+ name: foreman_remote_execution
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: katello
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.8.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - ">="
@@ -25,7 +53,7 @@ dependencies:
25
53
  - !ruby/object:Gem::Version
26
54
  version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
- name: rdoc
56
+ name: rubocop
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - ">="
@@ -38,7 +66,8 @@ dependencies:
38
66
  - - ">="
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
- description: Plugin for KernelCare
69
+ description: This plugin removes kernel trace if KernelCare package is installed on
70
+ host
42
71
  email:
43
72
  - maxmol27@gmail.com
44
73
  executables: []
@@ -48,38 +77,20 @@ files:
48
77
  - LICENSE
49
78
  - README.md
50
79
  - Rakefile
51
- - app/helpers/concerns/foreman_kernel_care/hosts_helper_extensions.rb
52
- - app/models/concerns/foreman_kernel_care/host_extensions.rb
80
+ - app/controllers/concerns/foreman_kernel_care/foreman_tasks.rb
53
81
  - app/models/concerns/foreman_kernel_care/host_managed_extensions.rb
54
- - app/views/dashboard/_foreman_kernel_care_widget.html.erb
55
- - app/views/foreman_kernel_care/layouts/layouts/new_layout.html.erb
56
- - app/views/foreman_kernel_care/layouts/new_layout.html.erb
57
- - config/routes.rb
82
+ - app/views/foreman_kernel_care/job_templates/kernel_version.erb
83
+ - app/views/foreman_kernel_care/job_templates/update_kernel.erb
84
+ - db/seeds.d/100_assign_features_with_templates.rb
85
+ - db/seeds.d/70_job_templates.rb
58
86
  - lib/foreman_kernel_care.rb
59
87
  - lib/foreman_kernel_care/engine.rb
88
+ - lib/foreman_kernel_care/remote_execution.rb
60
89
  - lib/foreman_kernel_care/version.rb
61
90
  - lib/tasks/foreman_kernel_care_tasks.rake
62
- - locale/Makefile
63
- - locale/en/foreman_kernel_care.po
64
- - locale/foreman_kernel_care.pot
65
- - locale/gemspec.rb
66
- - package.json
67
91
  - test/factories/foreman_kernel_care_factories.rb
68
92
  - test/test_plugin_helper.rb
69
- - test/unit/foreman_kernel_care_test.rb
70
- - webpack/global_index.js
71
- - webpack/global_test_setup.js
72
- - webpack/index.js
73
- - webpack/src/Components/EmptyState/Constants.js
74
- - webpack/src/Components/EmptyState/EmptyStateReducer.js
75
- - webpack/src/Components/EmptyState/ExtendedEmptyState.js
76
- - webpack/src/Components/EmptyState/__tests__/ExtendedEmptyState.test.js
77
- - webpack/src/Extends/index.js
78
- - webpack/src/Router/WelcomePage/Welcome.js
79
- - webpack/src/Router/WelcomePage/index.js
80
- - webpack/src/Router/routes.js
81
- - webpack/src/reducers.js
82
- - webpack/test_setup.js
93
+ - test/unit/host_managed_extensions_test.rb
83
94
  homepage: https://github.com/maccelf/foreman_kernel_care
84
95
  licenses:
85
96
  - GPL-3.0
@@ -104,7 +115,6 @@ signing_key:
104
115
  specification_version: 4
105
116
  summary: Plugin for KernelCare
106
117
  test_files:
107
- - test/test_plugin_helper.rb
108
- - test/unit/foreman_kernel_care_test.rb
109
118
  - test/factories/foreman_kernel_care_factories.rb
110
- - webpack/src/Components/EmptyState/__tests__/ExtendedEmptyState.test.js
119
+ - test/test_plugin_helper.rb
120
+ - test/unit/host_managed_extensions_test.rb
@@ -1,13 +0,0 @@
1
- module ForemanKernelCare
2
- module HostsHelperExtensions
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- # execute callbacks
7
- end
8
-
9
- # create or overwrite instance methods...
10
- def instance_method_name
11
- end
12
- end
13
- end
@@ -1,19 +0,0 @@
1
- module ForemanKernelCare
2
- module HostExtensions
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- # execute callbacks
7
- end
8
-
9
- # create or overwrite instance methods...
10
- def instance_method_name
11
- end
12
-
13
- module ClassMethods
14
- # create or overwrite class methods...
15
- def class_method_name
16
- end
17
- end
18
- end
19
- end
@@ -1,2 +0,0 @@
1
- <h4 class="header ca"><%= _('ForemanKernelCare') %></h4>
2
- <%= _('Widget content') %>
data/config/routes.rb DELETED
@@ -1,9 +0,0 @@
1
- ForemanKernelCare::Engine.routes.draw do
2
- get 'new_action', to: 'example#new_action', as: 'new_action'
3
- get 'plugin_template_description', to: 'example#react_template_page_description'
4
- get 'welcome', to: '/react#index', as: 'welcome'
5
- end
6
-
7
- Foreman::Application.routes.draw do
8
- mount ForemanKernelCare::Engine, at: '/foreman_kernel_care'
9
- end
data/locale/Makefile DELETED
@@ -1,60 +0,0 @@
1
- #
2
- # Makefile for PO merging and MO generation. More info in the README.
3
- #
4
- # make all-mo (default) - generate MO files
5
- # make check - check translations using translate-tool
6
- # make tx-update - download and merge translations from Transifex
7
- # make clean - clean everything
8
- #
9
- DOMAIN = foreman_kernel_care
10
- VERSION = $(shell ruby -e 'require "rubygems";spec = Gem::Specification::load(Dir.glob("../*.gemspec")[0]);puts spec.version')
11
- POTFILE = $(DOMAIN).pot
12
- MOFILE = $(DOMAIN).mo
13
- POFILES = $(shell find . -name '$(DOMAIN).po')
14
- MOFILES = $(patsubst %.po,%.mo,$(POFILES))
15
- POXFILES = $(patsubst %.po,%.pox,$(POFILES))
16
- EDITFILES = $(patsubst %.po,%.edit.po,$(POFILES))
17
-
18
- %.mo: %.po
19
- mkdir -p $(shell dirname $@)/LC_MESSAGES
20
- msgfmt -o $(shell dirname $@)/LC_MESSAGES/$(MOFILE) $<
21
-
22
- # Generate MO files from PO files
23
- all-mo: $(MOFILES)
24
-
25
- # Check for malformed strings
26
- %.pox: %.po
27
- msgfmt -c $<
28
- pofilter --nofuzzy -t variables -t blank -t urls -t emails -t long -t newlines \
29
- -t endwhitespace -t endpunc -t puncspacing -t options -t printf -t validchars --gnome $< > $@
30
- cat $@
31
- ! grep -q msgid $@
32
-
33
- %.edit.po:
34
- touch $@
35
-
36
- check: $(POXFILES)
37
-
38
- # Unify duplicate translations
39
- uniq-po:
40
- for f in $(shell find ./ -name "*.po") ; do \
41
- msguniq $$f -o $$f ; \
42
- done
43
-
44
- tx-pull: $(EDITFILES)
45
- tx pull -f
46
- for f in $(EDITFILES) ; do \
47
- sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
48
- done
49
-
50
- tx-update: tx-pull
51
- @echo
52
- @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation, then make -C locale mo-files to finish
53
- @echo
54
-
55
- mo-files: $(MOFILES)
56
- git add $(POFILES) $(POTFILE) ../locale/*/LC_MESSAGES
57
- git commit -m "i18n - pulling from tx"
58
- @echo
59
- @echo Changes commited!
60
- @echo
@@ -1,19 +0,0 @@
1
- # foreman_kernel_care
2
- #
3
- # This file is distributed under the same license as foreman_kernel_care.
4
- #
5
- #, fuzzy
6
- msgid ""
7
- msgstr ""
8
- "Project-Id-Version: version 0.0.1\n"
9
- "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2014-08-20 08:46+0100\n"
11
- "PO-Revision-Date: 2014-08-20 08:54+0100\n"
12
- "Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
13
- "Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
14
- "Language: \n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=UTF-8\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
- "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19
-
@@ -1,19 +0,0 @@
1
- # foreman_kernel_care
2
- #
3
- # This file is distributed under the same license as foreman_kernel_care.
4
- #
5
- #, fuzzy
6
- msgid ""
7
- msgstr ""
8
- "Project-Id-Version: version 0.0.1\n"
9
- "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2014-08-20 08:46+0100\n"
11
- "PO-Revision-Date: 2014-08-20 08:46+0100\n"
12
- "Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
13
- "Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
14
- "Language: \n"
15
- "MIME-Version: 1.0\n"
16
- "Content-Type: text/plain; charset=UTF-8\n"
17
- "Content-Transfer-Encoding: 8bit\n"
18
- "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
-
data/locale/gemspec.rb DELETED
@@ -1,2 +0,0 @@
1
- # Matches foreman_kernel_care.gemspec
2
- _('TODO: Description of ForemanKernelCare.')
data/package.json DELETED
@@ -1,44 +0,0 @@
1
- {
2
- "name": "foreman_kernel_care",
3
- "version": "1.0.0",
4
- "description": "DESCRIPTION",
5
- "main": "index.js",
6
- "scripts": {
7
- "lint": "tfm-lint --plugin -d /webpack",
8
- "test": "tfm-test --config jest.config.js",
9
- "test:watch": "tfm-test --plugin --watchAll",
10
- "test:current": "tfm-test --plugin --watch",
11
- "publish-coverage": "tfm-publish-coverage",
12
- "stories": "tfm-stories --plugin",
13
- "stories:build": "tfm-build-stories --plugin",
14
- "create-react-component": "yo react-domain"
15
- },
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/theforeman/foreman_kernel_care.git"
19
- },
20
- "bugs": {
21
- "url": "http://projects.theforeman.org/projects/foreman_kernel_care/issues"
22
- },
23
- "peerDependencies": {
24
- "@theforeman/vendor": ">= 6.0.0"
25
- },
26
- "dependencies": {
27
- "react-intl": "^2.8.0"
28
- },
29
- "devDependencies": {
30
- "@babel/core": "^7.7.0",
31
- "@sheerun/mutationobserver-shim": "^0.3.3",
32
- "@theforeman/builder": "^6.0.0",
33
- "@theforeman/eslint-plugin-foreman": "6.0.0",
34
- "@theforeman/find-foreman": "^4.8.0",
35
- "@theforeman/stories": "^7.0.0",
36
- "@theforeman/test": "^8.0.0",
37
- "@theforeman/vendor-dev": "^6.0.0",
38
- "babel-eslint": "^10.0.3",
39
- "eslint": "^6.7.2",
40
- "prettier": "^1.19.1",
41
- "stylelint-config-standard": "^18.0.0",
42
- "stylelint": "^9.3.0"
43
- }
44
- }
@@ -1,11 +0,0 @@
1
- require 'test_plugin_helper'
2
-
3
- class ForemanPluginTemplateTest < ActiveSupport::TestCase
4
- setup do
5
- User.current = User.find_by_login 'admin'
6
- end
7
-
8
- test 'the truth' do
9
- assert true
10
- end
11
- end
@@ -1,17 +0,0 @@
1
- import { registerReducer } from 'foremanReact/common/MountingService';
2
- import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
3
- import { registerRoutes } from 'foremanReact/routes/RoutingService';
4
- import Routes from './src/Router/routes'
5
- import reducers from './src/reducers';
6
-
7
- // register reducers
8
- Object.entries(reducers).forEach(([key, reducer]) =>
9
- registerReducer(key, reducer)
10
- );
11
-
12
- // register client routes
13
- registerRoutes('PluginTemplate', Routes);
14
-
15
- // register fills for extending foreman core
16
- // http://foreman.surge.sh/?path=/docs/introduction-slot-and-fill--page
17
- addGlobalFill('<slotId>', '<fillId>', <div key='plugin-template-example' />, 300);
@@ -1,11 +0,0 @@
1
- // runs before each test to make sure console.error output will
2
- // fail a test (i.e. default PropType missing). Check the error
3
- // output and traceback for actual error.
4
- global.console.error = (error, stack) => {
5
- /* eslint-disable-next-line no-console */
6
- if (stack) console.log(stack); // Prints out original stack trace
7
- throw new Error(error);
8
- };
9
-
10
- // Increase jest timeout as some tests using multiple http mocks can time out on CI systems.
11
- jest.setTimeout(10000);
data/webpack/index.js DELETED
@@ -1,8 +0,0 @@
1
- import componentRegistry from 'foremanReact/components/componentRegistry';
2
- import ExtendedEmptyState from './src/Components/EmptyState/ExtendedEmptyState';
3
-
4
- // register components for erb mounting
5
- componentRegistry.register({
6
- name: 'ExtendedEmptyState',
7
- type: ExtendedEmptyState,
8
- });
@@ -1,2 +0,0 @@
1
- export const GENERAL_ACTION_TYPE = '[PLUGIN_TEMPLATE] GENERAL ACTION';
2
- export const FOREMAN_STORYBOOK = 'https://foreman.surge.sh';
@@ -1,19 +0,0 @@
1
- // This is an example for a generic redux's reducer
2
- // Reducers should be registered to foreman-core
3
- // For a further registration demonstration, have a look in `webpack/global_index.js`
4
-
5
- import Immutable from 'seamless-immutable';
6
- import { GENERAL_ACTION_TYPE } from './Constants';
7
-
8
- const initialState = Immutable({});
9
-
10
- export default (state = initialState, action) => {
11
- const { payload } = action;
12
-
13
- switch (action.type) {
14
- case GENERAL_ACTION_TYPE:
15
- return state.set('generalProprty', payload);
16
- default:
17
- return state;
18
- }
19
- };
@@ -1,43 +0,0 @@
1
- import React from 'react';
2
- import { Button, Alert } from '@patternfly/react-core';
3
- import EmptyState from 'foremanReact/components/common/EmptyState/EmptyStatePattern';
4
- import SkeletonLoader from 'foremanReact/components/common/SkeletonLoader';
5
- import PropTypes from 'prop-types';
6
-
7
- import { STATUS } from 'foremanReact/constants'
8
- import { useAPI } from 'foremanReact/common/hooks/API/APIHooks'
9
- import { translate as __ } from 'foremanReact/common/I18n';
10
- import { FOREMAN_STORYBOOK } from './Constants';
11
-
12
- const ExtendedEmptyState = ({ header }) => {
13
- // AJAX request using useAPI hook
14
- const { response: { description }, status } = useAPI('get', '/foreman_kernel_care/plugin_template_description')
15
-
16
-
17
- const storybookBtn = (
18
- <Button onClick={() => window.open(FOREMAN_STORYBOOK, '_blank')}>
19
- Storybook
20
- </Button>
21
- );
22
-
23
- switch (status) {
24
- case STATUS.ERROR:
25
- return (<Alert variant="danger" title={__("Loading description has failed")} />);
26
- case STATUS.RESOLVED: return (
27
- <EmptyState
28
- icon="add-circle-o"
29
- action={storybookBtn}
30
- header={header}
31
- description={description}
32
- documentation={false}
33
- />
34
- )
35
- default:
36
- return (<SkeletonLoader isLoading={status === STATUS.PENDING} count={5} />);
37
- }
38
- };
39
- ExtendedEmptyState.PropTypes = {
40
- header: PropTypes.string.isRequired
41
- };
42
-
43
- export default ExtendedEmptyState;
@@ -1,37 +0,0 @@
1
- // Tests work with react-testing-library or enzyme
2
- // This test uses react testing library
3
- // https://testing-library.com/docs/react-testing-library/api
4
-
5
- // For more information, test utils, and snapshots testing examples:
6
- // https://github.com/theforeman/foreman-js/tree/master/packages/test
7
-
8
-
9
- import React from 'react';
10
- import { createStore, applyMiddleware, combineReducers } from 'redux';
11
- import { render, waitFor, screen } from '@testing-library/react'
12
- import { Provider } from 'react-redux';
13
-
14
- import { reducers as APIReducer } from 'foremanReact/redux/API';
15
- import { middlewares } from 'foremanReact/redux/middlewares';
16
- import APIHelper from 'foremanReact/redux/API/API';
17
- import ExtendedEmptyState from '../ExtendedEmptyState';
18
-
19
- jest.mock('foremanReact/redux/API/API');
20
-
21
- const reducers = combineReducers(APIReducer);
22
- const store = createStore(reducers, applyMiddleware(...middlewares));
23
- const wrapper = ({ children }) => (
24
- <Provider store={store}>{children}</Provider>
25
- );
26
- describe('foreman plugin template', () => {
27
- it('should render an error alert', async () => {
28
- APIHelper.get.mockRejectedValue({ error: new Error() });
29
- render(<ExtendedEmptyState />, { wrapper });
30
- await waitFor(() => expect(screen.getByText('Loading description has failed')).toBeInTheDocument());
31
- });
32
- it('should render an empty state with custom description', async () => {
33
- APIHelper.get.mockResolvedValue({ data: { description: 'some description' } });
34
- render(<ExtendedEmptyState />, { wrapper });
35
- await waitFor(() => expect(screen.getByText('some description')).toBeInTheDocument());
36
- });
37
- });
@@ -1,15 +0,0 @@
1
- // This is an example of extending foreman-core's component via slot&fill
2
- // http://foreman.surge.sh/?path=/docs/introduction-slot-and-fill--page
3
- /*
4
- import React from 'react';
5
- import { addGlobalFill } from 'foremanReact/components/common/Fill/GlobalFill';
6
-
7
- addGlobalFill('slotId', 'fillId', <SomeComponent key="some-key" />, 300);
8
-
9
- addGlobalFill(
10
- 'slotId',
11
- 'fillId',
12
- { someProp: 'this is an override prop' },
13
- 300
14
- );
15
- */
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import ExtendedEmptyState from '../../Components/EmptyState/ExtendedEmptyState';
3
- import { translate as __ } from 'foremanReact/common/I18n';
4
-
5
- const WelcomePage = () => (
6
- <ExtendedEmptyState header={__("Welcome to the plugin template")} />
7
- );
8
-
9
- export default WelcomePage;
@@ -1 +0,0 @@
1
- export { default } from './Welcome';
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import WelcomePage from './WelcomePage';
3
-
4
- const routes = [
5
- {
6
- path: '/foreman_kernel_care/welcome',
7
- exact: true,
8
- render: (props) => <WelcomePage {...props} />,
9
- },
10
- ];
11
-
12
- export default routes;
@@ -1,10 +0,0 @@
1
- import { combineReducers } from 'redux';
2
- import EmptyStateReducer from './Components/EmptyState/EmptyStateReducer';
3
-
4
- const reducers = {
5
- foremanKernelCare: combineReducers({
6
- emptyState: EmptyStateReducer,
7
- }),
8
- };
9
-
10
- export default reducers;
@@ -1,17 +0,0 @@
1
- import 'core-js/shim';
2
- import 'regenerator-runtime/runtime';
3
- import MutationObserver from '@sheerun/mutationobserver-shim';
4
-
5
- import { configure } from 'enzyme';
6
- import Adapter from 'enzyme-adapter-react-16';
7
-
8
- configure({ adapter: new Adapter() });
9
-
10
- // Mocking translation function
11
- global.__ = text => text; // eslint-disable-line
12
-
13
- // Mocking locales to prevent unnecessary fallback messages
14
- window.locales = { en: { domain: 'app', locale_data: { app: { '': {} } } } };
15
-
16
- // see https://github.com/testing-library/dom-testing-library/releases/tag/v7.0.0
17
- window.MutationObserver = MutationObserver;