Skip to content

Commit

Permalink
Merge branch 'main' into docs-mongo
Browse files Browse the repository at this point in the history
  • Loading branch information
re-Tick committed Apr 12, 2024
2 parents 821a130 + 6328642 commit 6e5a882
Show file tree
Hide file tree
Showing 19 changed files with 229 additions and 110 deletions.
31 changes: 23 additions & 8 deletions cli/provider/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ func (c *CmdConfigurator) AddFlags(cmd *cobra.Command) error {
cmd.Flags().Uint32("proxyPort", c.cfg.ProxyPort, "Port used by the Keploy proxy server to intercept the outgoing dependency calls")
cmd.Flags().Uint32("dnsPort", c.cfg.DNSPort, "Port used by the Keploy DNS server to intercept the DNS queries")
cmd.Flags().StringP("command", "c", c.cfg.Command, "Command to start the user application")
cmd.Flags().String("cmdType", c.cfg.CommandType, "Type of command to start the user application (native/docker/docker-compose)")
cmd.Flags().DurationP("buildDelay", "b", c.cfg.BuildDelay, "User provided time to wait docker container build")
cmd.Flags().String("containerName", c.cfg.ContainerName, "Name of the application's docker container")
cmd.Flags().StringP("networkName", "n", c.cfg.NetworkName, "Name of the application's docker network")
Expand Down Expand Up @@ -323,6 +324,10 @@ func (c CmdConfigurator) ValidateFlags(ctx context.Context, cmd *cobra.Command)
}
return errors.New("missing required -c flag or appCmd in config file")
}

// set the command type
c.cfg.CommandType = string(utils.FindDockerCmd(c.cfg.Command))

if c.cfg.GenerateGithubActions {
defer utils.GenerateGithubActions(c.logger, c.cfg.Command)
}
Expand All @@ -336,12 +341,12 @@ func (c CmdConfigurator) ValidateFlags(ctx context.Context, cmd *cobra.Command)
return errors.New(errMsg)
}
if strings.Contains(c.cfg.Path, "..") {
c.cfg.Path, err = filepath.Abs(filepath.Clean(c.cfg.Path))

c.cfg.Path, err = utils.GetAbsPath(filepath.Clean(c.cfg.Path))
if err != nil {
errMsg := "failed to get the absolute path from relative path"
utils.LogError(c.logger, err, errMsg)
return errors.New(errMsg)
return fmt.Errorf("failed to get the absolute path from relative path: %w", err)
}

relativePath, err := filepath.Rel(curDir, c.cfg.Path)
if err != nil {
errMsg := "failed to get the relative path from absolute path"
Expand Down Expand Up @@ -374,12 +379,12 @@ func (c CmdConfigurator) ValidateFlags(ctx context.Context, cmd *cobra.Command)
return err
}

absPath, err := filepath.Abs(c.cfg.Path)
absPath, err := utils.GetAbsPath(c.cfg.Path)
if err != nil {
errMsg := "failed to get the absolute path from relative path"
utils.LogError(c.logger, err, errMsg)
return errors.New(errMsg)
utils.LogError(c.logger, err, "error while getting absolute path")
return errors.New("failed to get the absolute path")
}

c.cfg.Path = absPath + "/keploy"
if cmd.Name() == "test" {
testSets, err := cmd.Flags().GetStringSlice("testsets")
Expand All @@ -389,6 +394,16 @@ func (c CmdConfigurator) ValidateFlags(ctx context.Context, cmd *cobra.Command)
return errors.New(errMsg)
}
config.SetSelectedTests(c.cfg, testSets)

if utils.CmdType(c.cfg.CommandType) == utils.Native && c.cfg.Test.GoCoverage {
goCovPath, err := utils.SetCoveragePath(c.logger, c.cfg.Test.CoverageReportPath)
if err != nil {
utils.LogError(c.logger, err, "failed to set go coverage path")
return errors.New("failed to set go coverage path")
}
c.cfg.Test.CoverageReportPath = goCovPath
}

if c.cfg.Test.Delay <= 5 {
c.logger.Warn(fmt.Sprintf("Delay is set to %d seconds, incase your app takes more time to start use --delay to set custom delay", c.cfg.Test.Delay))
if c.cfg.InDocker {
Expand Down
10 changes: 10 additions & 0 deletions cli/test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cli

import (
"context"
"os"

"go.keploy.io/server/v2/pkg/graph"
"go.keploy.io/server/v2/utils"
Expand Down Expand Up @@ -44,6 +45,15 @@ func Test(ctx context.Context, logger *zap.Logger, cfg *config.Config, serviceFa
return nil
}
}

cmdType := utils.FindDockerCmd(cfg.Command)
if cmdType == utils.Native && cfg.Test.GoCoverage {
err := os.Setenv("GOCOVERDIR", cfg.Test.CoverageReportPath)
if err != nil {
utils.LogError(logger, err, "failed to set GOCOVERDIR")
return nil
}
}
err = replay.Start(ctx)
if err != nil {
utils.LogError(logger, err, "failed to replay")
Expand Down
5 changes: 4 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
// Package config provides configuration structures for the application.
package config

import "time"
import (
"time"
)

type Config struct {
Path string `json:"path" yaml:"path" mapstructure:"path" `
Expand All @@ -23,6 +25,7 @@ type Config struct {
GenerateGithubActions bool `json:"generateGithubActions" yaml:"generateGithubActions" mapstructure:"generateGithubActions"`
KeployContainer string `json:"keployContainer" yaml:"keployContainer" mapstructure:"keployContainer"`
KeployNetwork string `json:"keployNetwork" yaml:"keployNetwork" mapstructure:"keployNetwork"`
CommandType string `json:"cmdType" yaml:"cmdType" mapstructure:"cmdType"`
}

type Record struct {
Expand Down
1 change: 1 addition & 0 deletions config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ enableTesting: false
keployContainer: "keploy-v2"
keployNetwork: "keploy-network"
inDocker: false
cmdType: "native"
`

var config = &Config{}
Expand Down
2 changes: 1 addition & 1 deletion pkg/core/proxy/integrations/generic/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func decodeGeneric(ctx context.Context, logger *zap.Logger, reqBuf []byte, clien
logger.Debug("Into the generic parser in test mode")
errCh := make(chan error, 1)
go func(errCh chan error, genericRequests [][]byte) {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, nil)
defer close(errCh)
for {
// Since protocol packets have to be parsed for checking stream end,
Expand Down
4 changes: 2 additions & 2 deletions pkg/core/proxy/integrations/generic/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,14 @@ func encodeGeneric(ctx context.Context, logger *zap.Logger, reqBuf []byte, clien

// read requests from client
g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, nil)
defer close(clientBuffChan)
pUtil.ReadBuffConn(ctx, logger, clientConn, clientBuffChan, errChan)
return nil
})
// read responses from destination
g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, nil, destConn)
defer close(destBuffChan)
pUtil.ReadBuffConn(ctx, logger, destConn, destBuffChan, errChan)
return nil
Expand Down
10 changes: 6 additions & 4 deletions pkg/core/proxy/integrations/grpc/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package grpc

import (
"context"
"io"
"net"

pUtil "go.keploy.io/server/v2/pkg/core/proxy/util"
"go.keploy.io/server/v2/pkg/models"
"go.keploy.io/server/v2/utils"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
"io"
"net"
)

func encodeGrpc(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientConn, destConn net.Conn, mocks chan<- *models.Mock, _ models.OutgoingOptions) error {
Expand Down Expand Up @@ -35,7 +37,7 @@ func encodeGrpc(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo

// Route requests from the client to the server.
g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, destConn)
err := transferFrame(ctx, destConn, clientConn, streamInfoCollection, reqFromClient, serverSideDecoder, mocks)
if err != nil {
// check for EOF error
Expand All @@ -55,7 +57,7 @@ func encodeGrpc(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo
// Route response from the server to the client.
clientSideDecoder := NewDecoder()
g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, destConn)
err := transferFrame(ctx, clientConn, destConn, streamInfoCollection, !reqFromClient, clientSideDecoder, mocks)
if err != nil {
utils.LogError(logger, err, "failed to transfer frame from server to client")
Expand Down
11 changes: 7 additions & 4 deletions pkg/core/proxy/integrations/http/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (

"go.keploy.io/server/v2/pkg"
"go.keploy.io/server/v2/pkg/core/proxy/integrations"
"go.keploy.io/server/v2/pkg/core/proxy/util"
pUtil "go.keploy.io/server/v2/pkg/core/proxy/util"
"go.keploy.io/server/v2/pkg/models"
"go.keploy.io/server/v2/utils"
"go.uber.org/zap"
Expand All @@ -31,6 +31,7 @@ func decodeHTTP(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo
errCh := make(chan error, 1)

go func(errCh chan error, reqBuf []byte, opts models.OutgoingOptions) {
defer pUtil.Recover(logger, clientConn, nil)
defer close(errCh)
for {
//Check if the expected header is present
Expand All @@ -48,7 +49,7 @@ func decodeHTTP(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo
}
logger.Debug("The 100 continue response has been sent to the user application")
//Read the request buffer again
newRequest, err := util.ReadBytes(ctx, logger, clientConn)
newRequest, err := pUtil.ReadBytes(ctx, logger, clientConn)
if err != nil {
utils.LogError(logger, err, "failed to read the request buffer from the user application")
errCh <- err
Expand Down Expand Up @@ -103,12 +104,14 @@ func decodeHTTP(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo
utils.LogError(logger, nil, "Didn't match any preExisting http mock", zap.Any("metadata", getReqMeta(request)))
}

_, err = util.PassThrough(ctx, logger, clientConn, dstCfg, [][]byte{reqBuf})
_, err = pUtil.PassThrough(ctx, logger, clientConn, dstCfg, [][]byte{reqBuf})
if err != nil {
utils.LogError(logger, err, "failed to passThrough http request", zap.Any("metadata", getReqMeta(request)))
errCh <- err
return
}
errCh <- nil
return
}

statusLine := fmt.Sprintf("HTTP/%d.%d %d %s\r\n", stub.Spec.HTTPReq.ProtoMajor, stub.Spec.HTTPReq.ProtoMinor, stub.Spec.HTTPResp.StatusCode, http.StatusText(stub.Spec.HTTPResp.StatusCode))
Expand Down Expand Up @@ -168,7 +171,7 @@ func decodeHTTP(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo
return
}

reqBuf, err = util.ReadBytes(ctx, logger, clientConn)
reqBuf, err = pUtil.ReadBytes(ctx, logger, clientConn)
if err != nil {
logger.Debug("failed to read the request buffer from the client", zap.Error(err))
logger.Debug("This was the last response from the server:\n" + string(responseString))
Expand Down
3 changes: 2 additions & 1 deletion pkg/core/proxy/integrations/http/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"golang.org/x/sync/errgroup"

"go.keploy.io/server/v2/pkg/core/proxy/util"
pUtil "go.keploy.io/server/v2/pkg/core/proxy/util"
"go.keploy.io/server/v2/pkg/models"
"go.keploy.io/server/v2/utils"
"go.uber.org/zap"
Expand Down Expand Up @@ -48,7 +49,7 @@ func encodeHTTP(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientCo

//for keeping conn alive
g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, destConn)
defer close(errCh)
for {
//check if expect : 100-continue header is present
Expand Down
2 changes: 1 addition & 1 deletion pkg/core/proxy/integrations/mongo/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func decodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []byte, clientC
errCh := make(chan error, 1)

go func(errCh chan error, reqBuf []byte, startedDecoding time.Time, requestBuffers [][]byte) {
defer utils.Recover(logger)
defer util.Recover(logger, clientConn, nil)
defer close(errCh)
var readRequestDelay time.Duration
for {
Expand Down
20 changes: 12 additions & 8 deletions pkg/core/proxy/integrations/mongo/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

"golang.org/x/sync/errgroup"

"go.keploy.io/server/v2/pkg/core/proxy/util"
pUtil "go.keploy.io/server/v2/pkg/core/proxy/util"
"go.keploy.io/server/v2/pkg/models"
"go.keploy.io/server/v2/utils"
"go.uber.org/zap"
Expand All @@ -30,7 +30,7 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by
}

g.Go(func() error {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, destConn)
defer close(errCh)
for {
var err error
Expand All @@ -40,7 +40,7 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by
// Since, that is already read in the RecordOutgoing function.
if string(reqBuf) == "read form client conn" {
started := time.Now()
reqBuf, err = util.ReadBytes(ctx, logger, clientConn)
reqBuf, err = pUtil.ReadBytes(ctx, logger, clientConn)
logger.Debug("reading from the mongo conn", zap.Any("", string(reqBuf)))
if err != nil {
if err == io.EOF {
Expand Down Expand Up @@ -89,8 +89,9 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by
// check for the request packet streaming for the mongo wire message
if val, ok := mongoRequest.(*models.MongoOpMessage); ok && hasSecondSetBit(val.FlagBits) {
for {
// read the streaming request packets
requestBuffer1, err := util.ReadBytes(ctx, logger, clientConn)
<

Check failure on line 92 in pkg/core/proxy/integrations/mongo/encode.go

View workflow job for this annotation

GitHub Actions / build

syntax error: unexpected <, expected }

Check failure on line 92 in pkg/core/proxy/integrations/mongo/encode.go

View workflow job for this annotation

GitHub Actions / lint

expected statement, found '<' (typecheck)

Check failure on line 92 in pkg/core/proxy/integrations/mongo/encode.go

View workflow job for this annotation

GitHub Actions / lint

expected statement, found '<' (typecheck)
// read the streaming request packets
requestBuffer1, err := pUtil.ReadBytes(ctx, logger, clientConn)

Check failure on line 94 in pkg/core/proxy/integrations/mongo/encode.go

View workflow job for this annotation

GitHub Actions / build

syntax error: unexpected requestBuffer1 at end of statement
if err != nil {
if err == io.EOF {
logger.Debug("recieved request buffer is empty in record mode for mongo request")
Expand Down Expand Up @@ -139,8 +140,9 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by

reqTimestampMock := time.Now()
started := time.Now()

// read reply message length from the destination mongo server
responsePckLengthBuffer, err := util.ReadRequiredBytes(ctx, logger, destConn, 4)
responsePckLengthBuffer, err := pUtil.ReadRequiredBytes(ctx, logger, destConn, 4)
if err != nil {
if err == io.EOF {
logger.Debug("recieved response buffer is empty in record mode for mongo call")
Expand All @@ -158,8 +160,9 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by
pckLength := getPacketLength(responsePckLengthBuffer)
logger.Debug("received pck length ", zap.Any("packet length", pckLength))


// read the entire response packet
responsePckDataBuffer, err := util.ReadRequiredBytes(ctx, logger, destConn, int(pckLength)-4)
responsePckDataBuffer, err := pUtil.ReadRequiredBytes(ctx, logger, destConn, int(pckLength)-4)

logger.Debug("recieved these packets", zap.Any("packets", responsePckDataBuffer))

Expand Down Expand Up @@ -208,8 +211,9 @@ func (m *Mongo) encodeMongo(ctx context.Context, logger *zap.Logger, reqBuf []by
m.recordMessage(ctx, logger, mongoRequests, mongoResponses, opReq, reqTimestampMock, mocks)
}
started = time.Now()

// read the response packets from the destination server
responseBuffer, err = util.ReadBytes(ctx, logger, destConn)
responseBuffer, err = pUtil.ReadBytes(ctx, logger, destConn)
if err != nil {
if err == io.EOF {
logger.Debug("recieved response buffer is empty in record mode for mongo call")
Expand Down
8 changes: 4 additions & 4 deletions pkg/core/proxy/integrations/mysql/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"time"

"go.keploy.io/server/v2/pkg/core/proxy/integrations"
"go.keploy.io/server/v2/pkg/core/proxy/util"
pUtil "go.keploy.io/server/v2/pkg/core/proxy/util"
"go.keploy.io/server/v2/pkg/models"
"go.keploy.io/server/v2/utils"
"go.uber.org/zap"
Expand All @@ -33,7 +33,7 @@ func decodeMySQL(ctx context.Context, logger *zap.Logger, clientConn net.Conn, d
errCh := make(chan error, 1)

go func(errCh chan error, configMocks []*models.Mock, tcsMocks []*models.Mock, prevRequest string, requestBuffers [][]byte) {
defer utils.Recover(logger)
defer pUtil.Recover(logger, clientConn, nil)
defer close(errCh)
for {
//log.Debug("Config and TCS Mocks", zap.Any("configMocks", configMocks), zap.Any("tcsMocks", tcsMocks))
Expand Down Expand Up @@ -98,7 +98,7 @@ func decodeMySQL(ctx context.Context, logger *zap.Logger, clientConn net.Conn, d
}

// Attempt to read from the client
requestBuffer, err := util.ReadBytes(ctx, logger, clientConn)
requestBuffer, err := pUtil.ReadBytes(ctx, logger, clientConn)
if err != nil {
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
// Timeout occurred, no data received from client
Expand Down Expand Up @@ -178,7 +178,7 @@ func decodeMySQL(ctx context.Context, logger *zap.Logger, clientConn net.Conn, d
if matchedIndex == -1 {
logger.Debug("No matching mock found")

responseBuffer, err := util.PassThrough(ctx, logger, clientConn, dstCfg, requestBuffers)
responseBuffer, err := pUtil.PassThrough(ctx, logger, clientConn, dstCfg, requestBuffers)
if err != nil {
utils.LogError(logger, err, "Failed to passthrough the mysql request to the actual database server")
errCh <- err
Expand Down
Loading

0 comments on commit 6e5a882

Please sign in to comment.