k3s/vendor/github.com/rancher/wrangler/pkg/objectset/objectset.go

177 lines
3.5 KiB
Go
Raw Normal View History

2019-01-22 20:53:35 +00:00
package objectset
import (
"fmt"
"reflect"
2019-05-09 22:03:45 +00:00
"sort"
2019-01-22 20:53:35 +00:00
2019-05-09 22:03:45 +00:00
"github.com/rancher/wrangler/pkg/merr"
2019-01-22 20:53:35 +00:00
"k8s.io/apimachinery/pkg/api/meta"
2019-05-09 22:03:45 +00:00
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2019-01-22 20:53:35 +00:00
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
2019-05-09 22:03:45 +00:00
type ObjectKey struct {
Name string
Namespace string
2019-01-22 20:53:35 +00:00
}
2019-05-09 22:03:45 +00:00
func NewObjectKey(obj v1.Object) ObjectKey {
return ObjectKey{
Namespace: obj.GetNamespace(),
Name: obj.GetName(),
2019-01-22 20:53:35 +00:00
}
}
2019-05-09 22:03:45 +00:00
func (o ObjectKey) String() string {
if o.Namespace == "" {
return o.Name
2019-01-22 20:53:35 +00:00
}
2019-05-09 22:03:45 +00:00
return fmt.Sprintf("%s/%s", o.Namespace, o.Name)
2019-01-22 20:53:35 +00:00
}
2019-05-09 22:03:45 +00:00
type ObjectByGVK map[schema.GroupVersionKind]map[ObjectKey]runtime.Object
2019-01-22 20:53:35 +00:00
2019-05-09 22:03:45 +00:00
func (o ObjectByGVK) Add(obj runtime.Object) error {
2019-01-22 20:53:35 +00:00
metadata, err := meta.Accessor(obj)
if err != nil {
return err
}
objs := o[obj.GetObjectKind().GroupVersionKind()]
if objs == nil {
2019-05-09 22:03:45 +00:00
objs = map[ObjectKey]runtime.Object{}
2019-01-22 20:53:35 +00:00
o[obj.GetObjectKind().GroupVersionKind()] = objs
}
2019-05-09 22:03:45 +00:00
objs[ObjectKey{
Namespace: metadata.GetNamespace(),
Name: metadata.GetName(),
2019-01-22 20:53:35 +00:00
}] = obj
return nil
}
type ObjectSet struct {
errs []error
2019-05-09 22:03:45 +00:00
objects ObjectByGVK
2019-01-22 20:53:35 +00:00
nsed map[schema.GroupVersionKind]bool
inputs []runtime.Object
order []runtime.Object
}
func NewObjectSet() *ObjectSet {
return &ObjectSet{
nsed: map[schema.GroupVersionKind]bool{},
2019-05-09 22:03:45 +00:00
objects: ObjectByGVK{},
2019-01-22 20:53:35 +00:00
}
}
2019-05-09 22:03:45 +00:00
func (o *ObjectSet) Inputs() []runtime.Object {
return o.inputs
}
func (o *ObjectSet) ObjectsByGVK() ObjectByGVK {
return o.objects
}
2019-01-22 20:53:35 +00:00
func (o *ObjectSet) AddInput(objs ...runtime.Object) *ObjectSet {
for _, obj := range objs {
if obj == nil || reflect.ValueOf(obj).IsNil() {
continue
}
o.inputs = append(o.inputs, obj)
}
return o
}
func (o *ObjectSet) Add(objs ...runtime.Object) *ObjectSet {
for _, obj := range objs {
o.add(obj)
}
return o
}
func (o *ObjectSet) add(obj runtime.Object) {
if obj == nil || reflect.ValueOf(obj).IsNil() {
return
}
gvk := obj.GetObjectKind().GroupVersionKind()
metadata, err := meta.Accessor(obj)
if err != nil {
o.err(fmt.Errorf("failed to get metadata for %s", gvk))
return
}
name := metadata.GetName()
if name == "" {
o.err(fmt.Errorf("%s is missing name", gvk))
return
}
namespace := metadata.GetNamespace()
nsed, ok := o.nsed[gvk]
if ok && nsed != (namespace != "") {
o.err(fmt.Errorf("got %s objects that are both namespaced and not namespaced", gvk))
return
}
o.nsed[gvk] = namespace != ""
2019-05-09 22:03:45 +00:00
if err := o.objects.Add(obj); err != nil {
2019-01-22 20:53:35 +00:00
o.err(fmt.Errorf("failed to get metadata for %s", gvk))
return
}
o.order = append(o.order, obj)
}
func (o *ObjectSet) err(err error) error {
o.errs = append(o.errs, err)
return o.Err()
}
func (o *ObjectSet) AddErr(err error) {
o.errs = append(o.errs, err)
}
func (o *ObjectSet) Err() error {
2019-05-09 22:03:45 +00:00
return merr.NewErrors(o.errs...)
}
func (o *ObjectSet) Len() int {
return len(o.objects)
}
func (o *ObjectSet) GVKOrder(known ...schema.GroupVersionKind) []schema.GroupVersionKind {
seen := map[schema.GroupVersionKind]bool{}
var gvkOrder []schema.GroupVersionKind
for _, obj := range o.order {
if seen[obj.GetObjectKind().GroupVersionKind()] {
continue
}
seen[obj.GetObjectKind().GroupVersionKind()] = true
gvkOrder = append(gvkOrder, obj.GetObjectKind().GroupVersionKind())
}
var rest []schema.GroupVersionKind
for _, gvk := range known {
if seen[gvk] {
continue
}
seen[gvk] = true
rest = append(rest, gvk)
}
sort.Slice(rest, func(i, j int) bool {
return rest[i].String() < rest[j].String()
})
return append(gvkOrder, rest...)
2019-01-22 20:53:35 +00:00
}