github.com/kubeshop/testkube@v1.17.23/internal/app/api/v1/events.go (about)

     1  package v1
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"net/http"
     7  
     8  	"github.com/gofiber/fiber/v2"
     9  	"github.com/gofiber/websocket/v2"
    10  
    11  	events "github.com/fluxcd/pkg/apis/event/v1beta1"
    12  )
    13  
    14  // InitEvents is a handler to emit logs
    15  func (s TestkubeAPI) InitEvents() {
    16  	// run reconciller loop
    17  	go s.Events.Reconcile(context.Background())
    18  
    19  	// run workers
    20  	s.Events.Listen(context.Background())
    21  
    22  	// handle response logs
    23  	go func() {
    24  		s.Log.Debug("Listening for workers results")
    25  		for resp := range s.Events.Results {
    26  			if resp.Error() != "" {
    27  				s.Log.Errorw("got error when sending webhooks", "response", resp)
    28  				continue
    29  			}
    30  			s.Log.Debugw("got event response", "response", resp)
    31  		}
    32  	}()
    33  }
    34  
    35  func (s TestkubeAPI) EventsStreamHandler() fiber.Handler {
    36  	return websocket.New(func(c *websocket.Conn) {
    37  		s.Log.Debugw("handling websocket connection", "id", c.Params("id"), "locals", c.Locals, "remoteAddr", c.RemoteAddr(), "localAddr", c.LocalAddr())
    38  
    39  		// wait for disconnect
    40  		// WebsocketLoader will add WebsocketListener which will send data to `c`
    41  		<-s.WebsocketLoader.Add(c)
    42  
    43  		s.Log.Debugw("websocket closed", "id", c.Params("id"))
    44  	})
    45  }
    46  
    47  // GetTestHandler is method for getting an existing test
    48  func (s TestkubeAPI) FluxEventHandler() fiber.Handler {
    49  	return func(c *fiber.Ctx) error {
    50  		body := c.Body()
    51  
    52  		var event events.Event
    53  		err := json.Unmarshal(body, &event)
    54  		if err != nil {
    55  			return s.Error(c, http.StatusBadRequest, err)
    56  		}
    57  
    58  		// TODO handle Flux logic on deployment change
    59  		// check event.InvolvedObject?
    60  		switch event.Reason {
    61  		default:
    62  			s.Log.Debugw("got FluxCD event", "event", event)
    63  		}
    64  
    65  		return c.JSON(event)
    66  	}
    67  }