2015-08-20 05:08:26 +00:00
|
|
|
/*
|
|
|
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package thirdpartyresourcedata
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
2015-09-18 00:43:05 +00:00
|
|
|
"io"
|
2015-08-20 05:08:26 +00:00
|
|
|
"strings"
|
|
|
|
|
2016-01-13 22:40:56 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api"
|
2015-08-20 05:08:26 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api/meta"
|
2015-09-09 21:59:11 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
2015-09-29 21:36:47 +00:00
|
|
|
apiutil "k8s.io/kubernetes/pkg/api/util"
|
2016-01-13 22:40:56 +00:00
|
|
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
2015-10-09 22:04:41 +00:00
|
|
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
2015-08-20 05:08:26 +00:00
|
|
|
"k8s.io/kubernetes/pkg/runtime"
|
|
|
|
)
|
|
|
|
|
|
|
|
type thirdPartyResourceDataMapper struct {
|
2015-09-01 05:28:08 +00:00
|
|
|
mapper meta.RESTMapper
|
|
|
|
kind string
|
|
|
|
version string
|
2015-09-09 21:36:19 +00:00
|
|
|
group string
|
|
|
|
}
|
|
|
|
|
2015-11-16 20:14:27 +00:00
|
|
|
var _ meta.RESTMapper = &thirdPartyResourceDataMapper{}
|
|
|
|
|
2015-12-07 13:12:24 +00:00
|
|
|
func (t *thirdPartyResourceDataMapper) getResource() unversioned.GroupVersionResource {
|
2016-02-08 16:19:16 +00:00
|
|
|
plural, _ := meta.KindToResource(t.getKind())
|
2015-12-07 13:12:24 +00:00
|
|
|
|
|
|
|
return plural
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) getKind() unversioned.GroupVersionKind {
|
|
|
|
return unversioned.GroupVersionKind{Group: t.group, Version: t.version, Kind: t.kind}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) isThirdPartyResource(partialResource unversioned.GroupVersionResource) bool {
|
|
|
|
actualResource := t.getResource()
|
|
|
|
if strings.ToLower(partialResource.Resource) != strings.ToLower(actualResource.Resource) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if len(partialResource.Group) != 0 && partialResource.Group != actualResource.Group {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if len(partialResource.Version) != 0 && partialResource.Version != actualResource.Version {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) ResourcesFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionResource, error) {
|
|
|
|
if t.isThirdPartyResource(resource) {
|
|
|
|
return []unversioned.GroupVersionResource{t.getResource()}, nil
|
|
|
|
}
|
|
|
|
return t.mapper.ResourcesFor(resource)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) KindsFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionKind, error) {
|
|
|
|
if t.isThirdPartyResource(resource) {
|
|
|
|
return []unversioned.GroupVersionKind{t.getKind()}, nil
|
|
|
|
}
|
|
|
|
return t.mapper.KindsFor(resource)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) ResourceFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionResource, error) {
|
|
|
|
if t.isThirdPartyResource(resource) {
|
|
|
|
return t.getResource(), nil
|
|
|
|
}
|
|
|
|
return t.mapper.ResourceFor(resource)
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
|
2015-12-07 13:12:24 +00:00
|
|
|
func (t *thirdPartyResourceDataMapper) KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) {
|
2015-09-09 21:36:19 +00:00
|
|
|
if t.isThirdPartyResource(resource) {
|
2015-12-07 13:12:24 +00:00
|
|
|
return t.getKind(), nil
|
2015-09-09 21:36:19 +00:00
|
|
|
}
|
2015-11-16 20:14:27 +00:00
|
|
|
return t.mapper.KindFor(resource)
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
|
2015-11-16 21:24:59 +00:00
|
|
|
func (t *thirdPartyResourceDataMapper) RESTMapping(gk unversioned.GroupKind, versions ...string) (*meta.RESTMapping, error) {
|
|
|
|
if len(versions) != 1 {
|
|
|
|
return nil, fmt.Errorf("unexpected set of versions: %v", versions)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-11-16 21:24:59 +00:00
|
|
|
if gk.Group != t.group {
|
|
|
|
return nil, fmt.Errorf("unknown group %q expected %s", gk.Group, t.group)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-11-16 21:24:59 +00:00
|
|
|
if gk.Kind != "ThirdPartyResourceData" {
|
|
|
|
return nil, fmt.Errorf("unknown kind %s expected %s", gk.Kind, t.kind)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-11-16 21:24:59 +00:00
|
|
|
if versions[0] != t.version {
|
|
|
|
return nil, fmt.Errorf("unknown version %q expected %q", versions[0], t.version)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO figure out why we're doing this rewriting
|
2015-12-08 14:21:04 +00:00
|
|
|
extensionGK := unversioned.GroupKind{Group: extensions.GroupName, Kind: "ThirdPartyResourceData"}
|
2015-11-16 21:24:59 +00:00
|
|
|
|
2016-01-13 22:40:56 +00:00
|
|
|
mapping, err := t.mapper.RESTMapping(extensionGK, registered.GroupOrDie(extensions.GroupName).GroupVersion.Version)
|
2015-08-20 05:08:26 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return mapping, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) AliasesForResource(resource string) ([]string, bool) {
|
|
|
|
return t.mapper.AliasesForResource(resource)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataMapper) ResourceSingularizer(resource string) (singular string, err error) {
|
|
|
|
return t.mapper.ResourceSingularizer(resource)
|
|
|
|
}
|
|
|
|
|
2015-09-09 21:36:19 +00:00
|
|
|
func NewMapper(mapper meta.RESTMapper, kind, version, group string) meta.RESTMapper {
|
2015-09-01 05:28:08 +00:00
|
|
|
return &thirdPartyResourceDataMapper{
|
|
|
|
mapper: mapper,
|
|
|
|
kind: kind,
|
|
|
|
version: version,
|
2015-09-09 21:36:19 +00:00
|
|
|
group: group,
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
|
2015-12-21 05:36:03 +00:00
|
|
|
type thirdPartyResourceDataCodecFactory struct {
|
|
|
|
runtime.NegotiatedSerializer
|
|
|
|
kind string
|
|
|
|
encodeGV unversioned.GroupVersion
|
|
|
|
decodeGV unversioned.GroupVersion
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewNegotiatedSerializer(s runtime.NegotiatedSerializer, kind string, encodeGV, decodeGV unversioned.GroupVersion) runtime.NegotiatedSerializer {
|
|
|
|
return &thirdPartyResourceDataCodecFactory{
|
|
|
|
NegotiatedSerializer: s,
|
|
|
|
|
|
|
|
kind: kind,
|
|
|
|
encodeGV: encodeGV,
|
|
|
|
decodeGV: decodeGV,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataCodecFactory) EncoderForVersion(s runtime.Serializer, gv unversioned.GroupVersion) runtime.Encoder {
|
|
|
|
return NewCodec(runtime.NewCodec(
|
|
|
|
t.NegotiatedSerializer.EncoderForVersion(s, gv),
|
|
|
|
t.NegotiatedSerializer.DecoderToVersion(s, t.decodeGV),
|
|
|
|
), t.kind)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *thirdPartyResourceDataCodecFactory) DecoderToVersion(s runtime.Serializer, gv unversioned.GroupVersion) runtime.Decoder {
|
|
|
|
return NewCodec(runtime.NewCodec(
|
|
|
|
t.NegotiatedSerializer.EncoderForVersion(s, t.encodeGV),
|
|
|
|
t.NegotiatedSerializer.DecoderToVersion(s, gv),
|
|
|
|
), t.kind)
|
|
|
|
}
|
|
|
|
|
2015-08-20 05:08:26 +00:00
|
|
|
type thirdPartyResourceDataCodec struct {
|
|
|
|
delegate runtime.Codec
|
|
|
|
kind string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewCodec(codec runtime.Codec, kind string) runtime.Codec {
|
|
|
|
return &thirdPartyResourceDataCodec{codec, kind}
|
|
|
|
}
|
|
|
|
|
2015-10-09 22:49:10 +00:00
|
|
|
func (t *thirdPartyResourceDataCodec) populate(objIn *extensions.ThirdPartyResourceData, data []byte) error {
|
2015-08-20 05:08:26 +00:00
|
|
|
var obj interface{}
|
|
|
|
if err := json.Unmarshal(data, &obj); err != nil {
|
|
|
|
fmt.Printf("Invalid JSON:\n%s\n", string(data))
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
mapObj, ok := obj.(map[string]interface{})
|
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("unexpected object: %#v", obj)
|
|
|
|
}
|
2015-09-01 05:28:08 +00:00
|
|
|
return t.populateFromObject(objIn, mapObj, data)
|
|
|
|
}
|
|
|
|
|
2015-10-09 22:49:10 +00:00
|
|
|
func (t *thirdPartyResourceDataCodec) populateFromObject(objIn *extensions.ThirdPartyResourceData, mapObj map[string]interface{}, data []byte) error {
|
2015-09-09 21:59:11 +00:00
|
|
|
typeMeta := unversioned.TypeMeta{}
|
2015-09-03 00:13:38 +00:00
|
|
|
if err := json.Unmarshal(data, &typeMeta); err != nil {
|
|
|
|
return err
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
2015-09-03 00:13:38 +00:00
|
|
|
if typeMeta.Kind != t.kind {
|
|
|
|
return fmt.Errorf("unexpected kind: %s, expected %s", typeMeta.Kind, t.kind)
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
metadata, ok := mapObj["metadata"].(map[string]interface{})
|
|
|
|
if !ok {
|
2015-09-01 05:28:08 +00:00
|
|
|
return fmt.Errorf("unexpected object for metadata: %#v", mapObj["metadata"])
|
|
|
|
}
|
|
|
|
|
2015-09-03 00:13:38 +00:00
|
|
|
metadataData, err := json.Marshal(metadata)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
2015-09-01 05:28:08 +00:00
|
|
|
|
2015-09-03 00:13:38 +00:00
|
|
|
if err := json.Unmarshal(metadataData, &objIn.ObjectMeta); err != nil {
|
|
|
|
return err
|
2015-09-01 04:11:34 +00:00
|
|
|
}
|
2015-09-01 05:28:08 +00:00
|
|
|
|
2015-08-20 05:08:26 +00:00
|
|
|
objIn.Data = data
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-12-21 05:36:03 +00:00
|
|
|
func (t *thirdPartyResourceDataCodec) Decode(data []byte, gvk *unversioned.GroupVersionKind, into runtime.Object) (runtime.Object, *unversioned.GroupVersionKind, error) {
|
|
|
|
if into == nil {
|
|
|
|
obj := &extensions.ThirdPartyResourceData{}
|
|
|
|
if err := t.populate(obj, data); err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
objData, err := runtime.Encode(t.delegate, obj)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
return t.delegate.Decode(objData, gvk, into)
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
|
2015-12-21 05:36:03 +00:00
|
|
|
thirdParty, ok := into.(*extensions.ThirdPartyResourceData)
|
2015-08-20 05:08:26 +00:00
|
|
|
if !ok {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, fmt.Errorf("unexpected object: %#v", into)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var dataObj interface{}
|
|
|
|
if err := json.Unmarshal(data, &dataObj); err != nil {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, err
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
mapObj, ok := dataObj.(map[string]interface{})
|
|
|
|
if !ok {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, fmt.Errorf("unexpcted object: %#v", dataObj)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-12-21 05:36:03 +00:00
|
|
|
/*if gvk.Kind != "ThirdPartyResourceData" {
|
|
|
|
return nil, nil, fmt.Errorf("unexpected kind: %s", gvk.Kind)
|
|
|
|
}*/
|
|
|
|
actual := &unversioned.GroupVersionKind{}
|
2015-09-01 05:28:08 +00:00
|
|
|
if kindObj, found := mapObj["kind"]; !found {
|
2015-12-21 05:36:03 +00:00
|
|
|
if gvk == nil {
|
|
|
|
return nil, nil, runtime.NewMissingKindErr(string(data))
|
|
|
|
}
|
2015-11-17 15:07:45 +00:00
|
|
|
mapObj["kind"] = gvk.Kind
|
2015-12-21 05:36:03 +00:00
|
|
|
actual.Kind = gvk.Kind
|
2015-09-01 05:28:08 +00:00
|
|
|
} else {
|
|
|
|
kindStr, ok := kindObj.(string)
|
|
|
|
if !ok {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, fmt.Errorf("unexpected object for 'kind': %v", kindObj)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
if kindStr != t.kind {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, fmt.Errorf("kind doesn't match, expecting: %s, got %s", gvk.Kind, kindStr)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-12-21 05:36:03 +00:00
|
|
|
actual.Kind = t.kind
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
if versionObj, found := mapObj["apiVersion"]; !found {
|
2015-12-21 05:36:03 +00:00
|
|
|
if gvk == nil {
|
|
|
|
return nil, nil, runtime.NewMissingVersionErr(string(data))
|
|
|
|
}
|
2015-11-17 15:07:45 +00:00
|
|
|
mapObj["apiVersion"] = gvk.GroupVersion().String()
|
2015-12-21 05:36:03 +00:00
|
|
|
actual.Group, actual.Version = gvk.Group, gvk.Version
|
2015-09-01 05:28:08 +00:00
|
|
|
} else {
|
|
|
|
versionStr, ok := versionObj.(string)
|
|
|
|
if !ok {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, nil, fmt.Errorf("unexpected object for 'apiVersion': %v", versionObj)
|
|
|
|
}
|
|
|
|
if gvk != nil && versionStr != gvk.GroupVersion().String() {
|
|
|
|
return nil, nil, fmt.Errorf("version doesn't match, expecting: %v, got %s", gvk.GroupVersion(), versionStr)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-12-21 05:36:03 +00:00
|
|
|
gv, err := unversioned.ParseGroupVersion(versionStr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
2015-12-21 05:36:03 +00:00
|
|
|
actual.Group, actual.Version = gv.Group, gv.Version
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
|
2015-08-20 05:08:26 +00:00
|
|
|
if err := t.populate(thirdParty, data); err != nil {
|
2015-12-21 05:36:03 +00:00
|
|
|
return nil, actual, err
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
2015-12-21 05:36:03 +00:00
|
|
|
return thirdParty, actual, nil
|
2015-11-10 09:20:57 +00:00
|
|
|
}
|
|
|
|
|
2015-08-20 05:08:26 +00:00
|
|
|
const template = `{
|
|
|
|
"kind": "%s",
|
|
|
|
"items": [ %s ]
|
|
|
|
}`
|
|
|
|
|
2015-10-09 22:49:10 +00:00
|
|
|
func encodeToJSON(obj *extensions.ThirdPartyResourceData, stream io.Writer) error {
|
2015-09-03 00:13:38 +00:00
|
|
|
var objOut interface{}
|
|
|
|
if err := json.Unmarshal(obj.Data, &objOut); err != nil {
|
2015-09-18 00:43:05 +00:00
|
|
|
return err
|
2015-09-03 00:13:38 +00:00
|
|
|
}
|
|
|
|
objMap, ok := objOut.(map[string]interface{})
|
|
|
|
if !ok {
|
2015-09-18 00:43:05 +00:00
|
|
|
return fmt.Errorf("unexpected type: %v", objOut)
|
2015-09-03 00:13:38 +00:00
|
|
|
}
|
|
|
|
objMap["metadata"] = obj.ObjectMeta
|
2015-09-18 00:43:05 +00:00
|
|
|
encoder := json.NewEncoder(stream)
|
|
|
|
return encoder.Encode(objMap)
|
|
|
|
}
|
|
|
|
|
2015-12-21 05:36:03 +00:00
|
|
|
func (t *thirdPartyResourceDataCodec) EncodeToStream(obj runtime.Object, stream io.Writer, overrides ...unversioned.GroupVersion) (err error) {
|
2015-08-20 05:08:26 +00:00
|
|
|
switch obj := obj.(type) {
|
2015-10-09 22:49:10 +00:00
|
|
|
case *extensions.ThirdPartyResourceData:
|
2015-09-18 00:43:05 +00:00
|
|
|
return encodeToJSON(obj, stream)
|
2015-10-09 22:49:10 +00:00
|
|
|
case *extensions.ThirdPartyResourceDataList:
|
2015-08-20 05:08:26 +00:00
|
|
|
// TODO: There must be a better way to do this...
|
|
|
|
dataStrings := make([]string, len(obj.Items))
|
|
|
|
for ix := range obj.Items {
|
2015-09-18 00:43:05 +00:00
|
|
|
buff := &bytes.Buffer{}
|
|
|
|
err := encodeToJSON(&obj.Items[ix], buff)
|
2015-09-03 00:13:38 +00:00
|
|
|
if err != nil {
|
2015-09-18 00:43:05 +00:00
|
|
|
return err
|
2015-09-03 00:13:38 +00:00
|
|
|
}
|
2015-09-18 00:43:05 +00:00
|
|
|
dataStrings[ix] = buff.String()
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
2015-09-18 00:43:05 +00:00
|
|
|
fmt.Fprintf(stream, template, t.kind+"List", strings.Join(dataStrings, ","))
|
|
|
|
return nil
|
2015-09-09 21:59:11 +00:00
|
|
|
case *unversioned.Status:
|
2015-12-21 05:36:03 +00:00
|
|
|
return t.delegate.EncodeToStream(obj, stream, overrides...)
|
2015-08-20 05:08:26 +00:00
|
|
|
default:
|
2015-09-18 00:43:05 +00:00
|
|
|
return fmt.Errorf("unexpected object to encode: %#v", obj)
|
2015-08-20 05:08:26 +00:00
|
|
|
}
|
|
|
|
}
|
2015-09-01 05:28:08 +00:00
|
|
|
|
2015-09-29 21:36:47 +00:00
|
|
|
func NewObjectCreator(group, version string, delegate runtime.ObjectCreater) runtime.ObjectCreater {
|
|
|
|
return &thirdPartyResourceDataCreator{group, version, delegate}
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type thirdPartyResourceDataCreator struct {
|
2015-09-29 21:36:47 +00:00
|
|
|
group string
|
2015-09-01 05:28:08 +00:00
|
|
|
version string
|
|
|
|
delegate runtime.ObjectCreater
|
|
|
|
}
|
|
|
|
|
2015-12-08 19:40:23 +00:00
|
|
|
func (t *thirdPartyResourceDataCreator) New(kind unversioned.GroupVersionKind) (out runtime.Object, err error) {
|
|
|
|
switch kind.Kind {
|
2015-09-01 05:28:08 +00:00
|
|
|
case "ThirdPartyResourceData":
|
2015-12-08 19:40:23 +00:00
|
|
|
if apiutil.GetGroupVersion(t.group, t.version) != kind.GroupVersion().String() {
|
|
|
|
return nil, fmt.Errorf("unknown kind %v", kind)
|
2015-09-18 05:54:15 +00:00
|
|
|
}
|
2015-10-09 22:49:10 +00:00
|
|
|
return &extensions.ThirdPartyResourceData{}, nil
|
2015-09-01 05:28:08 +00:00
|
|
|
case "ThirdPartyResourceDataList":
|
2015-12-08 19:40:23 +00:00
|
|
|
if apiutil.GetGroupVersion(t.group, t.version) != kind.GroupVersion().String() {
|
|
|
|
return nil, fmt.Errorf("unknown kind %v", kind)
|
2015-09-18 05:54:15 +00:00
|
|
|
}
|
2015-10-09 22:49:10 +00:00
|
|
|
return &extensions.ThirdPartyResourceDataList{}, nil
|
2015-12-16 13:02:09 +00:00
|
|
|
case "ListOptions":
|
|
|
|
if apiutil.GetGroupVersion(t.group, t.version) == kind.GroupVersion().String() {
|
|
|
|
// Translate third party group to external group.
|
2016-01-13 22:40:56 +00:00
|
|
|
gvk := registered.EnabledVersionsForGroup(api.GroupName)[0].WithKind(kind.Kind)
|
2015-12-16 13:02:09 +00:00
|
|
|
return t.delegate.New(gvk)
|
|
|
|
}
|
|
|
|
return t.delegate.New(kind)
|
2015-09-01 05:28:08 +00:00
|
|
|
default:
|
2015-12-08 19:40:23 +00:00
|
|
|
return t.delegate.New(kind)
|
2015-09-01 05:28:08 +00:00
|
|
|
}
|
|
|
|
}
|