From 491da24c637d762cabef95f41129b14e10a26b50 Mon Sep 17 00:00:00 2001 From: Nimrod Gilboa Markevich <59927337+nimrod-up9@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:54:55 +0300 Subject: [PATCH] Add ability to set query in OAS Generator (#964) --- agent/pkg/oas/oas_generator.go | 40 +++++++++++++++++----------- agent/pkg/oas/oas_generator_test.go | 7 +++++ agent/pkg/oas/specgen_test.go | 41 ++++++++++++++++++++++++----- 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/agent/pkg/oas/oas_generator.go b/agent/pkg/oas/oas_generator.go index 499ba4616..33922e271 100644 --- a/agent/pkg/oas/oas_generator.go +++ b/agent/pkg/oas/oas_generator.go @@ -24,26 +24,20 @@ type OasGenerator interface { IsStarted() bool Reset() GetServiceSpecs() *sync.Map + SetEntriesQuery(query string) } type defaultOasGenerator struct { - started bool - ctx context.Context - cancel context.CancelFunc - serviceSpecs *sync.Map - dbConn *basenine.Connection + started bool + ctx context.Context + cancel context.CancelFunc + serviceSpecs *sync.Map + dbConn *basenine.Connection + entriesQuery string } func GetDefaultOasGeneratorInstance(conn *basenine.Connection) *defaultOasGenerator { syncOnce.Do(func() { - if conn == nil { - c, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort) - if err != nil { - panic(err) - } - conn = c - } - instance = NewDefaultOasGenerator(conn) logger.Log.Debug("OAS Generator Initialized") }) @@ -80,7 +74,8 @@ func (g *defaultOasGenerator) runGenerator() { dataChan := make(chan []byte) metaChan := make(chan []byte) - g.dbConn.Query("", dataChan, metaChan) + logger.Log.Infof("Querying DB for OAS generator with query '%s'", g.entriesQuery) + g.dbConn.Query(g.entriesQuery, dataChan, metaChan) for { select { @@ -181,12 +176,25 @@ func (g *defaultOasGenerator) GetServiceSpecs() *sync.Map { return g.serviceSpecs } -func NewDefaultOasGenerator(c *basenine.Connection) *defaultOasGenerator { +func (g *defaultOasGenerator) SetEntriesQuery(query string) { + g.entriesQuery = query +} + +func NewDefaultOasGenerator(conn *basenine.Connection) *defaultOasGenerator { + if conn == nil { + logger.Log.Infof("Creating new DB connection for OAS generator to address %s:%s", shared.BasenineHost, shared.BaseninePort) + newConn, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort) + if err != nil { + panic(err) + } + conn = newConn + } + return &defaultOasGenerator{ started: false, ctx: nil, cancel: nil, serviceSpecs: nil, - dbConn: c, + dbConn: conn, } } diff --git a/agent/pkg/oas/oas_generator_test.go b/agent/pkg/oas/oas_generator_test.go index c02224978..b2c44b412 100644 --- a/agent/pkg/oas/oas_generator_test.go +++ b/agent/pkg/oas/oas_generator_test.go @@ -9,6 +9,7 @@ import ( func TestOASGen(t *testing.T) { gen := new(defaultOasGenerator) + gen.dbConn = GetFakeDBConn(`{"startedDateTime": "20000101","request": {"url": "https://host/path", "method": "GET"}, "response": {"status": 200}}`) gen.serviceSpecs = &sync.Map{} e := new(har.Entry) @@ -21,6 +22,7 @@ func TestOASGen(t *testing.T) { Destination: "some", Entry: *e, } + gen.Start() gen.handleHARWithSource(ews) g, ok := gen.serviceSpecs.Load("some") if !ok { @@ -33,4 +35,9 @@ func TestOASGen(t *testing.T) { } specText, _ := json.Marshal(spec) t.Log(string(specText)) + + if !gen.IsStarted() { + t.Errorf("Should be started") + } + gen.Stop() } diff --git a/agent/pkg/oas/specgen_test.go b/agent/pkg/oas/specgen_test.go index accd3951d..da9a7f259 100644 --- a/agent/pkg/oas/specgen_test.go +++ b/agent/pkg/oas/specgen_test.go @@ -1,8 +1,10 @@ package oas import ( + "bytes" "encoding/json" "io/ioutil" + "net" "os" "regexp" "strings" @@ -11,13 +13,22 @@ import ( "time" "github.com/chanced/openapi" - "github.com/op/go-logging" "github.com/up9inc/mizu/shared/logger" "github.com/wI2L/jsondiff" + basenine "github.com/up9inc/basenine/client/go" "github.com/up9inc/mizu/agent/pkg/har" ) +func GetFakeDBConn(send string) *basenine.Connection { + dummyConn := new(basenine.Connection) + dummyConn.Conn = FakeConn{ + sendBuffer: bytes.NewBufferString(send), + receiveBuffer: bytes.NewBufferString(""), + } + return dummyConn +} + // if started via env, write file into subdir func outputSpec(label string, spec *openapi.OpenAPI, t *testing.T) string { content, err := json.MarshalIndent(spec, "", " ") @@ -43,14 +54,15 @@ func outputSpec(label string, spec *openapi.OpenAPI, t *testing.T) string { } func TestEntries(t *testing.T) { - logger.InitLoggerStd(logging.INFO) + //logger.InitLoggerStd(logging.INFO) causes race condition files, err := getFiles("./test_artifacts/") if err != nil { t.Log(err) t.FailNow() } - gen := NewDefaultOasGenerator(nil) + dummyConn := GetFakeDBConn("\n") + gen := NewDefaultOasGenerator(dummyConn) gen.serviceSpecs = new(sync.Map) loadStartingOAS("test_artifacts/catalogue.json", "catalogue", gen.serviceSpecs) loadStartingOAS("test_artifacts/trcc.json", "trcc-api-service", gen.serviceSpecs) @@ -124,7 +136,8 @@ func TestEntries(t *testing.T) { } func TestFileSingle(t *testing.T) { - gen := NewDefaultOasGenerator(nil) + dummyConn := GetFakeDBConn("\n") + gen := NewDefaultOasGenerator(dummyConn) gen.serviceSpecs = new(sync.Map) // loadStartingOAS() file := "test_artifacts/params.har" @@ -214,7 +227,8 @@ func loadStartingOAS(file string, label string, specs *sync.Map) { } func TestEntriesNegative(t *testing.T) { - gen := NewDefaultOasGenerator(nil) + dummyConn := GetFakeDBConn("\n") + gen := NewDefaultOasGenerator(dummyConn) gen.serviceSpecs = new(sync.Map) files := []string{"invalid"} _, err := feedEntries(files, false, gen) @@ -225,7 +239,8 @@ func TestEntriesNegative(t *testing.T) { } func TestEntriesPositive(t *testing.T) { - gen := NewDefaultOasGenerator(nil) + dummyConn := GetFakeDBConn("\n") + gen := NewDefaultOasGenerator(dummyConn) gen.serviceSpecs = new(sync.Map) files := []string{"test_artifacts/params.har"} _, err := feedEntries(files, false, gen) @@ -267,3 +282,17 @@ func TestLoadValid3_1(t *testing.T) { t.FailNow() } } + +type FakeConn struct { + sendBuffer *bytes.Buffer + receiveBuffer *bytes.Buffer +} + +func (f FakeConn) Read(p []byte) (int, error) { return f.sendBuffer.Read(p) } +func (f FakeConn) Write(p []byte) (int, error) { return f.receiveBuffer.Write(p) } +func (FakeConn) Close() error { return nil } +func (FakeConn) LocalAddr() net.Addr { return nil } +func (FakeConn) RemoteAddr() net.Addr { return nil } +func (FakeConn) SetDeadline(t time.Time) error { return nil } +func (FakeConn) SetReadDeadline(t time.Time) error { return nil } +func (FakeConn) SetWriteDeadline(t time.Time) error { return nil }