foreman_leapp 0.0.5 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -20
  3. data/app/controllers/api/v2/concerns/api_authorizer.rb +27 -0
  4. data/app/controllers/api/v2/preupgrade_reports_controller.rb +21 -2
  5. data/app/controllers/preupgrade_reports_controller.rb +11 -1
  6. data/app/lib/actions/preupgrade_job.rb +2 -1
  7. data/app/lib/helpers/job_helper.rb +3 -4
  8. data/app/models/preupgrade_report.rb +1 -0
  9. data/app/models/preupgrade_report_entry.rb +1 -0
  10. data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +1 -1
  11. data/app/views/api/v2/preupgrade_reports/job_invocation.json.rabl +3 -0
  12. data/app/views/foreman_leapp/job_templates/leapp_check.erb +15 -0
  13. data/app/views/foreman_leapp/job_templates/{preupgrade.erb → leapp_preupgrade.erb} +5 -2
  14. data/app/views/foreman_leapp/job_templates/leapp_remediation.erb +29 -0
  15. data/app/views/foreman_leapp/job_templates/leapp_upgrade.erb +26 -0
  16. data/app/views/job_invocations/_leapp_preupgrade_report.html.erb +2 -1
  17. data/config/routes.rb +2 -1
  18. data/db/migrate/20200429080939_report_entries_flags.rb +5 -0
  19. data/db/seeds.d/10_leapp_preupgrade.rb +1 -1
  20. data/lib/foreman_leapp/engine.rb +7 -6
  21. data/lib/foreman_leapp/version.rb +1 -1
  22. data/package.json +3 -2
  23. data/test/functional/api/v2/preupgrade_reports_controller_test.rb +89 -6
  24. data/test/functional/preupgrade_reports_controller_test.rb +27 -4
  25. data/test/unit/actions/preupgrade_job_test.rb +1 -1
  26. data/test/unit/helpers/job_helper_test.rb +3 -10
  27. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +4 -0
  28. data/webpack/__mocks__/foremanReact/common/I18n.js +1 -1
  29. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
  30. data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +1 -0
  31. data/webpack/components/PreupgradeReports/PreupgradeReports.js +119 -8
  32. data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +1 -1
  33. data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +152 -0
  34. data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +2 -0
  35. data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +11 -0
  36. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +72 -2
  37. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +26 -1
  38. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +78 -0
  39. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +60 -5
  40. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +489 -0
  41. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +40 -1
  42. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +36 -1
  43. data/webpack/components/PreupgradeReports/components/EntriesFilter.js +121 -0
  44. data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +3 -0
  45. data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +30 -0
  46. data/webpack/components/PreupgradeReports/components/FixSelectedButton.js +35 -0
  47. data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +15 -0
  48. data/webpack/components/PreupgradeReports/components/NoReports.js +35 -0
  49. data/webpack/components/PreupgradeReports/components/NoReports.test.js +15 -0
  50. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +29 -0
  51. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.test.js +17 -0
  52. data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +330 -0
  53. data/webpack/components/PreupgradeReports/components/__snapshots__/FixSelectedButton.test.js.snap +40 -0
  54. data/webpack/components/PreupgradeReports/components/__snapshots__/NoReports.test.js.snap +19 -0
  55. data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +29 -0
  56. data/webpack/components/PreupgradeReports/index.js +28 -5
  57. data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +37 -0
  58. data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +28 -2
  59. data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +119 -0
  60. data/webpack/components/PreupgradeReportsList/components/InfoItem.js +1 -1
  61. data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +33 -0
  62. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +50 -6
  63. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +56 -0
  64. data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +50 -0
  65. data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +27 -0
  66. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js +38 -0
  67. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +2 -0
  68. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +14 -0
  69. data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +29 -0
  70. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +32 -0
  71. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +95 -14
  72. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +113 -0
  73. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +36 -0
  74. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +191 -29
  75. data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +19 -8
  76. data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +15 -0
  77. data/webpack/components/PreupgradeReportsList/components/helpers.js +177 -21
  78. data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +61 -0
  79. data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +61 -0
  80. data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +62 -0
  81. data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +62 -0
  82. data/webpack/components/PreupgradeReportsList/index.js +48 -10
  83. data/webpack/csrf.js +4 -0
  84. metadata +61 -10
  85. data/app/views/foreman_leapp/job_templates/remediation.erb +0 -17
  86. data/app/views/foreman_leapp/job_templates/upgrade.erb +0 -16
  87. data/webpack/components/PreupgradeReportsList/components/StringInfoItem.js +0 -49
  88. data/webpack/components/PreupgradeReportsList/components/__tests__/StringInfoItem.test.js +0 -13
  89. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/StringInfoItem.test.js.snap +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac3a9d3e20cffd15a2af9742b3db9f7a85e8b2e431de19f87d7bd4a9a0085126
4
- data.tar.gz: 7c4ff5f9d6eef8f247bd24132503dce1cc56e4252e268d68373d8b1ee7d29293
3
+ metadata.gz: de5248403683c119d2f8c4b7b331bbf5bc7125e408f8c5a0be2449191861926d
4
+ data.tar.gz: 4a08a8dc04d0e2d78fc76124b1cf5c2bc3c2cbb716f12bc376609d3d1e96ef9c
5
5
  SHA512:
6
- metadata.gz: 256603788044ab3fbc6d8ad94c4407dfbddaf6617fc330df1f2bdbee00e89b43652a653e5ac92eb0ed9f5e8480620c701c76eb7431420c2985fc03e6620a0708
7
- data.tar.gz: 8c941412d342bf483ce90409c38d2f30ad153c6680168791fc8221d7706c61cd034549c529d88f257d4760b0b95c43f7da196e13fdd1fda914e6cd1a40123785
6
+ metadata.gz: 3a2781a3d87d9b0b2dc94e8deb61f0a5ae3ca62c10d3a3d2a36efdab31edbca9a959c45dfd85b1e050061fc5af552d95bf4b85dddf7dba18731f55c3e9040bb1
7
+ data.tar.gz: 78f6881ddbb87523c898375bb5ba7d61bb0e9912deb50739f94a07035c77585ea0be585374e298bd41719baf1026ebed4e9b2e3137ce9efd300ae69408582312
data/README.md CHANGED
@@ -1,32 +1,23 @@
1
1
  # ForemanLeapp
2
2
 
3
- This plugin allows to run inplace upgrades for rhel7 vms in foreman using leapp tool.
4
- For more information about leapp check [github](https://github.com/oamg/leapp) or
5
- [developer docs](https://leapp.readthedocs.io/en/latest/).
3
+ This plugin allows to run inplace upgrades for RHEL 7 hosts in Foreman using Leapp tool.
4
+ For more information about Leapp tool check [github](https://github.com/oamg/leapp) or [developer docs](https://leapp.readthedocs.io/en/latest/).
6
5
 
7
6
  ## Installation
8
7
 
9
- See [How_to_Install_a_Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Plugin)
10
- for how to install Foreman plugins
8
+ See [Plugins Manual](https://www.theforeman.org/plugins/#2.Installation) for how to install Foreman plugins.
11
9
 
12
10
  ## Usage
13
11
 
14
- The plugin will add 2 remote execution jobs, "Run preupgrade via leapp" and "Run upgrade via leapp". Only
15
- preupgrade reports storage and retrieval has been implemented so far.
12
+ The plugin will add following jobs:
13
+ - Run preupgrade via Leapp
14
+ - Remediation plan
15
+ - Run upgrade via Leapp
16
16
 
17
- After running a preupgrade remote execution job on one or more foreman hosts the report can be retrieved from foreman db.
18
-
19
- The retrieval api looks like:
20
-
21
- - to fetch a specific preupgrade report - GET http://FOREMAN_URL:FOREMAN_PORT/api/v2/preupgrade_reports/REPORT_ID.
22
- - to fetch all reports for specific job invocation - GET http://FOREMAN_URL:FOREMAN_PORT/api/v2/aggregation/JOB_INVOCATION_ID.
23
- - to fetch last preupgrade report per host - GET http://FOREMAN_URL:FOREMAN_PORT/api/v2/preupgrade_reports/hosts/HOST_NAME_OR_ID/last.
24
-
25
- ## TODO
26
-
27
- - Unit tests
28
- - Automate rubocop checks
29
- - Frontend (either from scratch or adapt the react/patternfly/typescript one for cockpit upgrades)
17
+ ## Api
18
+ - `GET /api/preupgrade_reports` List Preupgrade reports
19
+ - `GET /api/preupgrade_reports/:id` Show Preupgrade report
20
+ - `GET /api/job_invocations/:id/preupgrade_reports` List Preupgrade reports for Job invocation
30
21
 
31
22
  ## Contributing
32
23
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApiAuthorizer
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :hosts_permission
8
+ end
9
+
10
+ private
11
+
12
+ def hosts_permission
13
+ return if User.current.can?('view_hosts')
14
+
15
+ render_error 'access_denied', status: :forbidden,
16
+ locals: { details: _('Missing one of the required permissions: view_hosts'),
17
+ missing_permissions: 'view_hosts' }
18
+ end
19
+
20
+ def resource_scope(_options = {})
21
+ @resource_scope ||= begin
22
+ scope = PreupgradeReport.joins(:host).merge(Host.authorized(:view_hosts, Host))
23
+ scope = scope.where(job_invocation_id: params[:id]) if action_name == 'job_invocation'
24
+ scope
25
+ end
26
+ end
27
+ end
@@ -3,7 +3,9 @@
3
3
  module Api
4
4
  module V2
5
5
  class PreupgradeReportsController < ::Api::V2::BaseController
6
- before_action :find_resource, only: %i[show]
6
+ include ApiAuthorizer
7
+
8
+ layout 'api/v2/layouts/index_layout', except: %i[show]
7
9
 
8
10
  api :GET, '/preupgrade_reports/', N_('List Preupgrade reports')
9
11
  param_group :search_and_pagination, ::Api::V2::BaseController
@@ -13,7 +15,24 @@ module Api
13
15
 
14
16
  api :GET, '/preupgrade_reports/:id', N_('Show Preupgrade report')
15
17
  param :id, :identifier, required: true
16
- def show; end
18
+ def show
19
+ @preupgrade_report = resource_scope.find(params[:id])
20
+ end
21
+
22
+ api :GET, '/job_invocations/:id/preupgrade_reports', N_('List Preupgrade reports for Job invocation')
23
+ param :id, :identifier, required: true
24
+ def job_invocation
25
+ @preupgrade_reports = resource_scope_for_index.where(job_invocation_id: params[:id])
26
+ end
27
+
28
+ private
29
+
30
+ # By overriding path_to_authenticate we can require REX's permission view_job_invocations
31
+ def path_to_authenticate
32
+ params['action'] = 'show' if params['action'] == 'job_invocation'
33
+ Foreman::AccessControl.normalize_path_hash params.slice(:action, :id, :user_id)
34
+ .merge({ controller: 'api/v2/job_invocations' })
35
+ end
17
36
  end
18
37
  end
19
38
  end
@@ -1,7 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class PreupgradeReportsController < ::Api::V2::BaseController
4
+ include ApiAuthorizer
5
+
4
6
  def index
5
- @preupgrade_reports = resource_scope.search_for(*search_options)
7
+ @preupgrade_reports = resource_scope.includes(:preupgrade_report_entries).search_for(*search_options)
8
+ end
9
+
10
+ private
11
+
12
+ # By overriding :path_to_authenticate we can require REX's :view_job_invocations permission
13
+ def path_to_authenticate
14
+ Foreman::AccessControl.normalize_path_hash params.slice(:action, :id, :user_id)
15
+ .merge({ controller: 'job_invocations' })
6
16
  end
7
17
  end
@@ -8,7 +8,8 @@ module Actions
8
8
  end
9
9
 
10
10
  def plan(job_invocation, host, *_args)
11
- return unless ::Helpers::JobHelper.correct_feature?(job_invocation, 'leapp_preupgrade')
11
+ return unless ::Helpers::JobHelper.correct_feature?(job_invocation, 'leapp_preupgrade') ||
12
+ ::Helpers::JobHelper.correct_feature?(job_invocation, 'leapp_remediation_plan')
12
13
 
13
14
  plan_self(host_id: host.id, job_invocation_id: job_invocation.id)
14
15
  end
@@ -4,10 +4,9 @@ module Helpers
4
4
  module JobHelper
5
5
  class << self
6
6
  def correct_feature?(job_invocation, feature)
7
- job_invocation.job_category == ::ForemanLeapp::JOB_CATEGORY &&
8
- RemoteExecutionFeature.find_by(job_template_id: job_invocation.pattern_template_invocations
9
- .pluck(:template_id)
10
- .first)&.label == feature
7
+ RemoteExecutionFeature.where(job_template_id: job_invocation.pattern_template_invocations
8
+ .first
9
+ .template_id, label: feature).any?
11
10
  end
12
11
  end
13
12
  end
@@ -27,6 +27,7 @@ class PreupgradeReport < ::Report
27
27
  leapp_run_id: data['leapp_run_id'],
28
28
  summary: entry['summary'],
29
29
  tags: entry['tags'],
30
+ flags: entry['flags'],
30
31
  detail: entry['detail'] }
31
32
  end
32
33
  end
@@ -5,6 +5,7 @@ class PreupgradeReportEntry < ApplicationRecord
5
5
  belongs_to_host
6
6
 
7
7
  serialize :tags, Array
8
+ serialize :flags, Array
8
9
  serialize :detail, JSON
9
10
 
10
11
  validates :preupgrade_report, :host, :hostname, :title, :actor, :audience, :severity, :leapp_run_id, presence: true
@@ -1,4 +1,4 @@
1
1
  object @preupgrade_report_entry
2
2
 
3
3
  attributes :id, :preupgrade_report_id, :host_id, :hostname, :title, :actor, :audience,
4
- :severity, :leapp_run_id, :summary, :tags, :created_at, :updated_at
4
+ :severity, :leapp_run_id, :summary, :tags, :flags, :created_at, :updated_at
@@ -0,0 +1,3 @@
1
+ collection @preupgrade_reports
2
+
3
+ extends 'api/v2/preupgrade_reports/base'
@@ -0,0 +1,15 @@
1
+ <%#
2
+ name: Check Leapp
3
+ description_format: 'Check if Leapp package is installed.'
4
+ kind: job_template
5
+ job_category: Leapp
6
+ provider_type: SSH
7
+ snippet: true
8
+ model: JobTemplate
9
+ %>
10
+
11
+ if ! command -v leapp > /dev/null
12
+ then
13
+ echo "Leapp is not installed."
14
+ exit 1
15
+ fi
@@ -1,14 +1,17 @@
1
1
  <%#
2
2
  kind: job_template
3
3
  name: Run preupgrade via Leapp
4
- job_category: Leapp
4
+ job_category: Leapp - Preupgrade
5
5
  description_format: 'Upgradeability check for RHEL 7 host'
6
6
  provider_type: SSH
7
7
  feature: leapp_preupgrade
8
+ model: JobTemplate
8
9
  %>
9
10
 
11
+ <%= render_template 'Check Leapp' %>
12
+
13
+ rm -f /var/log/leapp/leapp-report.json
10
14
  leapp preupgrade
11
- [ $? -eq 0 ] || exit 1
12
15
 
13
16
  echo "===leap_upgrade_report_start==="
14
17
  cat /var/log/leapp/leapp-report.json
@@ -0,0 +1,29 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Run remediation plan via Leapp
4
+ job_category: Other
5
+ description_format: 'Run remediation plan via Leapp'
6
+ provider_type: SSH
7
+ feature: leapp_remediation_plan
8
+ model: JobTemplate
9
+ template_inputs:
10
+ - name: remediation_ids
11
+ required: true
12
+ advanced: true
13
+ input_type: user
14
+ value_type: plain
15
+ description: List of remediation ids
16
+ - name: run_preupgrade
17
+ description: Run preupgrade check again when remediation entries are fixed.
18
+ input_type: user
19
+ required: true
20
+ options: "true\nfalse"
21
+ default: "true"
22
+ %>
23
+
24
+ <%= render_template 'Check Leapp' %>
25
+
26
+ <%= build_remediation_plan(input('remediation_ids').split(','), @host) %>
27
+ <% if input('run_preupgrade') == 'true' %>
28
+ <%= render_template 'Run preupgrade via Leapp' %>
29
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <%#
2
+ kind: job_template
3
+ name: Run upgrade via Leapp
4
+ job_category: Leapp - Upgrade
5
+ description_format: 'Upgrade RHEL 7 host'
6
+ provider_type: Ansible
7
+ feature: leapp_upgrade
8
+ model: JobTemplate
9
+ template_inputs:
10
+ - name: Reboot
11
+ description: Reboot the host automaticaly to continue with the upgrade
12
+ input_type: user
13
+ required: true
14
+ default: "true"
15
+ options: "true\nfalse"
16
+ %>
17
+ ---
18
+ - hosts: all
19
+ tasks:
20
+ - name: Run Leapp Upgrade
21
+ command: leapp upgrade
22
+ <%- if input('Reboot') == "true" -%>
23
+ - name: Reboot the machine
24
+ reboot:
25
+ reboot_timeout: 1800
26
+ <%- end -%>
@@ -6,5 +6,6 @@
6
6
  <% end %>
7
7
 
8
8
  <%= react_component('PreupgradeReports', {
9
- :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}")
9
+ :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}"),
10
+ :newJobInvocationUrl => new_job_invocation_path
10
11
  }) %>
@@ -4,8 +4,9 @@ Rails.application.routes.draw do
4
4
  resources :preupgrade_reports, :only => %i[index]
5
5
 
6
6
  namespace :api, defaults: { format: 'json' } do
7
- scope '(:apiv)', module: :v2, defaults: { apiv: 'v2'}, apiv: /v2/, constraints: ApiConstraints.new( version: 2, default: true) do
7
+ scope '(:apiv)', module: :v2, defaults: { apiv: 'v2' }, apiv: /v2/, constraints: ApiConstraints.new( version: 2, default: true) do
8
8
  resources :preupgrade_reports, only: %i[index show]
9
+ get 'job_invocations/:id/preupgrade_reports', to: 'preupgrade_reports#job_invocation'
9
10
  end
10
11
  end
11
12
  end
@@ -0,0 +1,5 @@
1
+ class ReportEntriesFlags < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :preupgrade_report_entries, :flags, :text
4
+ end
5
+ end
@@ -9,7 +9,7 @@ User.as_anonymous_admin do
9
9
  'job_templates/**/*.erb')].each do |template|
10
10
  template = JobTemplate.import_raw!(File.read(template),
11
11
  :default => true,
12
- :locked => true,
12
+ :lock => true,
13
13
  :update => true)
14
14
  template.organizations = organizations if template.present?
15
15
  template.locations = locations if template.present?
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ForemanLeapp
4
- JOB_CATEGORY = 'Leapp'
5
-
6
4
  class Engine < ::Rails::Engine
7
5
  engine_name 'foreman_leapp'
8
6
 
@@ -23,7 +21,7 @@ module ForemanLeapp
23
21
 
24
22
  initializer 'foreman_leapp.register_plugin', before: :finisher_hook do |_app|
25
23
  Foreman::Plugin.register :foreman_leapp do
26
- requires_foreman '>= 1.16'
24
+ requires_foreman '>= 2.1'
27
25
 
28
26
  apipie_documented_controllers ["#{ForemanLeapp::Engine.root}/app/controllers/api/v2/*.rb"]
29
27
  extend_template_helpers ForemanLeapp::TemplateHelper
@@ -33,7 +31,10 @@ module ForemanLeapp
33
31
  partial: 'job_invocations/leapp_preupgrade_report',
34
32
  name: _('Leapp preupgrade report'),
35
33
  id: 'leapp_preupgrade_report',
36
- onlyif: proc { |subject| ::Helpers::JobHelper.correct_feature?(subject, 'leapp_preupgrade') }
34
+ onlyif: proc { |subject|
35
+ ::Helpers::JobHelper.correct_feature?(subject, 'leapp_preupgrade') ||
36
+ ::Helpers::JobHelper.correct_feature?(subject, 'leapp_remediation_plan')
37
+ }
37
38
  end
38
39
  end
39
40
  end
@@ -41,8 +42,8 @@ module ForemanLeapp
41
42
  # Include concerns in this config.to_prepare block
42
43
  config.to_prepare do
43
44
  begin
44
- HostsHelper.prepend ForemanLeapp::HostsHelperExtensions
45
- Host::JobInvocation.include ForemanLeapp::JobInvocationExtensions
45
+ ::HostsHelper.prepend ForemanLeapp::HostsHelperExtensions
46
+ ::JobInvocation.include ForemanLeapp::JobInvocationExtensions
46
47
  rescue StandardError => e
47
48
  Rails.logger.warn "ForemanLeapp: skipping engine hook (#{e})"
48
49
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ForemanLeapp
4
- VERSION = '0.0.5'
4
+ VERSION = '0.1.3'
5
5
  end
@@ -6,7 +6,7 @@
6
6
  "scripts": {
7
7
  "lint": "tfm-lint --plugin -d /webpack",
8
8
  "link-leapp-js": "./script/link_leapp_js.sh",
9
- "test": "tfm-test --plugin",
9
+ "test": "tfm-test --plugin --config jest.config.js",
10
10
  "test:watch": "tfm-test --plugin --watchAll",
11
11
  "test:current": "tfm-test --plugin --watch",
12
12
  "publish-coverage": "tfm-publish-coverage",
@@ -32,10 +32,11 @@
32
32
  "@theforeman/builder": "^4.2.1",
33
33
  "@theforeman/eslint-plugin-foreman": "4.2.1",
34
34
  "@theforeman/stories": "^4.2.1",
35
- "@theforeman/vendor-dev": "^4.2.1",
36
35
  "@theforeman/test": "^4.2.1",
36
+ "@theforeman/vendor-dev": "^4.2.1",
37
37
  "babel-eslint": "^10.0.0",
38
38
  "eslint": "^6.8.0",
39
+ "jest-svg-transformer": "^1.0.0",
39
40
  "prettier": "^1.19.1"
40
41
  },
41
42
  "dependencies": {
@@ -7,24 +7,107 @@ module Api
7
7
  class PreupgradeReportsControllerTest < ActionController::TestCase
8
8
  setup do
9
9
  @host = FactoryBot.create(:host)
10
- @report = FactoryBot.create(:preupgrade_report, host: @host)
10
+ @job_invocation = FactoryBot.create(:job_invocation)
11
+ @report = FactoryBot.create(:preupgrade_report, host: @host, job_invocation: @job_invocation)
11
12
  @entry = FactoryBot.create(:preupgrade_report_entry, host: @host, preupgrade_report: @report)
12
13
  end
13
14
 
14
- test 'should get index' do
15
- get :index, session: set_session_user
15
+ test 'should get :index' do
16
+ get :index
16
17
  assert_response :success
17
- assert_not_empty ActiveSupport::JSON.decode(@response.body)['results']
18
+ assert_not_empty JSON.parse(@response.body)['results']
18
19
  end
19
20
 
20
- test 'should get detail of report and its entries' do
21
+ test 'should get :show' do
21
22
  get :show, params: { id: @report.id }
22
23
  assert_response :success
23
24
 
24
- response = ActiveSupport::JSON.decode(@response.body)
25
+ response = JSON.parse(@response.body)
25
26
  assert_equal response['id'], @report.id
26
27
  assert_not_empty response['preupgrade_report_entries']
27
28
  end
29
+
30
+ test 'should get :job_invocation' do
31
+ get :job_invocation, params: { id: @job_invocation.id }
32
+ assert_response :success
33
+ assert_not_empty JSON.parse(@response.body)['results']
34
+ end
35
+
36
+ context 'with permissions' do
37
+ setup do
38
+ @user = FactoryBot.create(:user, admin: false)
39
+ setup_user('view', 'job_invocations', nil, @user)
40
+ setup_user('view', 'hosts', nil, @user)
41
+ end
42
+
43
+ test 'should get :index' do
44
+ get :index, session: set_session_user(@user)
45
+ assert_response :success
46
+ assert_not_empty JSON.parse(@response.body)['results']
47
+ end
48
+
49
+ test 'should get :show' do
50
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
51
+ assert_response :success
52
+ assert_equal @report.id, JSON.parse(@response.body)['id']
53
+ end
54
+
55
+ test 'should get :job_invocation' do
56
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
57
+ assert_response :success
58
+ assert_not_empty JSON.parse(@response.body)['results']
59
+ end
60
+ end
61
+
62
+ context 'without :view_job_invocations' do
63
+ setup do
64
+ @user = FactoryBot.create(:user, admin: false)
65
+ setup_user('view', 'hosts', nil, @user)
66
+ end
67
+
68
+ test 'should not get :index' do
69
+ get :index, session: set_session_user(@user)
70
+ assert_response :forbidden
71
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
72
+ end
73
+
74
+ test 'should not get :show' do
75
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
76
+ assert_response :forbidden
77
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
78
+ end
79
+
80
+ test 'should not get :job_invocation' do
81
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
82
+ assert_response :forbidden
83
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
84
+ end
85
+ end
86
+
87
+ context 'without :view_hosts' do
88
+ setup do
89
+ @user = FactoryBot.create(:user, admin: false)
90
+ setup_user('view', 'job_invocations', nil, @user)
91
+ end
92
+
93
+ test 'should not get :index' do
94
+ get :index, session: set_session_user(@user)
95
+ assert_response :forbidden
96
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
97
+ end
98
+
99
+ test 'should not get :job_invocation' do
100
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
101
+ assert_response :forbidden
102
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
103
+ end
104
+
105
+ test 'should not get :job_invocation' do
106
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
107
+ assert_response :forbidden
108
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
109
+ end
110
+ end
28
111
  end
29
112
  end
30
113
  end