foreman_leapp 0.0.5 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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