foreman_rh_cloud 5.0.37 → 5.0.41
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.
- checksums.yaml +4 -4
 - data/app/controllers/api/v2/rh_cloud/cloud_request_controller.rb +11 -5
 - data/app/controllers/foreman_inventory_upload/uploads_controller.rb +0 -7
 - data/app/controllers/insights_cloud/settings_controller.rb +14 -0
 - data/config/routes.rb +2 -0
 - data/lib/foreman_inventory_upload/async/generate_all_reports_job.rb +4 -0
 - data/lib/foreman_rh_cloud/engine.rb +5 -1
 - data/lib/foreman_rh_cloud/version.rb +1 -1
 - data/lib/insights_cloud/async/cloud_connector_announce_task.rb +44 -0
 - data/lib/insights_cloud/async/connector_playbook_execution_reporter_task.rb +3 -1
 - data/lib/insights_cloud/generators/playbook_progress_generator.rb +2 -2
 - data/lib/insights_cloud.rb +4 -0
 - data/package.json +6 -6
 - data/test/controllers/insights_cloud/api/cloud_request_controller_test.rb +27 -0
 - data/test/controllers/insights_sync/settings_controller_test.rb +17 -0
 - data/test/jobs/cloud_connector_announce_task_test.rb +125 -0
 - data/test/unit/playbook_progress_generator_test.rb +1 -1
 - metadata +12 -9
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 4520a12619aad77a5d0ddeafd83203d8281e0ff7d3e9fcc2eef10a2a779bad27
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 7e6d55970f4c0742328e5a5e9159b084a391cc98305cf67cff6555a1575b6fe1
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f55b1b61ed73778bc62c7cf1819b1eac363417a6f929cbc1f6e9b8043f45904b2dec26f1c9294ab68e1b175a4cbda091ef7091d755180649d0f2e242784092c5
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 5b7fe9198f6c0172f93638f8315274158471169033de6f6c9113aa94dd2de8ab5ac0a0c9b32b0c1bb374cfb3303ab9d7915519139919799d9a88531bb280f024
         
     | 
| 
         @@ -27,16 +27,18 @@ module Api::V2::RhCloud 
     | 
|
| 
       27 
27 
     | 
    
         
             
                private
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                def metadata
         
     | 
| 
       30 
     | 
    
         
            -
                  params['metadata']
         
     | 
| 
      
 30 
     | 
    
         
            +
                  params['Metadata'] || params['metadata']
         
     | 
| 
       31 
31 
     | 
    
         
             
                end
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                def content
         
     | 
| 
      
 34 
     | 
    
         
            +
                  content = params['Content'] || params['content']
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       34 
36 
     | 
    
         
             
                  # the content received as base 64 of the string in double quotes
         
     | 
| 
       35 
     | 
    
         
            -
                  Base64.decode64( 
     | 
| 
      
 37 
     | 
    
         
            +
                  Base64.decode64(content).tr('"', '')
         
     | 
| 
       36 
38 
     | 
    
         
             
                end
         
     | 
| 
       37 
39 
     | 
    
         | 
| 
       38 
40 
     | 
    
         
             
                def directive
         
     | 
| 
       39 
     | 
    
         
            -
                  params['directive']
         
     | 
| 
      
 41 
     | 
    
         
            +
                  params['Directive'] || params['directive']
         
     | 
| 
       40 
42 
     | 
    
         
             
                end
         
     | 
| 
       41 
43 
     | 
    
         | 
| 
       42 
44 
     | 
    
         
             
                def handle_run_playbook_request
         
     | 
| 
         @@ -44,9 +46,13 @@ module Api::V2::RhCloud 
     | 
|
| 
       44 
46 
     | 
    
         
             
                  logger.error("Reporting URL is not valid: #{metadata['return_url']}") && return unless valid_url?(metadata['return_url'])
         
     | 
| 
       45 
47 
     | 
    
         | 
| 
       46 
48 
     | 
    
         
             
                  hosts = metadata['hosts'].split(',')
         
     | 
| 
       47 
     | 
    
         
            -
                  host_ids = host_ids(hosts)
         
     | 
| 
       48 
49 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
                   
     | 
| 
      
 50 
     | 
    
         
            +
                  # select hosts from the metadata list that are not disabled by the parameter.
         
     | 
| 
      
 51 
     | 
    
         
            +
                  host_ids = Host.search_for("not params.#{InsightsCloud.enable_cloud_remediations_param} = f")
         
     | 
| 
      
 52 
     | 
    
         
            +
                                 .where(id: host_ids(hosts))
         
     | 
| 
      
 53 
     | 
    
         
            +
                                 .pluck(:id)
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  logger.warn("Some hosts were not found/ignored. Looked for: #{hosts}, found ids: #{host_ids}") unless host_ids.length == hosts.length
         
     | 
| 
       50 
56 
     | 
    
         | 
| 
       51 
57 
     | 
    
         
             
                  logger.error("sat_org_id is not present in the metadata") && return unless metadata['sat_org_id']
         
     | 
| 
       52 
58 
     | 
    
         
             
                  org_id = metadata['sat_org_id'].to_i
         
     | 
| 
         @@ -18,13 +18,6 @@ module ForemanInventoryUpload 
     | 
|
| 
       18 
18 
     | 
    
         
             
                end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                def enable_cloud_connector
         
     | 
| 
       21 
     | 
    
         
            -
                  Organization.unscoped.each do |org|
         
     | 
| 
       22 
     | 
    
         
            -
                    presence = ForemanRhCloud::CloudPresence.new(org, logger)
         
     | 
| 
       23 
     | 
    
         
            -
                    presence.announce_to_sources
         
     | 
| 
       24 
     | 
    
         
            -
                  rescue StandardError => ex
         
     | 
| 
       25 
     | 
    
         
            -
                    logger.warn(ex)
         
     | 
| 
       26 
     | 
    
         
            -
                  end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
21 
     | 
    
         
             
                  cloud_connector = ForemanRhCloud::CloudConnector.new
         
     | 
| 
       29 
22 
     | 
    
         
             
                  render json: cloud_connector.install.to_json
         
     | 
| 
       30 
23 
     | 
    
         
             
                end
         
     | 
| 
         @@ -9,6 +9,20 @@ module InsightsCloud 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  render_setting(:insightsSyncEnabled, :allow_auto_insights_sync)
         
     | 
| 
       10 
10 
     | 
    
         
             
                end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
      
 12 
     | 
    
         
            +
                def set_org_parameter
         
     | 
| 
      
 13 
     | 
    
         
            +
                  parameter = params.require(:parameter)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  new_value = ActiveModel::Type::Boolean.new.cast(params.require(:value))
         
     | 
| 
      
 15 
     | 
    
         
            +
                  org_id = params.require(:organization_id)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  organization = Organization.authorized.find(org_id)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  org_param = organization.organization_parameters.find_or_create_by(name: parameter) do |org_param|
         
     | 
| 
      
 20 
     | 
    
         
            +
                    org_param.name = parameter
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                  org_param.value = new_value
         
     | 
| 
      
 23 
     | 
    
         
            +
                  org_param.save!
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       12 
26 
     | 
    
         
             
                private
         
     | 
| 
       13 
27 
     | 
    
         | 
| 
       14 
28 
     | 
    
         
             
                def render_setting(node_name, setting)
         
     | 
    
        data/config/routes.rb
    CHANGED
    
    | 
         @@ -25,6 +25,8 @@ Rails.application.routes.draw do 
     | 
|
| 
       25 
25 
     | 
    
         
             
                  end
         
     | 
| 
       26 
26 
     | 
    
         
             
                end
         
     | 
| 
       27 
27 
     | 
    
         
             
                match 'hits/:host_id', to: 'hits#show', via: :get
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                post ':organization_id/parameter', to: 'settings#set_org_parameter', constraints: { organization_id: %r{[^\/]+} }
         
     | 
| 
       28 
30 
     | 
    
         
             
              end
         
     | 
| 
       29 
31 
     | 
    
         | 
| 
       30 
32 
     | 
    
         
             
              namespace :foreman_rh_cloud do
         
     | 
| 
         @@ -83,9 +83,13 @@ module ForemanRhCloud 
     | 
|
| 
       83 
83 
     | 
    
         
             
                        :dispatch_cloud_requests,
         
     | 
| 
       84 
84 
     | 
    
         
             
                        'api/v2/rh_cloud/cloud_request': [:update]
         
     | 
| 
       85 
85 
     | 
    
         
             
                      )
         
     | 
| 
      
 86 
     | 
    
         
            +
                      permission(
         
     | 
| 
      
 87 
     | 
    
         
            +
                        :control_organization_insights,
         
     | 
| 
      
 88 
     | 
    
         
            +
                        'insights_cloud/settings': [:set_org_parameter]
         
     | 
| 
      
 89 
     | 
    
         
            +
                      )
         
     | 
| 
       86 
90 
     | 
    
         
             
                    end
         
     | 
| 
       87 
91 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
                    plugin_permissions = [:view_foreman_rh_cloud, :generate_foreman_rh_cloud, :view_insights_hits, :dispatch_cloud_requests]
         
     | 
| 
      
 92 
     | 
    
         
            +
                    plugin_permissions = [:view_foreman_rh_cloud, :generate_foreman_rh_cloud, :view_insights_hits, :dispatch_cloud_requests, :control_organization_insights]
         
     | 
| 
       89 
93 
     | 
    
         | 
| 
       90 
94 
     | 
    
         
             
                    role 'ForemanRhCloud', plugin_permissions, 'Role granting permissions to view the hosts inventory,
         
     | 
| 
       91 
95 
     | 
    
         
             
                                                                generate a report, upload it to the cloud and download it locally'
         
     | 
| 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module InsightsCloud
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Async
         
     | 
| 
      
 3 
     | 
    
         
            +
                class CloudConnectorAnnounceTask < ::Actions::EntryAction
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def self.subscribe
         
     | 
| 
      
 5 
     | 
    
         
            +
                    Actions::RemoteExecution::RunHostsJob
         
     | 
| 
      
 6 
     | 
    
         
            +
                  end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  def self.connector_feature_id
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @connector_feature_id ||= RemoteExecutionFeature.feature!(ForemanRhCloud::CloudConnector::CLOUD_CONNECTOR_FEATURE).id
         
     | 
| 
      
 10 
     | 
    
         
            +
                  end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  def plan(job_invocation)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    return unless connector_playbook_job?(job_invocation)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    plan_self
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  def finalize
         
     | 
| 
      
 19 
     | 
    
         
            +
                    Organization.unscoped.each do |org|
         
     | 
| 
      
 20 
     | 
    
         
            +
                      presence = ForemanRhCloud::CloudPresence.new(org, logger)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      presence.announce_to_sources
         
     | 
| 
      
 22 
     | 
    
         
            +
                    rescue StandardError => ex
         
     | 
| 
      
 23 
     | 
    
         
            +
                      logger.warn(ex)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def rescue_strategy_for_self
         
     | 
| 
      
 28 
     | 
    
         
            +
                    Dynflow::Action::Rescue::Skip
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  def connector_playbook_job?(job_invocation)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    job_invocation&.remote_execution_feature_id == connector_feature_id
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  def connector_feature_id
         
     | 
| 
      
 36 
     | 
    
         
            +
                    self.class.connector_feature_id
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  def logger
         
     | 
| 
      
 40 
     | 
    
         
            +
                    action_logger
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -137,6 +137,7 @@ module InsightsCloud 
     | 
|
| 
       137 
137 
     | 
    
         | 
| 
       138 
138 
     | 
    
         
             
                  def report_job_progress(invocation_status)
         
     | 
| 
       139 
139 
     | 
    
         
             
                    generator = InsightsCloud::Generators::PlaybookProgressGenerator.new(correlation_id)
         
     | 
| 
      
 140 
     | 
    
         
            +
                    all_hosts_success = true
         
     | 
| 
       140 
141 
     | 
    
         | 
| 
       141 
142 
     | 
    
         
             
                    invocation_status.each do |host_name, status|
         
     | 
| 
       142 
143 
     | 
    
         
             
                      # skip host if the host already reported that it's finished
         
     | 
| 
         @@ -151,9 +152,10 @@ module InsightsCloud 
     | 
|
| 
       151 
152 
     | 
    
         
             
                      if status['state'] == 'stopped'
         
     | 
| 
       152 
153 
     | 
    
         
             
                        generator.host_finished_message(host_name, status['exit_status'])
         
     | 
| 
       153 
154 
     | 
    
         
             
                        status['report_done'] = true
         
     | 
| 
      
 155 
     | 
    
         
            +
                        all_hosts_success &&= status['exit_status'] == 0
         
     | 
| 
       154 
156 
     | 
    
         
             
                      end
         
     | 
| 
       155 
157 
     | 
    
         
             
                    end
         
     | 
| 
       156 
     | 
    
         
            -
                    generator.job_finished_message if done?(invocation_status)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    generator.job_finished_message(all_hosts_success) if done?(invocation_status)
         
     | 
| 
       157 
159 
     | 
    
         | 
| 
       158 
160 
     | 
    
         
             
                    send_report(generator.generate)
         
     | 
| 
       159 
161 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -30,12 +30,12 @@ module InsightsCloud 
     | 
|
| 
       30 
30 
     | 
    
         
             
                    }
         
     | 
| 
       31 
31 
     | 
    
         
             
                  end
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                  def job_finished_message
         
     | 
| 
      
 33 
     | 
    
         
            +
                  def job_finished_message(success)
         
     | 
| 
       34 
34 
     | 
    
         
             
                    @messages << {
         
     | 
| 
       35 
35 
     | 
    
         
             
                      "type": "playbook_run_completed",
         
     | 
| 
       36 
36 
     | 
    
         
             
                      "version": 3,
         
     | 
| 
       37 
37 
     | 
    
         
             
                      "correlation_id": correlation_id,
         
     | 
| 
       38 
     | 
    
         
            -
                      "status":  
     | 
| 
      
 38 
     | 
    
         
            +
                      "status": success ? 'success' : 'failure',
         
     | 
| 
       39 
39 
     | 
    
         
             
                    }
         
     | 
| 
       40 
40 
     | 
    
         
             
                  end
         
     | 
| 
       41 
41 
     | 
    
         | 
    
        data/lib/insights_cloud.rb
    CHANGED
    
    
    
        data/package.json
    CHANGED
    
    | 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            {
         
     | 
| 
       2 
2 
     | 
    
         
             
              "name": "foreman_rh_cloud",
         
     | 
| 
       3 
     | 
    
         
            -
              "version": "5.0. 
     | 
| 
      
 3 
     | 
    
         
            +
              "version": "5.0.41",
         
     | 
| 
       4 
4 
     | 
    
         
             
              "description": "Inventory Upload =============",
         
     | 
| 
       5 
5 
     | 
    
         
             
              "main": "index.js",
         
     | 
| 
       6 
6 
     | 
    
         
             
              "scripts": {
         
     | 
| 
         @@ -22,14 +22,14 @@ 
     | 
|
| 
       22 
22 
     | 
    
         
             
                "url": "http://projects.theforeman.org/projects/foreman_rh_cloud/issues"
         
     | 
| 
       23 
23 
     | 
    
         
             
              },
         
     | 
| 
       24 
24 
     | 
    
         
             
              "peerDependencies": {
         
     | 
| 
       25 
     | 
    
         
            -
                "@theforeman/vendor": " 
     | 
| 
      
 25 
     | 
    
         
            +
                "@theforeman/vendor": ">= 8.16.0"
         
     | 
| 
       26 
26 
     | 
    
         
             
              },
         
     | 
| 
       27 
27 
     | 
    
         
             
              "devDependencies": {
         
     | 
| 
       28 
28 
     | 
    
         
             
                "@babel/core": "~7.7.0",
         
     | 
| 
       29 
     | 
    
         
            -
                "@theforeman/builder": " 
     | 
| 
       30 
     | 
    
         
            -
                "@theforeman/stories": " 
     | 
| 
       31 
     | 
    
         
            -
                "@theforeman/test": " 
     | 
| 
       32 
     | 
    
         
            -
                "@theforeman/eslint-plugin-foreman": " 
     | 
| 
      
 29 
     | 
    
         
            +
                "@theforeman/builder": ">= 8.16.0",
         
     | 
| 
      
 30 
     | 
    
         
            +
                "@theforeman/stories": ">= 8.16.0",
         
     | 
| 
      
 31 
     | 
    
         
            +
                "@theforeman/test": ">= 8.16.0",
         
     | 
| 
      
 32 
     | 
    
         
            +
                "@theforeman/eslint-plugin-foreman": ">= 8.16.0",
         
     | 
| 
       33 
33 
     | 
    
         
             
                "babel-eslint": "~10.0.0",
         
     | 
| 
       34 
34 
     | 
    
         
             
                "eslint": "~6.7.2",
         
     | 
| 
       35 
35 
     | 
    
         
             
                "eslint-plugin-spellcheck": "~0.0.17",
         
     | 
| 
         @@ -40,6 +40,33 @@ module InsightsCloud::Api 
     | 
|
| 
       40 
40 
     | 
    
         
             
                  assert_response :success
         
     | 
| 
       41 
41 
     | 
    
         
             
                end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
      
 43 
     | 
    
         
            +
                test 'Starts playbook run for correct directive with capitalized keys' do
         
     | 
| 
      
 44 
     | 
    
         
            +
                  host1 = FactoryBot.create(:host, :with_insights_hits)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  host1.insights.uuid = 'TEST_UUID1'
         
     | 
| 
      
 46 
     | 
    
         
            +
                  host1.insights.save!
         
     | 
| 
      
 47 
     | 
    
         
            +
                  host2 = FactoryBot.create(:host, :with_insights_hits)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  host2.insights.uuid = 'TEST_UUID2'
         
     | 
| 
      
 49 
     | 
    
         
            +
                  host2.insights.save!
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  mock_composer = mock('composer')
         
     | 
| 
      
 52 
     | 
    
         
            +
                  ::JobInvocationComposer.expects(:for_feature).with do |feature, host_ids, params|
         
     | 
| 
      
 53 
     | 
    
         
            +
                    feature == :rh_cloud_connector_run_playbook &&
         
     | 
| 
      
 54 
     | 
    
         
            +
                    host_ids.first == host1.id &&
         
     | 
| 
      
 55 
     | 
    
         
            +
                    host_ids.last == host2.id
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end.returns(mock_composer)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  mock_composer.expects(:trigger!)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  mock_composer.expects(:job_invocation)
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  params = run_playbook_request
         
     | 
| 
      
 61 
     | 
    
         
            +
                  params['Directive'] = params.delete('directive')
         
     | 
| 
      
 62 
     | 
    
         
            +
                  params['Metadata'] = params.delete('metadata')
         
     | 
| 
      
 63 
     | 
    
         
            +
                  params['Content'] = params.delete('content')
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  post :update, params: run_playbook_request
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  assert_response :success
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
       43 
70 
     | 
    
         
             
                private
         
     | 
| 
       44 
71 
     | 
    
         | 
| 
       45 
72 
     | 
    
         
             
                def run_playbook_request
         
     | 
| 
         @@ -27,4 +27,21 @@ class SettingsControllerTest < ActionController::TestCase 
     | 
|
| 
       27 
27 
     | 
    
         
             
                assert_equal true, actual['insightsSyncEnabled']
         
     | 
| 
       28 
28 
     | 
    
         
             
                assert_equal true, Setting[:allow_auto_insights_sync]
         
     | 
| 
       29 
29 
     | 
    
         
             
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              test 'Should update an organization parameter' do
         
     | 
| 
      
 32 
     | 
    
         
            +
                FactoryBot.create(:common_parameter, name: InsightsCloud.enable_cloud_remediations_param, value: false)
         
     | 
| 
      
 33 
     | 
    
         
            +
                host = FactoryBot.create(:host)
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                # make sure the parameter is there
         
     | 
| 
      
 36 
     | 
    
         
            +
                assert_equal false, host.host_params[InsightsCloud.enable_cloud_remediations_param]
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                post :set_org_parameter, params: { parameter: InsightsCloud.enable_cloud_remediations_param, value: true, organization_id: host.organization.id }, session: set_session_user
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                # needed for properly access host_params
         
     | 
| 
      
 41 
     | 
    
         
            +
                User.as_anonymous_admin do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # refresh the host record
         
     | 
| 
      
 43 
     | 
    
         
            +
                  host = Host.find(host.id)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  assert_equal true, host.host_params[InsightsCloud.enable_cloud_remediations_param]
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
       30 
47 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,125 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'test_plugin_helper'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'foreman_tasks/test_helpers'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "#{ForemanTasks::Engine.root}/test/support/dummy_dynflow_action"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class CloudConnectorAnnounceTaskTest < ActiveSupport::TestCase
         
     | 
| 
      
 7 
     | 
    
         
            +
              include ForemanTasks::TestHelpers::WithInThreadExecutor
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              setup do
         
     | 
| 
      
 10 
     | 
    
         
            +
                RemoteExecutionFeature.register(
         
     | 
| 
      
 11 
     | 
    
         
            +
                  :ansible_configure_cloud_connector,
         
     | 
| 
      
 12 
     | 
    
         
            +
                  N_('Configure Cloud Connector on given hosts'),
         
     | 
| 
      
 13 
     | 
    
         
            +
                  :description => N_('Configure Cloud Connector on given hosts'),
         
     | 
| 
      
 14 
     | 
    
         
            +
                  :proxy_selector_override => ::RemoteExecutionProxySelector::INTERNAL_PROXY
         
     | 
| 
      
 15 
     | 
    
         
            +
                )
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                @job_invocation = generate_job_invocation(:ansible_configure_cloud_connector)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                # reset connector feature ID cache
         
     | 
| 
      
 20 
     | 
    
         
            +
                InsightsCloud::Async::CloudConnectorAnnounceTask.instance_variable_set(:@connector_feature_id, nil)
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              test 'It executes cloud presence announcer' do
         
     | 
| 
      
 24 
     | 
    
         
            +
                ForemanRhCloud::CloudPresence.any_instance.expects(:announce_to_sources).times(Organization.unscoped.count)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                ForemanTasks.sync_task(InsightsCloud::Async::CloudConnectorAnnounceTask, @job_invocation)
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              private
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              def generate_job_invocation(feature_name)
         
     | 
| 
      
 32 
     | 
    
         
            +
                job_template = FactoryBot.build(
         
     | 
| 
      
 33 
     | 
    
         
            +
                  :job_template,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  :template => 'BLEH'
         
     | 
| 
      
 35 
     | 
    
         
            +
                )
         
     | 
| 
      
 36 
     | 
    
         
            +
                feature = RemoteExecutionFeature.feature!(feature_name).id
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                job_invocation = FactoryBot.create(
         
     | 
| 
      
 39 
     | 
    
         
            +
                  :job_invocation,
         
     | 
| 
      
 40 
     | 
    
         
            +
                  remote_execution_feature_id: feature,
         
     | 
| 
      
 41 
     | 
    
         
            +
                  task_id: FactoryBot.create(:dynflow_task).id
         
     | 
| 
      
 42 
     | 
    
         
            +
                )
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                job_template.template_inputs << playbook_url_input = FactoryBot.build(:template_input,
         
     | 
| 
      
 45 
     | 
    
         
            +
                  :name => 'playbook_url',
         
     | 
| 
      
 46 
     | 
    
         
            +
                  :input_type => 'user',
         
     | 
| 
      
 47 
     | 
    
         
            +
                  :required => true)
         
     | 
| 
      
 48 
     | 
    
         
            +
                job_template.template_inputs << report_url_input = FactoryBot.build(:template_input,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  :name => 'report_url',
         
     | 
| 
      
 50 
     | 
    
         
            +
                  :input_type => 'user',
         
     | 
| 
      
 51 
     | 
    
         
            +
                  :required => true)
         
     | 
| 
      
 52 
     | 
    
         
            +
                job_template.template_inputs << correlation_id_input = FactoryBot.build(:template_input,
         
     | 
| 
      
 53 
     | 
    
         
            +
                  :name => 'correlation_id',
         
     | 
| 
      
 54 
     | 
    
         
            +
                  :input_type => 'user',
         
     | 
| 
      
 55 
     | 
    
         
            +
                  :required => true)
         
     | 
| 
      
 56 
     | 
    
         
            +
                job_template.template_inputs << report_interval_input = FactoryBot.build(:template_input,
         
     | 
| 
      
 57 
     | 
    
         
            +
                  :name => 'report_interval',
         
     | 
| 
      
 58 
     | 
    
         
            +
                  :input_type => 'user',
         
     | 
| 
      
 59 
     | 
    
         
            +
                  :required => true)
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                template_invocation = FactoryBot.build(:template_invocation,
         
     | 
| 
      
 62 
     | 
    
         
            +
                  :template => job_template,
         
     | 
| 
      
 63 
     | 
    
         
            +
                  :job_invocation => job_invocation
         
     | 
| 
      
 64 
     | 
    
         
            +
                )
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                template_invocation.input_values << FactoryBot.create(
         
     | 
| 
      
 67 
     | 
    
         
            +
                  :template_invocation_input_value,
         
     | 
| 
      
 68 
     | 
    
         
            +
                  :template_invocation => template_invocation,
         
     | 
| 
      
 69 
     | 
    
         
            +
                  :template_input => playbook_url_input,
         
     | 
| 
      
 70 
     | 
    
         
            +
                  :value => 'http://example.com/TEST_PLAYBOOK'
         
     | 
| 
      
 71 
     | 
    
         
            +
                )
         
     | 
| 
      
 72 
     | 
    
         
            +
                template_invocation.input_values << FactoryBot.create(
         
     | 
| 
      
 73 
     | 
    
         
            +
                  :template_invocation_input_value,
         
     | 
| 
      
 74 
     | 
    
         
            +
                  :template_invocation => template_invocation,
         
     | 
| 
      
 75 
     | 
    
         
            +
                  :template_input => report_url_input,
         
     | 
| 
      
 76 
     | 
    
         
            +
                  :value => 'http://example.com/TEST_REPORT'
         
     | 
| 
      
 77 
     | 
    
         
            +
                )
         
     | 
| 
      
 78 
     | 
    
         
            +
                template_invocation.input_values << FactoryBot.create(
         
     | 
| 
      
 79 
     | 
    
         
            +
                  :template_invocation_input_value,
         
     | 
| 
      
 80 
     | 
    
         
            +
                  :template_invocation => template_invocation,
         
     | 
| 
      
 81 
     | 
    
         
            +
                  :template_input => correlation_id_input,
         
     | 
| 
      
 82 
     | 
    
         
            +
                  :value => 'TEST_CORRELATION'
         
     | 
| 
      
 83 
     | 
    
         
            +
                )
         
     | 
| 
      
 84 
     | 
    
         
            +
                template_invocation.input_values << FactoryBot.create(
         
     | 
| 
      
 85 
     | 
    
         
            +
                  :template_invocation_input_value,
         
     | 
| 
      
 86 
     | 
    
         
            +
                  :template_invocation => template_invocation,
         
     | 
| 
      
 87 
     | 
    
         
            +
                  :template_input => report_interval_input,
         
     | 
| 
      
 88 
     | 
    
         
            +
                  :value => '1'
         
     | 
| 
      
 89 
     | 
    
         
            +
                )
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                @host1 = FactoryBot.create(:host, :with_insights_hits, name: 'host1')
         
     | 
| 
      
 92 
     | 
    
         
            +
                @host1.insights.uuid = 'TEST_UUID1'
         
     | 
| 
      
 93 
     | 
    
         
            +
                @host1.insights.save!
         
     | 
| 
      
 94 
     | 
    
         
            +
                @host2 = FactoryBot.create(:host, :with_insights_hits, name: 'host2')
         
     | 
| 
      
 95 
     | 
    
         
            +
                @host2.insights.uuid = 'TEST_UUID2'
         
     | 
| 
      
 96 
     | 
    
         
            +
                @host2.insights.save!
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                targeting = FactoryBot.create(:targeting, hosts: [@host1, @host2])
         
     | 
| 
      
 99 
     | 
    
         
            +
                job_invocation.targeting = targeting
         
     | 
| 
      
 100 
     | 
    
         
            +
                job_invocation.save!
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                job_invocation.template_invocations << FactoryBot.create(
         
     | 
| 
      
 103 
     | 
    
         
            +
                  :template_invocation,
         
     | 
| 
      
 104 
     | 
    
         
            +
                  run_host_job_task: FactoryBot.create(:dynflow_task),
         
     | 
| 
      
 105 
     | 
    
         
            +
                  host_id: @host1.id
         
     | 
| 
      
 106 
     | 
    
         
            +
                )
         
     | 
| 
      
 107 
     | 
    
         
            +
                job_invocation.template_invocations << FactoryBot.create(
         
     | 
| 
      
 108 
     | 
    
         
            +
                  :template_invocation,
         
     | 
| 
      
 109 
     | 
    
         
            +
                  run_host_job_task: FactoryBot.create(:dynflow_task),
         
     | 
| 
      
 110 
     | 
    
         
            +
                  host_id: @host2.id
         
     | 
| 
      
 111 
     | 
    
         
            +
                )
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                fake_output = (1..5).map do |i|
         
     | 
| 
      
 114 
     | 
    
         
            +
                  { 'timestamp' => (Time.now - (5 - i)).to_f, 'output' => "#{i}\n" }
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
                Support::DummyDynflowAction.any_instance.stubs(:live_output).returns(fake_output)
         
     | 
| 
      
 117 
     | 
    
         
            +
                Support::DummyDynflowAction.any_instance.stubs(:exit_status).returns(0)
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                job_invocation
         
     | 
| 
      
 120 
     | 
    
         
            +
              end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
              def read_jsonl(jsonl)
         
     | 
| 
      
 123 
     | 
    
         
            +
                jsonl.lines.map { |l| JSON.parse(l) }
         
     | 
| 
      
 124 
     | 
    
         
            +
              end
         
     | 
| 
      
 125 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -51,7 +51,7 @@ class PlaybookProgressGeneratorTest < ActiveSupport::TestCase 
     | 
|
| 
       51 
51 
     | 
    
         
             
              end
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
       53 
53 
     | 
    
         
             
              test 'Outputs job finished message' do
         
     | 
| 
       54 
     | 
    
         
            -
                @generator.job_finished_message
         
     | 
| 
      
 54 
     | 
    
         
            +
                @generator.job_finished_message(true)
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
       56 
56 
     | 
    
         
             
                actual = @generator.generate
         
     | 
| 
       57 
57 
     | 
    
         
             
                actual_message = JSON.parse(actual)
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: foreman_rh_cloud
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 5.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 5.0.41
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Foreman Red Hat Cloud team
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2022- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2022-08-02 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: katello
         
     | 
| 
         @@ -221,6 +221,7 @@ files: 
     | 
|
| 
       221 
221 
     | 
    
         
             
            - lib/foreman_rh_cloud/engine.rb
         
     | 
| 
       222 
222 
     | 
    
         
             
            - lib/foreman_rh_cloud/version.rb
         
     | 
| 
       223 
223 
     | 
    
         
             
            - lib/insights_cloud.rb
         
     | 
| 
      
 224 
     | 
    
         
            +
            - lib/insights_cloud/async/cloud_connector_announce_task.rb
         
     | 
| 
       224 
225 
     | 
    
         
             
            - lib/insights_cloud/async/connector_playbook_execution_reporter_task.rb
         
     | 
| 
       225 
226 
     | 
    
         
             
            - lib/insights_cloud/async/insights_client_status_aging.rb
         
     | 
| 
       226 
227 
     | 
    
         
             
            - lib/insights_cloud/async/insights_full_sync.rb
         
     | 
| 
         @@ -255,6 +256,7 @@ files: 
     | 
|
| 
       255 
256 
     | 
    
         
             
            - test/controllers/uploads_settings_controller_test.rb
         
     | 
| 
       256 
257 
     | 
    
         
             
            - test/factories/insights_factories.rb
         
     | 
| 
       257 
258 
     | 
    
         
             
            - test/factories/inventory_upload_factories.rb
         
     | 
| 
      
 259 
     | 
    
         
            +
            - test/jobs/cloud_connector_announce_task_test.rb
         
     | 
| 
       258 
260 
     | 
    
         
             
            - test/jobs/connector_playbook_execution_reporter_task_test.rb
         
     | 
| 
       259 
261 
     | 
    
         
             
            - test/jobs/insights_client_status_aging_test.rb
         
     | 
| 
       260 
262 
     | 
    
         
             
            - test/jobs/insights_full_sync_test.rb
         
     | 
| 
         @@ -672,7 +674,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       672 
674 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       673 
675 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       674 
676 
     | 
    
         
             
            requirements: []
         
     | 
| 
       675 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 677 
     | 
    
         
            +
            rubygems_version: 3.3.7
         
     | 
| 
       676 
678 
     | 
    
         
             
            signing_key:
         
     | 
| 
       677 
679 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       678 
680 
     | 
    
         
             
            summary: Summary of ForemanRhCloud.
         
     | 
| 
         @@ -688,33 +690,34 @@ test_files: 
     | 
|
| 
       688 
690 
     | 
    
         
             
            - test/controllers/uploads_settings_controller_test.rb
         
     | 
| 
       689 
691 
     | 
    
         
             
            - test/factories/insights_factories.rb
         
     | 
| 
       690 
692 
     | 
    
         
             
            - test/factories/inventory_upload_factories.rb
         
     | 
| 
       691 
     | 
    
         
            -
            - test/jobs/ 
     | 
| 
       692 
     | 
    
         
            -
            - test/jobs/inventory_scheduled_sync_test.rb
         
     | 
| 
       693 
     | 
    
         
            -
            - test/jobs/upload_report_job_test.rb
         
     | 
| 
      
 693 
     | 
    
         
            +
            - test/jobs/cloud_connector_announce_task_test.rb
         
     | 
| 
       694 
694 
     | 
    
         
             
            - test/jobs/connector_playbook_execution_reporter_task_test.rb
         
     | 
| 
      
 695 
     | 
    
         
            +
            - test/jobs/insights_client_status_aging_test.rb
         
     | 
| 
       695 
696 
     | 
    
         
             
            - test/jobs/insights_full_sync_test.rb
         
     | 
| 
       696 
697 
     | 
    
         
             
            - test/jobs/insights_resolutions_sync_test.rb
         
     | 
| 
       697 
698 
     | 
    
         
             
            - test/jobs/insights_rules_sync_test.rb
         
     | 
| 
       698 
699 
     | 
    
         
             
            - test/jobs/inventory_full_sync_test.rb
         
     | 
| 
       699 
700 
     | 
    
         
             
            - test/jobs/inventory_hosts_sync_test.rb
         
     | 
| 
      
 701 
     | 
    
         
            +
            - test/jobs/inventory_scheduled_sync_test.rb
         
     | 
| 
       700 
702 
     | 
    
         
             
            - test/jobs/inventory_self_host_sync_test.rb
         
     | 
| 
      
 703 
     | 
    
         
            +
            - test/jobs/upload_report_job_test.rb
         
     | 
| 
       701 
704 
     | 
    
         
             
            - test/models/insights_client_report_status_test.rb
         
     | 
| 
       702 
705 
     | 
    
         
             
            - test/test_plugin_helper.rb
         
     | 
| 
       703 
706 
     | 
    
         
             
            - test/unit/archived_report_generator_test.rb
         
     | 
| 
       704 
707 
     | 
    
         
             
            - test/unit/fact_helpers_test.rb
         
     | 
| 
      
 708 
     | 
    
         
            +
            - test/unit/foreman_rh_cloud_self_host_test.rb
         
     | 
| 
       705 
709 
     | 
    
         
             
            - test/unit/insights_facet_test.rb
         
     | 
| 
       706 
710 
     | 
    
         
             
            - test/unit/metadata_generator_test.rb
         
     | 
| 
      
 711 
     | 
    
         
            +
            - test/unit/playbook_progress_generator_test.rb
         
     | 
| 
       707 
712 
     | 
    
         
             
            - test/unit/rh_cloud_http_proxy_test.rb
         
     | 
| 
       708 
713 
     | 
    
         
             
            - test/unit/rh_cloud_permissions_test.rb
         
     | 
| 
       709 
714 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/branch_info_test.rb
         
     | 
| 
       710 
     | 
    
         
            -
            - test/unit/services/foreman_rh_cloud/insights_status_cleaner_test.rb
         
     | 
| 
       711 
715 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb
         
     | 
| 
       712 
716 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/cloud_status_service_test.rb
         
     | 
| 
       713 
717 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/hit_remediations_retriever_test.rb
         
     | 
| 
      
 718 
     | 
    
         
            +
            - test/unit/services/foreman_rh_cloud/insights_status_cleaner_test.rb
         
     | 
| 
       714 
719 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/template_renderer_helper_test.rb
         
     | 
| 
       715 
720 
     | 
    
         
             
            - test/unit/services/foreman_rh_cloud/url_remediations_retriever_test.rb
         
     | 
| 
       716 
721 
     | 
    
         
             
            - test/unit/shell_process_job_test.rb
         
     | 
| 
       717 
722 
     | 
    
         
             
            - test/unit/slice_generator_test.rb
         
     | 
| 
       718 
723 
     | 
    
         
             
            - test/unit/tags_generator_test.rb
         
     | 
| 
       719 
     | 
    
         
            -
            - test/unit/foreman_rh_cloud_self_host_test.rb
         
     | 
| 
       720 
     | 
    
         
            -
            - test/unit/playbook_progress_generator_test.rb
         
     |