Skip to content

Commit 98668fa

Browse files
authored
feat(pubsublite): Added Pub/Sub Lite clients and routing headers (#3105)
Added functions to create all the required gapic clients. Updated the AdminClient to use these. Added utils for attaching headers for routing to the correct backend server handling a particular topic or subscription.
1 parent b66727a commit 98668fa

File tree

2 files changed

+77
-6
lines changed

2 files changed

+77
-6
lines changed

pubsublite/admin.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ import (
1717
"context"
1818

1919
"google.golang.org/api/option"
20-
"google.golang.org/api/option/internaloption"
2120

2221
vkit "cloud.google.com/go/pubsublite/apiv1"
2322
pb "google.golang.org/genproto/googleapis/cloud/pubsublite/v1"
2423
)
2524

26-
// AdminClient provides admin operations for Google Pub/Sub Lite resources
25+
// AdminClient provides admin operations for Cloud Pub/Sub Lite resources
2726
// within a Google Cloud region. An AdminClient may be shared by multiple
2827
// goroutines.
2928
type AdminClient struct {
@@ -33,14 +32,12 @@ type AdminClient struct {
3332
// NewAdminClient creates a new Cloud Pub/Sub Lite client to perform admin
3433
// operations for resources within a given region.
3534
// See https://cloud.google.com/pubsub/lite/docs/locations for the list of
36-
// regions and zones where Google Pub/Sub Lite is available.
35+
// regions and zones where Cloud Pub/Sub Lite is available.
3736
func NewAdminClient(ctx context.Context, region string, opts ...option.ClientOption) (*AdminClient, error) {
3837
if err := validateRegion(region); err != nil {
3938
return nil, err
4039
}
41-
options := []option.ClientOption{internaloption.WithDefaultEndpoint(region + "-pubsublite.googleapis.com:443")}
42-
options = append(options, opts...)
43-
admin, err := vkit.NewAdminClient(ctx, options...)
40+
admin, err := newAdminClient(ctx, region, opts...)
4441
if err != nil {
4542
return nil, err
4643
}

pubsublite/rpc.go

+74
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,18 @@
1414
package pubsublite
1515

1616
import (
17+
"context"
18+
"fmt"
19+
"net/url"
1720
"time"
1821

22+
"google.golang.org/api/option"
23+
"google.golang.org/api/option/internaloption"
1924
"google.golang.org/grpc/codes"
25+
"google.golang.org/grpc/metadata"
2026
"google.golang.org/grpc/status"
2127

28+
vkit "cloud.google.com/go/pubsublite/apiv1"
2229
gax "github.com/googleapis/gax-go/v2"
2330
)
2431

@@ -98,3 +105,70 @@ func isRetryableStreamError(err error, isEligible func(codes.Code) bool) bool {
98105
}
99106
return isEligible(s.Code())
100107
}
108+
109+
const (
110+
pubsubLiteDefaultEndpoint = "-pubsublite.googleapis.com:443"
111+
routingMetadataHeader = "x-goog-request-params"
112+
)
113+
114+
func defaultClientOptions(region string) []option.ClientOption {
115+
return []option.ClientOption{
116+
internaloption.WithDefaultEndpoint(region + pubsubLiteDefaultEndpoint),
117+
}
118+
}
119+
120+
func newAdminClient(ctx context.Context, region string, opts ...option.ClientOption) (*vkit.AdminClient, error) {
121+
if err := validateRegion(region); err != nil {
122+
return nil, err
123+
}
124+
options := append(defaultClientOptions(region), opts...)
125+
return vkit.NewAdminClient(ctx, options...)
126+
}
127+
128+
func newPublisherClient(ctx context.Context, region string, opts ...option.ClientOption) (*vkit.PublisherClient, error) {
129+
if err := validateRegion(region); err != nil {
130+
return nil, err
131+
}
132+
options := append(defaultClientOptions(region), opts...)
133+
return vkit.NewPublisherClient(ctx, options...)
134+
}
135+
136+
func newSubscriberClient(ctx context.Context, region string, opts ...option.ClientOption) (*vkit.SubscriberClient, error) {
137+
if err := validateRegion(region); err != nil {
138+
return nil, err
139+
}
140+
options := append(defaultClientOptions(region), opts...)
141+
return vkit.NewSubscriberClient(ctx, options...)
142+
}
143+
144+
func newCursorClient(ctx context.Context, region string, opts ...option.ClientOption) (*vkit.CursorClient, error) {
145+
if err := validateRegion(region); err != nil {
146+
return nil, err
147+
}
148+
options := append(defaultClientOptions(region), opts...)
149+
return vkit.NewCursorClient(ctx, options...)
150+
}
151+
152+
func newPartitionAssignmentClient(ctx context.Context, region string, opts ...option.ClientOption) (*vkit.PartitionAssignmentClient, error) {
153+
if err := validateRegion(region); err != nil {
154+
return nil, err
155+
}
156+
options := append(defaultClientOptions(region), opts...)
157+
return vkit.NewPartitionAssignmentClient(ctx, options...)
158+
}
159+
160+
func addTopicRoutingMetadata(ctx context.Context, topic TopicPath, partition int) context.Context {
161+
md, _ := metadata.FromOutgoingContext(ctx)
162+
md = md.Copy()
163+
val := fmt.Sprintf("partition=%d&topic=%s", partition, url.QueryEscape(topic.String()))
164+
md[routingMetadataHeader] = append(md[routingMetadataHeader], val)
165+
return metadata.NewOutgoingContext(ctx, md)
166+
}
167+
168+
func addSubscriptionRoutingMetadata(ctx context.Context, subs SubscriptionPath, partition int) context.Context {
169+
md, _ := metadata.FromOutgoingContext(ctx)
170+
md = md.Copy()
171+
val := fmt.Sprintf("partition=%d&subscription=%s", partition, url.QueryEscape(subs.String()))
172+
md[routingMetadataHeader] = append(md[routingMetadataHeader], val)
173+
return metadata.NewOutgoingContext(ctx, md)
174+
}

0 commit comments

Comments
 (0)