Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build-template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ objects:
metadata:
name: ${NAME}
spec:
successfulBuildsHistoryLimit: 2
failedBuildsHistoryLimit: 1
output:
to:
kind: ImageStreamTag
Expand Down
32 changes: 32 additions & 0 deletions helm/helm-vars-dev-standalone.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Standalone mode for development
# Usage: helm template poolboy-dev helm -f helm/helm-vars-dev-standalone.yaml | oc apply -f -

clusterDomain: apps-crc.testing

# Standalone mode - single operator pod handles everything
operatorMode: standalone

namespace:
name: poolboy-dev
create: false

image:
repository: image-registry.openshift-image-registry.svc:5000/poolboy-dev/poolboy
tagOverride: latest
pullPolicy: Always

# ===========================================
# Disable distributed components
# ===========================================
redis:
enabled: false

worker:
enabled: false

scheduler:
enabled: false

flower:
enabled: false

73 changes: 73 additions & 0 deletions helm/helm-vars-dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Development environment values for Poolboy
# Usage: helm template poolboy-dev helm -f helm/helm-vars-dev.yaml | oc apply -f -

clusterDomain: apps-crc.testing

# Use standalone mode for testing watches without Celery overhead
operatorMode: standalone

namespace:
name: poolboy-dev
create: false

image:
repository: image-registry.openshift-image-registry.svc:5000/poolboy-dev/poolboy
tagOverride: latest
pullPolicy: Always

# ===========================================
# Redis Configuration
# ===========================================
redis:
enabled: true

# ===========================================
# Worker Configuration
# ===========================================
worker:
enabled: true
replicas: 1
hpa:
enabled: false

# ===========================================
# Scheduler Configuration
# ===========================================
scheduler:
enabled: true

# ===========================================
# Celery Flower - Task Monitoring UI
# ===========================================
flower:
enabled: true
route:
enabled: true

# ===========================================
# Worker Settings (simplified)
# ===========================================
useWorkers:
lockRetryCountdown: 3
errorRetryCountdown: 30
partitions:
resourcePool: 2
resourceHandle: 4
resourceClaim: 4

# ===========================================
# Scheduled Tasks (safety net - watches handle real-time events)
# ===========================================
schedules:
maintain-all-pools:
enabled: true
schedule:
seconds: 30 # No PoolWatch yet, keep frequent
maintain-all-handles:
enabled: true
schedule:
seconds: 60 # Needs polling for lifespan.end triggers
maintain-all-claims:
enabled: true
schedule:
seconds: 60 # Same as old daemon interval
18 changes: 18 additions & 0 deletions helm/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,21 @@ Define the image to deploy
{{- printf "%s:v%s" .Values.image.repository .Chart.AppVersion -}}
{{- end -}}
{{- end -}}

{{/*
Determine if operator is running in standalone mode.
Backward compatibility mapping:
- 'all-in-one' -> standalone (true)
- 'standalone' -> standalone (true)
- 'manager', 'resource-handler', 'resource-watch' -> distributed (false)
- 'distributed' -> distributed (false)
- any other value -> distributed (false)
*/}}
{{- define "poolboy.isStandalone" -}}
{{- $mode := .Values.operatorMode | default "distributed" -}}
{{- if or (eq $mode "standalone") (eq $mode "all-in-one") -}}
true
{{- else -}}
false
{{- end -}}
{{- end -}}
34 changes: 13 additions & 21 deletions helm/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,51 +6,43 @@ metadata:
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
app.kubernetes.io/component: operator
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "poolboy.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: operator
strategy:
type: Recreate
template:
metadata:
labels:
{{- include "poolboy.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: operator
spec:
containers:
- name: manager
env:
- name: KOPF_OPERATORS
value: main.py
- name: CLUSTER_DOMAIN
value: "{{ .Values.clusterDomain }}"
- name: MANAGE_CLAIMS_INTERVAL
value: "{{ .Values.manageClaimsInterval }}"
- name: MANAGE_HANDLES_INTERVAL
value: "{{ .Values.manageHandlesInterval }}"
- name: MANAGE_POOLS_INTERVAL
value: "{{ .Values.managePoolsInterval }}"
- name: IS_STANDALONE
value: {{ include "poolboy.isStandalone" . | quote }}
- name: OPERATOR_DOMAIN
value: {{ include "poolboy.operatorDomain" . }}
- name: OPERATOR_MODE
value: "{{ .Values.operatorMode }}"
{{- if eq .Values.operatorMode "manager" }}
- name: RESOURCE_HANDLER_COUNT
value: "{{ .Values.resourceHandlerCount }}"
{{- if .Values.resourceHandlerResources }}
- name: RESOURCE_HANDLER_RESOURCES
value: {{ .Values.resourceHandlerResources | toJson | quote }}
{{- end }}
{{- if .Values.resourceWatchResources }}
- name: RESOURCE_WATCH_RESOURCES
value: {{ .Values.resourceWatchResources | toJson | quote }}
{{- end }}
{{- end }}
{{- if .Values.enablePrometheusMetrics}}
- name: METRICS_ENABLED
value: "true"
{{- end }}
- name: RESOURCE_REFRESH_INTERVAL
value: "{{ .Values.resourceRefreshInterval }}"
{{- if .Values.worker.enabled }}
envFrom:
- configMapRef:
name: {{ include "poolboy.name" . }}-useworkers-cm
{{- end }}
image: "{{ include "poolboy.image" . }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
resources:
Expand All @@ -64,7 +56,7 @@ spec:
- name: kopf
containerPort: 8080
- name: metrics
containerPort: 9091
containerPort: 9090
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
Expand Down
26 changes: 13 additions & 13 deletions helm/templates/metrics-credentials.yaml
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
{{- if .Values.enablePrometheusMetrics -}}
apiVersion: secretgenerator.mittwald.de/v1alpha1
kind: StringSecret
{{- $secretName := printf "%s-metrics-credentials" (include "poolboy.name" .) }}
{{- $existingSecret := lookup "v1" "Secret" (include "poolboy.namespaceName" .) $secretName }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "poolboy.name" . }}-metrics-credentials
name: {{ $secretName }}
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
annotations:
secret-generator.v1.mittwald.de/type: basic-auth
spec:
forceRegenerate: false
data:
metrics_username: {{ .Values.metrics.username }}
fields:
- fieldName: metrics_password
encoding: "hex"
length: "32"
type: Opaque
data:
metrics_username: {{ .Values.metrics.username | b64enc }}
{{- if and $existingSecret $existingSecret.data.metrics_password }}
metrics_password: {{ $existingSecret.data.metrics_password }}
{{- else }}
metrics_password: {{ randAlphaNum 32 | b64enc }}
{{- end }}
{{- end }}
1 change: 1 addition & 0 deletions helm/templates/service-monitor.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ spec:
selector:
matchLabels:
{{- include "poolboy.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: operator
namespaceSelector:
matchNames:
- {{ include "poolboy.namespaceName" . }}
Expand Down
2 changes: 2 additions & 0 deletions helm/templates/service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ metadata:
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
app.kubernetes.io/component: operator
spec:
type: {{ .Values.service.type }}
{{- with .Values.service.ports }}
Expand All @@ -14,5 +15,6 @@ spec:
{{- end }}
selector:
{{- include "poolboy.selectorLabels" . | nindent 4 }}
app.kubernetes.io/component: operator
sessionAffinity: None
{{- end -}}
20 changes: 20 additions & 0 deletions helm/templates/worker/flower-credentials.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{{- if and .Values.flower.enabled .Values.flower.auth.enabled }}
{{- $secretName := printf "%s-flower-credentials" (include "poolboy.name" .) }}
{{- $existingSecret := lookup "v1" "Secret" (include "poolboy.namespaceName" .) $secretName }}
apiVersion: v1
kind: Secret
metadata:
name: {{ $secretName }}
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
app.kubernetes.io/component: flower
type: Opaque
data:
username: {{ .Values.flower.auth.username | default "admin" | b64enc }}
{{- if and $existingSecret $existingSecret.data.password }}
password: {{ $existingSecret.data.password }}
{{- else }}
password: {{ randAlphaNum 32 | b64enc }}
{{- end }}
{{- end }}
101 changes: 101 additions & 0 deletions helm/templates/worker/flower-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
{{- if .Values.flower.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "poolboy.name" . }}-flower
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
app.kubernetes.io/component: flower
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: {{ .Values.flower.replicas | default 1 }}
selector:
matchLabels:
{{- include "poolboy.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: flower
template:
metadata:
labels:
{{- include "poolboy.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: flower
spec:
containers:
- name: flower
image: "{{ .Values.flower.image.repository }}:{{ .Values.flower.image.tag }}"
imagePullPolicy: {{ .Values.flower.image.pullPolicy | default "IfNotPresent" }}
command: ["celery"]
args:
- "--broker={{ printf "redis://%s-redis:6379/0" (include "poolboy.name" .) }}"
- "--result-backend={{ printf "redis://%s-redis:6379/1" (include "poolboy.name" .) }}"
- "flower"
- "--port={{ .Values.flower.port | default 5555 }}"
{{- if .Values.flower.auth.enabled }}
- "--basic-auth=$(FLOWER_USERNAME):$(FLOWER_PASSWORD)"
{{- end }}
{{- if .Values.flower.config.maxTasks }}
- "--max-tasks={{ .Values.flower.config.maxTasks }}"
{{- end }}
{{- if .Values.flower.config.purgeOfflineWorkers }}
- "--purge_offline_workers={{ .Values.flower.config.purgeOfflineWorkers }}"
{{- end }}
{{- if .Values.flower.persistence.enabled }}
- "--persistent=true"
- "--db=/data/flower.db"
{{- end }}
ports:
- name: flower
containerPort: {{ .Values.flower.port | default 5555 }}
envFrom:
{{- with .Values.flower.extraEnvFrom }}
{{- toYaml . | nindent 12 }}
{{- end }}
env:
{{- range $key, $value := .Values.flower.extraEnvVars }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
{{- if .Values.flower.auth.enabled }}
- name: FLOWER_USERNAME
valueFrom:
secretKeyRef:
name: {{ include "poolboy.name" . }}-flower-credentials
key: username
- name: FLOWER_PASSWORD
valueFrom:
secretKeyRef:
name: {{ include "poolboy.name" . }}-flower-credentials
key: password
{{- end }}
livenessProbe:
httpGet:
path: /healthcheck
port: flower
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /healthcheck
port: flower
initialDelaySeconds: 5
periodSeconds: 10
resources:
{{- toYaml .Values.flower.resources | nindent 12 }}
volumeMounts:
- name: flower-data
mountPath: /data
volumes:
- name: flower-data
{{- if .Values.flower.persistence.enabled }}
persistentVolumeClaim:
claimName: {{ include "poolboy.name" . }}-flower-pvc
{{- else }}
emptyDir: {}
{{- end }}
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "poolboy.serviceAccountName" . }}
{{- end }}
Loading