1
0
mirror of https://github.com/rancher/norman.git synced 2025-09-01 23:36:58 +00:00
Files
norman/lifecycle/object.go

157 lines
3.6 KiB
Go
Raw Normal View History

2017-12-05 09:21:12 -07:00
package lifecycle
import (
"github.com/rancher/norman/clientbase"
"github.com/rancher/norman/types/slice"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
var (
2018-01-03 14:50:43 -07:00
created = "lifecycle.cattle.io/create"
finalizerKey = "controller.cattle.io/"
2017-12-05 09:21:12 -07:00
)
type ObjectLifecycle interface {
Create(obj runtime.Object) (runtime.Object, error)
Finalize(obj runtime.Object) (runtime.Object, error)
Updated(obj runtime.Object) (runtime.Object, error)
2017-12-05 09:21:12 -07:00
}
type objectLifecycleAdapter struct {
name string
lifecycle ObjectLifecycle
objectClient *clientbase.ObjectClient
}
func NewObjectLifecycleAdapter(name string, lifecycle ObjectLifecycle, objectClient *clientbase.ObjectClient) func(key string, obj runtime.Object) error {
o := objectLifecycleAdapter{
name: name,
lifecycle: lifecycle,
objectClient: objectClient,
}
return o.sync
}
func (o *objectLifecycleAdapter) sync(key string, obj runtime.Object) error {
if obj == nil {
return nil
}
metadata, err := meta.Accessor(obj)
if err != nil {
return err
}
if cont, err := o.finalize(metadata, obj); err != nil || !cont {
return err
}
2017-12-05 14:15:52 -07:00
if cont, err := o.create(metadata, obj); err != nil || !cont {
2017-12-05 09:21:12 -07:00
return err
}
2017-12-16 01:22:48 -07:00
obj = obj.DeepCopyObject()
if newObj, err := o.lifecycle.Updated(obj); err != nil {
2017-12-16 01:22:48 -07:00
if newObj != nil {
o.objectClient.Update(metadata.GetName(), newObj)
}
return err
} else if newObj != nil {
_, err = o.objectClient.Update(metadata.GetName(), newObj)
return err
}
return nil
2017-12-05 09:21:12 -07:00
}
func (o *objectLifecycleAdapter) finalize(metadata metav1.Object, obj runtime.Object) (bool, error) {
// Check finalize
if metadata.GetDeletionTimestamp() == nil {
return true, nil
}
2018-01-03 14:50:43 -07:00
if !slice.ContainsString(metadata.GetFinalizers(), o.constructFinalizerKey()) {
2017-12-05 09:21:12 -07:00
return false, nil
}
obj = obj.DeepCopyObject()
2017-12-16 01:22:48 -07:00
if newObj, err := o.lifecycle.Finalize(obj); err != nil {
if newObj != nil {
o.objectClient.Update(metadata.GetName(), newObj)
}
return false, err
} else if newObj != nil {
obj = newObj
}
2018-01-03 14:50:43 -07:00
if err := removeFinalizer(o.constructFinalizerKey(), obj); err != nil {
2017-12-16 01:22:48 -07:00
return false, err
}
_, err := o.objectClient.Update(metadata.GetName(), obj)
return false, err
}
func removeFinalizer(name string, obj runtime.Object) error {
2017-12-05 09:21:12 -07:00
metadata, err := meta.Accessor(obj)
if err != nil {
2017-12-16 01:22:48 -07:00
return err
2017-12-05 09:21:12 -07:00
}
var finalizers []string
for _, finalizer := range metadata.GetFinalizers() {
2017-12-16 01:22:48 -07:00
if finalizer == name {
2017-12-05 09:21:12 -07:00
continue
}
finalizers = append(finalizers, finalizer)
}
metadata.SetFinalizers(finalizers)
2017-12-16 01:22:48 -07:00
return nil
2017-12-05 09:21:12 -07:00
}
2017-12-05 14:15:52 -07:00
func (o *objectLifecycleAdapter) createKey() string {
return created + "." + o.name
2017-12-05 09:21:12 -07:00
}
2018-01-03 14:50:43 -07:00
func (o *objectLifecycleAdapter) constructFinalizerKey() string {
return finalizerKey + o.name
}
2017-12-05 14:15:52 -07:00
func (o *objectLifecycleAdapter) create(metadata metav1.Object, obj runtime.Object) (bool, error) {
initialized := o.createKey()
2017-12-05 09:21:12 -07:00
2017-12-16 01:22:48 -07:00
if metadata.GetAnnotations()[initialized] == "true" {
2017-12-05 09:21:12 -07:00
return true, nil
}
obj = obj.DeepCopyObject()
2017-12-16 01:22:48 -07:00
if newObj, err := o.lifecycle.Create(obj); err != nil {
if newObj != nil {
o.objectClient.Update(metadata.GetName(), newObj)
}
return false, err
} else if newObj != nil {
obj = newObj
}
2017-12-05 09:21:12 -07:00
metadata, err := meta.Accessor(obj)
if err != nil {
return false, err
}
2017-12-16 01:22:48 -07:00
if metadata.GetAnnotations() == nil {
metadata.SetAnnotations(map[string]string{})
2017-12-05 09:21:12 -07:00
}
if o.objectClient.GroupVersionKind().Kind != "Namespace" {
2018-01-03 14:50:43 -07:00
metadata.SetFinalizers(append(metadata.GetFinalizers(), o.constructFinalizerKey()))
}
2017-12-16 01:22:48 -07:00
metadata.GetAnnotations()[initialized] = "true"
2017-12-05 09:21:12 -07:00
2017-12-13 17:20:31 -07:00
_, err = o.objectClient.Update(metadata.GetName(), obj)
return false, err
2017-12-05 09:21:12 -07:00
}