package install import ( "fmt" "github.com/golang/glog" kapi "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apimachinery" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util/sets" "github.com/openshift/origin/pkg/deploy/api" "github.com/openshift/origin/pkg/deploy/api/v1" ) const importPrefix = "github.com/openshift/origin/pkg/deploy/api" var accessor = meta.NewAccessor() // availableVersions lists all known external versions for this group from most preferred to least preferred var availableVersions = []unversioned.GroupVersion{v1.SchemeGroupVersion} func init() { registered.RegisterVersions(availableVersions) externalVersions := []unversioned.GroupVersion{} for _, v := range availableVersions { if registered.IsAllowedVersion(v) { externalVersions = append(externalVersions, v) } } if len(externalVersions) == 0 { glog.Infof("No version is registered for group %v", api.GroupName) return } if err := registered.EnableVersions(externalVersions...); err != nil { panic(err) } if err := enableVersions(externalVersions); err != nil { panic(err) } } // TODO: enableVersions should be centralized rather than spread in each API // group. // We can combine registered.RegisterVersions, registered.EnableVersions and // registered.RegisterGroup once we have moved enableVersions there. func enableVersions(externalVersions []unversioned.GroupVersion) error { addVersionsToScheme(externalVersions...) preferredExternalVersion := externalVersions[0] groupMeta := apimachinery.GroupMeta{ GroupVersion: preferredExternalVersion, GroupVersions: externalVersions, RESTMapper: newRESTMapper(externalVersions), SelfLinker: runtime.SelfLinker(accessor), InterfacesFor: interfacesFor, } if err := registered.RegisterGroup(groupMeta); err != nil { return err } kapi.RegisterRESTMapper(groupMeta.RESTMapper) return nil } func addVersionsToScheme(externalVersions ...unversioned.GroupVersion) { // add the internal version to Scheme api.AddToScheme(kapi.Scheme) // add the enabled external versions to Scheme for _, v := range externalVersions { if !registered.IsEnabledVersion(v) { glog.Errorf("Version %s is not enabled, so it will not be added to the Scheme.", v) continue } switch v { case v1.SchemeGroupVersion: v1.AddToScheme(kapi.Scheme) default: glog.Errorf("Version %s is not known, so it will not be added to the Scheme.", v) continue } } } func newRESTMapper(externalVersions []unversioned.GroupVersion) meta.RESTMapper { rootScoped := sets.NewString() ignoredKinds := sets.NewString() return kapi.NewDefaultRESTMapper(externalVersions, interfacesFor, importPrefix, ignoredKinds, rootScoped) } func interfacesFor(version unversioned.GroupVersion) (*meta.VersionInterfaces, error) { switch version { case v1.SchemeGroupVersion: return &meta.VersionInterfaces{ ObjectConvertor: kapi.Scheme, MetadataAccessor: accessor, }, nil default: g, _ := registered.Group(api.GroupName) return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, g.GroupVersions) } }