@@ -3,6 +3,9 @@ package workers
33import (
44 "context"
55 "encoding/json"
6+ "fmt"
7+ "github.com/go-resty/resty/v2"
8+ "strings"
69 "sync"
710 "time"
811
@@ -18,30 +21,39 @@ type K8SWorker struct {
1821 cluster string
1922 integration string
2023 client * opslevel.Client
24+ rest * resty.Client
2125 controller * controller.Controller
2226}
2327
24- func NewK8SWorker (ctx context.Context , wg * sync.WaitGroup , cluster string , integration string , selectors []controller.Selector , client * opslevel.Client , resync , flush time.Duration ) {
28+ func NewK8SWorker (ctx context.Context , wg * sync.WaitGroup , cluster string , integration string , selectors []controller.Selector , client * opslevel.Client , rest * resty. Client , resync , flush time.Duration ) {
2529 controller .Run (ctx , wg , selectors , resync , flush , & K8SWorker {
26- client : client ,
2730 cluster : cluster ,
2831 integration : integration ,
32+ client : client ,
33+ rest : rest ,
2934 })
3035}
3136
3237func (s * K8SWorker ) Handle (evt controller.Event ) {
3338 kind := evt .ExternalKind ()
3439 id := evt .ExternalID (s .cluster )
3540
36- switch evt .Op {
37- case controller .OpCreate , controller .OpUpdate :
38- value , err := s .parse (evt .New )
39- if err != nil {
40- log .Error ().Err (err ).Msgf ("failed to convert k8s resource" )
41+ if strings .Contains (s .integration , "integrations/custom/webhook" ) {
42+ switch evt .Op {
43+ case controller .OpCreate , controller .OpUpdate :
44+ s .sendEvent (kind , id , evt .New )
45+ }
46+ } else {
47+ switch evt .Op {
48+ case controller .OpCreate , controller .OpUpdate :
49+ value , err := s .parse (evt .New )
50+ if err != nil {
51+ log .Error ().Err (err ).Msgf ("failed to convert k8s resource" )
52+ }
53+ s .sendUpsert (kind , id , value )
54+ case controller .OpDelete :
55+ s .sendDelete (kind , id )
4156 }
42- s .sendUpsert (kind , id , value )
43- case controller .OpDelete :
44- s .sendDelete (kind , id )
4557 }
4658}
4759
@@ -62,6 +74,26 @@ func (s *K8SWorker) parse(item *unstructured.Unstructured) (opslevel.JSON, error
6274 return data , nil
6375}
6476
77+ func (s * K8SWorker ) sendEvent (kind string , id string , value * unstructured.Unstructured ) {
78+ kind = strings .Replace (kind , "/" , "_" , - 1 )
79+ if viper .GetBool ("dry-run" ) {
80+ log .Info ().Msgf ("[DRYRUN] POST %s | %s" , kind , id )
81+ log .Debug ().Msgf ("\t %#v" , value )
82+ } else {
83+ url := fmt .Sprintf ("%s?external_kind=%s" , s .integration , kind )
84+ resp , err := s .rest .R ().SetBody (value ).Post (url )
85+ if err != nil {
86+ log .Error ().Err (err ).Msgf ("error during post" )
87+ return
88+ }
89+ if resp .StatusCode () > 299 {
90+ log .Error ().Msgf ("%v" , resp )
91+ return
92+ }
93+ log .Info ().Msgf ("POST %s | %s" , kind , id )
94+ }
95+ }
96+
6597func (s * K8SWorker ) sendUpsert (kind string , id string , value opslevel.JSON ) {
6698 var m struct {
6799 Payload struct {
0 commit comments