Skip to content

Commit bb71682

Browse files
committed
add discovery integration test
1 parent d3d8abb commit bb71682

File tree

7 files changed

+245
-26
lines changed

7 files changed

+245
-26
lines changed

.github/workflows/tests.yml

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ jobs:
6767
- name: Checkout code
6868
uses: actions/checkout@v2
6969
- name: Test
70-
run: go test -race -coverpkg=./... -coverprofile unit.txt -covermode atomic ./test/table_test.go
70+
run: go test -race -coverpkg=./... -coverprofile table.txt -covermode atomic ./test/table_test.go
7171
- name: Upload coverage to Codecov
7272
uses: codecov/codecov-action@v2
7373
with:
@@ -106,7 +106,7 @@ jobs:
106106
- name: Checkout code
107107
uses: actions/checkout@v2
108108
- name: Test
109-
run: go test -race -coverpkg=./... -coverprofile unit.txt -covermode atomic ./test/ratelimiter_test.go
109+
run: go test -race -coverpkg=./... -coverprofile ratelimiter.txt -covermode atomic ./test/ratelimiter_test.go
110110
shell: bash
111111
- name: Upload coverage to Codecov
112112
uses: codecov/codecov-action@v2
@@ -146,13 +146,52 @@ jobs:
146146
- name: Checkout code
147147
uses: actions/checkout@v2
148148
- name: Test
149-
run: go test -race -coverpkg=./... -coverprofile unit.txt -covermode atomic ./test/scripting_test.go
149+
run: go test -race -coverpkg=./... -coverprofile scripting.txt -covermode atomic ./test/scripting_test.go
150150
- name: Upload coverage to Codecov
151151
uses: codecov/codecov-action@v2
152152
with:
153153
file: ./scripting.txt
154154
flags: scripting,e2e,integration,${{ matrix.os }},${{ matrix.go-version }}
155155
name: scripting
156+
discovery:
157+
strategy:
158+
matrix:
159+
go-version: [1.17.x]
160+
os: [ubuntu-latest]
161+
services:
162+
ydb:
163+
image: cr.yandex/yc/yandex-docker-local-ydb:latest
164+
ports:
165+
- 2135:2135
166+
- 8765:8765
167+
volumes:
168+
- /tmp/ydb_certs:/ydb_certs
169+
env:
170+
YDB_LOCAL_SURVIVE_RESTART: true
171+
YDB_USE_IN_MEMORY_PDISKS: true
172+
options: '-h localhost'
173+
env:
174+
OS: ${{ matrix.os }}
175+
GO: ${{ matrix.go-version }}
176+
YDB_CONNECTION_STRING: grpcs://localhost:2135/?database=/local
177+
YDB_SSL_ROOT_CERTIFICATES_FILE: /tmp/ydb_certs/ca.pem
178+
YDB_ANONYMOUS_CREDENTIALS: 1
179+
runs-on: ${{ matrix.os }}
180+
steps:
181+
- name: Install Go
182+
uses: actions/setup-go@v2
183+
with:
184+
go-version: ${{ matrix.go-version }}
185+
- name: Checkout code
186+
uses: actions/checkout@v2
187+
- name: Test
188+
run: go test -race -coverpkg=./... -coverprofile discovery.txt -covermode atomic ./test/discovery_test.go
189+
- name: Upload coverage to Codecov
190+
uses: codecov/codecov-action@v2
191+
with:
192+
file: ./discovery.txt
193+
flags: discovery,e2e,integration,${{ matrix.os }},${{ matrix.go-version }}
194+
name: discovery
156195
connection:
157196
strategy:
158197
matrix:
@@ -185,7 +224,7 @@ jobs:
185224
- name: Checkout code
186225
uses: actions/checkout@v2
187226
- name: Test
188-
run: go test -race -coverpkg=./... -coverprofile unit.txt -covermode atomic ./test/connection_test.go
227+
run: go test -race -coverpkg=./... -coverprofile connection.txt -covermode atomic ./test/connection_test.go
189228
- name: Upload coverage to Codecov
190229
uses: codecov/codecov-action@v2
191230
with:

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* Fixed `recursive` param in `ratelimiter.ListResource`
1313
* Added counting stream usages for exclude park connection if it in use
1414
* Added `trace.Driver` events about change stream usage and `conn.Release()` call
15+
* Fixed bug with non-applying meta headers on direct call `db.Discovery.Discover`
1516

1617
## 3.14.4
1718
* Implemented auto-removing `conn.Conn` from `conn.Pool` with counting usages of `conn.Conn`

internal/conn/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"google.golang.org/grpc"
77

8+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/meta"
89
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
910
)
1011

@@ -13,4 +14,5 @@ type Config interface {
1314
Trace() trace.Driver
1415
ConnectionTTL() time.Duration
1516
GrpcDialOptions() []grpc.DialOption
17+
Meta() meta.Meta
1618
}

internal/conn/conn.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,15 @@ func (c *conn) invoke(
329329
)
330330
}
331331

332+
ctx, err = c.config.Meta().Meta(ctx)
333+
if err != nil {
334+
return errors.NewGrpcError(
335+
codes.Unavailable,
336+
errors.WithMsg("ydb driver conn apply meta failed"),
337+
errors.WithErr(err),
338+
)
339+
}
340+
332341
c.changeUsages(1)
333342
defer c.changeUsages(-1)
334343

@@ -407,6 +416,15 @@ func (c *conn) newStream(
407416
)
408417
}
409418

419+
ctx, err = c.config.Meta().Meta(ctx)
420+
if err != nil {
421+
return nil, errors.NewGrpcError(
422+
codes.Unavailable,
423+
errors.WithMsg("ydb driver conn apply meta failed"),
424+
errors.WithErr(err),
425+
)
426+
}
427+
410428
c.changeStreamUsages(1)
411429
defer c.changeStreamUsages(-1)
412430

internal/db/database.go

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"google.golang.org/grpc"
7+
"google.golang.org/grpc/codes"
78

89
"github.com/ydb-platform/ydb-go-sdk/v3/config"
910
"github.com/ydb-platform/ydb-go-sdk/v3/discovery"
@@ -112,22 +113,18 @@ func (db *database) Invoke(
112113
) error {
113114
cc, err := db.cluster.Get(ctx)
114115
if err != nil {
115-
return errors.WithStackTrace(err)
116-
}
117-
ctx, err = db.config.Meta().Meta(ctx)
118-
if err != nil {
119-
return errors.WithStackTrace(err)
116+
return errors.NewGrpcError(
117+
codes.Unavailable,
118+
errors.WithMsg("ydb driver cluster get failed"),
119+
errors.WithErr(err),
120+
)
120121
}
121122
defer func() {
122123
if err != nil && errors.MustPessimizeEndpoint(err) {
123124
db.cluster.Pessimize(ctx, cc, err)
124125
}
125126
}()
126-
err = cc.Invoke(ctx, method, args, reply, opts...)
127-
if err != nil {
128-
return errors.WithStackTrace(err)
129-
}
130-
return nil
127+
return cc.Invoke(ctx, method, args, reply, opts...)
131128
}
132129

133130
func (db *database) NewStream(
@@ -138,21 +135,16 @@ func (db *database) NewStream(
138135
) (grpc.ClientStream, error) {
139136
cc, err := db.cluster.Get(ctx)
140137
if err != nil {
141-
return nil, errors.WithStackTrace(err)
142-
}
143-
ctx, err = db.config.Meta().Meta(ctx)
144-
if err != nil {
145-
return nil, errors.WithStackTrace(err)
138+
return nil, errors.NewGrpcError(
139+
codes.Unavailable,
140+
errors.WithMsg("ydb driver cluster get failed"),
141+
errors.WithErr(err),
142+
)
146143
}
147144
defer func() {
148145
if err != nil && errors.MustPessimizeEndpoint(err) {
149146
db.cluster.Pessimize(ctx, cc, err)
150147
}
151148
}()
152-
var client grpc.ClientStream
153-
client, err = cc.NewStream(ctx, desc, method, opts...)
154-
if err != nil {
155-
return nil, errors.WithStackTrace(err)
156-
}
157-
return client, nil
149+
return cc.NewStream(ctx, desc, method, opts...)
158150
}

test/connection_test.go

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"testing"
1212
"time"
1313

14+
"google.golang.org/grpc"
15+
"google.golang.org/grpc/metadata"
1416
"google.golang.org/protobuf/proto"
1517
"google.golang.org/protobuf/types/known/durationpb"
1618

@@ -26,13 +28,38 @@ import (
2628
ydb "github.com/ydb-platform/ydb-go-sdk/v3"
2729
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
2830
"github.com/ydb-platform/ydb-go-sdk/v3/config"
31+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/meta"
2932
"github.com/ydb-platform/ydb-go-sdk/v3/log"
3033
"github.com/ydb-platform/ydb-go-sdk/v3/retry"
3134
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
3235
)
3336

3437
// nolint:gocyclo
3538
func TestConnection(t *testing.T) {
39+
var (
40+
userAgent = "connection user agent"
41+
requestType = "connection request type"
42+
checkMedatada = func(ctx context.Context) {
43+
md, has := metadata.FromOutgoingContext(ctx)
44+
if !has {
45+
t.Fatalf("no medatada")
46+
}
47+
userAgents := md.Get(meta.HeaderUserAgent)
48+
if len(userAgents) == 0 {
49+
t.Fatalf("no user agent")
50+
}
51+
if userAgents[0] != userAgent {
52+
t.Fatalf("unknown user agent: %s", userAgents[0])
53+
}
54+
requestTypes := md.Get(meta.HeaderRequestType)
55+
if len(requestTypes) == 0 {
56+
t.Fatalf("no request type")
57+
}
58+
if requestTypes[0] != requestType {
59+
t.Fatalf("unknown request type: %s", requestTypes[0])
60+
}
61+
}
62+
)
3663
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
3764
defer cancel()
3865
db, err := ydb.New(
@@ -53,7 +80,34 @@ func TestConnection(t *testing.T) {
5380
ydb.WithErrWriter(os.Stderr),
5481
ydb.WithMinLevel(log.WARN),
5582
),
56-
ydb.WithUserAgent("scripting"),
83+
ydb.WithUserAgent(userAgent),
84+
ydb.WithRequestsType(requestType),
85+
ydb.With(
86+
config.WithGrpcOptions(
87+
grpc.WithUnaryInterceptor(func(
88+
ctx context.Context,
89+
method string,
90+
req, reply interface{},
91+
cc *grpc.ClientConn,
92+
invoker grpc.UnaryInvoker,
93+
opts ...grpc.CallOption,
94+
) error {
95+
checkMedatada(ctx)
96+
return invoker(ctx, method, req, reply, cc, opts...)
97+
}),
98+
grpc.WithStreamInterceptor(func(
99+
ctx context.Context,
100+
desc *grpc.StreamDesc,
101+
cc *grpc.ClientConn,
102+
method string,
103+
streamer grpc.Streamer,
104+
opts ...grpc.CallOption,
105+
) (grpc.ClientStream, error) {
106+
checkMedatada(ctx)
107+
return streamer(ctx, desc, cc, method, opts...)
108+
}),
109+
),
110+
),
57111
)
58112
if err != nil {
59113
t.Fatal(err)

test/discovery_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//go:build !fast
2+
// +build !fast
3+
4+
package test
5+
6+
import (
7+
"context"
8+
"crypto/tls"
9+
"os"
10+
"testing"
11+
"time"
12+
13+
"google.golang.org/grpc"
14+
"google.golang.org/grpc/metadata"
15+
16+
ydb "github.com/ydb-platform/ydb-go-sdk/v3"
17+
"github.com/ydb-platform/ydb-go-sdk/v3/balancers"
18+
"github.com/ydb-platform/ydb-go-sdk/v3/config"
19+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/meta"
20+
"github.com/ydb-platform/ydb-go-sdk/v3/log"
21+
"github.com/ydb-platform/ydb-go-sdk/v3/trace"
22+
)
23+
24+
func TestDiscovery(t *testing.T) {
25+
var (
26+
userAgent = "connection user agent"
27+
requestType = "connection request type"
28+
checkMedatada = func(ctx context.Context) {
29+
md, has := metadata.FromOutgoingContext(ctx)
30+
if !has {
31+
t.Fatalf("no medatada")
32+
}
33+
userAgents := md.Get(meta.HeaderUserAgent)
34+
if len(userAgents) == 0 {
35+
t.Fatalf("no user agent")
36+
}
37+
if userAgents[0] != userAgent {
38+
t.Fatalf("unknown user agent: %s", userAgents[0])
39+
}
40+
requestTypes := md.Get(meta.HeaderRequestType)
41+
if len(requestTypes) == 0 {
42+
t.Fatalf("no request type")
43+
}
44+
if requestTypes[0] != requestType {
45+
t.Fatalf("unknown request type: %s", requestTypes[0])
46+
}
47+
}
48+
)
49+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
50+
defer cancel()
51+
db, err := ydb.New(
52+
ctx,
53+
ydb.WithConnectionString(os.Getenv("YDB_CONNECTION_STRING")),
54+
ydb.WithAnonymousCredentials(),
55+
ydb.With(
56+
config.WithOperationTimeout(time.Second*2),
57+
config.WithOperationCancelAfter(time.Second*2),
58+
),
59+
ydb.WithBalancer(balancers.SingleConn()),
60+
ydb.WithConnectionTTL(time.Millisecond*500),
61+
ydb.WithMinTLSVersion(tls.VersionTLS10),
62+
ydb.WithLogger(
63+
trace.MatchDetails(`ydb\.(driver|discovery).*`),
64+
ydb.WithNamespace("ydb"),
65+
ydb.WithOutWriter(os.Stdout),
66+
ydb.WithErrWriter(os.Stderr),
67+
ydb.WithMinLevel(log.WARN),
68+
),
69+
ydb.WithUserAgent(userAgent),
70+
ydb.WithRequestsType(requestType),
71+
ydb.With(
72+
config.WithGrpcOptions(
73+
grpc.WithUnaryInterceptor(func(
74+
ctx context.Context,
75+
method string,
76+
req, reply interface{},
77+
cc *grpc.ClientConn,
78+
invoker grpc.UnaryInvoker,
79+
opts ...grpc.CallOption,
80+
) error {
81+
checkMedatada(ctx)
82+
return invoker(ctx, method, req, reply, cc, opts...)
83+
}),
84+
grpc.WithStreamInterceptor(func(
85+
ctx context.Context,
86+
desc *grpc.StreamDesc,
87+
cc *grpc.ClientConn,
88+
method string,
89+
streamer grpc.Streamer,
90+
opts ...grpc.CallOption,
91+
) (grpc.ClientStream, error) {
92+
checkMedatada(ctx)
93+
return streamer(ctx, desc, cc, method, opts...)
94+
}),
95+
),
96+
),
97+
)
98+
if err != nil {
99+
t.Fatal(err)
100+
}
101+
defer func() {
102+
// cleanup connection
103+
if e := db.Close(ctx); e != nil {
104+
t.Fatalf("db close failed: %+v", e)
105+
}
106+
}()
107+
t.Run("Discover", func(t *testing.T) {
108+
time.Sleep(time.Second) // wait for parking conn
109+
if _, err = db.Discovery().Discover(ctx); err != nil {
110+
t.Fatalf("Execute failed: %v", err)
111+
}
112+
})
113+
}

0 commit comments

Comments
 (0)