Skip to content

Commit

Permalink
feat: support user-provided pod template (PodSpec) in the ApicurioReg…
Browse files Browse the repository at this point in the history
…istry CRD (preview feature)
  • Loading branch information
jsenko committed May 29, 2023
1 parent 4c75ce3 commit 63cfac2
Show file tree
Hide file tree
Showing 9 changed files with 765 additions and 72 deletions.
159 changes: 145 additions & 14 deletions api/v1/apicurioregistry_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ limitations under the License.
package v1

import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
core "k8s.io/api/core/v1"
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// ### Spec
Expand All @@ -36,7 +36,7 @@ type ApicurioRegistrySpecConfiguration struct {
UI ApicurioRegistrySpecConfigurationUI `json:"ui,omitempty"`
LogLevel string `json:"logLevel,omitempty"`
Security ApicurioRegistrySpecConfigurationSecurity `json:"security,omitempty"`
Env []corev1.EnvVar `json:"env,omitempty"`
Env []core.EnvVar `json:"env,omitempty"`
}

type ApicurioRegistrySpecConfigurationDataSource struct {
Expand Down Expand Up @@ -100,18 +100,149 @@ type ApicurioRegistrySpecDeploymentMetadata struct {
}

type ApicurioRegistrySpecDeployment struct {
Replicas int32 `json:"replicas,omitempty"`
Host string `json:"host,omitempty"`
Affinity *corev1.Affinity `json:"affinity,omitempty"`
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
Replicas int32 `json:"replicas,omitempty"`
Host string `json:"host,omitempty"`
Affinity *core.Affinity `json:"affinity,omitempty"`
Tolerations []core.Toleration `json:"tolerations,omitempty"`
// Metadata applied to the Deployment pod template.
Metadata ApicurioRegistrySpecDeploymentMetadata `json:"metadata,omitempty"`
// Image set in the Deployment pod template. Overrides the values in the REGISTRY_IMAGE_MEM, REGISTRY_IMAGE_KAFKASQL and REGISTRY_IMAGE_SQL operator environment variables.
Image string `json:"image,omitempty"`
// List of secrets in the same namespace to use for pulling the Deployment pod image.
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
ImagePullSecrets []core.LocalObjectReference `json:"imagePullSecrets,omitempty"`
// Configure how the Operator manages Kubernetes resources
ManagedResources ApicurioRegistrySpecDeploymentManagedResources `json:"managedResources,omitempty"`

PodSpecPreview ApicurioRegistrySpecDeploymentPodSpecPreview `json:"podSpecPreview,omitempty"`
}

// This is a slightly modified copy of k8s.io/api/core/v1.PodSpec:
// - Allow empty field "containers"
// - Comments removed to avoid an error "Too long: must have at most 262144 bytes" when executing "kubectl apply".
// By using kubectl apply to create/update resources, an annotation "kubectl.kubernetes.io/last-applied-configuration"
// is created by K8s API to store the latest version of the resource.
// However, it has a size limit and if the CRD has many long descriptions, it will result the error.
type ApicurioRegistrySpecDeploymentPodSpecPreview struct {
Volumes []core.Volume `json:"volumes,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,1,rep,name=volumes"`

InitContainers []core.Container `json:"initContainers,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,20,rep,name=initContainers"`

Containers []ApicurioRegistrySpecDeploymentPodSpecPreviewContainer `json:"containers,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,2,rep,name=containers"`

EphemeralContainers []core.EphemeralContainer `json:"ephemeralContainers,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,34,rep,name=ephemeralContainers"`

RestartPolicy core.RestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,3,opt,name=restartPolicy,casttype=RestartPolicy"`

TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty" protobuf:"varint,4,opt,name=terminationGracePeriodSeconds"`

ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty" protobuf:"varint,5,opt,name=activeDeadlineSeconds"`

DNSPolicy core.DNSPolicy `json:"dnsPolicy,omitempty" protobuf:"bytes,6,opt,name=dnsPolicy,casttype=DNSPolicy"`

NodeSelector map[string]string `json:"nodeSelector,omitempty" protobuf:"bytes,7,rep,name=nodeSelector"`

ServiceAccountName string `json:"serviceAccountName,omitempty" protobuf:"bytes,8,opt,name=serviceAccountName"`

DeprecatedServiceAccount string `json:"serviceAccount,omitempty" protobuf:"bytes,9,opt,name=serviceAccount"`

AutomountServiceAccountToken *bool `json:"automountServiceAccountToken,omitempty" protobuf:"varint,21,opt,name=automountServiceAccountToken"`

NodeName string `json:"nodeName,omitempty" protobuf:"bytes,10,opt,name=nodeName"`

HostNetwork bool `json:"hostNetwork,omitempty" protobuf:"varint,11,opt,name=hostNetwork"`

HostPID bool `json:"hostPID,omitempty" protobuf:"varint,12,opt,name=hostPID"`

HostIPC bool `json:"hostIPC,omitempty" protobuf:"varint,13,opt,name=hostIPC"`

ShareProcessNamespace *bool `json:"shareProcessNamespace,omitempty" protobuf:"varint,27,opt,name=shareProcessNamespace"`

SecurityContext *core.PodSecurityContext `json:"securityContext,omitempty" protobuf:"bytes,14,opt,name=securityContext"`

ImagePullSecrets []core.LocalObjectReference `json:"imagePullSecrets,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,15,rep,name=imagePullSecrets"`

Hostname string `json:"hostname,omitempty" protobuf:"bytes,16,opt,name=hostname"`

Subdomain string `json:"subdomain,omitempty" protobuf:"bytes,17,opt,name=subdomain"`

Affinity *core.Affinity `json:"affinity,omitempty" protobuf:"bytes,18,opt,name=affinity"`

SchedulerName string `json:"schedulerName,omitempty" protobuf:"bytes,19,opt,name=schedulerName"`

Tolerations []core.Toleration `json:"tolerations,omitempty" protobuf:"bytes,22,opt,name=tolerations"`

HostAliases []core.HostAlias `json:"hostAliases,omitempty" patchStrategy:"merge" patchMergeKey:"ip" protobuf:"bytes,23,rep,name=hostAliases"`

PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,24,opt,name=priorityClassName"`

Priority *int32 `json:"priority,omitempty" protobuf:"bytes,25,opt,name=priority"`

DNSConfig *core.PodDNSConfig `json:"dnsConfig,omitempty" protobuf:"bytes,26,opt,name=dnsConfig"`

ReadinessGates []core.PodReadinessGate `json:"readinessGates,omitempty" protobuf:"bytes,28,opt,name=readinessGates"`

RuntimeClassName *string `json:"runtimeClassName,omitempty" protobuf:"bytes,29,opt,name=runtimeClassName"`

EnableServiceLinks *bool `json:"enableServiceLinks,omitempty" protobuf:"varint,30,opt,name=enableServiceLinks"`

PreemptionPolicy *core.PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,31,opt,name=preemptionPolicy"`

Overhead core.ResourceList `json:"overhead,omitempty" protobuf:"bytes,32,opt,name=overhead"`

TopologySpreadConstraints []core.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty" patchStrategy:"merge" patchMergeKey:"topologyKey" protobuf:"bytes,33,opt,name=topologySpreadConstraints"`

SetHostnameAsFQDN *bool `json:"setHostnameAsFQDN,omitempty" protobuf:"varint,35,opt,name=setHostnameAsFQDN"`

OS *core.PodOS `json:"os,omitempty" protobuf:"bytes,36,opt,name=os"`
}

// This is a slightly modified copy of k8s.io/api/core/v1.Container:
// - Allow empty field "name"
// - Comments removed, see ApicurioRegistrySpecDeploymentPodSpecPreview for an explanation
type ApicurioRegistrySpecDeploymentPodSpecPreviewContainer struct {
Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`

Image string `json:"image,omitempty" protobuf:"bytes,2,opt,name=image"`

Command []string `json:"command,omitempty" protobuf:"bytes,3,rep,name=command"`

Args []string `json:"args,omitempty" protobuf:"bytes,4,rep,name=args"`

WorkingDir string `json:"workingDir,omitempty" protobuf:"bytes,5,opt,name=workingDir"`

Ports []core.ContainerPort `json:"ports,omitempty" patchStrategy:"merge" patchMergeKey:"containerPort" protobuf:"bytes,6,rep,name=ports"`

EnvFrom []core.EnvFromSource `json:"envFrom,omitempty" protobuf:"bytes,19,rep,name=envFrom"`

Env []core.EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"`

Resources core.ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"`

VolumeMounts []core.VolumeMount `json:"volumeMounts,omitempty" patchStrategy:"merge" patchMergeKey:"mountPath" protobuf:"bytes,9,rep,name=volumeMounts"`

VolumeDevices []core.VolumeDevice `json:"volumeDevices,omitempty" patchStrategy:"merge" patchMergeKey:"devicePath" protobuf:"bytes,21,rep,name=volumeDevices"`

LivenessProbe *core.Probe `json:"livenessProbe,omitempty" protobuf:"bytes,10,opt,name=livenessProbe"`

ReadinessProbe *core.Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`

StartupProbe *core.Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"`

Lifecycle *core.Lifecycle `json:"lifecycle,omitempty" protobuf:"bytes,12,opt,name=lifecycle"`

TerminationMessagePath string `json:"terminationMessagePath,omitempty" protobuf:"bytes,13,opt,name=terminationMessagePath"`

TerminationMessagePolicy core.TerminationMessagePolicy `json:"terminationMessagePolicy,omitempty" protobuf:"bytes,20,opt,name=terminationMessagePolicy,casttype=TerminationMessagePolicy"`

ImagePullPolicy core.PullPolicy `json:"imagePullPolicy,omitempty" protobuf:"bytes,14,opt,name=imagePullPolicy,casttype=PullPolicy"`

SecurityContext *core.SecurityContext `json:"securityContext,omitempty" protobuf:"bytes,15,opt,name=securityContext"`

Stdin bool `json:"stdin,omitempty" protobuf:"varint,16,opt,name=stdin"`

StdinOnce bool `json:"stdinOnce,omitempty" protobuf:"varint,17,opt,name=stdinOnce"`

TTY bool `json:"tty,omitempty" protobuf:"varint,18,opt,name=tty"`
}

type ApicurioRegistrySpecDeploymentManagedResources struct {
Expand All @@ -129,7 +260,7 @@ type ApicurioRegistryStatus struct {
// Information about the deployed application.
Info ApicurioRegistryStatusInfo `json:"info,omitempty"`
// List of status conditions.
Conditions []metav1.Condition `json:"conditions,omitempty"`
Conditions []meta.Condition `json:"conditions,omitempty"`
// List of resources managed by this operator.
ManagedResources []ApicurioRegistryStatusManagedResource `json:"managedResources,omitempty"`
}
Expand All @@ -150,8 +281,8 @@ type ApicurioRegistryStatusManagedResource struct {
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
type ApicurioRegistry struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
meta.TypeMeta `json:",inline"`
meta.ObjectMeta `json:"metadata,omitempty"`

Spec ApicurioRegistrySpec `json:"spec,omitempty"`
Status ApicurioRegistryStatus `json:"status,omitempty"`
Expand All @@ -160,9 +291,9 @@ type ApicurioRegistry struct {
// ApicurioRegistryList contains a list of ApicurioRegistry
// +kubebuilder:object:root=true
type ApicurioRegistryList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []ApicurioRegistry `json:"items"`
meta.TypeMeta `json:",inline"`
meta.ListMeta `json:"metadata,omitempty"`
Items []ApicurioRegistry `json:"items"`
}

func init() {
Expand Down
Loading

0 comments on commit 63cfac2

Please sign in to comment.