Skip to content

Commit a098fba

Browse files
authored
feat(internal/gengapic): include API version in gapic metadata (#1653)
1 parent 78e9249 commit a098fba

File tree

4 files changed

+140
-9
lines changed

4 files changed

+140
-9
lines changed

internal/gengapic/client_init.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"strings"
2020

2121
"github.com/googleapis/gapic-generator-go/internal/pbinfo"
22+
"google.golang.org/genproto/googleapis/api/annotations"
23+
"google.golang.org/protobuf/proto"
2224
"google.golang.org/protobuf/types/descriptorpb"
2325
)
2426

@@ -380,6 +382,9 @@ func (g *generator) makeClients(serv *descriptorpb.ServiceDescriptorProto, servN
380382
return err
381383
}
382384

385+
apiVersion := proto.GetExtension(serv.Options, annotations.E_ApiVersion).(string)
386+
g.addMetadataServiceEntry(serv.GetName(), apiVersion)
387+
383388
err = g.internalClientIntfInit(serv, servName)
384389
if err != nil {
385390
return err

internal/gengapic/client_init_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,8 @@ func TestClientInit(t *testing.T) {
330330
},
331331
Options: &descriptorpb.ServiceOptions{},
332332
}
333-
proto.SetExtension(servPlain.Options, annotations.E_ApiVersion, "v1_20240425")
333+
servPlainAPIVersion := "v1_20240425"
334+
proto.SetExtension(servPlain.Options, annotations.E_ApiVersion, servPlainAPIVersion)
334335

335336
servLRO := &descriptorpb.ServiceDescriptorProto{
336337
Name: proto.String("Foo"),
@@ -592,6 +593,12 @@ func TestClientInit(t *testing.T) {
592593
g.snippetMetadata = sm
593594
g.makeClients(tst.serv, tst.servName)
594595

596+
if md, ok := g.metadata.GetServices()[tst.serv.GetName()]; !ok {
597+
t.Errorf("ClientInit(%s) gapic metadata, expected %s to be present but found %+v", tst.tstName, tst.serv.GetName(), g.metadata.GetServices())
598+
} else if tst.serv == servPlain && md.GetApiVersion() != servPlainAPIVersion {
599+
t.Errorf("ClinitInit(%s) gapic metadata service entry api version, got %q, want %q", tst.tstName, md.GetApiVersion(), servPlainAPIVersion)
600+
}
601+
595602
if diff := cmp.Diff(g.imports, tst.imports); diff != "" {
596603
t.Errorf("ClientInit(%s) imports got(-),want(+):\n%s", tst.tstName, diff)
597604
}

internal/gengapic/metadata.go

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,65 @@ func (g *generator) genGapicMetadataFile() error {
3535
return nil
3636
}
3737

38+
// Initializes the service metadata entry with the API version, if set.
39+
// Per-transport clients will be added as they are generated.
40+
func (g *generator) addMetadataServiceEntry(service, apiVersion string) {
41+
if g.metadata.Services == nil {
42+
g.metadata.Services = make(map[string]*metadata.GapicMetadata_ServiceForTransport)
43+
}
44+
_, ok := g.metadata.GetServices()[service]
45+
if !ok {
46+
s := &metadata.GapicMetadata_ServiceForTransport{
47+
Clients: make(map[string]*metadata.GapicMetadata_ServiceAsClient),
48+
ApiVersion: apiVersion,
49+
}
50+
g.metadata.Services[service] = s
51+
}
52+
}
53+
3854
// Adds a metadata structure for the (service, transport) combination.
55+
// Will exit early if addMetadataServiceEntry is not called prior to this.
3956
// This method is idempotent.
4057
func (g *generator) addMetadataServiceForTransport(service, transport, lib string) {
58+
if g.metadata.Services == nil {
59+
return
60+
}
61+
4162
s, ok := g.metadata.GetServices()[service]
4263
if !ok {
43-
s = &metadata.GapicMetadata_ServiceForTransport{
44-
Clients: make(map[string]*metadata.GapicMetadata_ServiceAsClient),
45-
}
46-
g.metadata.Services[service] = s
64+
return
4765
}
4866

4967
if _, ok := s.Clients[transport]; !ok {
5068
s.Clients[transport] = &metadata.GapicMetadata_ServiceAsClient{
5169
// The "Client" part of the generated type's name is hard-coded in the
5270
// generator so we need to append it to the lib name.
53-
//
54-
// TODO(noahdietz): when REGAPIC is added we may need to special-case based
55-
// on transport.
5671
LibraryClient: lib + "Client",
5772
Rpcs: make(map[string]*metadata.GapicMetadata_MethodList),
5873
}
5974
}
6075
}
6176

77+
// Adds a metadata service transport client method entry for the given RPC.
78+
// Will exit early if addMetadataServiceEntry or addMetadaServiceForTransport
79+
// are not called prior to this.
6280
func (g *generator) addMetadataMethod(service, transport, rpc string) {
81+
if g.metadata.Services == nil {
82+
return
83+
}
84+
s, ok := g.metadata.GetServices()[service]
85+
if !ok {
86+
return
87+
}
88+
c, ok := s.GetClients()[transport]
89+
if !ok {
90+
return
91+
}
92+
if c.GetRpcs() == nil {
93+
c.Rpcs = make(map[string]*metadata.GapicMetadata_MethodList)
94+
}
6395
// There is only one method per RPC on a generated Go client, with the same name as the RPC.
64-
g.metadata.GetServices()[service].GetClients()[transport].GetRpcs()[rpc] = &metadata.GapicMetadata_MethodList{
96+
c.GetRpcs()[rpc] = &metadata.GapicMetadata_MethodList{
6597
Methods: []string{rpc},
6698
}
6799
}

internal/gengapic/metadata_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,79 @@ import (
2323
"google.golang.org/protobuf/proto"
2424
)
2525

26+
func TestAddMetadataServiceEntry(t *testing.T) {
27+
for _, tst := range []struct {
28+
name, service, apiVersion string
29+
init, want *metadata.GapicMetadata
30+
}{
31+
{
32+
name: "empty_metadata",
33+
service: "Fooer",
34+
apiVersion: "v1",
35+
init: &metadata.GapicMetadata{},
36+
want: &metadata.GapicMetadata{
37+
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
38+
"Fooer": {
39+
Clients: make(map[string]*metadata.GapicMetadata_ServiceAsClient),
40+
ApiVersion: "v1",
41+
},
42+
},
43+
},
44+
},
45+
{
46+
name: "service_exists",
47+
service: "Fooer",
48+
apiVersion: "v1",
49+
init: &metadata.GapicMetadata{
50+
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
51+
"Fooer": {
52+
Clients: map[string]*metadata.GapicMetadata_ServiceAsClient{
53+
"grpc": {
54+
LibraryClient: "FooerClient",
55+
},
56+
},
57+
},
58+
},
59+
},
60+
want: &metadata.GapicMetadata{
61+
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
62+
"Fooer": {
63+
Clients: map[string]*metadata.GapicMetadata_ServiceAsClient{
64+
"grpc": {
65+
LibraryClient: "FooerClient",
66+
},
67+
},
68+
},
69+
},
70+
},
71+
},
72+
{
73+
name: "no_api_version",
74+
service: "Fooer",
75+
init: &metadata.GapicMetadata{},
76+
want: &metadata.GapicMetadata{
77+
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
78+
"Fooer": {
79+
Clients: make(map[string]*metadata.GapicMetadata_ServiceAsClient),
80+
},
81+
},
82+
},
83+
},
84+
} {
85+
t.Run(tst.name, func(t *testing.T) {
86+
g := generator{
87+
metadata: tst.init,
88+
}
89+
g.addMetadataServiceEntry(tst.service, tst.apiVersion)
90+
91+
if diff := cmp.Diff(g.metadata, tst.want, cmp.Comparer(proto.Equal)); diff != "" {
92+
t.Errorf("addMetadataServiceEntry(%q, %q): got(-),want(+):\n%s", tst.service, tst.apiVersion, diff)
93+
}
94+
})
95+
}
96+
97+
}
98+
2699
func TestAddMetadataServiceForTransport(t *testing.T) {
27100
for _, tst := range []struct {
28101
service, lib string
@@ -34,6 +107,20 @@ func TestAddMetadataServiceForTransport(t *testing.T) {
34107
init: &metadata.GapicMetadata{
35108
Services: make(map[string]*metadata.GapicMetadata_ServiceForTransport),
36109
},
110+
want: &metadata.GapicMetadata{
111+
Services: make(map[string]*metadata.GapicMetadata_ServiceForTransport),
112+
},
113+
},
114+
{
115+
service: "LibraryService",
116+
lib: "LibraryService",
117+
init: &metadata.GapicMetadata{
118+
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
119+
"LibraryService": {
120+
Clients: make(map[string]*metadata.GapicMetadata_ServiceAsClient),
121+
},
122+
},
123+
},
37124
want: &metadata.GapicMetadata{
38125
Services: map[string]*metadata.GapicMetadata_ServiceForTransport{
39126
"LibraryService": {

0 commit comments

Comments
 (0)