api-testing/pkg/testing/remote/grpc_store.go

336 lines
8.8 KiB
Go

/*
Copyright 2023 API Testing Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package remote
import (
context "context"
"errors"
"time"
"github.com/linuxsuren/api-testing/pkg/logging"
server "github.com/linuxsuren/api-testing/pkg/server"
"github.com/linuxsuren/api-testing/pkg/testing"
"google.golang.org/grpc"
)
var (
grpcLogger = logging.DefaultLogger(logging.LogLevelInfo).WithName("grpc")
)
type gRPCLoader struct {
store *testing.Store
client LoaderClient
ctx context.Context
conn *grpc.ClientConn
}
func NewGRPCloaderFromStore() testing.StoreWriterFactory {
return &gRPCLoader{}
}
func (g *gRPCLoader) NewInstance(store testing.Store) (writer testing.Writer, err error) {
address := store.Kind.URL
var conn *grpc.ClientConn
if conn, err = grpc.Dial(address, grpc.WithInsecure()); err == nil {
writer = &gRPCLoader{
store: &store,
ctx: WithStoreContext(context.Background(), &store),
client: NewLoaderClient(conn),
conn: conn,
}
}
return
}
func (g *gRPCLoader) HasMore() bool {
// nothing to do
return false
}
func (g *gRPCLoader) Load() ([]byte, error) {
// nothing to do
return nil, nil
}
func (g *gRPCLoader) Put(path string) error {
// nothing to do
return nil
}
func (g *gRPCLoader) GetContext() string {
// nothing to do
return ""
}
func (g *gRPCLoader) GetCount() int {
// nothing to do
return 0
}
func (g *gRPCLoader) Reset() {
// nothing to do
}
func (g *gRPCLoader) GetTestSuiteYaml(suite string) (testSuiteYaml []byte, err error) {
var testSuite testing.TestSuite
if testSuite, err = g.GetTestSuite(suite, true); err == nil {
testSuiteYaml, err = testing.ToYAML(&testSuite)
}
return
}
func (g *gRPCLoader) ListTestCase(suite string) (testcases []testing.TestCase, err error) {
var testCases *server.TestCases
testCases, err = g.client.ListTestCases(g.ctx, &TestSuite{
Name: suite,
})
if err == nil && testCases.Data != nil {
for _, item := range testCases.Data {
if item.Name == "" {
continue
}
testcases = append(testcases, ConvertToNormalTestCase(item))
}
}
return
}
func (g *gRPCLoader) GetTestCase(suite, name string) (testcase testing.TestCase, err error) {
var result *server.TestCase
result, err = g.client.GetTestCase(g.ctx, &server.TestCase{
Name: name,
SuiteName: suite,
})
if err == nil && result != nil {
testcase = ConvertToNormalTestCase(result)
}
return
}
func (g *gRPCLoader) GetHistoryTestCaseWithResult(id string) (result testing.HistoryTestResult, err error) {
var historyTestResult *server.HistoryTestResult
historyTestResult, err = g.client.GetHistoryTestCaseWithResult(g.ctx, &server.HistoryTestCase{
ID: id,
})
if err == nil && historyTestResult != nil {
result = ConvertToNormalTestCaseResult(historyTestResult)
}
return
}
func (g *gRPCLoader) GetHistoryTestCase(id string) (result testing.HistoryTestCase, err error) {
var historyTestCase *server.HistoryTestCase
historyTestCase, err = g.client.GetHistoryTestCase(g.ctx, &server.HistoryTestCase{
ID: id,
})
if err == nil && historyTestCase != nil {
result = ConvertToNormalHistoryTestCase(historyTestCase)
}
return
}
func (g *gRPCLoader) CreateTestCase(suite string, testcase testing.TestCase) (err error) {
payload := ConvertToGRPCTestCase(testcase)
payload.SuiteName = suite
_, err = g.client.CreateTestCase(g.ctx, payload)
return
}
func (g *gRPCLoader) UpdateTestCase(suite string, testcase testing.TestCase) (err error) {
payload := ConvertToGRPCTestCase(testcase)
payload.SuiteName = suite
_, err = g.client.UpdateTestCase(g.ctx, payload)
return
}
func (g *gRPCLoader) DeleteTestCase(suite, testcase string) (err error) {
_, err = g.client.DeleteTestCase(g.ctx, &server.TestCase{
Name: testcase,
SuiteName: suite,
})
return
}
func (g *gRPCLoader) RenameTestCase(suite, oldName, newName string) (err error) {
_, err = g.client.RenameTestCase(g.ctx, &server.TestCaseDuplicate{
SourceCaseName: oldName,
SourceSuiteName: suite,
TargetCaseName: newName,
})
return
}
func (g *gRPCLoader) CreateHistoryTestCase(testcaseResult testing.TestCaseResult, testSuite *testing.TestSuite, historyHeader map[string]string) (err error) {
payload := ConvertToGRPCHistoryTestCaseResult(testcaseResult, testSuite, historyHeader)
_, err = g.client.CreateTestCaseHistory(g.ctx, payload)
return
}
func (g *gRPCLoader) ListHistoryTestSuite() (suites []testing.HistoryTestSuite, err error) {
var items *HistoryTestSuites
items, err = g.client.ListHistoryTestSuite(g.ctx, &server.Empty{})
if err == nil && items != nil {
for _, item := range items.Data {
suites = append(suites, *ConvertToNormalHistoryTestSuite(item))
}
}
return
}
func (g *gRPCLoader) DeleteHistoryTestCase(id string) (err error) {
_, err = g.client.DeleteHistoryTestCase(g.ctx, &server.HistoryTestCase{
ID: id,
})
return
}
func (g *gRPCLoader) DeleteAllHistoryTestCase(suite, name string) (err error) {
_, err = g.client.DeleteAllHistoryTestCase(g.ctx, &server.HistoryTestCase{
SuiteName: suite,
CaseName: name,
})
return
}
func (g *gRPCLoader) GetTestCaseAllHistory(suite, name string) (historyTestcases []testing.HistoryTestCase, err error) {
var historyTestCases *server.HistoryTestCases
historyTestCases, err = g.client.GetTestCaseAllHistory(g.ctx, &server.TestCase{
Name: name,
SuiteName: suite,
})
if err == nil && historyTestCases.Data != nil {
for _, item := range historyTestCases.Data {
historyTestcases = append(historyTestcases, ConvertToNormalHistoryTestCase(item))
}
}
return
}
func (g *gRPCLoader) ListTestSuite() (suites []testing.TestSuite, err error) {
var items *TestSuites
items, err = g.client.ListTestSuite(g.ctx, &server.Empty{})
if err == nil && items != nil {
for _, item := range items.Data {
suites = append(suites, *ConvertToNormalTestSuite(item))
}
}
return
}
func (g *gRPCLoader) GetTestSuite(name string, full bool) (suite testing.TestSuite, err error) {
var result *TestSuite
if result, err = g.client.GetTestSuite(g.ctx,
&TestSuite{Name: name, Full: full}); err == nil {
suite = *ConvertToNormalTestSuite(result)
}
return
}
func (g *gRPCLoader) CreateSuite(name, api string) (err error) {
_, err = g.client.CreateTestSuite(g.ctx, &TestSuite{
Name: name,
Api: api,
})
return
}
func (g *gRPCLoader) GetSuite(name string) (reply *testing.TestSuite, _ string, err error) {
var suite *TestSuite
if suite, err = g.client.GetTestSuite(g.ctx,
&TestSuite{Name: name}); err != nil {
return
}
reply = ConvertToNormalTestSuite(suite)
return
}
func (g *gRPCLoader) UpdateSuite(suite testing.TestSuite) (err error) {
_, err = g.client.UpdateTestSuite(g.ctx, ConvertToGRPCTestSuite(&suite))
return
}
func (g *gRPCLoader) DeleteSuite(name string) (err error) {
_, err = g.client.DeleteTestSuite(g.ctx, &TestSuite{
Name: name,
})
return
}
func (g *gRPCLoader) RenameTestSuite(oldName, newName string) (err error) {
_, err = g.client.RenameTestSuite(g.ctx, &server.TestSuiteDuplicate{
SourceSuiteName: oldName,
TargetSuiteName: newName,
})
return
}
func (g *gRPCLoader) Verify() (readOnly bool, err error) {
// avoid to long to wait the response
ctx, cancel := context.WithTimeout(g.ctx, time.Second*5)
defer cancel()
var result *server.ExtensionStatus
if result, err = g.client.Verify(ctx, &server.Empty{}); err == nil {
readOnly = result.ReadOnly
if !result.Ready {
err = errors.New(result.Message)
}
}
return
}
func (g *gRPCLoader) PProf(name string) []byte {
data, err := g.client.PProf(context.Background(), &server.PProfRequest{
Name: name,
})
if err != nil {
grpcLogger.Info("failed to get pprof:", "error", err)
}
return data.Data
}
func (g *gRPCLoader) Query(query map[string]string) (result testing.DataResult, err error) {
var dataResult *server.DataQueryResult
if dataResult, err = g.client.Query(g.ctx, &server.DataQuery{
Sql: query["sql"],
Key: query["key"],
}); err == nil {
result.Pairs = pairToMap(dataResult.Data)
for _, item := range dataResult.Items {
result.Rows = append(result.Rows, pairToMap(item.Data))
}
if dataResult.Meta != nil {
result.Databases = dataResult.Meta.Databases
result.Tables = dataResult.Meta.Tables
result.CurrentDatabase = dataResult.Meta.CurrentDatabase
result.Duration = dataResult.Meta.Duration
result.Labels = pairToMap(dataResult.Meta.Labels)
}
}
return
}
func (g *gRPCLoader) Close() {
if g.conn != nil {
g.conn.Close()
}
}