mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Unstructured methods belong in unstructured.go
Simple code move
This commit is contained in:
parent
6a9a93d469
commit
c95b9df894
@ -16,17 +16,6 @@ limitations under the License.
|
|||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/golang/glog"
|
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api/meta/metatypes"
|
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
|
||||||
"k8s.io/kubernetes/pkg/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Note that the types provided in this file are not versioned and are intended to be
|
// Note that the types provided in this file are not versioned and are intended to be
|
||||||
// safe to use from within all versions of every API object.
|
// safe to use from within all versions of every API object.
|
||||||
|
|
||||||
@ -139,409 +128,6 @@ type Unstructured struct {
|
|||||||
Object map[string]interface{}
|
Object map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON ensures that the unstructured object produces proper
|
|
||||||
// JSON when passed to Go's standard JSON library.
|
|
||||||
func (u *Unstructured) MarshalJSON() ([]byte, error) {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
err := UnstructuredJSONScheme.Encode(u, &buf)
|
|
||||||
return buf.Bytes(), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON ensures that the unstructured object properly decodes
|
|
||||||
// JSON when passed to Go's standard JSON library.
|
|
||||||
func (u *Unstructured) UnmarshalJSON(b []byte) error {
|
|
||||||
_, _, err := UnstructuredJSONScheme.Decode(b, nil, u)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNestedField(obj map[string]interface{}, fields ...string) interface{} {
|
|
||||||
var val interface{} = obj
|
|
||||||
for _, field := range fields {
|
|
||||||
if _, ok := val.(map[string]interface{}); !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
val = val.(map[string]interface{})[field]
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNestedString(obj map[string]interface{}, fields ...string) string {
|
|
||||||
if str, ok := getNestedField(obj, fields...).(string); ok {
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNestedSlice(obj map[string]interface{}, fields ...string) []string {
|
|
||||||
if m, ok := getNestedField(obj, fields...).([]interface{}); ok {
|
|
||||||
strSlice := make([]string, 0, len(m))
|
|
||||||
for _, v := range m {
|
|
||||||
if str, ok := v.(string); ok {
|
|
||||||
strSlice = append(strSlice, str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strSlice
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNestedMap(obj map[string]interface{}, fields ...string) map[string]string {
|
|
||||||
if m, ok := getNestedField(obj, fields...).(map[string]interface{}); ok {
|
|
||||||
strMap := make(map[string]string, len(m))
|
|
||||||
for k, v := range m {
|
|
||||||
if str, ok := v.(string); ok {
|
|
||||||
strMap[k] = str
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strMap
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func setNestedField(obj map[string]interface{}, value interface{}, fields ...string) {
|
|
||||||
m := obj
|
|
||||||
if len(fields) > 1 {
|
|
||||||
for _, field := range fields[0 : len(fields)-1] {
|
|
||||||
if _, ok := m[field].(map[string]interface{}); !ok {
|
|
||||||
m[field] = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
m = m[field].(map[string]interface{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m[fields[len(fields)-1]] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
func setNestedSlice(obj map[string]interface{}, value []string, fields ...string) {
|
|
||||||
m := make([]interface{}, 0, len(value))
|
|
||||||
for _, v := range value {
|
|
||||||
m = append(m, v)
|
|
||||||
}
|
|
||||||
setNestedField(obj, m, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func setNestedMap(obj map[string]interface{}, value map[string]string, fields ...string) {
|
|
||||||
m := make(map[string]interface{}, len(value))
|
|
||||||
for k, v := range value {
|
|
||||||
m[k] = v
|
|
||||||
}
|
|
||||||
setNestedField(obj, m, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) setNestedField(value interface{}, fields ...string) {
|
|
||||||
if u.Object == nil {
|
|
||||||
u.Object = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
setNestedField(u.Object, value, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) setNestedSlice(value []string, fields ...string) {
|
|
||||||
if u.Object == nil {
|
|
||||||
u.Object = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
setNestedSlice(u.Object, value, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) setNestedMap(value map[string]string, fields ...string) {
|
|
||||||
if u.Object == nil {
|
|
||||||
u.Object = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
setNestedMap(u.Object, value, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func extractOwnerReference(src interface{}) metatypes.OwnerReference {
|
|
||||||
v := src.(map[string]interface{})
|
|
||||||
controllerPtr, ok := (getNestedField(v, "controller")).(*bool)
|
|
||||||
if !ok {
|
|
||||||
controllerPtr = nil
|
|
||||||
} else {
|
|
||||||
if controllerPtr != nil {
|
|
||||||
controller := *controllerPtr
|
|
||||||
controllerPtr = &controller
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return metatypes.OwnerReference{
|
|
||||||
Kind: getNestedString(v, "kind"),
|
|
||||||
Name: getNestedString(v, "name"),
|
|
||||||
APIVersion: getNestedString(v, "apiVersion"),
|
|
||||||
UID: (types.UID)(getNestedString(v, "uid")),
|
|
||||||
Controller: controllerPtr,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setOwnerReference(src metatypes.OwnerReference) map[string]interface{} {
|
|
||||||
ret := make(map[string]interface{})
|
|
||||||
controllerPtr := src.Controller
|
|
||||||
if controllerPtr != nil {
|
|
||||||
controller := *controllerPtr
|
|
||||||
controllerPtr = &controller
|
|
||||||
}
|
|
||||||
setNestedField(ret, src.Kind, "kind")
|
|
||||||
setNestedField(ret, src.Name, "name")
|
|
||||||
setNestedField(ret, src.APIVersion, "apiVersion")
|
|
||||||
setNestedField(ret, string(src.UID), "uid")
|
|
||||||
setNestedField(ret, controllerPtr, "controller")
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func getOwnerReferences(object map[string]interface{}) ([]map[string]interface{}, error) {
|
|
||||||
field := getNestedField(object, "metadata", "ownerReferences")
|
|
||||||
if field == nil {
|
|
||||||
return nil, fmt.Errorf("cannot find field metadata.ownerReferences in %v", object)
|
|
||||||
}
|
|
||||||
ownerReferences, ok := field.([]map[string]interface{})
|
|
||||||
if ok {
|
|
||||||
return ownerReferences, nil
|
|
||||||
}
|
|
||||||
// TODO: This is hacky...
|
|
||||||
interfaces, ok := field.([]interface{})
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("expect metadata.ownerReferences to be a slice in %#v", object)
|
|
||||||
}
|
|
||||||
ownerReferences = make([]map[string]interface{}, 0, len(interfaces))
|
|
||||||
for i := 0; i < len(interfaces); i++ {
|
|
||||||
r, ok := interfaces[i].(map[string]interface{})
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("expect element metadata.ownerReferences to be a map[string]interface{} in %#v", object)
|
|
||||||
}
|
|
||||||
ownerReferences = append(ownerReferences, r)
|
|
||||||
}
|
|
||||||
return ownerReferences, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetOwnerReferences() []metatypes.OwnerReference {
|
|
||||||
original, err := getOwnerReferences(u.Object)
|
|
||||||
if err != nil {
|
|
||||||
glog.V(6).Info(err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ret := make([]metatypes.OwnerReference, 0, len(original))
|
|
||||||
for i := 0; i < len(original); i++ {
|
|
||||||
ret = append(ret, extractOwnerReference(original[i]))
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetOwnerReferences(references []metatypes.OwnerReference) {
|
|
||||||
var newReferences = make([]map[string]interface{}, 0, len(references))
|
|
||||||
for i := 0; i < len(references); i++ {
|
|
||||||
newReferences = append(newReferences, setOwnerReference(references[i]))
|
|
||||||
}
|
|
||||||
u.setNestedField(newReferences, "metadata", "ownerReferences")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetAPIVersion() string {
|
|
||||||
return getNestedString(u.Object, "apiVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetAPIVersion(version string) {
|
|
||||||
u.setNestedField(version, "apiVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetKind() string {
|
|
||||||
return getNestedString(u.Object, "kind")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetKind(kind string) {
|
|
||||||
u.setNestedField(kind, "kind")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetNamespace() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "namespace")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetNamespace(namespace string) {
|
|
||||||
u.setNestedField(namespace, "metadata", "namespace")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetName() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "name")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetName(name string) {
|
|
||||||
u.setNestedField(name, "metadata", "name")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetGenerateName() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "generateName")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetGenerateName(name string) {
|
|
||||||
u.setNestedField(name, "metadata", "generateName")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetUID() types.UID {
|
|
||||||
return types.UID(getNestedString(u.Object, "metadata", "uid"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetUID(uid types.UID) {
|
|
||||||
u.setNestedField(string(uid), "metadata", "uid")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetResourceVersion() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "resourceVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetResourceVersion(version string) {
|
|
||||||
u.setNestedField(version, "metadata", "resourceVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetSelfLink() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "selfLink")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetSelfLink(selfLink string) {
|
|
||||||
u.setNestedField(selfLink, "metadata", "selfLink")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetCreationTimestamp() unversioned.Time {
|
|
||||||
var timestamp unversioned.Time
|
|
||||||
timestamp.UnmarshalQueryParameter(getNestedString(u.Object, "metadata", "creationTimestamp"))
|
|
||||||
return timestamp
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetCreationTimestamp(timestamp unversioned.Time) {
|
|
||||||
ts, _ := timestamp.MarshalQueryParameter()
|
|
||||||
u.setNestedField(ts, "metadata", "creationTimestamp")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetDeletionTimestamp() *unversioned.Time {
|
|
||||||
var timestamp unversioned.Time
|
|
||||||
timestamp.UnmarshalQueryParameter(getNestedString(u.Object, "metadata", "deletionTimestamp"))
|
|
||||||
if timestamp.IsZero() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return ×tamp
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetDeletionTimestamp(timestamp *unversioned.Time) {
|
|
||||||
ts, _ := timestamp.MarshalQueryParameter()
|
|
||||||
u.setNestedField(ts, "metadata", "deletionTimestamp")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetLabels() map[string]string {
|
|
||||||
return getNestedMap(u.Object, "metadata", "labels")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetLabels(labels map[string]string) {
|
|
||||||
u.setNestedMap(labels, "metadata", "labels")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetAnnotations() map[string]string {
|
|
||||||
return getNestedMap(u.Object, "metadata", "annotations")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetAnnotations(annotations map[string]string) {
|
|
||||||
u.setNestedMap(annotations, "metadata", "annotations")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
|
|
||||||
u.SetAPIVersion(gvk.GroupVersion().String())
|
|
||||||
u.SetKind(gvk.Kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GroupVersionKind() unversioned.GroupVersionKind {
|
|
||||||
gv, err := unversioned.ParseGroupVersion(u.GetAPIVersion())
|
|
||||||
if err != nil {
|
|
||||||
return unversioned.GroupVersionKind{}
|
|
||||||
}
|
|
||||||
gvk := gv.WithKind(u.GetKind())
|
|
||||||
return gvk
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetFinalizers() []string {
|
|
||||||
return getNestedSlice(u.Object, "metadata", "finalizers")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetFinalizers(finalizers []string) {
|
|
||||||
u.setNestedSlice(finalizers, "metadata", "finalizers")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) GetClusterName() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "clusterName")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Unstructured) SetClusterName(clusterName string) {
|
|
||||||
u.setNestedField(clusterName, "metadata", "clusterName")
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnstructuredList allows lists that do not have Golang structs
|
|
||||||
// registered to be manipulated generically. This can be used to deal
|
|
||||||
// with the API lists from a plug-in.
|
|
||||||
type UnstructuredList struct {
|
|
||||||
Object map[string]interface{}
|
|
||||||
|
|
||||||
// Items is a list of unstructured objects.
|
|
||||||
Items []*Unstructured `json:"items"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON ensures that the unstructured list object produces proper
|
|
||||||
// JSON when passed to Go's standard JSON library.
|
|
||||||
func (u *UnstructuredList) MarshalJSON() ([]byte, error) {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
err := UnstructuredJSONScheme.Encode(u, &buf)
|
|
||||||
return buf.Bytes(), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON ensures that the unstructured list object properly
|
|
||||||
// decodes JSON when passed to Go's standard JSON library.
|
|
||||||
func (u *UnstructuredList) UnmarshalJSON(b []byte) error {
|
|
||||||
_, _, err := UnstructuredJSONScheme.Decode(b, nil, u)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) setNestedField(value interface{}, fields ...string) {
|
|
||||||
if u.Object == nil {
|
|
||||||
u.Object = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
setNestedField(u.Object, value, fields...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) GetAPIVersion() string {
|
|
||||||
return getNestedString(u.Object, "apiVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) SetAPIVersion(version string) {
|
|
||||||
u.setNestedField(version, "apiVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) GetKind() string {
|
|
||||||
return getNestedString(u.Object, "kind")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) SetKind(kind string) {
|
|
||||||
u.setNestedField(kind, "kind")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) GetResourceVersion() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "resourceVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) SetResourceVersion(version string) {
|
|
||||||
u.setNestedField(version, "metadata", "resourceVersion")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) GetSelfLink() string {
|
|
||||||
return getNestedString(u.Object, "metadata", "selfLink")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) SetSelfLink(selfLink string) {
|
|
||||||
u.setNestedField(selfLink, "metadata", "selfLink")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
|
|
||||||
u.SetAPIVersion(gvk.GroupVersion().String())
|
|
||||||
u.SetKind(gvk.Kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UnstructuredList) GroupVersionKind() unversioned.GroupVersionKind {
|
|
||||||
gv, err := unversioned.ParseGroupVersion(u.GetAPIVersion())
|
|
||||||
if err != nil {
|
|
||||||
return unversioned.GroupVersionKind{}
|
|
||||||
}
|
|
||||||
gvk := gv.WithKind(u.GetKind())
|
|
||||||
return gvk
|
|
||||||
}
|
|
||||||
|
|
||||||
// VersionedObjects is used by Decoders to give callers a way to access all versions
|
// VersionedObjects is used by Decoders to give callers a way to access all versions
|
||||||
// of an object during the decoding process.
|
// of an object during the decoding process.
|
||||||
type VersionedObjects struct {
|
type VersionedObjects struct {
|
||||||
|
@ -17,16 +17,424 @@ limitations under the License.
|
|||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
gojson "encoding/json"
|
gojson "encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/api/meta/metatypes"
|
||||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
|
"k8s.io/kubernetes/pkg/types"
|
||||||
"k8s.io/kubernetes/pkg/util/json"
|
"k8s.io/kubernetes/pkg/util/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// MarshalJSON ensures that the unstructured object produces proper
|
||||||
|
// JSON when passed to Go's standard JSON library.
|
||||||
|
func (u *Unstructured) MarshalJSON() ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
err := UnstructuredJSONScheme.Encode(u, &buf)
|
||||||
|
return buf.Bytes(), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON ensures that the unstructured object properly decodes
|
||||||
|
// JSON when passed to Go's standard JSON library.
|
||||||
|
func (u *Unstructured) UnmarshalJSON(b []byte) error {
|
||||||
|
_, _, err := UnstructuredJSONScheme.Decode(b, nil, u)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNestedField(obj map[string]interface{}, fields ...string) interface{} {
|
||||||
|
var val interface{} = obj
|
||||||
|
for _, field := range fields {
|
||||||
|
if _, ok := val.(map[string]interface{}); !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
val = val.(map[string]interface{})[field]
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNestedString(obj map[string]interface{}, fields ...string) string {
|
||||||
|
if str, ok := getNestedField(obj, fields...).(string); ok {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNestedSlice(obj map[string]interface{}, fields ...string) []string {
|
||||||
|
if m, ok := getNestedField(obj, fields...).([]interface{}); ok {
|
||||||
|
strSlice := make([]string, 0, len(m))
|
||||||
|
for _, v := range m {
|
||||||
|
if str, ok := v.(string); ok {
|
||||||
|
strSlice = append(strSlice, str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strSlice
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNestedMap(obj map[string]interface{}, fields ...string) map[string]string {
|
||||||
|
if m, ok := getNestedField(obj, fields...).(map[string]interface{}); ok {
|
||||||
|
strMap := make(map[string]string, len(m))
|
||||||
|
for k, v := range m {
|
||||||
|
if str, ok := v.(string); ok {
|
||||||
|
strMap[k] = str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strMap
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setNestedField(obj map[string]interface{}, value interface{}, fields ...string) {
|
||||||
|
m := obj
|
||||||
|
if len(fields) > 1 {
|
||||||
|
for _, field := range fields[0 : len(fields)-1] {
|
||||||
|
if _, ok := m[field].(map[string]interface{}); !ok {
|
||||||
|
m[field] = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
m = m[field].(map[string]interface{})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m[fields[len(fields)-1]] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
func setNestedSlice(obj map[string]interface{}, value []string, fields ...string) {
|
||||||
|
m := make([]interface{}, 0, len(value))
|
||||||
|
for _, v := range value {
|
||||||
|
m = append(m, v)
|
||||||
|
}
|
||||||
|
setNestedField(obj, m, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setNestedMap(obj map[string]interface{}, value map[string]string, fields ...string) {
|
||||||
|
m := make(map[string]interface{}, len(value))
|
||||||
|
for k, v := range value {
|
||||||
|
m[k] = v
|
||||||
|
}
|
||||||
|
setNestedField(obj, m, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) setNestedField(value interface{}, fields ...string) {
|
||||||
|
if u.Object == nil {
|
||||||
|
u.Object = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
setNestedField(u.Object, value, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) setNestedSlice(value []string, fields ...string) {
|
||||||
|
if u.Object == nil {
|
||||||
|
u.Object = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
setNestedSlice(u.Object, value, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) setNestedMap(value map[string]string, fields ...string) {
|
||||||
|
if u.Object == nil {
|
||||||
|
u.Object = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
setNestedMap(u.Object, value, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractOwnerReference(src interface{}) metatypes.OwnerReference {
|
||||||
|
v := src.(map[string]interface{})
|
||||||
|
controllerPtr, ok := (getNestedField(v, "controller")).(*bool)
|
||||||
|
if !ok {
|
||||||
|
controllerPtr = nil
|
||||||
|
} else {
|
||||||
|
if controllerPtr != nil {
|
||||||
|
controller := *controllerPtr
|
||||||
|
controllerPtr = &controller
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return metatypes.OwnerReference{
|
||||||
|
Kind: getNestedString(v, "kind"),
|
||||||
|
Name: getNestedString(v, "name"),
|
||||||
|
APIVersion: getNestedString(v, "apiVersion"),
|
||||||
|
UID: (types.UID)(getNestedString(v, "uid")),
|
||||||
|
Controller: controllerPtr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setOwnerReference(src metatypes.OwnerReference) map[string]interface{} {
|
||||||
|
ret := make(map[string]interface{})
|
||||||
|
controllerPtr := src.Controller
|
||||||
|
if controllerPtr != nil {
|
||||||
|
controller := *controllerPtr
|
||||||
|
controllerPtr = &controller
|
||||||
|
}
|
||||||
|
setNestedField(ret, src.Kind, "kind")
|
||||||
|
setNestedField(ret, src.Name, "name")
|
||||||
|
setNestedField(ret, src.APIVersion, "apiVersion")
|
||||||
|
setNestedField(ret, string(src.UID), "uid")
|
||||||
|
setNestedField(ret, controllerPtr, "controller")
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOwnerReferences(object map[string]interface{}) ([]map[string]interface{}, error) {
|
||||||
|
field := getNestedField(object, "metadata", "ownerReferences")
|
||||||
|
if field == nil {
|
||||||
|
return nil, fmt.Errorf("cannot find field metadata.ownerReferences in %v", object)
|
||||||
|
}
|
||||||
|
ownerReferences, ok := field.([]map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
return ownerReferences, nil
|
||||||
|
}
|
||||||
|
// TODO: This is hacky...
|
||||||
|
interfaces, ok := field.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("expect metadata.ownerReferences to be a slice in %#v", object)
|
||||||
|
}
|
||||||
|
ownerReferences = make([]map[string]interface{}, 0, len(interfaces))
|
||||||
|
for i := 0; i < len(interfaces); i++ {
|
||||||
|
r, ok := interfaces[i].(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("expect element metadata.ownerReferences to be a map[string]interface{} in %#v", object)
|
||||||
|
}
|
||||||
|
ownerReferences = append(ownerReferences, r)
|
||||||
|
}
|
||||||
|
return ownerReferences, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetOwnerReferences() []metatypes.OwnerReference {
|
||||||
|
original, err := getOwnerReferences(u.Object)
|
||||||
|
if err != nil {
|
||||||
|
glog.V(6).Info(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ret := make([]metatypes.OwnerReference, 0, len(original))
|
||||||
|
for i := 0; i < len(original); i++ {
|
||||||
|
ret = append(ret, extractOwnerReference(original[i]))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetOwnerReferences(references []metatypes.OwnerReference) {
|
||||||
|
var newReferences = make([]map[string]interface{}, 0, len(references))
|
||||||
|
for i := 0; i < len(references); i++ {
|
||||||
|
newReferences = append(newReferences, setOwnerReference(references[i]))
|
||||||
|
}
|
||||||
|
u.setNestedField(newReferences, "metadata", "ownerReferences")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetAPIVersion() string {
|
||||||
|
return getNestedString(u.Object, "apiVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetAPIVersion(version string) {
|
||||||
|
u.setNestedField(version, "apiVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetKind() string {
|
||||||
|
return getNestedString(u.Object, "kind")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetKind(kind string) {
|
||||||
|
u.setNestedField(kind, "kind")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetNamespace() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "namespace")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetNamespace(namespace string) {
|
||||||
|
u.setNestedField(namespace, "metadata", "namespace")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetName() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "name")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetName(name string) {
|
||||||
|
u.setNestedField(name, "metadata", "name")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetGenerateName() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "generateName")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetGenerateName(name string) {
|
||||||
|
u.setNestedField(name, "metadata", "generateName")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetUID() types.UID {
|
||||||
|
return types.UID(getNestedString(u.Object, "metadata", "uid"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetUID(uid types.UID) {
|
||||||
|
u.setNestedField(string(uid), "metadata", "uid")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetResourceVersion() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "resourceVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetResourceVersion(version string) {
|
||||||
|
u.setNestedField(version, "metadata", "resourceVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetSelfLink() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "selfLink")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetSelfLink(selfLink string) {
|
||||||
|
u.setNestedField(selfLink, "metadata", "selfLink")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetCreationTimestamp() unversioned.Time {
|
||||||
|
var timestamp unversioned.Time
|
||||||
|
timestamp.UnmarshalQueryParameter(getNestedString(u.Object, "metadata", "creationTimestamp"))
|
||||||
|
return timestamp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetCreationTimestamp(timestamp unversioned.Time) {
|
||||||
|
ts, _ := timestamp.MarshalQueryParameter()
|
||||||
|
u.setNestedField(ts, "metadata", "creationTimestamp")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetDeletionTimestamp() *unversioned.Time {
|
||||||
|
var timestamp unversioned.Time
|
||||||
|
timestamp.UnmarshalQueryParameter(getNestedString(u.Object, "metadata", "deletionTimestamp"))
|
||||||
|
if timestamp.IsZero() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return ×tamp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetDeletionTimestamp(timestamp *unversioned.Time) {
|
||||||
|
ts, _ := timestamp.MarshalQueryParameter()
|
||||||
|
u.setNestedField(ts, "metadata", "deletionTimestamp")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetLabels() map[string]string {
|
||||||
|
return getNestedMap(u.Object, "metadata", "labels")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetLabels(labels map[string]string) {
|
||||||
|
u.setNestedMap(labels, "metadata", "labels")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetAnnotations() map[string]string {
|
||||||
|
return getNestedMap(u.Object, "metadata", "annotations")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetAnnotations(annotations map[string]string) {
|
||||||
|
u.setNestedMap(annotations, "metadata", "annotations")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
|
||||||
|
u.SetAPIVersion(gvk.GroupVersion().String())
|
||||||
|
u.SetKind(gvk.Kind)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GroupVersionKind() unversioned.GroupVersionKind {
|
||||||
|
gv, err := unversioned.ParseGroupVersion(u.GetAPIVersion())
|
||||||
|
if err != nil {
|
||||||
|
return unversioned.GroupVersionKind{}
|
||||||
|
}
|
||||||
|
gvk := gv.WithKind(u.GetKind())
|
||||||
|
return gvk
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetFinalizers() []string {
|
||||||
|
return getNestedSlice(u.Object, "metadata", "finalizers")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetFinalizers(finalizers []string) {
|
||||||
|
u.setNestedSlice(finalizers, "metadata", "finalizers")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) GetClusterName() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "clusterName")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Unstructured) SetClusterName(clusterName string) {
|
||||||
|
u.setNestedField(clusterName, "metadata", "clusterName")
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnstructuredList allows lists that do not have Golang structs
|
||||||
|
// registered to be manipulated generically. This can be used to deal
|
||||||
|
// with the API lists from a plug-in.
|
||||||
|
type UnstructuredList struct {
|
||||||
|
Object map[string]interface{}
|
||||||
|
|
||||||
|
// Items is a list of unstructured objects.
|
||||||
|
Items []*Unstructured `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON ensures that the unstructured list object produces proper
|
||||||
|
// JSON when passed to Go's standard JSON library.
|
||||||
|
func (u *UnstructuredList) MarshalJSON() ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
err := UnstructuredJSONScheme.Encode(u, &buf)
|
||||||
|
return buf.Bytes(), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON ensures that the unstructured list object properly
|
||||||
|
// decodes JSON when passed to Go's standard JSON library.
|
||||||
|
func (u *UnstructuredList) UnmarshalJSON(b []byte) error {
|
||||||
|
_, _, err := UnstructuredJSONScheme.Decode(b, nil, u)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) setNestedField(value interface{}, fields ...string) {
|
||||||
|
if u.Object == nil {
|
||||||
|
u.Object = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
setNestedField(u.Object, value, fields...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) GetAPIVersion() string {
|
||||||
|
return getNestedString(u.Object, "apiVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) SetAPIVersion(version string) {
|
||||||
|
u.setNestedField(version, "apiVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) GetKind() string {
|
||||||
|
return getNestedString(u.Object, "kind")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) SetKind(kind string) {
|
||||||
|
u.setNestedField(kind, "kind")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) GetResourceVersion() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "resourceVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) SetResourceVersion(version string) {
|
||||||
|
u.setNestedField(version, "metadata", "resourceVersion")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) GetSelfLink() string {
|
||||||
|
return getNestedString(u.Object, "metadata", "selfLink")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) SetSelfLink(selfLink string) {
|
||||||
|
u.setNestedField(selfLink, "metadata", "selfLink")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
|
||||||
|
u.SetAPIVersion(gvk.GroupVersion().String())
|
||||||
|
u.SetKind(gvk.Kind)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UnstructuredList) GroupVersionKind() unversioned.GroupVersionKind {
|
||||||
|
gv, err := unversioned.ParseGroupVersion(u.GetAPIVersion())
|
||||||
|
if err != nil {
|
||||||
|
return unversioned.GroupVersionKind{}
|
||||||
|
}
|
||||||
|
gvk := gv.WithKind(u.GetKind())
|
||||||
|
return gvk
|
||||||
|
}
|
||||||
|
|
||||||
// UnstructuredJSONScheme is capable of converting JSON data into the Unstructured
|
// UnstructuredJSONScheme is capable of converting JSON data into the Unstructured
|
||||||
// type, which can be used for generic access to objects without a predefined scheme.
|
// type, which can be used for generic access to objects without a predefined scheme.
|
||||||
// TODO: move into serializer/json.
|
// TODO: move into serializer/json.
|
||||||
|
Loading…
Reference in New Issue
Block a user