Skip to content

Commit 51c9057

Browse files
authored
refactor(internal/librarian/golang): use ReleaseLevels in serviceconfig.API for release level detection (#4558)
Set GAPIC option, `release-level`, from `ReleaseLevels` in `serviceconfig.API`. Set release-level in repo metadata according to API path and `ReleaseLevels` in `serviceconfig.API`. This logic is ported from legacylibrarian ([source](https://github.com/googleapis/google-cloud-go/blob/86f6198517fc41bfdbe165cfad0ffcd0e68ec367/internal/librariangen/generate/manifest.go#L140)) Fixes #4435
1 parent a3f1b43 commit 51c9057

4 files changed

Lines changed: 73 additions & 205 deletions

File tree

internal/librarian/golang/generate.go

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,11 @@ import (
2929
"github.com/googleapis/librarian/internal/command"
3030
"github.com/googleapis/librarian/internal/config"
3131
"github.com/googleapis/librarian/internal/filesystem"
32-
"github.com/googleapis/librarian/internal/semver"
3332
"github.com/googleapis/librarian/internal/serviceconfig"
3433
)
3534

3635
const (
37-
releaseLevelAlpha = "alpha"
38-
releaseLevelBeta = "beta"
39-
releaseLevelGA = "ga"
36+
releaseLevelGA = "ga"
4037
)
4138

4239
var (
@@ -154,7 +151,7 @@ func generateAPI(ctx context.Context, api *config.API, library *config.Library,
154151
"--go-grpc_opt=require_unimplemented_servers=false",
155152
}
156153
if !goAPI.ProtoOnly {
157-
gapicOpts, err := buildGAPICOpts(api.Path, library, goAPI, googleapisDir)
154+
gapicOpts, err := buildGAPICOpts(api.Path, goAPI, googleapisDir)
158155
if err != nil {
159156
return err
160157
}
@@ -172,7 +169,7 @@ func generateAPI(ctx context.Context, api *config.API, library *config.Library,
172169
return command.Run(ctx, args[0], args[1:]...)
173170
}
174171

175-
func buildGAPICOpts(apiPath string, library *config.Library, goAPI *config.GoAPI, googleapisDir string) ([]string, error) {
172+
func buildGAPICOpts(apiPath string, goAPI *config.GoAPI, googleapisDir string) ([]string, error) {
176173
sc, err := serviceconfig.Find(googleapisDir, apiPath, config.LanguageGo)
177174
if err != nil {
178175
return nil, err
@@ -207,10 +204,7 @@ func buildGAPICOpts(apiPath string, library *config.Library, goAPI *config.GoAPI
207204
if trans := transport(sc); trans != "" {
208205
opts = append(opts, fmt.Sprintf("transport=%s", trans))
209206
}
210-
level, err := releaseLevel(apiPath, library.Version)
211-
if err != nil {
212-
return nil, err
213-
}
207+
level := releaseLevel(sc)
214208
opts = append(opts, "release-level="+level)
215209
return opts, nil
216210
}
@@ -378,27 +372,12 @@ func hasRESTNumericEnums(sc *serviceconfig.API) bool {
378372
return true
379373
}
380374

381-
// releaseLevel determines the release level for an API based on the API path and the library's current version.
382-
func releaseLevel(apiPath, version string) (string, error) {
383-
apiVersion := filepath.Base(apiPath)
384-
if strings.Contains(apiVersion, releaseLevelAlpha) {
385-
return releaseLevelAlpha, nil
386-
}
387-
if strings.Contains(apiVersion, releaseLevelBeta) {
388-
return releaseLevelBeta, nil
389-
}
390-
if version == "" {
391-
return releaseLevelAlpha, nil
375+
// releaseLevel determines the release level for an API.
376+
func releaseLevel(sc *serviceconfig.API) string {
377+
if rl, ok := sc.ReleaseLevels[config.LanguageGo]; ok {
378+
return rl
392379
}
393-
semverVer, err := semver.Parse(version)
394-
if err != nil {
395-
return "", err
396-
}
397-
if semverVer.Major < 1 {
398-
return releaseLevelBeta, nil
399-
}
400-
401-
return releaseLevelGA, nil
380+
return releaseLevelGA
402381
}
403382

404383
// transport get transport from serviceconfig.API for language Go.

internal/librarian/golang/generate_test.go

Lines changed: 25 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -743,58 +743,39 @@ func TestHasRESTNumericEnums(t *testing.T) {
743743

744744
func TestReleaseLevel(t *testing.T) {
745745
for _, test := range []struct {
746-
name string
747-
apiPath string
748-
version string
749-
want string
746+
name string
747+
sc *serviceconfig.API
748+
want string
750749
}{
751750
{
752-
name: "ga",
753-
apiPath: "google/cloud/secretmanager/v1",
754-
version: "1.0.0",
755-
want: "ga",
756-
},
757-
{
758-
name: "stable with pre-GA version",
759-
apiPath: "google/cloud/secretmanager/v1",
760-
version: "0.11.0",
761-
want: "beta",
762-
},
763-
{
764-
name: "alpha",
765-
apiPath: "google/cloud/secretmanager/v1alpha1",
766-
want: "alpha",
767-
},
768-
{
769-
name: "beta",
770-
apiPath: "google/cloud/secretmanager/v1beta2",
771-
want: "beta",
751+
name: "empty release levels",
752+
sc: &serviceconfig.API{},
753+
want: "ga",
772754
},
773755
{
774-
name: "alpha in api path",
775-
apiPath: "google/cloud/alphabet/v1",
776-
version: "1.0.0",
777-
want: "ga",
756+
name: "release levels do not have go",
757+
sc: &serviceconfig.API{
758+
ReleaseLevels: map[string]string{config.LanguagePython: "beta"},
759+
},
760+
want: "ga",
778761
},
779762
{
780-
name: "empty version",
781-
apiPath: "google/cloud/alphabet/v1",
782-
version: "",
783-
want: "alpha",
763+
name: "alpha",
764+
sc: &serviceconfig.API{
765+
ReleaseLevels: map[string]string{config.LanguageGo: "alpha"},
766+
},
767+
want: "alpha",
784768
},
785769
{
786-
name: "empty version with beta path",
787-
apiPath: "google/cloud/alphabet/v1beta1",
788-
version: "",
789-
want: "beta",
770+
name: "beta",
771+
sc: &serviceconfig.API{
772+
ReleaseLevels: map[string]string{config.LanguageGo: "beta"},
773+
},
774+
want: "beta",
790775
},
791776
} {
792777
t.Run(test.name, func(t *testing.T) {
793-
got, err := releaseLevel(test.apiPath, test.version)
794-
if err != nil {
795-
t.Error(err)
796-
return
797-
}
778+
got := releaseLevel(test.sc)
798779
if diff := cmp.Diff(test.want, got); diff != "" {
799780
t.Errorf("mismatch (-want +got):\n%s", diff)
800781
}
@@ -850,18 +831,13 @@ func TestBuildGAPICOpts(t *testing.T) {
850831
for _, test := range []struct {
851832
name string
852833
apiPath string
853-
library *config.Library
854834
goAPI *config.GoAPI
855835
googleapisDir string
856836
want []string
857837
}{
858838
{
859839
name: "basic case with service and grpc configs",
860840
apiPath: "google/cloud/secretmanager/v1",
861-
library: &config.Library{
862-
Name: "secretmanager",
863-
Version: "1.2.3",
864-
},
865841
goAPI: &config.GoAPI{
866842
ClientPackage: "secretmanager",
867843
ImportPath: "secretmanager/apiv1",
@@ -881,10 +857,6 @@ func TestBuildGAPICOpts(t *testing.T) {
881857
{
882858
name: "no rest numeric enums",
883859
apiPath: "google/cloud/bigquery/v2",
884-
library: &config.Library{
885-
Name: "bigquery/v2",
886-
Version: "1.2.3",
887-
},
888860
goAPI: &config.GoAPI{
889861
ClientPackage: "bigquery",
890862
ImportPath: "bigquery/v2/apiv2",
@@ -897,39 +869,12 @@ func TestBuildGAPICOpts(t *testing.T) {
897869
"api-service-config=" + filepath.Join(googleapisDir, "google/cloud/bigquery/v2/bigquery_v2.yaml"),
898870
"grpc-service-config=" + filepath.Join(googleapisDir, "google/cloud/bigquery/v2/bigquery_grpc_service_config.json"),
899871
"transport=grpc+rest",
900-
"release-level=ga",
901-
},
902-
},
903-
{
904-
name: "beta release level from version",
905-
apiPath: "google/cloud/secretmanager/v1",
906-
library: &config.Library{
907-
Name: "secretmanager",
908-
Version: "0.2.3",
909-
},
910-
goAPI: &config.GoAPI{
911-
ClientPackage: "secretmanager",
912-
ImportPath: "secretmanager/apiv1",
913-
Path: "google/cloud/secretmanager/v1",
914-
},
915-
googleapisDir: googleapisDir,
916-
want: []string{
917-
"go-gapic-package=cloud.google.com/go/secretmanager/apiv1;secretmanager",
918-
"metadata",
919-
"rest-numeric-enums",
920-
"api-service-config=" + filepath.Join(googleapisDir, "google/cloud/secretmanager/v1/secretmanager_v1.yaml"),
921-
"grpc-service-config=" + filepath.Join(googleapisDir, "google/cloud/secretmanager/v1/secretmanager_grpc_service_config.json"),
922-
"transport=grpc+rest",
923-
"release-level=beta",
872+
"release-level=alpha",
924873
},
925874
},
926875
{
927876
name: "transport override",
928877
apiPath: "google/cloud/gkehub/v1",
929-
library: &config.Library{
930-
Name: "gkehub",
931-
Version: "1.2.3",
932-
},
933878
goAPI: &config.GoAPI{
934879
ClientPackage: "gkehub",
935880
ImportPath: "gkehub/apiv1",
@@ -948,10 +893,6 @@ func TestBuildGAPICOpts(t *testing.T) {
948893
{
949894
name: "no metadata",
950895
apiPath: "google/cloud/gkehub/v1",
951-
library: &config.Library{
952-
Name: "gkehub",
953-
Version: "1.2.3",
954-
},
955896
goAPI: &config.GoAPI{
956897
ClientPackage: "gkehub",
957898
ImportPath: "gkehub/apiv1",
@@ -970,11 +911,6 @@ func TestBuildGAPICOpts(t *testing.T) {
970911
{
971912
name: "generator features",
972913
apiPath: "google/cloud/bigquery/v2",
973-
library: &config.Library{
974-
Name: "bigquery/v2",
975-
Version: "1.2.3",
976-
APIs: []*config.API{{Path: "google/cloud/bigquery/v2"}},
977-
},
978914
goAPI: &config.GoAPI{
979915
ClientPackage: "bigquery",
980916
EnabledGeneratorFeatures: []string{"F_wrapper_types_for_page_size"},
@@ -989,17 +925,12 @@ func TestBuildGAPICOpts(t *testing.T) {
989925
"api-service-config=" + filepath.Join(googleapisDir, "google/cloud/bigquery/v2/bigquery_v2.yaml"),
990926
"grpc-service-config=" + filepath.Join(googleapisDir, "google/cloud/bigquery/v2/bigquery_grpc_service_config.json"),
991927
"transport=grpc+rest",
992-
"release-level=ga",
928+
"release-level=alpha",
993929
},
994930
},
995931
{
996932
name: "no transport",
997933
apiPath: "google/cloud/apigeeconnect/v1",
998-
library: &config.Library{
999-
Name: "apigeeconnect",
1000-
Version: "1.2.3",
1001-
APIs: []*config.API{{Path: "google/cloud/apigeeconnect/v1"}},
1002-
},
1003934
goAPI: &config.GoAPI{
1004935
ClientPackage: "apigeeconnect",
1005936
ImportPath: "apigeeconnect/apiv1",
@@ -1017,11 +948,6 @@ func TestBuildGAPICOpts(t *testing.T) {
1017948
{
1018949
name: "diregapic",
1019950
apiPath: "google/cloud/compute/v1",
1020-
library: &config.Library{
1021-
Name: "compute",
1022-
Version: "1.2.3",
1023-
APIs: []*config.API{{Path: "google/cloud/compute/v1"}},
1024-
},
1025951
goAPI: &config.GoAPI{
1026952
ClientPackage: "compute",
1027953
ImportPath: "compute/apiv1",
@@ -1041,7 +967,7 @@ func TestBuildGAPICOpts(t *testing.T) {
1041967
} {
1042968
t.Run(test.name, func(t *testing.T) {
1043969
t.Parallel()
1044-
got, err := buildGAPICOpts(test.apiPath, test.library, test.goAPI, test.googleapisDir)
970+
got, err := buildGAPICOpts(test.apiPath, test.goAPI, test.googleapisDir)
1045971
if err != nil {
1046972
t.Fatal(err)
1047973
}

internal/librarian/golang/repometadata.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ func generateRepoMetadata(api *serviceconfig.API, library *config.Library) error
3434
if goAPI == nil {
3535
return errGoAPINotFound
3636
}
37-
level, err := metadataReleaseLevel(api, library)
38-
if err != nil {
39-
return err
40-
}
37+
level := metadataReleaseLevel(api)
4138
metadata := &repometadata.RepoMetadata{
4239
APIShortname: api.ShortName,
4340
ClientDocumentation: clientDocURL(library, goAPI.ImportPath),
@@ -66,15 +63,13 @@ func distributionName(importPath string) string {
6663
return fmt.Sprintf("cloud.google.com/go/%s", importPath)
6764
}
6865

69-
func metadataReleaseLevel(api *serviceconfig.API, library *config.Library) (string, error) {
70-
apiReleaseLevel, err := releaseLevel(api.Path, library.Version)
71-
if err != nil {
72-
return "", err
66+
func metadataReleaseLevel(api *serviceconfig.API) string {
67+
version := serviceconfig.ExtractVersion(api.Path)
68+
if strings.Contains(version, "alpha") || strings.Contains(version, "beta") {
69+
return repoMetadataReleaseLevelPreview
7370
}
74-
switch apiReleaseLevel {
75-
case releaseLevelGA:
76-
return repoMetadataReleaseLevelStable, nil
77-
default:
78-
return repoMetadataReleaseLevelPreview, nil
71+
if releaseLevel(api) != releaseLevelGA {
72+
return repoMetadataReleaseLevelPreview
7973
}
74+
return repoMetadataReleaseLevelStable
8075
}

0 commit comments

Comments
 (0)