diff --git a/agent/main.go b/agent/main.go index a0bc0484b..3e702d085 100644 --- a/agent/main.go +++ b/agent/main.go @@ -18,6 +18,7 @@ import ( "github.com/gin-gonic/gin" "github.com/up9inc/mizu/agent/pkg/dependency" "github.com/up9inc/mizu/agent/pkg/elastic" + "github.com/up9inc/mizu/agent/pkg/entries" "github.com/up9inc/mizu/agent/pkg/middlewares" "github.com/up9inc/mizu/agent/pkg/models" "github.com/up9inc/mizu/agent/pkg/oas" @@ -371,4 +372,5 @@ func handleIncomingMessageAsTapper(socketConnection *websocket.Conn) { func initializeDependencies() { dependency.RegisterGenerator(dependency.ServiceMapGeneratorDependency, func() interface{} { return servicemap.GetDefaultServiceMapInstance() }) dependency.RegisterGenerator(dependency.OasGeneratorDependency, func() interface{} { return oas.GetDefaultOasGeneratorInstance() }) + dependency.RegisterGenerator(dependency.EntriesProvider, func() interface{} { return &entries.BasenineEntriesProvider{} }) } diff --git a/agent/pkg/controllers/entries_controller.go b/agent/pkg/controllers/entries_controller.go index c26b9c0cf..8fbd9a328 100644 --- a/agent/pkg/controllers/entries_controller.go +++ b/agent/pkg/controllers/entries_controller.go @@ -1,25 +1,20 @@ package controllers import ( - "encoding/json" "net/http" "strconv" - "time" - "github.com/up9inc/mizu/agent/pkg/app" - "github.com/up9inc/mizu/agent/pkg/har" + "github.com/up9inc/mizu/agent/pkg/dependency" + "github.com/up9inc/mizu/agent/pkg/entries" "github.com/up9inc/mizu/agent/pkg/models" "github.com/up9inc/mizu/agent/pkg/validation" "github.com/gin-gonic/gin" - basenine "github.com/up9inc/basenine/client/go" - "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/logger" - tapApi "github.com/up9inc/mizu/tap/api" ) -func Error(c *gin.Context, err error) bool { +func HandleEntriesError(c *gin.Context, err error) bool { if err != nil { logger.Log.Errorf("Error getting entry: %v", err) _ = c.Error(err) @@ -49,45 +44,18 @@ func GetEntries(c *gin.Context) { entriesRequest.TimeoutMs = 3000 } - data, meta, err := basenine.Fetch(shared.BasenineHost, shared.BaseninePort, - entriesRequest.LeftOff, entriesRequest.Direction, entriesRequest.Query, - entriesRequest.Limit, time.Duration(entriesRequest.TimeoutMs)*time.Millisecond) - if err != nil { - c.JSON(http.StatusInternalServerError, validationError) - } - - response := &models.EntriesResponse{} - var dataSlice []interface{} - - for _, row := range data { - var entry *tapApi.Entry - err = json.Unmarshal(row, &entry) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "error": true, - "type": "error", - "autoClose": "5000", - "msg": string(row), - }) - return // exit + entriesProvider := dependency.GetInstance(dependency.EntriesProvider).(entries.EntriesProvider) + entries, metadata, err := entriesProvider.GetEntries(entriesRequest) + if !HandleEntriesError(c, err) { + baseEntries := make([]interface{}, 0) + for _, entry := range entries { + baseEntries = append(baseEntries, entry.Base) } - - extension := app.ExtensionsMap[entry.Protocol.Name] - base := extension.Dissector.Summarize(entry) - - dataSlice = append(dataSlice, base) + c.JSON(http.StatusOK, models.EntriesResponse{ + Data: baseEntries, + Meta: metadata, + }) } - - var metadata *basenine.Metadata - err = json.Unmarshal(meta, &metadata) - if err != nil { - logger.Log.Debugf("Error recieving metadata: %v", err.Error()) - } - - response.Data = dataSlice - response.Meta = metadata - - c.JSON(http.StatusOK, response) } func GetEntry(c *gin.Context) { @@ -102,54 +70,11 @@ func GetEntry(c *gin.Context) { } id, _ := strconv.Atoi(c.Param("id")) - var entry *tapApi.Entry - bytes, err := basenine.Single(shared.BasenineHost, shared.BaseninePort, id, singleEntryRequest.Query) - if Error(c, err) { - return // exit - } - err = json.Unmarshal(bytes, &entry) - if err != nil { - c.JSON(http.StatusNotFound, gin.H{ - "error": true, - "type": "error", - "autoClose": "5000", - "msg": string(bytes), - }) - return // exit - } - extension := app.ExtensionsMap[entry.Protocol.Name] - base := extension.Dissector.Summarize(entry) - var representation []byte - representation, err = extension.Dissector.Represent(entry.Request, entry.Response) - if err != nil { - c.JSON(http.StatusNotFound, gin.H{ - "error": true, - "type": "error", - "autoClose": "5000", - "msg": err.Error(), - }) - return // exit - } + entriesProvider := dependency.GetInstance(dependency.EntriesProvider).(entries.EntriesProvider) + entry, err := entriesProvider.GetEntry(singleEntryRequest, id) - var rules []map[string]interface{} - var isRulesEnabled bool - if entry.Protocol.Name == "http" { - harEntry, _ := har.NewEntry(entry.Request, entry.Response, entry.StartTime, entry.ElapsedTime) - _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entry.Destination.Name) - isRulesEnabled = _isRulesEnabled - inrec, _ := json.Marshal(rulesMatched) - if err := json.Unmarshal(inrec, &rules); err != nil { - logger.Log.Error(err) - } + if !HandleEntriesError(c, err) { + c.JSON(http.StatusOK, entry) } - - c.JSON(http.StatusOK, tapApi.EntryWrapper{ - Protocol: entry.Protocol, - Representation: string(representation), - Data: entry, - Base: base, - Rules: rules, - IsRulesEnabled: isRulesEnabled, - }) } diff --git a/agent/pkg/dependency/type_names.go b/agent/pkg/dependency/type_names.go index a503d81ab..d886ce24e 100644 --- a/agent/pkg/dependency/type_names.go +++ b/agent/pkg/dependency/type_names.go @@ -5,4 +5,5 @@ type DependencyContainerType string const ( ServiceMapGeneratorDependency = "ServiceMapGeneratorDependency" OasGeneratorDependency = "OasGeneratorDependency" + EntriesProvider = "EntriesProvider" ) diff --git a/agent/pkg/entries/entries_provider.go b/agent/pkg/entries/entries_provider.go new file mode 100644 index 000000000..61140d004 --- /dev/null +++ b/agent/pkg/entries/entries_provider.go @@ -0,0 +1,98 @@ +package entries + +import ( + "encoding/json" + "time" + + basenine "github.com/up9inc/basenine/client/go" + "github.com/up9inc/mizu/agent/pkg/app" + "github.com/up9inc/mizu/agent/pkg/har" + "github.com/up9inc/mizu/agent/pkg/models" + "github.com/up9inc/mizu/shared" + "github.com/up9inc/mizu/shared/logger" + tapApi "github.com/up9inc/mizu/tap/api" +) + +type EntriesProvider interface { + GetEntries(entriesRequest *models.EntriesRequest) ([]*tapApi.EntryWrapper, *basenine.Metadata, error) + GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId int) (*tapApi.EntryWrapper, error) +} + +type BasenineEntriesProvider struct{} + +func (e *BasenineEntriesProvider) GetEntries(entriesRequest *models.EntriesRequest) ([]*tapApi.EntryWrapper, *basenine.Metadata, error) { + data, meta, err := basenine.Fetch(shared.BasenineHost, shared.BaseninePort, + entriesRequest.LeftOff, entriesRequest.Direction, entriesRequest.Query, + entriesRequest.Limit, time.Duration(entriesRequest.TimeoutMs)*time.Millisecond) + if err != nil { + return nil, nil, err + } + + var dataSlice []*tapApi.EntryWrapper + + for _, row := range data { + var entry *tapApi.Entry + err = json.Unmarshal(row, &entry) + if err != nil { + return nil, nil, err + } + + extension := app.ExtensionsMap[entry.Protocol.Name] + base := extension.Dissector.Summarize(entry) + + dataSlice = append(dataSlice, &tapApi.EntryWrapper{ + Protocol: entry.Protocol, + Data: entry, + Base: base, + }) + } + + var metadata *basenine.Metadata + err = json.Unmarshal(meta, &metadata) + if err != nil { + logger.Log.Debugf("Error recieving metadata: %v", err.Error()) + } + + return dataSlice, metadata, nil +} + +func (e *BasenineEntriesProvider) GetEntry(singleEntryRequest *models.SingleEntryRequest, entryId int) (*tapApi.EntryWrapper, error) { + var entry *tapApi.Entry + bytes, err := basenine.Single(shared.BasenineHost, shared.BaseninePort, entryId, singleEntryRequest.Query) + if err != nil { + return nil, err + } + err = json.Unmarshal(bytes, &entry) + if err != nil { + return nil, err + } + + extension := app.ExtensionsMap[entry.Protocol.Name] + base := extension.Dissector.Summarize(entry) + var representation []byte + representation, err = extension.Dissector.Represent(entry.Request, entry.Response) + if err != nil { + return nil, err + } + + var rules []map[string]interface{} + var isRulesEnabled bool + if entry.Protocol.Name == "http" { + harEntry, _ := har.NewEntry(entry.Request, entry.Response, entry.StartTime, entry.ElapsedTime) + _, rulesMatched, _isRulesEnabled := models.RunValidationRulesState(*harEntry, entry.Destination.Name) + isRulesEnabled = _isRulesEnabled + inrec, _ := json.Marshal(rulesMatched) + if err := json.Unmarshal(inrec, &rules); err != nil { + logger.Log.Error(err) + } + } + + return &tapApi.EntryWrapper{ + Protocol: entry.Protocol, + Representation: string(representation), + Data: entry, + Base: base, + Rules: rules, + IsRulesEnabled: isRulesEnabled, + }, nil +}