Add ability to set query in OAS Generator (#964)

This commit is contained in:
Nimrod Gilboa Markevich
2022-04-06 11:54:55 +03:00
committed by GitHub
parent 832162ae0f
commit 491da24c63
3 changed files with 66 additions and 22 deletions

View File

@@ -24,26 +24,20 @@ type OasGenerator interface {
IsStarted() bool IsStarted() bool
Reset() Reset()
GetServiceSpecs() *sync.Map GetServiceSpecs() *sync.Map
SetEntriesQuery(query string)
} }
type defaultOasGenerator struct { type defaultOasGenerator struct {
started bool started bool
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
serviceSpecs *sync.Map serviceSpecs *sync.Map
dbConn *basenine.Connection dbConn *basenine.Connection
entriesQuery string
} }
func GetDefaultOasGeneratorInstance(conn *basenine.Connection) *defaultOasGenerator { func GetDefaultOasGeneratorInstance(conn *basenine.Connection) *defaultOasGenerator {
syncOnce.Do(func() { syncOnce.Do(func() {
if conn == nil {
c, err := basenine.NewConnection(shared.BasenineHost, shared.BaseninePort)
if err != nil {
panic(err)
}
conn = c
}
instance = NewDefaultOasGenerator(conn) instance = NewDefaultOasGenerator(conn)
logger.Log.Debug("OAS Generator Initialized") logger.Log.Debug("OAS Generator Initialized")
}) })
@@ -80,7 +74,8 @@ func (g *defaultOasGenerator) runGenerator() {
dataChan := make(chan []byte) dataChan := make(chan []byte)
metaChan := 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 { for {
select { select {
@@ -181,12 +176,25 @@ func (g *defaultOasGenerator) GetServiceSpecs() *sync.Map {
return g.serviceSpecs 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{ return &defaultOasGenerator{
started: false, started: false,
ctx: nil, ctx: nil,
cancel: nil, cancel: nil,
serviceSpecs: nil, serviceSpecs: nil,
dbConn: c, dbConn: conn,
} }
} }

View File

@@ -9,6 +9,7 @@ import (
func TestOASGen(t *testing.T) { func TestOASGen(t *testing.T) {
gen := new(defaultOasGenerator) gen := new(defaultOasGenerator)
gen.dbConn = GetFakeDBConn(`{"startedDateTime": "20000101","request": {"url": "https://host/path", "method": "GET"}, "response": {"status": 200}}`)
gen.serviceSpecs = &sync.Map{} gen.serviceSpecs = &sync.Map{}
e := new(har.Entry) e := new(har.Entry)
@@ -21,6 +22,7 @@ func TestOASGen(t *testing.T) {
Destination: "some", Destination: "some",
Entry: *e, Entry: *e,
} }
gen.Start()
gen.handleHARWithSource(ews) gen.handleHARWithSource(ews)
g, ok := gen.serviceSpecs.Load("some") g, ok := gen.serviceSpecs.Load("some")
if !ok { if !ok {
@@ -33,4 +35,9 @@ func TestOASGen(t *testing.T) {
} }
specText, _ := json.Marshal(spec) specText, _ := json.Marshal(spec)
t.Log(string(specText)) t.Log(string(specText))
if !gen.IsStarted() {
t.Errorf("Should be started")
}
gen.Stop()
} }

View File

@@ -1,8 +1,10 @@
package oas package oas
import ( import (
"bytes"
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"net"
"os" "os"
"regexp" "regexp"
"strings" "strings"
@@ -11,13 +13,22 @@ import (
"time" "time"
"github.com/chanced/openapi" "github.com/chanced/openapi"
"github.com/op/go-logging"
"github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/shared/logger"
"github.com/wI2L/jsondiff" "github.com/wI2L/jsondiff"
basenine "github.com/up9inc/basenine/client/go"
"github.com/up9inc/mizu/agent/pkg/har" "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 // if started via env, write file into subdir
func outputSpec(label string, spec *openapi.OpenAPI, t *testing.T) string { func outputSpec(label string, spec *openapi.OpenAPI, t *testing.T) string {
content, err := json.MarshalIndent(spec, "", " ") 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) { func TestEntries(t *testing.T) {
logger.InitLoggerStd(logging.INFO) //logger.InitLoggerStd(logging.INFO) causes race condition
files, err := getFiles("./test_artifacts/") files, err := getFiles("./test_artifacts/")
if err != nil { if err != nil {
t.Log(err) t.Log(err)
t.FailNow() t.FailNow()
} }
gen := NewDefaultOasGenerator(nil) dummyConn := GetFakeDBConn("\n")
gen := NewDefaultOasGenerator(dummyConn)
gen.serviceSpecs = new(sync.Map) gen.serviceSpecs = new(sync.Map)
loadStartingOAS("test_artifacts/catalogue.json", "catalogue", gen.serviceSpecs) loadStartingOAS("test_artifacts/catalogue.json", "catalogue", gen.serviceSpecs)
loadStartingOAS("test_artifacts/trcc.json", "trcc-api-service", 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) { func TestFileSingle(t *testing.T) {
gen := NewDefaultOasGenerator(nil) dummyConn := GetFakeDBConn("\n")
gen := NewDefaultOasGenerator(dummyConn)
gen.serviceSpecs = new(sync.Map) gen.serviceSpecs = new(sync.Map)
// loadStartingOAS() // loadStartingOAS()
file := "test_artifacts/params.har" file := "test_artifacts/params.har"
@@ -214,7 +227,8 @@ func loadStartingOAS(file string, label string, specs *sync.Map) {
} }
func TestEntriesNegative(t *testing.T) { func TestEntriesNegative(t *testing.T) {
gen := NewDefaultOasGenerator(nil) dummyConn := GetFakeDBConn("\n")
gen := NewDefaultOasGenerator(dummyConn)
gen.serviceSpecs = new(sync.Map) gen.serviceSpecs = new(sync.Map)
files := []string{"invalid"} files := []string{"invalid"}
_, err := feedEntries(files, false, gen) _, err := feedEntries(files, false, gen)
@@ -225,7 +239,8 @@ func TestEntriesNegative(t *testing.T) {
} }
func TestEntriesPositive(t *testing.T) { func TestEntriesPositive(t *testing.T) {
gen := NewDefaultOasGenerator(nil) dummyConn := GetFakeDBConn("\n")
gen := NewDefaultOasGenerator(dummyConn)
gen.serviceSpecs = new(sync.Map) gen.serviceSpecs = new(sync.Map)
files := []string{"test_artifacts/params.har"} files := []string{"test_artifacts/params.har"}
_, err := feedEntries(files, false, gen) _, err := feedEntries(files, false, gen)
@@ -267,3 +282,17 @@ func TestLoadValid3_1(t *testing.T) {
t.FailNow() 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 }