summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/client-go/discovery/unstructured.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/k8s.io/client-go/discovery/unstructured.go')
-rw-r--r--vendor/k8s.io/client-go/discovery/unstructured.go66
1 files changed, 33 insertions, 33 deletions
diff --git a/vendor/k8s.io/client-go/discovery/unstructured.go b/vendor/k8s.io/client-go/discovery/unstructured.go
index ee72d668b..fa7f2ec06 100644
--- a/vendor/k8s.io/client-go/discovery/unstructured.go
+++ b/vendor/k8s.io/client-go/discovery/unstructured.go
@@ -17,22 +17,28 @@ limitations under the License.
package discovery
import (
- "fmt"
+ "reflect"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
-// UnstructuredObjectTyper provides a runtime.ObjectTyper implmentation for
+// UnstructuredObjectTyper provides a runtime.ObjectTyper implementation for
// runtime.Unstructured object based on discovery information.
type UnstructuredObjectTyper struct {
registered map[schema.GroupVersionKind]bool
+ typers []runtime.ObjectTyper
}
// NewUnstructuredObjectTyper returns a runtime.ObjectTyper for
-// unstructred objects based on discovery information.
-func NewUnstructuredObjectTyper(groupResources []*APIGroupResources) *UnstructuredObjectTyper {
- dot := &UnstructuredObjectTyper{registered: make(map[schema.GroupVersionKind]bool)}
+// unstructured objects based on discovery information. It accepts a list of fallback typers
+// for handling objects that are not runtime.Unstructured. It does not delegate the Recognizes
+// check, only ObjectKinds.
+func NewUnstructuredObjectTyper(groupResources []*APIGroupResources, typers ...runtime.ObjectTyper) *UnstructuredObjectTyper {
+ dot := &UnstructuredObjectTyper{
+ registered: make(map[schema.GroupVersionKind]bool),
+ typers: typers,
+ }
for _, group := range groupResources {
for _, discoveryVersion := range group.Group.Versions {
resources, ok := group.VersionedResources[discoveryVersion.Version]
@@ -49,29 +55,35 @@ func NewUnstructuredObjectTyper(groupResources []*APIGroupResources) *Unstructur
return dot
}
-// ObjectKind returns the group,version,kind of the provided object, or an error
-// if the object in not runtime.Unstructured or has no group,version,kind
-// information.
-func (d *UnstructuredObjectTyper) ObjectKind(obj runtime.Object) (schema.GroupVersionKind, error) {
- if _, ok := obj.(runtime.Unstructured); !ok {
- return schema.GroupVersionKind{}, fmt.Errorf("type %T is invalid for dynamic object typer", obj)
- }
-
- return obj.GetObjectKind().GroupVersionKind(), nil
-}
-
// ObjectKinds returns a slice of one element with the group,version,kind of the
// provided object, or an error if the object is not runtime.Unstructured or
// has no group,version,kind information. unversionedType will always be false
// because runtime.Unstructured object should always have group,version,kind
// information set.
func (d *UnstructuredObjectTyper) ObjectKinds(obj runtime.Object) (gvks []schema.GroupVersionKind, unversionedType bool, err error) {
- gvk, err := d.ObjectKind(obj)
- if err != nil {
- return nil, false, err
+ if _, ok := obj.(runtime.Unstructured); ok {
+ gvk := obj.GetObjectKind().GroupVersionKind()
+ if len(gvk.Kind) == 0 {
+ return nil, false, runtime.NewMissingKindErr("object has no kind field ")
+ }
+ if len(gvk.Version) == 0 {
+ return nil, false, runtime.NewMissingVersionErr("object has no apiVersion field")
+ }
+ return []schema.GroupVersionKind{gvk}, false, nil
}
-
- return []schema.GroupVersionKind{gvk}, false, nil
+ var lastErr error
+ for _, typer := range d.typers {
+ gvks, unversioned, err := typer.ObjectKinds(obj)
+ if err != nil {
+ lastErr = err
+ continue
+ }
+ return gvks, unversioned, nil
+ }
+ if lastErr == nil {
+ lastErr = runtime.NewNotRegisteredErrForType(reflect.TypeOf(obj))
+ }
+ return nil, false, lastErr
}
// Recognizes returns true if the provided group,version,kind was in the
@@ -80,16 +92,4 @@ func (d *UnstructuredObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool {
return d.registered[gvk]
}
-// IsUnversioned returns false always because runtime.Unstructured objects
-// should always have group,version,kind information set. ok will be true if the
-// object's group,version,kind is api.Registry.
-func (d *UnstructuredObjectTyper) IsUnversioned(obj runtime.Object) (unversioned bool, ok bool) {
- gvk, err := d.ObjectKind(obj)
- if err != nil {
- return false, false
- }
-
- return false, d.registered[gvk]
-}
-
var _ runtime.ObjectTyper = &UnstructuredObjectTyper{}