Skip to content

Commit 1ed001f

Browse files
authored
Add Resource scope information to APISchema (#99)
* expose scope information in x-openmfp-scope extension * cleanup useless tests and mv mocks * bump mockery to latest
1 parent 73d943f commit 1ed001f

File tree

16 files changed

+169
-1912
lines changed

16 files changed

+169
-1912
lines changed

.mockery.yaml

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,10 @@
1+
issue-845-fix: True
2+
resolve-type-alias: False
13
with-expecter: true
24
packages:
3-
github.com/openmfp/crd-gql-gateway/listener/apischema:
4-
config:
5-
dir: listener/apischema/mocks
6-
outpkg: mocks
7-
interfaces:
8-
Resolver:
9-
10-
github.com/openmfp/crd-gql-gateway/listener/discoveryclient:
11-
config:
12-
dir: listener/discoveryclient/mocks
13-
outpkg: mocks
14-
interfaces:
15-
Factory:
16-
17-
github.com/openmfp/crd-gql-gateway/listener/workspacefile:
18-
config:
19-
dir: listener/workspacefile/mocks
20-
outpkg: mocks
21-
interfaces:
22-
IOHandler:
23-
245
sigs.k8s.io/controller-runtime/pkg/client:
256
config:
26-
dir: listener/controller/mocks
7+
dir: gateway/resolver/mocks
278
outpkg: mocks
289
interfaces:
29-
Client:
3010
WithWatch:

Taskfile.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ vars:
55
LOCAL_BIN: bin
66
ENVTEST_K8S_VERSION: "1.29.0"
77
ENVTEST_VERSION: release-0.17
8+
MOCKERY_VERSION: v2.52.3
89
tasks:
910
## Setup
1011
setup:mockery:
1112
internal: true
1213
cmds:
13-
- test -s {{.LOCAL_BIN}}/mockery || GOBIN=$(pwd)/{{.LOCAL_BIN}} go install github.com/vektra/mockery/v2@v2.43.2
14+
- test -s {{.LOCAL_BIN}}/mockery || GOBIN=$(pwd)/{{.LOCAL_BIN}} go install github.com/vektra/mockery/v2@{{.MOCKERY_VERSION}}
1415
setup:envtest:
1516
internal: true
1617
cmds:

listener/controller/mocks/mock_WithWatch.go renamed to gateway/resolver/mocks/mock_WithWatch.go

Lines changed: 10 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gateway/resolver/resolver_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package resolver
22

33
import (
44
"context"
5+
"testing"
6+
57
"github.com/graphql-go/graphql"
6-
"github.com/openmfp/crd-gql-gateway/listener/controller/mocks"
8+
"github.com/openmfp/crd-gql-gateway/gateway/resolver/mocks"
79
"github.com/openmfp/golang-commons/logger"
810
"github.com/stretchr/testify/assert"
911
"github.com/stretchr/testify/mock"
@@ -12,7 +14,6 @@ import (
1214
"k8s.io/apimachinery/pkg/labels"
1315
"k8s.io/apimachinery/pkg/runtime/schema"
1416
"sigs.k8s.io/controller-runtime/pkg/client"
15-
"testing"
1617
)
1718

1819
func getResolver(runtimeClientMock client.WithWatch) (*Service, error) {

listener/apischema/crd_resolver.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010

1111
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1212
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
14+
"k8s.io/apimachinery/pkg/api/meta"
1315
"k8s.io/client-go/discovery"
1416
"k8s.io/client-go/openapi"
1517
"k8s.io/kube-openapi/pkg/validation/spec"
@@ -23,10 +25,11 @@ var (
2325

2426
type CRDResolver struct {
2527
*discovery.DiscoveryClient
28+
meta.RESTMapper
2629
}
2730

2831
func (cr *CRDResolver) Resolve() ([]byte, error) {
29-
return resolveSchema(cr.DiscoveryClient)
32+
return resolveSchema(cr.DiscoveryClient, cr.RESTMapper)
3033
}
3134

3235
func (cr *CRDResolver) ResolveApiSchema(crd *apiextensionsv1.CustomResourceDefinition) ([]byte, error) {
@@ -45,7 +48,7 @@ func (cr *CRDResolver) ResolveApiSchema(crd *apiextensionsv1.CustomResourceDefin
4548
return nil, fmt.Errorf("failed to filter server preferred resources: %w", err)
4649
}
4750

48-
return resolveForPaths(cr.OpenAPIV3(), preferredApiGroups)
51+
return resolveForPaths(cr.OpenAPIV3(), preferredApiGroups, cr.RESTMapper)
4952
}
5053

5154
func errorIfCRDNotInPreferredApiGroups(gvk *metav1.GroupVersionKind, apiResLists []*metav1.APIResourceList) ([]string, error) {
@@ -112,7 +115,7 @@ func getSchemaForPath(preferredApiGroups []string, path string, gv openapi.Group
112115
return resp.Components.Schemas, nil
113116
}
114117

115-
func resolveForPaths(oc openapi.Client, preferredApiGroups []string) ([]byte, error) {
118+
func resolveForPaths(oc openapi.Client, preferredApiGroups []string, rm meta.RESTMapper) ([]byte, error) {
116119
apiv3Paths, err := oc.Paths()
117120
if err != nil {
118121
return nil, fmt.Errorf("failed to get OpenAPI paths: %w", err)
@@ -127,9 +130,15 @@ func resolveForPaths(oc openapi.Client, preferredApiGroups []string) ([]byte, er
127130
}
128131
maps.Copy(schemas, schema)
129132
}
133+
134+
scopedSchemas, err := addScopeInfo(schemas, rm)
135+
if err != nil {
136+
return nil, fmt.Errorf("failed to add scope info to v3 schema: %w", err)
137+
}
138+
130139
v3JSON, err := json.Marshal(&schemaResponse{
131140
Components: schemasComponentsWrapper{
132-
Schemas: schemas,
141+
Schemas: scopedSchemas,
133142
},
134143
})
135144
if err != nil {
@@ -143,7 +152,7 @@ func resolveForPaths(oc openapi.Client, preferredApiGroups []string) ([]byte, er
143152
return v2JSON, nil
144153
}
145154

146-
func resolveSchema(dc discovery.DiscoveryInterface) ([]byte, error) {
155+
func resolveSchema(dc discovery.DiscoveryInterface, rm meta.RESTMapper) ([]byte, error) {
147156
preferredApiGroups := []string{}
148157
apiResList, err := dc.ServerPreferredResources()
149158
if err != nil {
@@ -153,5 +162,5 @@ func resolveSchema(dc discovery.DiscoveryInterface) ([]byte, error) {
153162
preferredApiGroups = append(preferredApiGroups, apiRes.GroupVersion)
154163
}
155164

156-
return resolveForPaths(dc.OpenAPIV3(), preferredApiGroups)
165+
return resolveForPaths(dc.OpenAPIV3(), preferredApiGroups, rm)
157166
}

listener/apischema/mocks/mock_Resolver.go

Lines changed: 0 additions & 93 deletions
This file was deleted.

listener/apischema/resolver.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package apischema
22

33
import (
4+
"k8s.io/apimachinery/pkg/api/meta"
45
"k8s.io/client-go/discovery"
56
"k8s.io/kube-openapi/pkg/validation/spec"
67
)
@@ -18,16 +19,16 @@ type schemaResponse struct {
1819
}
1920

2021
type Resolver interface {
21-
Resolve(dc discovery.DiscoveryInterface) ([]byte, error)
22+
Resolve(dc discovery.DiscoveryInterface, rm meta.RESTMapper) ([]byte, error)
2223
}
2324

24-
func NewResolver() *ResolverImpl {
25-
return &ResolverImpl{}
25+
type resolverImpl struct {
2626
}
2727

28-
type ResolverImpl struct {
28+
func NewResolver() *resolverImpl {
29+
return &resolverImpl{}
2930
}
3031

31-
func (r *ResolverImpl) Resolve(dc discovery.DiscoveryInterface) ([]byte, error) {
32-
return resolveSchema(dc)
32+
func (r *resolverImpl) Resolve(dc discovery.DiscoveryInterface, rm meta.RESTMapper) ([]byte, error) {
33+
return resolveSchema(dc, rm)
3334
}

0 commit comments

Comments
 (0)