Add TestStreamIsActive (#384)

* Return IsActive error vs log and continue

Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* Add TestStreamIsActive

Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* Bump github.com/onsi/gomega from 1.17.0 to 1.18.0 (#378)

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* Configure WhiteSource Bolt for GitHub (#379)

Co-authored-by: whitesource-bolt-for-github[bot] <42819689+whitesource-bolt-for-github[bot]@users.noreply.github.com>
Co-authored-by: Tom Kerkhove <kerkhove.tom@gmail.com>
Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* adding targetPendingRequests to the xkcd helm chart (#373)

Signed-off-by: Aaron Schlesinger <aaron@ecomaz.net>
Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* fixing targetPendingRequests in the HTTPScaledObject v0.2.0 documentation (#372)

Signed-off-by: Aaron Schlesinger <aaron@ecomaz.net>
Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* defer grpcServer.Stop()

Co-authored-by: Aaron Schlesinger <70865+arschles@users.noreply.github.com>
Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

* Don't check error for gprServer

Signed-off-by: Aaron Wislang <aaron.wislang@microsoft.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: whitesource-bolt-for-github[bot] <42819689+whitesource-bolt-for-github[bot]@users.noreply.github.com>
Co-authored-by: Tom Kerkhove <kerkhove.tom@gmail.com>
Co-authored-by: Aaron Schlesinger <70865+arschles@users.noreply.github.com>
This commit is contained in:
Aaron Wislang 2022-01-27 17:22:51 -05:00 committed by GitHub
parent 84d97e4105
commit ce06b0d04c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 136 additions and 5 deletions

View File

@ -99,9 +99,9 @@ func (e *impl) StreamIsActive(
if err != nil { if err != nil {
e.lggr.Error( e.lggr.Error(
err, err,
"error getting active status in stream, continuing", "error getting active status in stream",
) )
continue return err
} }
server.Send(&externalscaler.IsActiveResponse{ server.Send(&externalscaler.IsActiveResponse{
Result: active.Result, Result: active.Result,

View File

@ -3,6 +3,7 @@ package main
import ( import (
context "context" context "context"
"fmt" "fmt"
"net"
"testing" "testing"
"time" "time"
@ -11,6 +12,8 @@ import (
"github.com/kedacore/http-add-on/pkg/routing" "github.com/kedacore/http-add-on/pkg/routing"
externalscaler "github.com/kedacore/http-add-on/proto" externalscaler "github.com/kedacore/http-add-on/proto"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"google.golang.org/grpc"
"google.golang.org/grpc/test/bufconn"
) )
func standardTarget() routing.Target { func standardTarget() routing.Target {
@ -22,6 +25,137 @@ func standardTarget() routing.Target {
123, 123,
) )
} }
func TestStreamIsActive(t *testing.T) {
type testCase struct {
name string
host string
expected bool
expectedErr bool
setup func(*routing.Table, *queuePinger)
}
testCases := []testCase{
{
name: "Simple host inactive",
host: t.Name(),
expected: false,
expectedErr: false,
setup: func(table *routing.Table, q *queuePinger) {
table.AddTarget(t.Name(), standardTarget())
q.pingMut.Lock()
defer q.pingMut.Unlock()
q.allCounts[t.Name()] = 0
},
},
{
name: "Host is 'interceptor'",
host: "interceptor",
expected: true,
expectedErr: false,
setup: func(*routing.Table, *queuePinger) {},
},
{
name: "Simple host active",
host: t.Name(),
expected: true,
expectedErr: false,
setup: func(table *routing.Table, q *queuePinger) {
table.AddTarget(t.Name(), standardTarget())
q.pingMut.Lock()
defer q.pingMut.Unlock()
q.allCounts[t.Name()] = 1
},
},
{
name: "No host present, but host in routing table",
host: t.Name(),
expected: false,
expectedErr: false,
setup: func(table *routing.Table, q *queuePinger) {
table.AddTarget(t.Name(), standardTarget())
},
},
{
name: "Host doesn't exist",
host: t.Name(),
expected: false,
expectedErr: true,
setup: func(*routing.Table, *queuePinger) {},
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
r := require.New(t)
ctx := context.Background()
lggr := logr.Discard()
table := routing.NewTable()
ticker, pinger, err := newFakeQueuePinger(ctx, lggr)
r.NoError(err)
defer ticker.Stop()
tc.setup(table, pinger)
hdl := newImpl(
lggr,
pinger,
table,
123,
200,
)
bufSize := 1024 * 1024
lis := bufconn.Listen(bufSize)
grpcServer := grpc.NewServer()
defer grpcServer.Stop()
externalscaler.RegisterExternalScalerServer(
grpcServer,
hdl,
)
go grpcServer.Serve(lis)
bufDialFunc := func(context.Context, string) (net.Conn, error) {
return lis.Dial()
}
conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialFunc), grpc.WithInsecure())
if err != nil {
t.Fatalf("Failed to dial bufnet: %v", err)
}
defer conn.Close()
client := externalscaler.NewExternalScalerClient(conn)
testRef := &externalscaler.ScaledObjectRef{
ScalerMetadata: map[string]string{
"host": tc.host,
},
}
// First will see if we can establish the stream and handle this
// error.
streamClient, err := client.StreamIsActive(ctx, testRef)
if err != nil {
t.Fatalf("StreamIsActive failed: %v", err)
}
// Next, as in TestIsActive, we check for any error, expected
// or unexpected, for each table test.
res, err := streamClient.Recv()
if tc.expectedErr && err != nil {
return
} else if err != nil {
t.Fatalf("expected no error but got: %v", err)
}
if tc.expected != res.Result {
t.Fatalf("Expected IsActive result %v, got: %v", tc.expected, res.Result)
}
})
}
}
func TestIsActive(t *testing.T) { func TestIsActive(t *testing.T) {
type testCase struct { type testCase struct {
name string name string
@ -88,9 +222,6 @@ func TestIsActive(t *testing.T) {
lggr := logr.Discard() lggr := logr.Discard()
table := routing.NewTable() table := routing.NewTable()
ticker, pinger, err := newFakeQueuePinger(ctx, lggr) ticker, pinger, err := newFakeQueuePinger(ctx, lggr)
if err != nil {
t.Fatalf("failed to create queue pinger: %v", err)
}
r.NoError(err) r.NoError(err)
defer ticker.Stop() defer ticker.Stop()
tc.setup(table, pinger) tc.setup(table, pinger)