Skip to content

Commit 14cef07

Browse files
committed
Complete kopf creation handler
1 parent 19b2387 commit 14cef07

18 files changed

+547
-270
lines changed

docs/crd.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Celery spec defines the desired state and configuration parameters for running a custom celery resource in a Kubernetes cluster.
2+
3+
It currently supports these parameters-
4+
5+
- `image` [Required]- Container image name to run in the worker and flower deployments
6+
- `imagePullPolicy` - Image pull policy. One of Always, Never, IfNotPresent
7+
- `imagePullSecrets` - ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used. If specified, these secrets will be passed to individual puller implementations for them to use. Read more: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod
8+
- `appName` [Required]- Application name for worker and flower deployments, will be suffixed accordingly
9+
- `celeryApp` [Required] - Celery app instance to use (e.g. module.celery_app_attr_name)
10+
- `celeryVersion` - Celery version
11+
- `workerReplicas` - Number of worker pods to be run. Default is 1
12+
- `flowerReplicas` - Number of flower pods to be run. Default is 1
13+
- `workerSpec` - Worker deployment-specific parameters
14+
+ `args` - Arguments to the celery worker command. The docker image's CMD is used if this is not provided. Similar to: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
15+
+ `env` - EnvVar represents an environment variable present in a Container. Similar to: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
16+
+ `nodeSelector` - A map of key-value pairs. For the pod/worker to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels. Read more: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
17+
+ `resources` - Compute Resources required by the worker container. Cannot be updated. Read more: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
18+
- `flowerSpec` - Flower deployment specific parameters
19+
+ `args` - Arguments to the celery flower command. Similar to: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
20+
+ `env` - EnvVar represents an environment variable present in a Container. Similar to: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
21+
+ `nodeSelector` - A map of key-value pairs. For the pod/worker to be eligible to run on a node, the node must have each of the indicated key-value pairs as labels. Read more: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
22+
+ `resources` - Compute Resources required by the worker container. Cannot be updated. Read more: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
23+
+ `service` - Service defines the template for the associated Kubernetes Service object for exposing Flower UI. Read more: https://kubernetes.io/docs/concepts/services-networking/service/
24+
- `initContainers` - List of initialization containers belonging to the worker and flower pods. Read more: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
25+
- `volumes` - Define some extra Kubernetes Volumes for Celery cluster pods. Accepts a list of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes
26+
- `volumeMounts` - Define some extra Kubernetes Volume mounts for Celery cluster pods. More info: https://kubernetes.io/docs/concepts/storage/volumes/
27+
- `livenessProbe` - Periodic probe of container liveness. Read more: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
28+
- `readinessProbe` - Periodic probe of container readiness. Read more: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

handlers.py

Lines changed: 0 additions & 264 deletions
This file was deleted.

kubernetes_utils/__init__.py

Whitespace-only changes.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from typing import List
2+
from kubernetes import client as k8s
3+
from kubernetes_utils.pod_generator import PodGenerator
4+
from models.celery_custom_resource import CeleryCustomResource
5+
6+
7+
class FlowerDeploymentGenerator(object):
8+
9+
def __init__(self, namespace: str, celery_cr: CeleryCustomResource):
10+
self.namespace = namespace
11+
self.celery_cr = celery_cr
12+
13+
def get_flower_deployment(self) -> k8s.V1Deployment:
14+
template = k8s.V1PodTemplateSpec(
15+
metadata=k8s.V1ObjectMeta(
16+
labels={"app": f'{self.celery_cr.app_name}-celery-flower'}
17+
),
18+
spec=self.get_flower_pod().spec
19+
)
20+
deployment_spec = k8s.V1DeploymentSpec(
21+
replicas=self.celery_cr.worker_replicas,
22+
template=template,
23+
selector={'matchLabels': {'app': f'{self.celery_cr.app_name}-celery-flower'}}
24+
)
25+
26+
return k8s.V1Deployment(
27+
api_version="apps/v1",
28+
kind="Deployment",
29+
metadata=k8s.V1ObjectMeta(name=f'{self.celery_cr.app_name}-celery-flower'),
30+
spec=deployment_spec
31+
)
32+
33+
def get_flower_pod(self) -> k8s.V1Pod:
34+
return PodGenerator(
35+
namespace=self.namespace,
36+
image=self.celery_cr.image,
37+
image_pull_policy=self.celery_cr.image_pull_policy,
38+
image_pull_secrets=self.celery_cr.image_pull_secrets,
39+
name=f"{self.celery_cr.app_name}-celery-flower",
40+
container_name='flower',
41+
volume_mounts=self.celery_cr.volume_mounts,
42+
volumes=self.celery_cr.volumes,
43+
init_containers=self.celery_cr.init_containers,
44+
cmds=["flower"],
45+
envs=self.celery_cr.flower_spec.env,
46+
args=self.__get_flower_container_args(
47+
self.celery_cr.celery_app, self.celery_cr.flower_spec.args
48+
),
49+
node_selectors=self.celery_cr.flower_spec.node_selector,
50+
resources=self.celery_cr.flower_spec.resources.to_dict(),
51+
readiness_probe=self.celery_cr.readiness_probe,
52+
liveness_probe=self.celery_cr.liveness_probe
53+
).gen_pod()
54+
55+
def get_flower_svc(self) -> k8s.V1Service:
56+
svc_template = self.celery_cr.flower_spec.service
57+
metadata = {
58+
'name': f'{self.celery_cr.app_name}-celery-flower'
59+
}
60+
return k8s.V1Service(
61+
metadata=metadata,
62+
spec=svc_template.get('spec')
63+
)
64+
65+
def __get_flower_container_args(
66+
self, celery_app: str, args: List[str]
67+
) -> List[str]:
68+
base_args = [f"--app={celery_app}", "flower"]
69+
if args:
70+
base_args.extend(args)
71+
return base_args

0 commit comments

Comments
 (0)