diff --git a/.gitignore b/.gitignore index 7afb26c0..0879e783 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ bld/ # Testing results coverage.json coverage.info +.vs diff --git a/src/KubeOps/Operator/Entities/Extensions/KubernetesObjectExtensions.cs b/src/KubeOps/Operator/Entities/Extensions/KubernetesObjectExtensions.cs new file mode 100644 index 00000000..5136bb41 --- /dev/null +++ b/src/KubeOps/Operator/Entities/Extensions/KubernetesObjectExtensions.cs @@ -0,0 +1,68 @@ +using k8s; +using k8s.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace KubeOps.Operator.Entities.Extensions +{ + public static class KubernetesObjectExtensions + { + public static TResource WithOwnerReference(this TResource resource, IKubernetesObject owner) + where TResource : IKubernetesObject + { + resource.Metadata.EnsureOwnerReferences().Add(owner.MakeOwnerReference()); + return resource; + } + + public static IList EnsureOwnerReferences(this V1ObjectMeta meta) + { + if (meta.OwnerReferences == null) + { + meta.OwnerReferences = new List(); + } + + return meta.OwnerReferences; + } + + public static V1OwnerReference MakeOwnerReference(this IKubernetesObject kubernetesObject) + => new V1OwnerReference(kubernetesObject.ApiVersion, kubernetesObject.Kind, kubernetesObject.Metadata.Name, kubernetesObject.Metadata.Uid); + + public static V1ObjectReference MakeObjectReference(this IKubernetesObject kubernetesObject) + => new V1ObjectReference() + { + ApiVersion = kubernetesObject.ApiVersion, + Kind = kubernetesObject.Kind, + Name = kubernetesObject.Metadata.Name, + NamespaceProperty = kubernetesObject.Metadata.NamespaceProperty, + ResourceVersion = kubernetesObject.Metadata.ResourceVersion, + Uid = kubernetesObject.Metadata.Uid + }; + + /* commented pending fleshing this out and improving after confirming event best practices + /// + /// Create an event for a kubernetesObject that can be applied to the cluster using the Create on + /// + /// The object to create an event for + /// A short reason tag, like Created, Updated, Reconciled + /// A human readable message to go with the event + /// A string corresponding to the event type, Normal or Warning + /// The component generating the event, it should be the name of the operator + /// + public static V1Event Event(this IKubernetesObject kubernetesObject, string reason, string message, string type = "Normal", string? component = null) => + new V1Event + { + Metadata = new V1ObjectMeta { Name = $"{kubernetesObject.Name()}.{DateTimeOffset.UtcNow.ToFileTime()}", NamespaceProperty = kubernetesObject.Namespace() }, + InvolvedObject = kubernetesObject.MakeObjectReference(), + Reason = reason, + Source = new V1EventSource { Component = component }, + Count = 1, + Message = message, + FirstTimestamp = DateTime.UtcNow, + LastTimestamp = DateTime.UtcNow, + Type = type + }; + */ + } +}