Skip to content

Commit 11b669b

Browse files
authored
fix(serviceconfig): update Find for OpenAPI and Discovery paths (#3671)
Previously, Find did not correctly match APIs when the channel parameter is an OpenAPI or Discovery path. This is now fixed by matching on the API.OpenAPI and API.Discovery field. Fixes #3640
1 parent 6ec8ac6 commit 11b669b

3 files changed

Lines changed: 146 additions & 15 deletions

File tree

internal/serviceconfig/serviceconfig.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,26 +80,34 @@ func Read(serviceConfigPath string) (*Service, error) {
8080
// Returns an API struct with Path, ServiceConfig, and Title fields populated.
8181
// ServiceConfig and Title may be empty strings if not found or not configured.
8282
func Find(googleapisDir, path string) (*API, error) {
83-
result := &API{Path: path}
84-
85-
// Check allowlist for overrides
83+
var result *API
8684
for _, api := range APIs {
87-
if api.Path == path {
88-
result.ServiceConfig = api.ServiceConfig
89-
result.Title = api.Title
90-
result.Discovery = api.Discovery
91-
result.OpenAPI = api.OpenAPI
85+
// The path for OpenAPI and discovery documents are in
86+
// googleapis/google-cloud-rust and
87+
// googleapis/discovery-artifact-manager, respectively.
88+
// The api.Path field is that API path in googleapis/googleapis.
89+
if api.Path == path || api.OpenAPI == path || api.Discovery == path {
90+
// Create a copy of the API struct to allow modifications to
91+
// result.ServiceConfig without affecting the APIs slice.
92+
r := api
93+
result = &r
9294
break
9395
}
9496
}
9597

98+
// TODO(https://github.com/googleapis/librarian/issues/3627): all APIs
99+
// should be listed in the allowlist
100+
if result == nil {
101+
return &API{Path: path}, nil
102+
}
103+
96104
// If service config is overridden in allowlist, use it
97105
if result.ServiceConfig != "" {
98106
return result, nil
99107
}
100108

101109
// Search filesystem for service config
102-
dir := filepath.Join(googleapisDir, path)
110+
dir := filepath.Join(googleapisDir, result.Path)
103111
_, err := os.Stat(dir)
104112
if err != nil {
105113
if errors.Is(err, os.ErrNotExist) {
@@ -129,7 +137,7 @@ func Find(googleapisDir, path string) (*API, error) {
129137
return nil, err
130138
}
131139
if isServiceConfig {
132-
result.ServiceConfig = filepath.Join(path, name)
140+
result.ServiceConfig = filepath.Join(result.Path, name)
133141
return result, nil
134142
}
135143
}

internal/serviceconfig/serviceconfig_test.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,11 @@ func TestFind(t *testing.T) {
9797
},
9898
},
9999
{
100-
name: "not found",
101-
channel: "google/cloud/compute/v1",
100+
name: "not service config has title override",
101+
channel: "google/cloud/orgpolicy/v1",
102102
want: &API{
103-
Path: "google/cloud/compute/v1",
104-
Discovery: "discoveries/compute.v1.json",
103+
Path: "google/cloud/orgpolicy/v1",
104+
Title: "Organization Policy Types",
105105
},
106106
},
107107
{
@@ -113,13 +113,31 @@ func TestFind(t *testing.T) {
113113
wantErr: true,
114114
},
115115
{
116-
name: "override",
116+
name: "service config override",
117117
channel: "google/cloud/aiplatform/v1/schema/predict/instance",
118118
want: &API{
119119
Path: "google/cloud/aiplatform/v1/schema/predict/instance",
120120
ServiceConfig: "google/cloud/aiplatform/v1/schema/aiplatform_v1.yaml",
121121
},
122122
},
123+
{
124+
name: "openapi",
125+
channel: "testdata/secretmanager_openapi_v1.json",
126+
want: &API{
127+
Path: "google/cloud/secretmanager/v1",
128+
OpenAPI: "testdata/secretmanager_openapi_v1.json",
129+
ServiceConfig: "google/cloud/secretmanager/v1/secretmanager_v1.yaml",
130+
},
131+
},
132+
{
133+
name: "discovery",
134+
channel: "discoveries/compute.v1.json",
135+
want: &API{
136+
Path: "google/cloud/compute/v1",
137+
Discovery: "discoveries/compute.v1.json",
138+
ServiceConfig: "google/cloud/compute/v1/compute_v1.yaml",
139+
},
140+
},
123141
} {
124142
t.Run(test.name, func(t *testing.T) {
125143
got, err := Find(googleapisDir, test.channel)
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Copyright 2020 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
type: google.api.Service
15+
config_version: 3
16+
name: compute.googleapis.com
17+
title: Google Compute Engine API
18+
apis:
19+
- name: google.cloud.compute.v1.AcceleratorTypes
20+
- name: google.cloud.compute.v1.Addresses
21+
- name: google.cloud.compute.v1.Autoscalers
22+
- name: google.cloud.compute.v1.BackendBuckets
23+
- name: google.cloud.compute.v1.BackendServices
24+
- name: google.cloud.compute.v1.DiskTypes
25+
- name: google.cloud.compute.v1.Disks
26+
- name: google.cloud.compute.v1.ExternalVpnGateways
27+
- name: google.cloud.compute.v1.FirewallPolicies
28+
- name: google.cloud.compute.v1.Firewalls
29+
- name: google.cloud.compute.v1.ForwardingRules
30+
- name: google.cloud.compute.v1.GlobalAddresses
31+
- name: google.cloud.compute.v1.GlobalForwardingRules
32+
- name: google.cloud.compute.v1.GlobalNetworkEndpointGroups
33+
- name: google.cloud.compute.v1.GlobalOperations
34+
- name: google.cloud.compute.v1.GlobalOrganizationOperations
35+
- name: google.cloud.compute.v1.GlobalPublicDelegatedPrefixes
36+
- name: google.cloud.compute.v1.HealthChecks
37+
- name: google.cloud.compute.v1.ImageFamilyViews
38+
- name: google.cloud.compute.v1.Images
39+
- name: google.cloud.compute.v1.InstanceGroupManagers
40+
- name: google.cloud.compute.v1.InstanceGroups
41+
- name: google.cloud.compute.v1.InstanceTemplates
42+
- name: google.cloud.compute.v1.Instances
43+
- name: google.cloud.compute.v1.InterconnectAttachments
44+
- name: google.cloud.compute.v1.InterconnectLocations
45+
- name: google.cloud.compute.v1.Interconnects
46+
- name: google.cloud.compute.v1.LicenseCodes
47+
- name: google.cloud.compute.v1.Licenses
48+
- name: google.cloud.compute.v1.MachineTypes
49+
- name: google.cloud.compute.v1.NetworkEndpointGroups
50+
- name: google.cloud.compute.v1.Networks
51+
- name: google.cloud.compute.v1.NodeGroups
52+
- name: google.cloud.compute.v1.NodeTemplates
53+
- name: google.cloud.compute.v1.NodeTypes
54+
- name: google.cloud.compute.v1.PacketMirrorings
55+
- name: google.cloud.compute.v1.Projects
56+
- name: google.cloud.compute.v1.PublicAdvertisedPrefixes
57+
- name: google.cloud.compute.v1.PublicDelegatedPrefixes
58+
- name: google.cloud.compute.v1.RegionAutoscalers
59+
- name: google.cloud.compute.v1.RegionBackendServices
60+
- name: google.cloud.compute.v1.RegionCommitments
61+
- name: google.cloud.compute.v1.RegionDiskTypes
62+
- name: google.cloud.compute.v1.RegionDisks
63+
- name: google.cloud.compute.v1.RegionHealthCheckServices
64+
- name: google.cloud.compute.v1.RegionHealthChecks
65+
- name: google.cloud.compute.v1.RegionInstanceGroupManagers
66+
- name: google.cloud.compute.v1.RegionInstanceGroups
67+
- name: google.cloud.compute.v1.RegionInstances
68+
- name: google.cloud.compute.v1.RegionNetworkEndpointGroups
69+
- name: google.cloud.compute.v1.RegionNotificationEndpoints
70+
- name: google.cloud.compute.v1.RegionOperations
71+
- name: google.cloud.compute.v1.RegionSslCertificates
72+
- name: google.cloud.compute.v1.RegionTargetHttpProxies
73+
- name: google.cloud.compute.v1.RegionTargetHttpsProxies
74+
- name: google.cloud.compute.v1.RegionUrlMaps
75+
- name: google.cloud.compute.v1.Regions
76+
- name: google.cloud.compute.v1.Reservations
77+
- name: google.cloud.compute.v1.ResourcePolicies
78+
- name: google.cloud.compute.v1.Routers
79+
- name: google.cloud.compute.v1.Routes
80+
- name: google.cloud.compute.v1.SecurityPolicies
81+
- name: google.cloud.compute.v1.ServiceAttachments
82+
- name: google.cloud.compute.v1.Snapshots
83+
- name: google.cloud.compute.v1.SslCertificates
84+
- name: google.cloud.compute.v1.SslPolicies
85+
- name: google.cloud.compute.v1.Subnetworks
86+
- name: google.cloud.compute.v1.TargetGrpcProxies
87+
- name: google.cloud.compute.v1.TargetHttpProxies
88+
- name: google.cloud.compute.v1.TargetHttpsProxies
89+
- name: google.cloud.compute.v1.TargetInstances
90+
- name: google.cloud.compute.v1.TargetPools
91+
- name: google.cloud.compute.v1.TargetSslProxies
92+
- name: google.cloud.compute.v1.TargetTcpProxies
93+
- name: google.cloud.compute.v1.TargetVpnGateways
94+
- name: google.cloud.compute.v1.UrlMaps
95+
- name: google.cloud.compute.v1.VpnGateways
96+
- name: google.cloud.compute.v1.VpnTunnels
97+
- name: google.cloud.compute.v1.ZoneOperations
98+
- name: google.cloud.compute.v1.Zones
99+
authentication:
100+
rules:
101+
- selector: '*'
102+
oauth:
103+
canonical_scopes: |-
104+
https://www.googleapis.com/auth/compute,
105+
https://www.googleapis.com/auth/cloud-platform

0 commit comments

Comments
 (0)