foreman_rh_cloud 4.0.23 → 4.0.24
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/models/insights_client_report_status.rb +4 -0
- data/app/services/foreman_rh_cloud/cloud_request_forwarder.rb +0 -8
- data/lib/foreman_inventory_upload.rb +9 -1
- data/lib/foreman_inventory_upload/generators/queries.rb +1 -0
- data/lib/foreman_inventory_upload/generators/slice.rb +1 -0
- data/lib/foreman_rh_cloud/engine.rb +14 -9
- data/lib/foreman_rh_cloud/version.rb +1 -1
- data/lib/insights_cloud/async/insights_client_status_aging.rb +17 -0
- data/lib/inventory_sync/async/host_result.rb +4 -0
- data/lib/inventory_sync/async/inventory_hosts_sync.rb +10 -0
- data/lib/inventory_sync/async/inventory_self_host_sync.rb +30 -0
- data/lib/inventory_sync/async/query_inventory_job.rb +5 -1
- data/package.json +1 -1
- data/test/controllers/insights_cloud/api/machine_telemetries_controller_test.rb +41 -0
- data/test/jobs/insights_client_status_aging_test.rb +33 -0
- data/test/jobs/inventory_hosts_sync_test.rb +2 -0
- data/test/jobs/inventory_self_host_sync_test.rb +103 -0
- data/test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb +3 -3
- data/test/unit/slice_generator_test.rb +15 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b73f3b045ed5bcbba051801155232d62a0884b30da8e461328a17e509fe0f0ec
|
4
|
+
data.tar.gz: 2cc1a0c73e193de7d26b368e9a78760ee302f78ecafeef6c27e18165293d0d2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2eb0bb9cdb4d2aefa66acec328c98467a7db33de69e0256f966cca0f929756fb9100a5880d8d9a03f358cfafaf6e5aa32cf9896125c0eab8e3de9b9ebbb09269
|
7
|
+
data.tar.gz: 12e435965a84de5c538e98463fcdacbacd70eefd692822782cdb5ec4ed1e9f91e6d31f65466cffaa4b415c4491ff62e393a1e2f716f4542b03e5911fe6a34b97
|
@@ -6,6 +6,10 @@ class InsightsClientReportStatus < HostStatus::Status
|
|
6
6
|
NOT_MANAGED = 2 # host_registration_insights = false
|
7
7
|
NOT_MANAGED_WITH_DATA = 3 # host_registration_insights = false & getting data
|
8
8
|
|
9
|
+
scope :stale, -> { where.not(reported_at: (Time.now - REPORT_INTERVAL)..Time.now) }
|
10
|
+
scope :reporting, -> { where(status: REPORTING) }
|
11
|
+
scope :not_managed_with_data, -> { where(status: NOT_MANAGED_WITH_DATA) }
|
12
|
+
|
9
13
|
def self.status_name
|
10
14
|
N_('Insights')
|
11
15
|
end
|
@@ -56,10 +56,6 @@ module ForemanRhCloud
|
|
56
56
|
|
57
57
|
def path_params(request_path, certs)
|
58
58
|
case request_path
|
59
|
-
when metadata_request?
|
60
|
-
{
|
61
|
-
url: ForemanRhCloud.base_url + request_path.sub('/redhat_access/r/insights', '/api'),
|
62
|
-
}
|
63
59
|
when platform_request?
|
64
60
|
{
|
65
61
|
url: ForemanRhCloud.cert_base_url + request_path.sub('/redhat_access/r/insights/platform', '/api'),
|
@@ -76,10 +72,6 @@ module ForemanRhCloud
|
|
76
72
|
end
|
77
73
|
end
|
78
74
|
|
79
|
-
def metadata_request?
|
80
|
-
->(request_path) { request_path.include? '/static' }
|
81
|
-
end
|
82
|
-
|
83
75
|
def platform_request?
|
84
76
|
->(request_path) { request_path.include? '/platform' }
|
85
77
|
end
|
@@ -70,8 +70,16 @@ module ForemanInventoryUpload
|
|
70
70
|
folder
|
71
71
|
end
|
72
72
|
|
73
|
+
def self.inventory_base_url
|
74
|
+
ForemanRhCloud.base_url + "/api/inventory/v1/hosts"
|
75
|
+
end
|
76
|
+
|
73
77
|
def self.inventory_export_url
|
74
78
|
tags = URI.encode("satellite/satellite_instance_id=#{Foreman.instance_id}")
|
75
|
-
|
79
|
+
inventory_base_url + "?tags=#{tags}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.inventory_self_url
|
83
|
+
inventory_base_url + "?hostname_or_id=#{ForemanRhCloud.foreman_host.fqdn}"
|
76
84
|
end
|
77
85
|
end
|
@@ -49,6 +49,7 @@ module ForemanInventoryUpload
|
|
49
49
|
@stream.simple_field('satellite_id', uuid_value!(host.subscription_facet&.uuid))
|
50
50
|
@stream.simple_field('bios_uuid', bios_uuid(host))
|
51
51
|
@stream.simple_field('vm_uuid', uuid_value(fact_value(host, 'virt::uuid')))
|
52
|
+
@stream.simple_field('insights_id', uuid_value(fact_value(host, 'insights_id')))
|
52
53
|
report_ip_addresses(host, host_ips_cache)
|
53
54
|
report_mac_addresses(host)
|
54
55
|
@stream.object_field('system_profile') do
|
@@ -6,6 +6,18 @@ module ForemanRhCloud
|
|
6
6
|
class Engine < ::Rails::Engine
|
7
7
|
engine_name 'foreman_rh_cloud'
|
8
8
|
|
9
|
+
def self.register_scheduled_task(task_class, cronline)
|
10
|
+
return if ForemanTasks::RecurringLogic.joins(:tasks)
|
11
|
+
.merge(ForemanTasks::Task.where(label: task_class.name))
|
12
|
+
.exists?
|
13
|
+
|
14
|
+
User.as_anonymous_admin do
|
15
|
+
recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline(cronline)
|
16
|
+
recurring_logic.save!
|
17
|
+
recurring_logic.start(task_class)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
9
21
|
initializer 'foreman_rh_cloud.load_default_settings', :before => :load_config_initializers do
|
10
22
|
require_dependency File.expand_path('../../app/models/setting/rh_cloud.rb', __dir__)
|
11
23
|
end
|
@@ -138,15 +150,8 @@ module ForemanRhCloud
|
|
138
150
|
# skip object creation when admin user is not present, for example in test DB
|
139
151
|
if User.unscoped.find_by_login(User::ANONYMOUS_ADMIN).present?
|
140
152
|
::ForemanTasks.dynflow.config.on_init(false) do |world|
|
141
|
-
|
142
|
-
|
143
|
-
).exists?
|
144
|
-
User.as_anonymous_admin do
|
145
|
-
recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline("0 0 * * *")
|
146
|
-
recurring_logic.save!
|
147
|
-
recurring_logic.start(InventorySync::Async::InventoryScheduledSync)
|
148
|
-
end
|
149
|
-
end
|
153
|
+
ForemanRhCloud::Engine.register_scheduled_task(InventorySync::Async::InventoryScheduledSync, '0 0 * * *')
|
154
|
+
ForemanRhCloud::Engine.register_scheduled_task(InsightsCloud::Async::InsightsClientStatusAging, '0 0 * * *')
|
150
155
|
end
|
151
156
|
end
|
152
157
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module InsightsCloud
|
2
|
+
module Async
|
3
|
+
class InsightsClientStatusAging < ::Actions::EntryAction
|
4
|
+
include ::Actions::RecurringAction
|
5
|
+
|
6
|
+
def run
|
7
|
+
# update all stale records to "not reporting" counterpart
|
8
|
+
InsightsClientReportStatus.stale.reporting.update_all(status: InsightsClientReportStatus::NO_REPORT)
|
9
|
+
InsightsClientReportStatus.stale.not_managed_with_data.update_all(status: InsightsClientReportStatus::NOT_MANAGED)
|
10
|
+
end
|
11
|
+
|
12
|
+
def logger
|
13
|
+
action_logger
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module InventorySync
|
2
2
|
module Async
|
3
3
|
class HostResult
|
4
|
+
attr_reader :uuid_by_fqdn
|
5
|
+
|
4
6
|
def initialize(result)
|
5
7
|
@total = result['total']
|
6
8
|
@count = result['count']
|
@@ -8,6 +10,7 @@ module InventorySync
|
|
8
10
|
@per_page = result['per_page']
|
9
11
|
@sub_ids = result["results"].map { |host| host['subscription_manager_id'] }
|
10
12
|
@uuid_by_sub_id = Hash[result["results"].map { |host| [host['subscription_manager_id'], host['id']] }]
|
13
|
+
@uuid_by_fqdn = Hash[result["results"].map { |host| [host['fqdn'].downcase, host['id']] }]
|
11
14
|
end
|
12
15
|
|
13
16
|
def status_hashes
|
@@ -19,6 +22,7 @@ module InventorySync
|
|
19
22
|
host_id: host_id,
|
20
23
|
status: InventorySync::InventoryStatus::SYNC,
|
21
24
|
reported_at: DateTime.current,
|
25
|
+
type: InventorySync::InventoryStatus.name,
|
22
26
|
}
|
23
27
|
end
|
24
28
|
end.compact
|
@@ -4,6 +4,12 @@ module InventorySync
|
|
4
4
|
set_callback :iteration, :around, :setup_facet_transaction
|
5
5
|
set_callback :step, :around, :create_facets
|
6
6
|
|
7
|
+
def plan
|
8
|
+
# by default the tasks will be executed concurrently
|
9
|
+
plan_self
|
10
|
+
plan_self_host_sync
|
11
|
+
end
|
12
|
+
|
7
13
|
def setup_facet_transaction
|
8
14
|
InsightsFacet.transaction do
|
9
15
|
yield
|
@@ -33,6 +39,10 @@ module InventorySync
|
|
33
39
|
InsightsFacet.where(host_id: host_id).update_all(uuid: uuids_hash[host_id])
|
34
40
|
end
|
35
41
|
end
|
42
|
+
|
43
|
+
def plan_self_host_sync
|
44
|
+
plan_action InventorySync::Async::InventorySelfHostSync
|
45
|
+
end
|
36
46
|
end
|
37
47
|
end
|
38
48
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module InventorySync
|
2
|
+
module Async
|
3
|
+
class InventorySelfHostSync < QueryInventoryJob
|
4
|
+
set_callback :step, :around, :create_facets
|
5
|
+
|
6
|
+
def create_facets
|
7
|
+
# get the results from the event
|
8
|
+
results = yield
|
9
|
+
|
10
|
+
add_missing_insights_facet(results.uuid_by_fqdn) unless results.uuid_by_fqdn.empty?
|
11
|
+
results
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def add_missing_insights_facet(uuids_hash)
|
17
|
+
facet = InsightsFacet.find_or_create_by(host_id: ForemanRhCloud.foreman_host.id) do |facet|
|
18
|
+
facet.uuid = uuids_hash.values.first
|
19
|
+
end
|
20
|
+
|
21
|
+
# fix empty uuid in case the facet already exists
|
22
|
+
facet.update(uuid: uuids_hash.values.first) unless facet.uuid
|
23
|
+
end
|
24
|
+
|
25
|
+
def request_url
|
26
|
+
ForemanInventoryUpload.inventory_self_url
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -31,7 +31,7 @@ module InventorySync
|
|
31
31
|
def query_inventory(page = 1)
|
32
32
|
hosts_inventory_response = execute_cloud_request(
|
33
33
|
method: :get,
|
34
|
-
url:
|
34
|
+
url: request_url,
|
35
35
|
headers: {
|
36
36
|
params: {
|
37
37
|
per_page: 100,
|
@@ -46,6 +46,10 @@ module InventorySync
|
|
46
46
|
def logger
|
47
47
|
action_logger
|
48
48
|
end
|
49
|
+
|
50
|
+
def request_url
|
51
|
+
ForemanInventoryUpload.inventory_export_url
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
data/package.json
CHANGED
@@ -11,6 +11,39 @@ module InsightsCloud::Api
|
|
11
11
|
host = FactoryBot.create(:host, :with_subscription, :organization => org)
|
12
12
|
User.current = ::Katello::CpConsumerUser.new(:uuid => host.subscription_facet.uuid, :login => host.subscription_facet.uuid)
|
13
13
|
InsightsCloud::Api::MachineTelemetriesController.any_instance.stubs(:upstream_owner).returns({ 'uuid' => 'abcdefg' })
|
14
|
+
|
15
|
+
@cert1 = "-----BEGIN CERTIFICATE-----\r\n" +
|
16
|
+
"MIIFdDCCA1ygAwIBAgIJAM5Uqykb3EAtMA0GCSqGSIb3DQEBCwUAME8xCzAJBgNV\r\n" +
|
17
|
+
"BAYTAklMMREwDwYDVQQIDAhUZWwgQXZpdjEUMBIGA1UECgwLVGhlIEZvcmVtYW4x\r\n" +
|
18
|
+
"FzAVBgNVBAMMDnRoZWZvcmVtYW4ub3JnMB4XDTE4MDMyNDEyMzYyOFoXDTI4MDMy\r\n" +
|
19
|
+
"MTEyMzYyOFowTzELMAkGA1UEBhMCSUwxETAPBgNVBAgMCFRlbCBBdml2MRQwEgYD\r\n" +
|
20
|
+
"VQQKDAtUaGUgRm9yZW1hbjEXMBUGA1UEAwwOdGhlZm9yZW1hbi5vcmcwggIiMA0G\r\n" +
|
21
|
+
"CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF04/s4h+BgHPG1HDZ/sDlYq925pkc\r\n" +
|
22
|
+
"RTVAfnE2EXDAmZ6W4Q9ueDY65MHe3ZWO5Dg72kNSP2sK9kRI7Dk5CAFOgyw1rH8t\r\n" +
|
23
|
+
"Hd1+0xp/lv6e4SvSYghxIL68vFe0ftKkm1usqejBM5ZTgKr7JCI+XSIN36F65Kde\r\n" +
|
24
|
+
"c+vxwBnayuhP04r9/aaE/709SXML4eRVYW8I3qFy9FPtUOm+bY8U2PIv5fHayqbG\r\n" +
|
25
|
+
"cL/4t3+MCtMhHJsLzdBXya+1P5t+HcKjUNlmwoUF961YAktVuEFloGd0RMRlqF3/\r\n" +
|
26
|
+
"itU3QNlXgA5QBIciE5VPr/PiqgMC3zgd5avjF4OribZ+N9AATLiQMW78il5wSfcc\r\n" +
|
27
|
+
"kQjU9ChOLrzku455vQ8KE4bc0qvpCWGfUah6MvL9JB+TQkRl/8kxl0b9ZinIvJDH\r\n" +
|
28
|
+
"ynVMb4cB/TDEjrjOfzn9mWLH0ZJqjmc2bER/G12WQxOaYLxdVwRStD3Yh6PtiFWu\r\n" +
|
29
|
+
"sXOk19UOTVkeuvGFVtvzLfEwQ1lDEo7+VBQz8FG/HBu2Hpq3IwCFrHuicikwjQJk\r\n" +
|
30
|
+
"nfturgD0rBOKEc1qWNZRCvovYOLL6ihvv5Orujsx5ZCHOAtnVNxkvIlFt2RS45LF\r\n" +
|
31
|
+
"MtPJyhAc6SjitllfUEirxprsbmeSZqrIfzcGaEhgOSnyik1WMv6bYiqPfBg8Fzjh\r\n" +
|
32
|
+
"vOCbtiDNPmvgOwIDAQABo1MwUTAdBgNVHQ4EFgQUtkAgQopsTtG9zSG3MgW2IxHD\r\n" +
|
33
|
+
"MDwwHwYDVR0jBBgwFoAUtkAgQopsTtG9zSG3MgW2IxHDMDwwDwYDVR0TAQH/BAUw\r\n" +
|
34
|
+
"AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAJq7iN+ZroRBweNhvUobxs75bLIV6tNn1\r\n" +
|
35
|
+
"MdNHDRA+hezwf+gxHZhFyaAHfTpst2/9leK5Qe5Zd6gZLr3E5/8ppQuRod72H39B\r\n" +
|
36
|
+
"vxMlG5zxDss0WMo3vZeKZbTY6QhXi/lY2IZ6OGV4feSvCsYxn27GTjjrRUSLFeHH\r\n" +
|
37
|
+
"JVemCwCDMavaE3+OIY4v2P4FcG+MjUvfOB9ahI24TWL7YgrsNVmJjCILq+EeUj0t\r\n" +
|
38
|
+
"Gde1SXVyLkqt7PoxHRJAE0BCEMJSnjxaVB329acJgeehBUxjj4CCPqtDxtbz9HEH\r\n" +
|
39
|
+
"mOKfNdaKpFor+DUeEKUWVGnr9U9xOaC+Ws+oX7MIEUCDM7p2ob4JwcjnFs1jZgHh\r\n" +
|
40
|
+
"Hwig+i7doTlc701PvKWO96fuNHK3B3/jTb1fVvSZ49O/RvY1VWODdUdxWmXGHNh3\r\n" +
|
41
|
+
"LoR8tSPEb46lC2DXGaIQumqQt8PnBG+vL1qkQa1SGTV7dJ8TTbxbv0S+sS+igkk9\r\n" +
|
42
|
+
"zsIEK8Ea3Ep935cXximz0faAAKHSA+It+xHLAyDtqy2KaAEBgGsBuuWlUfK6TaP3\r\n" +
|
43
|
+
"Gwdjct3y4yYUO45lUsUfHqX8vk/4ttW5zYeDiW+HArJz+9VUXNbEdury4kGuHgBj\r\n" +
|
44
|
+
"xHD4Bsul65+hHZ9QywKU26F1A6TLkYpQ2rk/Dx9LGICM4m4IlHjWJPFsQdtkyOor\r\n" +
|
45
|
+
"osxMtcaZZ1E=\r\n" +
|
46
|
+
"-----END CERTIFICATE-----"
|
14
47
|
end
|
15
48
|
|
16
49
|
test "should respond with response from cloud" do
|
@@ -30,6 +63,14 @@ module InsightsCloud::Api
|
|
30
63
|
::ForemanRhCloud::CloudRequestForwarder.any_instance.expects(:execute_cloud_request).with do |opts|
|
31
64
|
opts[:headers][:content_type] == 'application/json'
|
32
65
|
end.returns(res)
|
66
|
+
InsightsCloud::Api::MachineTelemetriesController.any_instance.expects(:candlepin_id_cert)
|
67
|
+
.returns(
|
68
|
+
{
|
69
|
+
cert: @cert1,
|
70
|
+
key: OpenSSL::PKey::RSA.new(1024).to_pem,
|
71
|
+
}
|
72
|
+
)
|
73
|
+
InsightsCloud::Api::MachineTelemetriesController.any_instance.expects(:cp_owner_id).returns('123')
|
33
74
|
|
34
75
|
post :forward_request, as: :json, params: { "path" => "static/v1/test", "machine_telemetry" => {"foo" => "bar"} }
|
35
76
|
assert_equal @body, @response.body
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
require 'foreman_tasks/test_helpers'
|
3
|
+
|
4
|
+
class InsightsClientStatusAgingTest < ActiveSupport::TestCase
|
5
|
+
include ForemanTasks::TestHelpers::WithInThreadExecutor
|
6
|
+
|
7
|
+
setup do
|
8
|
+
User.current = User.find_by(login: 'secret_admin')
|
9
|
+
|
10
|
+
@host1 = FactoryBot.create(:host)
|
11
|
+
@host2 = FactoryBot.create(:host)
|
12
|
+
@host3 = FactoryBot.create(:host)
|
13
|
+
@host4 = FactoryBot.create(:host)
|
14
|
+
|
15
|
+
@hosts = [@host1, @host2, @host3, @host4]
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'stale statuses should change' do
|
19
|
+
InsightsClientReportStatus.find_or_initialize_by(host_id: @host1.id).update(status: InsightsClientReportStatus::REPORTING, reported_at: Time.now - InsightsClientReportStatus::REPORT_INTERVAL - 1.day)
|
20
|
+
InsightsClientReportStatus.find_or_initialize_by(host_id: @host2.id).update(status: InsightsClientReportStatus::NO_REPORT, reported_at: Time.now - InsightsClientReportStatus::REPORT_INTERVAL - 1.day)
|
21
|
+
InsightsClientReportStatus.find_or_initialize_by(host_id: @host3.id).update(status: InsightsClientReportStatus::NOT_MANAGED, reported_at: Time.now - InsightsClientReportStatus::REPORT_INTERVAL - 1.day)
|
22
|
+
InsightsClientReportStatus.find_or_initialize_by(host_id: @host4.id).update(status: InsightsClientReportStatus::NOT_MANAGED_WITH_DATA, reported_at: Time.now - InsightsClientReportStatus::REPORT_INTERVAL - 1.day)
|
23
|
+
|
24
|
+
ForemanTasks.sync_task(InsightsCloud::Async::InsightsClientStatusAging)
|
25
|
+
|
26
|
+
@hosts.each(&:reload)
|
27
|
+
|
28
|
+
assert_equal InsightsClientReportStatus::NO_REPORT, @host1.get_status(InsightsClientReportStatus).status
|
29
|
+
assert_equal InsightsClientReportStatus::NO_REPORT, @host2.get_status(InsightsClientReportStatus).status
|
30
|
+
assert_equal InsightsClientReportStatus::NOT_MANAGED, @host3.get_status(InsightsClientReportStatus).status
|
31
|
+
assert_equal InsightsClientReportStatus::NOT_MANAGED, @host4.get_status(InsightsClientReportStatus).status
|
32
|
+
end
|
33
|
+
end
|
@@ -243,6 +243,7 @@ class InventoryHostsSyncTest < ActiveSupport::TestCase
|
|
243
243
|
|
244
244
|
test 'Inventory should sync UUID for existing Insights Facets' do
|
245
245
|
InventorySync::Async::InventoryHostsSync.any_instance.expects(:query_inventory).returns(@inventory)
|
246
|
+
InventorySync::Async::InventoryHostsSync.any_instance.expects(:plan_self_host_sync)
|
246
247
|
|
247
248
|
@host2.build_insights.save
|
248
249
|
|
@@ -255,6 +256,7 @@ class InventoryHostsSyncTest < ActiveSupport::TestCase
|
|
255
256
|
|
256
257
|
test 'Inventory should sync UUID for new Insights Facets' do
|
257
258
|
InventorySync::Async::InventoryHostsSync.any_instance.expects(:query_inventory).returns(@inventory)
|
259
|
+
InventorySync::Async::InventoryHostsSync.any_instance.expects(:plan_self_host_sync)
|
258
260
|
|
259
261
|
ForemanTasks.sync_task(InventorySync::Async::InventoryHostsSync)
|
260
262
|
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
require 'foreman_tasks/test_helpers'
|
3
|
+
|
4
|
+
class InventorySelfHostSyncTest < ActiveSupport::TestCase
|
5
|
+
include ForemanTasks::TestHelpers::WithInThreadExecutor
|
6
|
+
|
7
|
+
setup do
|
8
|
+
User.current = User.find_by(login: 'secret_admin')
|
9
|
+
|
10
|
+
# this host would pass our plugin queries, so it could be uploaded to the cloud.
|
11
|
+
@host1 = FactoryBot.create(:host)
|
12
|
+
@host1_inventory_id = '3255d080-e6c1-44e2-8d72-b044b9a38d8f'
|
13
|
+
|
14
|
+
ForemanInventoryUpload::Generators::Queries.instance_variable_set(:@fact_names, nil)
|
15
|
+
|
16
|
+
ForemanRhCloud.stubs(:foreman_host).returns(@host1)
|
17
|
+
|
18
|
+
inventory_json = <<-INVENTORY_JSON
|
19
|
+
{
|
20
|
+
"total": 1,
|
21
|
+
"count": 1,
|
22
|
+
"page": 1,
|
23
|
+
"per_page": 1,
|
24
|
+
"results": [
|
25
|
+
{
|
26
|
+
"insights_id": "e0dc5144-d78e-43ed-97be-a7a21d1b6946",
|
27
|
+
"rhel_machine_id": null,
|
28
|
+
"subscription_manager_id": "0f97ee19-6862-4900-aea4-f121c8754776",
|
29
|
+
"satellite_id": "0f97ee19-6862-4900-aea4-f121c8754776",
|
30
|
+
"bios_uuid": "6a0b199a-8225-4ade-ae44-3b18cfc84a01",
|
31
|
+
"ip_addresses": [
|
32
|
+
"192.168.122.136"
|
33
|
+
],
|
34
|
+
"fqdn": "#{@host1.fqdn}",
|
35
|
+
"mac_addresses": [
|
36
|
+
"52:54:00:02:d1:2a",
|
37
|
+
"00:00:00:00:00:00"
|
38
|
+
],
|
39
|
+
"external_id": null,
|
40
|
+
"id": "#{@host1_inventory_id}",
|
41
|
+
"account": "1460290",
|
42
|
+
"display_name": "insights-rh8.example.com",
|
43
|
+
"ansible_host": null,
|
44
|
+
"facts": [
|
45
|
+
{
|
46
|
+
"namespace": "satellite",
|
47
|
+
"facts": {
|
48
|
+
"virtual_host_name": "virt-who-nobody.home-1",
|
49
|
+
"satellite_instance_id": "fc4d0cb0-a0b0-421e-b096-b028319b8e47",
|
50
|
+
"is_simple_content_access": false,
|
51
|
+
"distribution_version": "8.3",
|
52
|
+
"satellite_version": "6.8.4",
|
53
|
+
"organization_id": 1,
|
54
|
+
"is_hostname_obfuscated": false,
|
55
|
+
"virtual_host_uuid": "a90e6294-4766-420a-8dc0-3ec5b96d60ec"
|
56
|
+
}
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"namespace": "yupana",
|
60
|
+
"facts": {
|
61
|
+
"report_platform_id": "d37afa50-08ce-4efb-a0e5-759c2a016661",
|
62
|
+
"report_slice_id": "5bf791d7-5e30-4a3c-929a-11dd9fa6eb72",
|
63
|
+
"source": "Satellite",
|
64
|
+
"yupana_host_id": "78c62486-0ac4-406c-a4c0-3a1f81112a2d",
|
65
|
+
"account": "1460290"
|
66
|
+
}
|
67
|
+
}
|
68
|
+
],
|
69
|
+
"reporter": "puptoo",
|
70
|
+
"stale_timestamp": "2021-03-19T06:05:12.092136+00:00",
|
71
|
+
"stale_warning_timestamp": "2021-03-26T06:05:12.092136+00:00",
|
72
|
+
"culled_timestamp": "2021-04-02T06:05:12.092136+00:00",
|
73
|
+
"created": "2021-02-08T13:22:50.555671+00:00",
|
74
|
+
"updated": "2021-03-18T01:05:12.131847+00:00"
|
75
|
+
}
|
76
|
+
]
|
77
|
+
}
|
78
|
+
INVENTORY_JSON
|
79
|
+
@inventory = JSON.parse(inventory_json)
|
80
|
+
end
|
81
|
+
|
82
|
+
test 'Inventory should sync UUID for existing Insights Facets' do
|
83
|
+
InventorySync::Async::InventorySelfHostSync.any_instance.expects(:query_inventory).returns(@inventory)
|
84
|
+
|
85
|
+
@host1.build_insights.save
|
86
|
+
|
87
|
+
ForemanTasks.sync_task(InventorySync::Async::InventorySelfHostSync)
|
88
|
+
|
89
|
+
@host1.reload
|
90
|
+
|
91
|
+
assert_equal @host1_inventory_id, @host1.insights.uuid
|
92
|
+
end
|
93
|
+
|
94
|
+
test 'Inventory should sync UUID for new Insights Facets' do
|
95
|
+
InventorySync::Async::InventorySelfHostSync.any_instance.expects(:query_inventory).returns(@inventory)
|
96
|
+
|
97
|
+
ForemanTasks.sync_task(InventorySync::Async::InventorySelfHostSync)
|
98
|
+
|
99
|
+
@host1.reload
|
100
|
+
|
101
|
+
assert_equal @host1_inventory_id, @host1.insights.uuid
|
102
|
+
end
|
103
|
+
end
|
@@ -42,9 +42,9 @@ class CloudRequestForwarderTest < ActiveSupport::TestCase
|
|
42
42
|
test 'should prepare correct cloud url' do
|
43
43
|
paths = {
|
44
44
|
"/redhat_access/r/insights/platform/module-update-router/v1/channel?module=insights-core" => "https://cert.cloud.redhat.com/api/module-update-router/v1/channel?module=insights-core",
|
45
|
-
"/redhat_access/r/insights/v1/static/release/insights-core.egg" => "https://
|
46
|
-
"/redhat_access/r/insights/v1/static/uploader.v2.json" => "https://
|
47
|
-
"/redhat_access/r/insights/v1/static/uploader.v2.json.asc" => "https://
|
45
|
+
"/redhat_access/r/insights/v1/static/release/insights-core.egg" => "https://cert-api.access.redhat.com/r/insights/v1/static/release/insights-core.egg",
|
46
|
+
"/redhat_access/r/insights/v1/static/uploader.v2.json" => "https://cert-api.access.redhat.com/r/insights/v1/static/uploader.v2.json",
|
47
|
+
"/redhat_access/r/insights/v1/static/uploader.v2.json.asc" => "https://cert-api.access.redhat.com/r/insights/v1/static/uploader.v2.json.asc",
|
48
48
|
"/redhat_access/r/insights/platform/inventory/v1/hosts" => "https://cert.cloud.redhat.com/api/inventory/v1/hosts",
|
49
49
|
"/redhat_access/r/insights/platform/ingress/v1/upload" => "https://cert.cloud.redhat.com/api/ingress/v1/upload",
|
50
50
|
"/redhat_access/r/insights/uploads/67200803-132b-474b-a6f9-37be74185df4" => "https://cert-api.access.redhat.com/r/insights/uploads/67200803-132b-474b-a6f9-37be74185df4",
|
@@ -53,6 +53,7 @@ class SliceGeneratorTest < ActiveSupport::TestCase
|
|
53
53
|
'insights_client::hostname',
|
54
54
|
'insights_client::obfuscate_ip_enabled',
|
55
55
|
'insights_client::ips',
|
56
|
+
'insights_id',
|
56
57
|
]
|
57
58
|
end
|
58
59
|
|
@@ -657,6 +658,20 @@ class SliceGeneratorTest < ActiveSupport::TestCase
|
|
657
658
|
assert_not_nil actual_host['bios_uuid']
|
658
659
|
end
|
659
660
|
|
661
|
+
test 'passes valid insights_id field' do
|
662
|
+
FactoryBot.create(:fact_value, fact_name: fact_names['insights_id'], value: 'D30B0B42-7824-2635-C62D-491394DE43F7', host: @host)
|
663
|
+
|
664
|
+
batch = Host.where(id: @host.id).in_batches.first
|
665
|
+
generator = create_generator(batch)
|
666
|
+
|
667
|
+
json_str = generator.render
|
668
|
+
actual = JSON.parse(json_str.join("\n"))
|
669
|
+
|
670
|
+
assert_equal '00000000-0000-0000-0000-000000000000', actual['report_slice_id']
|
671
|
+
assert_not_nil(actual_host = actual['hosts'].first)
|
672
|
+
assert_not_nil actual_host['insights_id']
|
673
|
+
end
|
674
|
+
|
660
675
|
private
|
661
676
|
|
662
677
|
def create_generator(batch, name = '00000000-0000-0000-0000-000000000000')
|
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: 4.0.
|
4
|
+
version: 4.0.24
|
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: 2021-
|
11
|
+
date: 2021-07-20 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/insights_client_status_aging.rb
|
224
225
|
- lib/insights_cloud/async/insights_full_sync.rb
|
225
226
|
- lib/insights_cloud/async/insights_generate_notifications.rb
|
226
227
|
- lib/insights_cloud/async/insights_resolutions_sync.rb
|
@@ -231,6 +232,7 @@ files:
|
|
231
232
|
- lib/inventory_sync/async/inventory_full_sync.rb
|
232
233
|
- lib/inventory_sync/async/inventory_hosts_sync.rb
|
233
234
|
- lib/inventory_sync/async/inventory_scheduled_sync.rb
|
235
|
+
- lib/inventory_sync/async/inventory_self_host_sync.rb
|
234
236
|
- lib/inventory_sync/async/query_inventory_job.rb
|
235
237
|
- lib/tasks/foreman_rh_cloud_tasks.rake
|
236
238
|
- lib/tasks/insights.rake
|
@@ -249,12 +251,14 @@ files:
|
|
249
251
|
- test/controllers/uploads_settings_controller_test.rb
|
250
252
|
- test/factories/insights_factories.rb
|
251
253
|
- test/factories/inventory_upload_factories.rb
|
254
|
+
- test/jobs/insights_client_status_aging_test.rb
|
252
255
|
- test/jobs/insights_full_sync_test.rb
|
253
256
|
- test/jobs/insights_resolutions_sync_test.rb
|
254
257
|
- test/jobs/insights_rules_sync_test.rb
|
255
258
|
- test/jobs/inventory_full_sync_test.rb
|
256
259
|
- test/jobs/inventory_hosts_sync_test.rb
|
257
260
|
- test/jobs/inventory_scheduled_sync_test.rb
|
261
|
+
- test/jobs/inventory_self_host_sync_test.rb
|
258
262
|
- test/jobs/upload_report_job_test.rb
|
259
263
|
- test/models/insights_client_report_status_test.rb
|
260
264
|
- test/test_plugin_helper.rb
|
@@ -677,12 +681,14 @@ test_files:
|
|
677
681
|
- test/controllers/uploads_settings_controller_test.rb
|
678
682
|
- test/factories/insights_factories.rb
|
679
683
|
- test/factories/inventory_upload_factories.rb
|
684
|
+
- test/jobs/insights_client_status_aging_test.rb
|
680
685
|
- test/jobs/insights_full_sync_test.rb
|
681
686
|
- test/jobs/insights_resolutions_sync_test.rb
|
682
687
|
- test/jobs/insights_rules_sync_test.rb
|
683
688
|
- test/jobs/inventory_full_sync_test.rb
|
684
689
|
- test/jobs/inventory_hosts_sync_test.rb
|
685
690
|
- test/jobs/inventory_scheduled_sync_test.rb
|
691
|
+
- test/jobs/inventory_self_host_sync_test.rb
|
686
692
|
- test/jobs/upload_report_job_test.rb
|
687
693
|
- test/models/insights_client_report_status_test.rb
|
688
694
|
- test/test_plugin_helper.rb
|