mirror of https://github.com/k3s-io/k3s
209 lines
7.6 KiB
Go
209 lines
7.6 KiB
Go
/*
|
|
Copyright The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
// Code generated by main. DO NOT EDIT.
|
|
|
|
package v1
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"time"
|
|
|
|
v1 "github.com/k3s-io/k3s/pkg/apis/k3s.cattle.io/v1"
|
|
"github.com/rancher/wrangler/v3/pkg/apply"
|
|
"github.com/rancher/wrangler/v3/pkg/condition"
|
|
"github.com/rancher/wrangler/v3/pkg/generic"
|
|
"github.com/rancher/wrangler/v3/pkg/kv"
|
|
"k8s.io/apimachinery/pkg/api/equality"
|
|
"k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
)
|
|
|
|
// ETCDSnapshotFileController interface for managing ETCDSnapshotFile resources.
|
|
type ETCDSnapshotFileController interface {
|
|
generic.NonNamespacedControllerInterface[*v1.ETCDSnapshotFile, *v1.ETCDSnapshotFileList]
|
|
}
|
|
|
|
// ETCDSnapshotFileClient interface for managing ETCDSnapshotFile resources in Kubernetes.
|
|
type ETCDSnapshotFileClient interface {
|
|
generic.NonNamespacedClientInterface[*v1.ETCDSnapshotFile, *v1.ETCDSnapshotFileList]
|
|
}
|
|
|
|
// ETCDSnapshotFileCache interface for retrieving ETCDSnapshotFile resources in memory.
|
|
type ETCDSnapshotFileCache interface {
|
|
generic.NonNamespacedCacheInterface[*v1.ETCDSnapshotFile]
|
|
}
|
|
|
|
// ETCDSnapshotFileStatusHandler is executed for every added or modified ETCDSnapshotFile. Should return the new status to be updated
|
|
type ETCDSnapshotFileStatusHandler func(obj *v1.ETCDSnapshotFile, status v1.ETCDSnapshotStatus) (v1.ETCDSnapshotStatus, error)
|
|
|
|
// ETCDSnapshotFileGeneratingHandler is the top-level handler that is executed for every ETCDSnapshotFile event. It extends ETCDSnapshotFileStatusHandler by a returning a slice of child objects to be passed to apply.Apply
|
|
type ETCDSnapshotFileGeneratingHandler func(obj *v1.ETCDSnapshotFile, status v1.ETCDSnapshotStatus) ([]runtime.Object, v1.ETCDSnapshotStatus, error)
|
|
|
|
// RegisterETCDSnapshotFileStatusHandler configures a ETCDSnapshotFileController to execute a ETCDSnapshotFileStatusHandler for every events observed.
|
|
// If a non-empty condition is provided, it will be updated in the status conditions for every handler execution
|
|
func RegisterETCDSnapshotFileStatusHandler(ctx context.Context, controller ETCDSnapshotFileController, condition condition.Cond, name string, handler ETCDSnapshotFileStatusHandler) {
|
|
statusHandler := &eTCDSnapshotFileStatusHandler{
|
|
client: controller,
|
|
condition: condition,
|
|
handler: handler,
|
|
}
|
|
controller.AddGenericHandler(ctx, name, generic.FromObjectHandlerToHandler(statusHandler.sync))
|
|
}
|
|
|
|
// RegisterETCDSnapshotFileGeneratingHandler configures a ETCDSnapshotFileController to execute a ETCDSnapshotFileGeneratingHandler for every events observed, passing the returned objects to the provided apply.Apply.
|
|
// If a non-empty condition is provided, it will be updated in the status conditions for every handler execution
|
|
func RegisterETCDSnapshotFileGeneratingHandler(ctx context.Context, controller ETCDSnapshotFileController, apply apply.Apply,
|
|
condition condition.Cond, name string, handler ETCDSnapshotFileGeneratingHandler, opts *generic.GeneratingHandlerOptions) {
|
|
statusHandler := &eTCDSnapshotFileGeneratingHandler{
|
|
ETCDSnapshotFileGeneratingHandler: handler,
|
|
apply: apply,
|
|
name: name,
|
|
gvk: controller.GroupVersionKind(),
|
|
}
|
|
if opts != nil {
|
|
statusHandler.opts = *opts
|
|
}
|
|
controller.OnChange(ctx, name, statusHandler.Remove)
|
|
RegisterETCDSnapshotFileStatusHandler(ctx, controller, condition, name, statusHandler.Handle)
|
|
}
|
|
|
|
type eTCDSnapshotFileStatusHandler struct {
|
|
client ETCDSnapshotFileClient
|
|
condition condition.Cond
|
|
handler ETCDSnapshotFileStatusHandler
|
|
}
|
|
|
|
// sync is executed on every resource addition or modification. Executes the configured handlers and sends the updated status to the Kubernetes API
|
|
func (a *eTCDSnapshotFileStatusHandler) sync(key string, obj *v1.ETCDSnapshotFile) (*v1.ETCDSnapshotFile, error) {
|
|
if obj == nil {
|
|
return obj, nil
|
|
}
|
|
|
|
origStatus := obj.Status.DeepCopy()
|
|
obj = obj.DeepCopy()
|
|
newStatus, err := a.handler(obj, obj.Status)
|
|
if err != nil {
|
|
// Revert to old status on error
|
|
newStatus = *origStatus.DeepCopy()
|
|
}
|
|
|
|
if a.condition != "" {
|
|
if errors.IsConflict(err) {
|
|
a.condition.SetError(&newStatus, "", nil)
|
|
} else {
|
|
a.condition.SetError(&newStatus, "", err)
|
|
}
|
|
}
|
|
if !equality.Semantic.DeepEqual(origStatus, &newStatus) {
|
|
if a.condition != "" {
|
|
// Since status has changed, update the lastUpdatedTime
|
|
a.condition.LastUpdated(&newStatus, time.Now().UTC().Format(time.RFC3339))
|
|
}
|
|
|
|
var newErr error
|
|
obj.Status = newStatus
|
|
newObj, newErr := a.client.UpdateStatus(obj)
|
|
if err == nil {
|
|
err = newErr
|
|
}
|
|
if newErr == nil {
|
|
obj = newObj
|
|
}
|
|
}
|
|
return obj, err
|
|
}
|
|
|
|
type eTCDSnapshotFileGeneratingHandler struct {
|
|
ETCDSnapshotFileGeneratingHandler
|
|
apply apply.Apply
|
|
opts generic.GeneratingHandlerOptions
|
|
gvk schema.GroupVersionKind
|
|
name string
|
|
seen sync.Map
|
|
}
|
|
|
|
// Remove handles the observed deletion of a resource, cascade deleting every associated resource previously applied
|
|
func (a *eTCDSnapshotFileGeneratingHandler) Remove(key string, obj *v1.ETCDSnapshotFile) (*v1.ETCDSnapshotFile, error) {
|
|
if obj != nil {
|
|
return obj, nil
|
|
}
|
|
|
|
obj = &v1.ETCDSnapshotFile{}
|
|
obj.Namespace, obj.Name = kv.RSplit(key, "/")
|
|
obj.SetGroupVersionKind(a.gvk)
|
|
|
|
if a.opts.UniqueApplyForResourceVersion {
|
|
a.seen.Delete(key)
|
|
}
|
|
|
|
return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts).
|
|
WithOwner(obj).
|
|
WithSetID(a.name).
|
|
ApplyObjects()
|
|
}
|
|
|
|
// Handle executes the configured ETCDSnapshotFileGeneratingHandler and pass the resulting objects to apply.Apply, finally returning the new status of the resource
|
|
func (a *eTCDSnapshotFileGeneratingHandler) Handle(obj *v1.ETCDSnapshotFile, status v1.ETCDSnapshotStatus) (v1.ETCDSnapshotStatus, error) {
|
|
if !obj.DeletionTimestamp.IsZero() {
|
|
return status, nil
|
|
}
|
|
|
|
objs, newStatus, err := a.ETCDSnapshotFileGeneratingHandler(obj, status)
|
|
if err != nil {
|
|
return newStatus, err
|
|
}
|
|
if !a.isNewResourceVersion(obj) {
|
|
return newStatus, nil
|
|
}
|
|
|
|
err = generic.ConfigureApplyForObject(a.apply, obj, &a.opts).
|
|
WithOwner(obj).
|
|
WithSetID(a.name).
|
|
ApplyObjects(objs...)
|
|
if err != nil {
|
|
return newStatus, err
|
|
}
|
|
a.storeResourceVersion(obj)
|
|
return newStatus, nil
|
|
}
|
|
|
|
// isNewResourceVersion detects if a specific resource version was already successfully processed.
|
|
// Only used if UniqueApplyForResourceVersion is set in generic.GeneratingHandlerOptions
|
|
func (a *eTCDSnapshotFileGeneratingHandler) isNewResourceVersion(obj *v1.ETCDSnapshotFile) bool {
|
|
if !a.opts.UniqueApplyForResourceVersion {
|
|
return true
|
|
}
|
|
|
|
// Apply once per resource version
|
|
key := obj.Namespace + "/" + obj.Name
|
|
previous, ok := a.seen.Load(key)
|
|
return !ok || previous != obj.ResourceVersion
|
|
}
|
|
|
|
// storeResourceVersion keeps track of the latest resource version of an object for which Apply was executed
|
|
// Only used if UniqueApplyForResourceVersion is set in generic.GeneratingHandlerOptions
|
|
func (a *eTCDSnapshotFileGeneratingHandler) storeResourceVersion(obj *v1.ETCDSnapshotFile) {
|
|
if !a.opts.UniqueApplyForResourceVersion {
|
|
return
|
|
}
|
|
|
|
key := obj.Namespace + "/" + obj.Name
|
|
a.seen.Store(key, obj.ResourceVersion)
|
|
}
|