Skip to content

Commit 5c210d6

Browse files
committed
RHINENG-22325: sent inventory view event after evaluation
1 parent 7d43431 commit 5c210d6

3 files changed

Lines changed: 94 additions & 0 deletions

File tree

base/inventory_views/inventory_views.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package inventory_views
33
import (
44
"app/base/models"
55
"app/base/utils"
6+
"time"
67

78
"gorm.io/gorm"
89
)
@@ -35,6 +36,16 @@ type InventoryViewsEvent struct {
3536
Hosts []InventoryViewsHost `json:"hosts"`
3637
}
3738

39+
func MakeInventoryViewsEvent(tx *gorm.DB, orgID string, systems []models.SystemPlatform) (
40+
InventoryViewsEvent, error) {
41+
templates, err := FindSystemsTemplates(tx, systems)
42+
if err != nil {
43+
return InventoryViewsEvent{}, err
44+
}
45+
hosts := MakeInventoryViewsHosts(systems, templates)
46+
return InventoryViewsEvent{OrgID: orgID, Timestamp: time.Now().Format(time.RFC3339), Hosts: hosts}, nil
47+
}
48+
3849
func MakeInventoryViewsHosts(systems []models.SystemPlatform,
3950
templates map[int64]models.TemplateBase) []InventoryViewsHost {
4051
hosts := make([]InventoryViewsHost, len(systems))

evaluator/evaluate.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var (
5959
enableYumUpdatesEval bool
6060
nEvalGoroutines int
6161
enableInstantNotifications bool
62+
enableInventoryViews bool
6263
enableSatelliteFunctionality bool
6364
errVmaasBadRequest = errors.New("vmaas bad request")
6465
)
@@ -79,6 +80,7 @@ func configure() {
7980
vmaasUpdatesURL = utils.FailIfEmpty(utils.CoreCfg.VmaasAddress, "VMAAS_ADDRESS") + base.VMaaSAPIPrefix + "/updates"
8081
configureRemediations()
8182
configureNotifications()
83+
configureInventoryViews()
8284
configureStatus()
8385
}
8486

@@ -126,6 +128,8 @@ func confugureEvaluator() {
126128
nEvalGoroutines = utils.PodConfig.GetInt("max_goroutines", 1)
127129
// Send advisory notification immediately
128130
enableInstantNotifications = utils.PodConfig.GetBool("instant_notifications", true)
131+
// Send inventory views events
132+
enableInventoryViews = utils.PodConfig.GetBool("inventory_views", false)
129133
// Ignore templates for satellite managed systems
130134
enableSatelliteFunctionality = utils.PodConfig.GetBool("satellite_functionality", true)
131135
}
@@ -481,6 +485,15 @@ func evaluateAndStore(system *models.SystemPlatform,
481485
return errors.Wrap(err, "Unable to update system")
482486
}
483487

488+
if enableInventoryViews {
489+
err = publishInventoryViewsEvent(tx, []models.SystemPlatform{*system}, event)
490+
if err != nil {
491+
evaluationCnt.WithLabelValues("error-inventory-views-publish").Inc()
492+
utils.LogError("orgID", event.GetOrgID(), "inventoryID", system.GetInventoryID(), "err", err.Error(),
493+
"publishing inventory views event failed")
494+
}
495+
}
496+
484497
// Send instant notification with new advisories
485498
if enableInstantNotifications {
486499
err = publishNewAdvisoriesNotification(tx, system, event.GetOrgID(), systemAdvisoriesNew)

evaluator/inventory_views.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package evaluator
2+
3+
import (
4+
"app/base"
5+
"app/base/inventory_views"
6+
"app/base/models"
7+
"app/base/mqueue"
8+
"app/base/utils"
9+
"fmt"
10+
"time"
11+
12+
"github.com/pkg/errors"
13+
"github.com/segmentio/kafka-go"
14+
"gorm.io/gorm"
15+
)
16+
17+
var patchAppHeader = kafka.Header{Key: "application", Value: []byte("patch")}
18+
19+
var inventoryViewsPublisher mqueue.Writer
20+
21+
func configureInventoryViews() {
22+
if topic := utils.CoreCfg.InventoryViewsTopic; topic != "" {
23+
inventoryViewsPublisher = mqueue.NewKafkaWriterFromEnv(topic)
24+
}
25+
}
26+
27+
func publishInventoryViewsEvent(tx *gorm.DB, systems []models.SystemPlatform, origin *mqueue.PlatformEvent) error {
28+
if inventoryViewsPublisher == nil {
29+
return nil
30+
}
31+
32+
tStart := time.Now()
33+
defer utils.ObserveSecondsSince(tStart, evaluationPartDuration.WithLabelValues("inventory-views-publish"))
34+
35+
orgID := origin.GetOrgID()
36+
var requestID string
37+
if len(origin.RequestIDs) > 0 {
38+
requestID = origin.RequestIDs[0]
39+
} else {
40+
requestID = fmt.Sprintf("patch-%d", time.Now().UnixNano())
41+
}
42+
43+
value, err := inventory_views.MakeInventoryViewsEvent(tx, orgID, systems)
44+
if err != nil {
45+
return errors.Wrap(err, "creating inventory views event failed")
46+
}
47+
48+
headers := []kafka.Header{patchAppHeader, {Key: "request_id", Value: []byte(requestID)}}
49+
50+
msg, err := mqueue.MessageFromJSON(orgID, value, headers)
51+
if err != nil {
52+
return errors.Wrap(err, "creating inventory views message failed")
53+
}
54+
55+
err = inventoryViewsPublisher.WriteMessages(base.Context, msg)
56+
if err != nil {
57+
return errors.Wrap(err, "writing message to inventory views publisher failed")
58+
}
59+
60+
// log the event
61+
systemIDs := make([]int64, len(systems))
62+
for i, s := range systems {
63+
systemIDs[i] = s.ID
64+
}
65+
66+
utils.LogInfo("rh_account_ID", systems[0].RhAccountID, "systemIDs", systemIDs,
67+
"inventory views event sent successfully")
68+
69+
return nil
70+
}

0 commit comments

Comments
 (0)