Skip to content

Commit abee9c6

Browse files
committed
Unify and simplify legacy api installation
At the same time we get rid of the need for Store.ImportPrefix to filter the RESTMapper for each legacy group. Before this commit we had overlapping RESTMapper, even inconsistent ones because the root kinds were wrong outside of each legacy group.
1 parent fabc231 commit abee9c6

File tree

26 files changed

+339
-1508
lines changed

26 files changed

+339
-1508
lines changed

pkg/api/legacy/install.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package legacy
2+
3+
import (
4+
"fmt"
5+
6+
"k8s.io/apimachinery/pkg/api/meta"
7+
"k8s.io/apimachinery/pkg/apimachinery"
8+
"k8s.io/apimachinery/pkg/apimachinery/registered"
9+
"k8s.io/apimachinery/pkg/runtime"
10+
"k8s.io/apimachinery/pkg/runtime/schema"
11+
"k8s.io/apimachinery/pkg/util/sets"
12+
kapi "k8s.io/kubernetes/pkg/api"
13+
)
14+
15+
var (
16+
accessor = meta.NewAccessor()
17+
coreV1 = schema.GroupVersion{Group: "", Version: "v1"}
18+
)
19+
20+
func InstallLegacy(group string, addToCore, addToCoreV1 func(*runtime.Scheme) error, rootScopedKinds sets.String, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) {
21+
interfacesFor := interfacesForGroup(group)
22+
23+
// install core V1 types temporarily into a local scheme to enumerate them
24+
mapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{coreV1}, interfacesFor)
25+
localScheme := runtime.NewScheme()
26+
if err := addToCoreV1(localScheme); err != nil {
27+
panic(err)
28+
}
29+
for kind := range localScheme.KnownTypes(coreV1) {
30+
scope := meta.RESTScopeNamespace
31+
if rootScopedKinds.Has(kind) {
32+
scope = meta.RESTScopeRoot
33+
}
34+
mapper.Add(coreV1.WithKind(kind), scope)
35+
}
36+
37+
// register core v1 version. Should be done by kube (if the import dependencies are right).
38+
registry.RegisterVersions([]schema.GroupVersion{coreV1})
39+
if err := registry.EnableVersions(coreV1); err != nil {
40+
panic(err)
41+
}
42+
43+
// register types as core v1
44+
if err := addToCore(scheme); err != nil {
45+
panic(err)
46+
}
47+
if err := addToCoreV1(scheme); err != nil {
48+
panic(err)
49+
}
50+
51+
// add to group
52+
legacyGroupMeta := apimachinery.GroupMeta{
53+
GroupVersion: coreV1,
54+
GroupVersions: []schema.GroupVersion{coreV1},
55+
RESTMapper: mapper,
56+
SelfLinker: runtime.SelfLinker(accessor),
57+
InterfacesFor: interfacesFor,
58+
}
59+
if err := registry.RegisterGroup(legacyGroupMeta); err != nil {
60+
panic(err)
61+
}
62+
}
63+
64+
func interfacesForGroup(group string) func(version schema.GroupVersion) (*meta.VersionInterfaces, error) {
65+
return func(version schema.GroupVersion) (*meta.VersionInterfaces, error) {
66+
switch version {
67+
case coreV1:
68+
return &meta.VersionInterfaces{
69+
ObjectConvertor: kapi.Scheme,
70+
MetadataAccessor: accessor,
71+
}, nil
72+
73+
default:
74+
g, _ := kapi.Registry.Group(group)
75+
return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions)
76+
}
77+
}
78+
}

pkg/authorization/apis/authorization/install/apigroup.go

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 22 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,38 @@
11
package install
22

33
import (
4-
"fmt"
5-
6-
"github.com/golang/glog"
7-
8-
"k8s.io/apimachinery/pkg/api/meta"
9-
"k8s.io/apimachinery/pkg/apimachinery"
4+
"k8s.io/apimachinery/pkg/apimachinery/announced"
5+
"k8s.io/apimachinery/pkg/apimachinery/registered"
106
"k8s.io/apimachinery/pkg/runtime"
11-
"k8s.io/apimachinery/pkg/runtime/schema"
127
"k8s.io/apimachinery/pkg/util/sets"
138
kapi "k8s.io/kubernetes/pkg/api"
149

10+
"github.com/openshift/origin/pkg/api/legacy"
1511
authorizationapi "github.com/openshift/origin/pkg/authorization/apis/authorization"
1612
authorizationapiv1 "github.com/openshift/origin/pkg/authorization/apis/authorization/v1"
1713
)
1814

19-
var accessor = meta.NewAccessor()
20-
21-
// availableVersions lists all known external versions for this group from most preferred to least preferred
22-
var availableVersions = []schema.GroupVersion{authorizationapiv1.LegacySchemeGroupVersion}
23-
2415
func init() {
25-
kapi.Registry.RegisterVersions(availableVersions)
26-
externalVersions := []schema.GroupVersion{}
27-
for _, v := range availableVersions {
28-
if kapi.Registry.IsAllowedVersion(v) {
29-
externalVersions = append(externalVersions, v)
30-
}
31-
}
32-
if len(externalVersions) == 0 {
33-
glog.Infof("No version is registered for group %v", authorizationapi.GroupName)
34-
return
35-
}
36-
37-
if err := kapi.Registry.EnableVersions(externalVersions...); err != nil {
38-
panic(err)
39-
}
40-
if err := enableVersions(externalVersions); err != nil {
41-
panic(err)
42-
}
43-
44-
installApiGroup()
45-
}
46-
47-
// TODO: enableVersions should be centralized rather than spread in each API
48-
// group.
49-
// We can combine registered.RegisterVersions, registered.EnableVersions and
50-
// registered.RegisterGroup once we have moved enableVersions there.
51-
func enableVersions(externalVersions []schema.GroupVersion) error {
52-
addVersionsToScheme(externalVersions...)
53-
preferredExternalVersion := externalVersions[0]
54-
55-
groupMeta := apimachinery.GroupMeta{
56-
GroupVersion: preferredExternalVersion,
57-
GroupVersions: externalVersions,
58-
RESTMapper: newRESTMapper(externalVersions),
59-
SelfLinker: runtime.SelfLinker(accessor),
60-
InterfacesFor: interfacesFor,
61-
}
62-
63-
if err := kapi.Registry.RegisterGroup(groupMeta); err != nil {
64-
return err
65-
}
66-
return nil
16+
Install(kapi.GroupFactoryRegistry, kapi.Registry, kapi.Scheme)
17+
legacy.InstallLegacy(authorizationapi.GroupName, authorizationapi.AddToSchemeInCoreGroup, authorizationapiv1.AddToSchemeInCoreGroup,
18+
sets.NewString("ClusterRole", "ClusterRoleBinding", "ClusterPolicy", "ClusterPolicyBinding"),
19+
kapi.Registry, kapi.Scheme,
20+
)
6721
}
6822

69-
func addVersionsToScheme(externalVersions ...schema.GroupVersion) {
70-
// add the internal version to Scheme
71-
authorizationapi.AddToSchemeInCoreGroup(kapi.Scheme)
72-
// add the enabled external versions to Scheme
73-
for _, v := range externalVersions {
74-
if !kapi.Registry.IsEnabledVersion(v) {
75-
glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v)
76-
continue
77-
}
78-
switch v {
79-
case authorizationapiv1.LegacySchemeGroupVersion:
80-
authorizationapiv1.AddToSchemeInCoreGroup(kapi.Scheme)
81-
82-
default:
83-
glog.Errorf("Version %s is not known, so it will not be added to the Scheme.", v)
84-
continue
85-
}
86-
}
87-
}
88-
89-
func newRESTMapper(externalVersions []schema.GroupVersion) meta.RESTMapper {
90-
rootScoped := sets.NewString("ClusterRole", "ClusterRoleBinding", "ClusterPolicy", "ClusterPolicyBinding")
91-
ignoredKinds := sets.NewString()
92-
return meta.NewDefaultRESTMapperFromScheme(externalVersions, interfacesFor, ignoredKinds, rootScoped, kapi.Scheme)
93-
}
94-
95-
func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) {
96-
switch version {
97-
case authorizationapiv1.LegacySchemeGroupVersion:
98-
return &meta.VersionInterfaces{
99-
ObjectConvertor: kapi.Scheme,
100-
MetadataAccessor: accessor,
101-
}, nil
102-
103-
default:
104-
g, _ := kapi.Registry.Group(authorizationapi.GroupName)
105-
return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions)
23+
// Install registers the API group and adds types to a scheme
24+
func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) {
25+
if err := announced.NewGroupMetaFactory(
26+
&announced.GroupMetaFactoryArgs{
27+
GroupName: authorizationapi.GroupName,
28+
VersionPreferenceOrder: []string{authorizationapiv1.SchemeGroupVersion.Version},
29+
AddInternalObjectsToScheme: authorizationapi.AddToScheme,
30+
RootScopedKinds: sets.NewString("ClusterRole", "ClusterRoleBinding", "ClusterPolicy", "ClusterPolicyBinding", "SubjectAccessReview", "ResourceAccessReview"),
31+
},
32+
announced.VersionToSchemeFunc{
33+
authorizationapiv1.SchemeGroupVersion.Version: authorizationapiv1.AddToScheme,
34+
},
35+
).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil {
36+
panic(err)
10637
}
10738
}

pkg/build/apis/build/install/apigroup.go

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

0 commit comments

Comments
 (0)