Documentation ¶
Overview ¶
Copyright The Velero Contributors.
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.
Copyright The Velero Contributors.
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.
Index ¶
- Constants
- Variables
- func AddAnnotations(o *metav1.ObjectMeta, vals map[string]string)
- func AddLabels(o *metav1.ObjectMeta, vals map[string]string)
- func CollectPodLogs(ctx context.Context, podGetter corev1client.CoreV1Interface, pod string, ...) error
- func DeletePVAndPVCIfAny(ctx context.Context, client corev1client.CoreV1Interface, ...)
- func DeletePVIfAny(ctx context.Context, pvGetter corev1client.CoreV1Interface, pvName string, ...)
- func DeletePodIfAny(ctx context.Context, podGetter corev1client.CoreV1Interface, podName string, ...)
- func DiagnosePV(pv *corev1api.PersistentVolume) string
- func DiagnosePVC(pvc *corev1api.PersistentVolumeClaim) string
- func DiagnosePod(pod *corev1api.Pod) string
- func EnqueueRequestsFromMapUpdateFunc(fn MapUpdateFunc) handler.EventHandler
- func EnsureDeletePVC(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvcName string, ...) error
- func EnsureDeletePod(ctx context.Context, podGetter corev1client.CoreV1Interface, pod string, ...) error
- func EnsureNamespaceExistsAndIsReady(namespace *corev1api.Namespace, client corev1client.NamespaceInterface, ...) (ready bool, nsCreated bool, err error)
- func GetPVCForPodVolume(vol *corev1api.Volume, pod *corev1api.Pod, crClient crclient.Client) (*corev1api.PersistentVolumeClaim, error)
- func GetPVForPVC(pvc *corev1api.PersistentVolumeClaim, crClient crclient.Client) (*corev1api.PersistentVolume, error)
- func GetPodContainerTerminateMessage(pod *corev1api.Pod, container string) string
- func GetPodPVCVolume(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, ...) (*corev1api.PersistentVolumeClaim, *corev1api.PersistentVolume, ...)
- func GetPodTerminateMessage(pod *corev1api.Pod) string
- func GetSecret(client kbclient.Client, namespace, name string) (*corev1api.Secret, error)
- func GetSecretKey(client kbclient.Client, namespace string, ...) ([]byte, error)
- func GetVolumeDirectory(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, ...) (string, error)
- func GetVolumeMode(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, ...) (uploader.PersistentVolumeMode, error)
- func HasBackupLabel(o *metav1.ObjectMeta, backupName string) bool
- func IsCRDReady(crd *unstructured.Unstructured) (bool, error)
- func IsPVCBound(pvc *corev1api.PersistentVolumeClaim) bool
- func IsPodRunning(pod *corev1api.Pod) error
- func IsPodScheduled(pod *corev1api.Pod) error
- func IsPodUnrecoverable(pod *corev1api.Pod, log logrus.FieldLogger) (bool, string)
- func IsV1Beta1CRDReady(crd *apiextv1beta1.CustomResourceDefinition) bool
- func IsV1CRDReady(crd *apiextv1.CustomResourceDefinition) bool
- func MakePodPVCAttachment(volumeName string, volumeMode *corev1api.PersistentVolumeMode, readOnly bool) ([]corev1api.VolumeMount, []corev1api.VolumeDevice, string)
- func NamespaceAndName(objMeta metav1.Object) string
- func NewAllEventPredicate(f func(object client.Object) bool) predicate.Predicate
- func NewCreateEventPredicate(f func(client.Object) bool) predicate.Predicate
- func NewGenericEventPredicate(f func(object client.Object) bool) predicate.Predicate
- func NewUpdateEventPredicate(f func(client.Object, client.Object) bool) predicate.Predicate
- func ParseResourceRequirements(cpuRequest, memRequest, cpuLimit, memLimit string) (corev1.ResourceRequirements, error)
- func ParseSecurityContext(runAsUser string, runAsGroup string, allowPrivilegeEscalation string, ...) (corev1.SecurityContext, error)
- func PatchResource(original, updated client.Object, kbClient client.Client) error
- func PatchResourceWithRetries(maxDuration time.Duration, original, updated client.Object, ...) error
- func PatchResourceWithRetriesOnErrors(maxDuration time.Duration, original, updated client.Object, ...) error
- func RebindPVC(ctx context.Context, pvcGetter corev1client.CoreV1Interface, ...) (*corev1api.PersistentVolumeClaim, error)
- func ResetPVBinding(ctx context.Context, pvGetter corev1client.CoreV1Interface, ...) (*corev1api.PersistentVolume, error)
- func SetPVReclaimPolicy(ctx context.Context, pvGetter corev1client.CoreV1Interface, ...) (*corev1api.PersistentVolume, error)
- func SinglePathMatch(path string, fs filesystem.Interface, log logrus.FieldLogger) (string, error)
- func ToSystemAffinity(loadAffinities []*LoadAffinity) *corev1api.Affinity
- func TypedEnqueueRequestsFromMapFunc[object any, request comparable](fn TypedMapUpdateFunc[object, request]) handler.TypedEventHandler[object, request]
- func WaitPVBound(ctx context.Context, pvGetter corev1client.CoreV1Interface, pvName string, ...) (*corev1api.PersistentVolume, error)
- func WaitPVCBound(ctx context.Context, pvcGetter corev1client.CoreV1Interface, ...) (*corev1api.PersistentVolume, error)
- func WaitPVCConsumed(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvc string, ...) (string, *corev1api.PersistentVolumeClaim, error)
- type Client
- type EventRecorder
- type FalsePredicate
- type InternalLW
- type LoadAffinity
- type MapUpdateFunc
- type PeriodicalEnqueueSource
- type PeriodicalEnqueueSourceOption
- type PodResources
- type ResourceDeletionStatusTracker
- type SpecChangePredicate
- type TypedMapUpdateFunc
Constants ¶
const ( KubeAnnBindCompleted = "pv.kubernetes.io/bind-completed" KubeAnnBoundByController = "pv.kubernetes.io/bound-by-controller" KubeAnnDynamicallyProvisioned = "pv.kubernetes.io/provisioned-by" KubeAnnMigratedTo = "pv.kubernetes.io/migrated-to" KubeAnnSelectedNode = "volume.kubernetes.io/selected-node" )
These annotations are taken from the Kubernetes persistent volume/persistent volume claim controller. They cannot be directly importing because they are part of the kubernetes/kubernetes package, and importing that package is unsupported. Their values are well-known and slow changing. They're duplicated here as constants to provide compile-time checking. Originals can be found in kubernetes/kubernetes/pkg/controller/volume/persistentvolume/util/util.go.
Variables ¶
var ErrorPodVolumeIsNotPVC = errors.New("pod volume is not a PVC")
Functions ¶
func AddAnnotations ¶
func AddAnnotations(o *metav1.ObjectMeta, vals map[string]string)
AddAnnotations adds the supplied key-values to the annotations on the object
func AddLabels ¶
func AddLabels(o *metav1.ObjectMeta, vals map[string]string)
AddLabels adds the supplied key-values to the labels on the object
func CollectPodLogs ¶
func CollectPodLogs(ctx context.Context, podGetter corev1client.CoreV1Interface, pod string, namespace string, container string, output io.Writer) error
CollectPodLogs collects logs of the specified container of a pod and write to the output
func DeletePVAndPVCIfAny ¶
func DeletePVAndPVCIfAny(ctx context.Context, client corev1client.CoreV1Interface, pvcName, pvcNamespace string, ensureTimeout time.Duration, log logrus.FieldLogger)
DeletePVAndPVCIfAny deletes PVC and delete the bound PV if it exists and log an error when the deletion fails. It first sets the reclaim policy of the PV to Delete, then PV will be deleted automatically when PVC is deleted. If ensureTimeout is not 0, it waits until the PVC is deleted or timeout.
func DeletePVIfAny ¶
func DeletePVIfAny(ctx context.Context, pvGetter corev1client.CoreV1Interface, pvName string, log logrus.FieldLogger)
DeletePVIfAny deletes a PV by name if it exists, and log an error when the deletion fails
func DeletePodIfAny ¶
func DeletePodIfAny(ctx context.Context, podGetter corev1client.CoreV1Interface, podName string, podNamespace string, log logrus.FieldLogger)
DeletePodIfAny deletes a pod by name if it exists, and log an error when the deletion fails
func DiagnosePV ¶
func DiagnosePV(pv *corev1api.PersistentVolume) string
func DiagnosePVC ¶
func DiagnosePVC(pvc *corev1api.PersistentVolumeClaim) string
func DiagnosePod ¶
func EnqueueRequestsFromMapUpdateFunc ¶
func EnqueueRequestsFromMapUpdateFunc(fn MapUpdateFunc) handler.EventHandler
EnqueueRequestsFromMapUpdateFunc has the same purpose with handler.EnqueueRequestsFromMapFunc. MapUpdateFunc is simpler on Update event because mapAndEnqueue is called once with the new object. EnqueueRequestsFromMapFunc is called twice with the old and new object.
func EnsureDeletePVC ¶
func EnsureDeletePVC(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvcName string, namespace string, timeout time.Duration) error
EnsureDeletePVC asserts the existence of a PVC by name, deletes it and waits for its disappearance and returns errors on any failure If timeout is 0, it doesn't wait and return nil
func EnsureDeletePod ¶
func EnsureDeletePod(ctx context.Context, podGetter corev1client.CoreV1Interface, pod string, namespace string, timeout time.Duration) error
EnsureDeletePod asserts the existence of a pod by name, deletes it and waits for its disappearance and returns errors on any failure
func EnsureNamespaceExistsAndIsReady ¶
func EnsureNamespaceExistsAndIsReady(namespace *corev1api.Namespace, client corev1client.NamespaceInterface, timeout time.Duration, resourceDeletionStatusTracker ResourceDeletionStatusTracker) (ready bool, nsCreated bool, err error)
EnsureNamespaceExistsAndIsReady attempts to create the provided Kubernetes namespace. It returns three values:
- a bool indicating whether or not the namespace is ready,
- a bool indicating whether or not the namespace was created
- an error if one occurred.
examples:
namespace already exists and is not ready, this function will return (false, false, nil). If the namespace exists and is marked for deletion, this function will wait up to the timeout for it to fully delete.
func GetPVCForPodVolume ¶
func GetPVForPVC ¶
func GetPVForPVC( pvc *corev1api.PersistentVolumeClaim, crClient crclient.Client, ) (*corev1api.PersistentVolume, error)
func GetPodContainerTerminateMessage ¶
GetPodContainerTerminateMessage returns the terminate message for a specific container of a pod
func GetPodPVCVolume ¶
func GetPodPVCVolume(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, volumeName string, cli client.Client) ( *corev1api.PersistentVolumeClaim, *corev1api.PersistentVolume, *corev1api.Volume, error)
GetPodPVCVolume gets the PVC, PV and volume for a pod volume name. Returns pod volume in case of ErrorPodVolumeIsNotPVC error
func GetPodTerminateMessage ¶
GetPodTerminateMessage returns the terminate message for all containers of a pod
func GetSecretKey ¶
func GetVolumeDirectory ¶
func GetVolumeDirectory(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, volumeName string, cli client.Client) (string, error)
GetVolumeDirectory gets the name of the directory on the host, under /var/lib/kubelet/pods/<podUID>/volumes/, where the specified volume lives. For volumes with a CSIVolumeSource, append "/mount" to the directory name.
func GetVolumeMode ¶
func GetVolumeMode(ctx context.Context, log logrus.FieldLogger, pod *corev1api.Pod, volumeName string, cli client.Client) ( uploader.PersistentVolumeMode, error)
GetVolumeMode gets the uploader.PersistentVolumeMode of the volume.
func HasBackupLabel ¶
func HasBackupLabel(o *metav1.ObjectMeta, backupName string) bool
func IsCRDReady ¶
func IsCRDReady(crd *unstructured.Unstructured) (bool, error)
IsCRDReady triggers IsV1Beta1CRDReady/IsV1CRDReady according to the version of the input param
func IsPVCBound ¶
func IsPVCBound(pvc *corev1api.PersistentVolumeClaim) bool
IsPVCBound returns true if the specified PVC has been bound
func IsPodRunning ¶
IsPodRunning does a well-rounded check to make sure the specified pod is running stably. If not, return the error found
func IsPodScheduled ¶
IsPodScheduled does a well-rounded check to make sure the specified pod has been scheduled into a node and in a stable status. If not, return the error found
func IsPodUnrecoverable ¶
IsPodUnrecoverable checks if the pod is in an abnormal state and could not be recovered It could not cover all the cases but we could add more cases in the future
func IsV1Beta1CRDReady ¶
func IsV1Beta1CRDReady(crd *apiextv1beta1.CustomResourceDefinition) bool
IsV1Beta1CRDReady checks a v1beta1 CRD to see if it's ready, with both the Established and NamesAccepted conditions.
func IsV1CRDReady ¶
func IsV1CRDReady(crd *apiextv1.CustomResourceDefinition) bool
IsV1CRDReady checks a v1 CRD to see if it's ready, with both the Established and NamesAccepted conditions.
func MakePodPVCAttachment ¶
func MakePodPVCAttachment(volumeName string, volumeMode *corev1api.PersistentVolumeMode, readOnly bool) ([]corev1api.VolumeMount, []corev1api.VolumeDevice, string)
MakePodPVCAttachment returns the volume mounts and devices for a pod needed to attach a PVC
func NamespaceAndName ¶
NamespaceAndName returns a string in the format <namespace>/<name>
func NewAllEventPredicate ¶
NewAllEventPredicate creates a new Predicate that checks all the events with the provided func
func NewCreateEventPredicate ¶
func NewGenericEventPredicate ¶
NewGenericEventPredicate creates a new Predicate that checks the Generic event with the provided func
func NewUpdateEventPredicate ¶
NewUpdateEventPredicate creates a new Predicate that checks the update events with the provided func and ignore others
func ParseResourceRequirements ¶
func ParseResourceRequirements(cpuRequest, memRequest, cpuLimit, memLimit string) (corev1.ResourceRequirements, error)
ParseResourceRequirements takes a set of CPU and memory requests and limit string values and returns a ResourceRequirements struct to be used in a Container. An error is returned if we cannot parse the request/limit.
func ParseSecurityContext ¶
func PatchResource ¶
func PatchResourceWithRetries ¶
func PatchResourceWithRetries(maxDuration time.Duration, original, updated client.Object, kbClient client.Client, retriable func(error) bool) error
PatchResourceWithRetries patches the original resource with the updated resource, retrying when the provided retriable function returns true.
func PatchResourceWithRetriesOnErrors ¶
func PatchResourceWithRetriesOnErrors(maxDuration time.Duration, original, updated client.Object, kbClient client.Client) error
PatchResourceWithRetriesOnErrors patches the original resource with the updated resource, retrying when the operation returns an error.
func RebindPVC ¶
func RebindPVC(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvc *corev1api.PersistentVolumeClaim, pv string) (*corev1api.PersistentVolumeClaim, error)
RebindPVC rebinds a PVC by modifying its VolumeName to the specific PV
func ResetPVBinding ¶
func ResetPVBinding(ctx context.Context, pvGetter corev1client.CoreV1Interface, pv *corev1api.PersistentVolume, labels map[string]string, pvc *corev1api.PersistentVolumeClaim) (*corev1api.PersistentVolume, error)
ResetPVBinding resets the binding info of a PV and adds the required labels so as to make it ready for binding
func SetPVReclaimPolicy ¶
func SetPVReclaimPolicy(ctx context.Context, pvGetter corev1client.CoreV1Interface, pv *corev1api.PersistentVolume, policy corev1api.PersistentVolumeReclaimPolicy) (*corev1api.PersistentVolume, error)
SetPVReclaimPolicy sets the specified reclaim policy to a PV
func SinglePathMatch ¶
func SinglePathMatch(path string, fs filesystem.Interface, log logrus.FieldLogger) (string, error)
SinglePathMatch checks whether pass-in volume path is valid. Check whether there is only one match by the path's pattern.
func ToSystemAffinity ¶
func ToSystemAffinity(loadAffinities []*LoadAffinity) *corev1api.Affinity
func TypedEnqueueRequestsFromMapFunc ¶
func TypedEnqueueRequestsFromMapFunc[object any, request comparable](fn TypedMapUpdateFunc[object, request]) handler.TypedEventHandler[object, request]
func WaitPVBound ¶
func WaitPVBound(ctx context.Context, pvGetter corev1client.CoreV1Interface, pvName string, pvcName string, pvcNamespace string, timeout time.Duration) (*corev1api.PersistentVolume, error)
WaitPVBound wait for binding of a PV specified by name and returns the bound PV object
func WaitPVCBound ¶
func WaitPVCBound(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvGetter corev1client.CoreV1Interface, pvc string, namespace string, timeout time.Duration) (*corev1api.PersistentVolume, error)
WaitPVCBound wait for binding of a PVC specified by name and returns the bound PV object
func WaitPVCConsumed ¶
func WaitPVCConsumed(ctx context.Context, pvcGetter corev1client.CoreV1Interface, pvc string, namespace string, storageClient storagev1.StorageV1Interface, timeout time.Duration) (string, *corev1api.PersistentVolumeClaim, error)
WaitPVCConsumed waits for a PVC to be consumed by a pod so that the selected node is set by the pod scheduling; or does nothing if the consuming doesn't affect the PV provision. The latest PVC and the selected node will be returned.
Types ¶
type Client ¶
type Client interface { client.Reader client.Writer client.StatusClient client.SubResourceClientConstructor // Scheme returns the scheme this client is using. Scheme() *runtime.Scheme // RESTMapper returns the rest this client is using. RESTMapper() meta.RESTMapper // GroupVersionKindFor returns the GroupVersionKind for the given object. GroupVersionKindFor(obj runtime.Object) (schema.GroupVersionKind, error) // IsObjectNamespaced returns true if the GroupVersionKind of the object is namespaced. IsObjectNamespaced(obj runtime.Object) (bool, error) }
Client knows how to perform CRUD operations on Kubernetes objects. go:generate mockery --name=Client
type EventRecorder ¶
type EventRecorder interface { Event(object runtime.Object, warning bool, reason string, message string, a ...any) EndingEvent(object runtime.Object, warning bool, reason string, message string, a ...any) Shutdown() }
func NewEventRecorder ¶
func NewEventRecorder(kubeClient kubernetes.Interface, scheme *runtime.Scheme, eventSource string, eventNode string, log logrus.FieldLogger) EventRecorder
type FalsePredicate ¶
type FalsePredicate struct{}
FalsePredicate always returns false for all kinds of events
func (FalsePredicate) Create ¶
func (f FalsePredicate) Create(event.CreateEvent) bool
Create always returns false
func (FalsePredicate) Delete ¶
func (f FalsePredicate) Delete(event.DeleteEvent) bool
Delete always returns false
func (FalsePredicate) Generic ¶
func (f FalsePredicate) Generic(event.GenericEvent) bool
Generic always returns false
func (FalsePredicate) Update ¶
func (f FalsePredicate) Update(event.UpdateEvent) bool
Update always returns false
type InternalLW ¶
type InternalLW struct { Client kbclient.WithWatch Namespace string ObjectList kbclient.ObjectList }
func (*InternalLW) List ¶
func (lw *InternalLW) List(options metav1.ListOptions) (runtime.Object, error)
func (*InternalLW) Watch ¶
func (lw *InternalLW) Watch(options metav1.ListOptions) (watch.Interface, error)
type LoadAffinity ¶
type LoadAffinity struct { // NodeSelector specifies the label selector to match nodes NodeSelector metav1.LabelSelector `json:"nodeSelector"` }
type MapUpdateFunc ¶
type MapUpdateFunc = TypedMapUpdateFunc[client.Object, reconcile.Request]
type PeriodicalEnqueueSource ¶
PeriodicalEnqueueSource is an implementation of interface sigs.k8s.io/controller-runtime/pkg/source/Source It reads the specific resources from Kubernetes/cache and enqueues them into the queue to trigger the reconcile logic periodically
func NewPeriodicalEnqueueSource ¶
func NewPeriodicalEnqueueSource( logger logrus.FieldLogger, client client.Client, objList client.ObjectList, period time.Duration, option PeriodicalEnqueueSourceOption, ) *PeriodicalEnqueueSource
func (*PeriodicalEnqueueSource) Start ¶
func (p *PeriodicalEnqueueSource) Start(ctx context.Context, q workqueue.TypedRateLimitingInterface[reconcile.Request]) error
Start enqueue items periodically
func (*PeriodicalEnqueueSource) String ¶
func (p *PeriodicalEnqueueSource) String() string
type PeriodicalEnqueueSourceOption ¶
type PeriodicalEnqueueSourceOption struct { OrderFunc func(objList client.ObjectList) client.ObjectList Predicates []predicate.Predicate // the predicates only apply to the GenericEvent }
type PodResources ¶
type ResourceDeletionStatusTracker ¶
type ResourceDeletionStatusTracker interface { // Add informs the tracker that a polling is in progress to check namespace deletion status. Add(kind, ns, name string) // Delete informs the tracker that a namespace deletion is completed. Delete(kind, ns, name string) // Contains returns true if the tracker is tracking the namespace deletion progress. Contains(kind, ns, name string) bool }
resourceDeletionStatusTracker keeps track of items pending deletion.
func NewResourceDeletionStatusTracker ¶
func NewResourceDeletionStatusTracker() ResourceDeletionStatusTracker
NewResourceDeletionStatusTracker returns a new ResourceDeletionStatusTracker.
type SpecChangePredicate ¶
SpecChangePredicate implements a default update predicate function on Spec change As Velero doesn't enable subresource in CRDs, we cannot use the object's metadata.generation field to check the spec change More details about the generation field refer to https://github.com/kubernetes-sigs/controller-runtime/blob/v0.12.2/pkg/predicate/predicate.go#L156
func (SpecChangePredicate) Update ¶
func (SpecChangePredicate) Update(e event.UpdateEvent) bool
type TypedMapUpdateFunc ¶
type TypedMapUpdateFunc[object any, request comparable] func(context.Context, object) []request