github.com/spotmaxtech/k8s-apimachinery-v0260@v0.0.1/pkg/apis/meta/v1/unstructured/unstructured_list.go (about) 1 /* 2 Copyright 2015 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package unstructured 18 19 import ( 20 "bytes" 21 22 metav1 "github.com/spotmaxtech/k8s-apimachinery-v0260/pkg/apis/meta/v1" 23 "github.com/spotmaxtech/k8s-apimachinery-v0260/pkg/runtime" 24 "github.com/spotmaxtech/k8s-apimachinery-v0260/pkg/runtime/schema" 25 ) 26 27 var _ runtime.Unstructured = &UnstructuredList{} 28 var _ metav1.ListInterface = &UnstructuredList{} 29 30 // UnstructuredList allows lists that do not have Golang structs 31 // registered to be manipulated generically. This can be used to deal 32 // with the API lists from a plug-in. 33 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object 34 // +k8s:deepcopy-gen=true 35 type UnstructuredList struct { 36 Object map[string]interface{} 37 38 // Items is a list of unstructured objects. 39 Items []Unstructured `json:"items"` 40 } 41 42 func (u *UnstructuredList) GetObjectKind() schema.ObjectKind { return u } 43 44 func (u *UnstructuredList) IsList() bool { return true } 45 46 func (u *UnstructuredList) EachListItem(fn func(runtime.Object) error) error { 47 for i := range u.Items { 48 if err := fn(&u.Items[i]); err != nil { 49 return err 50 } 51 } 52 return nil 53 } 54 55 // NewEmptyInstance returns a new instance of the concrete type containing only kind/apiVersion and no other data. 56 // This should be called instead of reflect.New() for unstructured types because the go type alone does not preserve kind/apiVersion info. 57 func (u *UnstructuredList) NewEmptyInstance() runtime.Unstructured { 58 out := new(UnstructuredList) 59 if u != nil { 60 out.SetGroupVersionKind(u.GroupVersionKind()) 61 } 62 return out 63 } 64 65 // UnstructuredContent returns a map contain an overlay of the Items field onto 66 // the Object field. Items always overwrites overlay. 67 func (u *UnstructuredList) UnstructuredContent() map[string]interface{} { 68 out := make(map[string]interface{}, len(u.Object)+1) 69 70 // shallow copy every property 71 for k, v := range u.Object { 72 out[k] = v 73 } 74 75 items := make([]interface{}, len(u.Items)) 76 for i, item := range u.Items { 77 items[i] = item.UnstructuredContent() 78 } 79 out["items"] = items 80 return out 81 } 82 83 // SetUnstructuredContent obeys the conventions of List and keeps Items and the items 84 // array in sync. If items is not an array of objects in the incoming map, then any 85 // mismatched item will be removed. 86 func (obj *UnstructuredList) SetUnstructuredContent(content map[string]interface{}) { 87 obj.Object = content 88 if content == nil { 89 obj.Items = nil 90 return 91 } 92 items, ok := obj.Object["items"].([]interface{}) 93 if !ok || items == nil { 94 items = []interface{}{} 95 } 96 unstructuredItems := make([]Unstructured, 0, len(items)) 97 newItems := make([]interface{}, 0, len(items)) 98 for _, item := range items { 99 o, ok := item.(map[string]interface{}) 100 if !ok { 101 continue 102 } 103 unstructuredItems = append(unstructuredItems, Unstructured{Object: o}) 104 newItems = append(newItems, o) 105 } 106 obj.Items = unstructuredItems 107 obj.Object["items"] = newItems 108 } 109 110 func (u *UnstructuredList) DeepCopy() *UnstructuredList { 111 if u == nil { 112 return nil 113 } 114 out := new(UnstructuredList) 115 *out = *u 116 out.Object = runtime.DeepCopyJSON(u.Object) 117 out.Items = make([]Unstructured, len(u.Items)) 118 for i := range u.Items { 119 u.Items[i].DeepCopyInto(&out.Items[i]) 120 } 121 return out 122 } 123 124 // MarshalJSON ensures that the unstructured list object produces proper 125 // JSON when passed to Go's standard JSON library. 126 func (u *UnstructuredList) MarshalJSON() ([]byte, error) { 127 var buf bytes.Buffer 128 err := UnstructuredJSONScheme.Encode(u, &buf) 129 return buf.Bytes(), err 130 } 131 132 // UnmarshalJSON ensures that the unstructured list object properly 133 // decodes JSON when passed to Go's standard JSON library. 134 func (u *UnstructuredList) UnmarshalJSON(b []byte) error { 135 _, _, err := UnstructuredJSONScheme.Decode(b, nil, u) 136 return err 137 } 138 139 func (u *UnstructuredList) GetAPIVersion() string { 140 return getNestedString(u.Object, "apiVersion") 141 } 142 143 func (u *UnstructuredList) SetAPIVersion(version string) { 144 u.setNestedField(version, "apiVersion") 145 } 146 147 func (u *UnstructuredList) GetKind() string { 148 return getNestedString(u.Object, "kind") 149 } 150 151 func (u *UnstructuredList) SetKind(kind string) { 152 u.setNestedField(kind, "kind") 153 } 154 155 func (u *UnstructuredList) GetResourceVersion() string { 156 return getNestedString(u.Object, "metadata", "resourceVersion") 157 } 158 159 func (u *UnstructuredList) SetResourceVersion(version string) { 160 u.setNestedField(version, "metadata", "resourceVersion") 161 } 162 163 func (u *UnstructuredList) GetSelfLink() string { 164 return getNestedString(u.Object, "metadata", "selfLink") 165 } 166 167 func (u *UnstructuredList) SetSelfLink(selfLink string) { 168 u.setNestedField(selfLink, "metadata", "selfLink") 169 } 170 171 func (u *UnstructuredList) GetContinue() string { 172 return getNestedString(u.Object, "metadata", "continue") 173 } 174 175 func (u *UnstructuredList) SetContinue(c string) { 176 u.setNestedField(c, "metadata", "continue") 177 } 178 179 func (u *UnstructuredList) GetRemainingItemCount() *int64 { 180 return getNestedInt64Pointer(u.Object, "metadata", "remainingItemCount") 181 } 182 183 func (u *UnstructuredList) SetRemainingItemCount(c *int64) { 184 if c == nil { 185 RemoveNestedField(u.Object, "metadata", "remainingItemCount") 186 } else { 187 u.setNestedField(*c, "metadata", "remainingItemCount") 188 } 189 } 190 191 func (u *UnstructuredList) SetGroupVersionKind(gvk schema.GroupVersionKind) { 192 u.SetAPIVersion(gvk.GroupVersion().String()) 193 u.SetKind(gvk.Kind) 194 } 195 196 func (u *UnstructuredList) GroupVersionKind() schema.GroupVersionKind { 197 gv, err := schema.ParseGroupVersion(u.GetAPIVersion()) 198 if err != nil { 199 return schema.GroupVersionKind{} 200 } 201 gvk := gv.WithKind(u.GetKind()) 202 return gvk 203 } 204 205 func (u *UnstructuredList) setNestedField(value interface{}, fields ...string) { 206 if u.Object == nil { 207 u.Object = make(map[string]interface{}) 208 } 209 SetNestedField(u.Object, value, fields...) 210 }