1
- import os
2
- import kopf
3
- import kubernetes
4
- import requests
5
- import constants
6
1
from math import ceil
7
2
from collections import namedtuple
3
+ import requests
4
+ import kubernetes
5
+ import kopf
6
+ import constants
7
+ from models .celery_custom_resource import celery_custom_resource_from_dict
8
+ from kubernetes_utils .worker_deployment_generator import WorkerDeploymentGenerator
9
+ from kubernetes_utils .flower_deployment_generator import FlowerDeploymentGenerator
8
10
9
- from deployment_utils import (
10
- deploy_celery_workers ,
11
- deploy_flower ,
12
- expose_flower_service
13
- )
14
- from update_utils import (
11
+ from utilities .patching import (
15
12
update_all_deployments ,
16
13
update_worker_deployment ,
17
14
update_flower_deployment
18
15
)
19
16
20
17
21
18
@kopf .on .create ('celeryproject.org' , 'v1alpha1' , 'celery' )
22
- def create_fn (spec , name , namespace , logger , ** kwargs ):
19
+ def create_fn (spec , namespace , logger , ** kwargs ):
23
20
"""
24
21
Celery custom resource creation handler
25
22
"""
26
-
27
- # 1. Validation of spec
28
- val , err_msg = validate_spec (spec )
29
- if err_msg :
30
- status = 'Failed validation'
31
- raise kopf .PermanentError (f"{ err_msg } . Got { val } " )
32
-
33
23
api = kubernetes .client .CoreV1Api ()
34
24
apps_api_instance = kubernetes .client .AppsV1Api ()
35
-
36
- # 2. Deployment for celery workers
37
- worker_deployment = deploy_celery_workers (
38
- apps_api_instance , namespace , spec , logger
25
+ try :
26
+ celery_cr = celery_custom_resource_from_dict (dict (spec ))
27
+ except Exception as e :
28
+ raise kopf .PermanentError (e )
29
+
30
+ # deploy worker
31
+ worker_deployment = WorkerDeploymentGenerator (
32
+ namespace = namespace , celery_cr = celery_cr
33
+ ).get_worker_deployment ()
34
+ kopf .adopt (worker_deployment )
35
+ apps_api_instance .create_namespaced_deployment (
36
+ namespace = namespace ,
37
+ body = worker_deployment
39
38
)
40
39
41
- # 3. Deployment for flower
42
- flower_deployment = deploy_flower (
43
- apps_api_instance , namespace , spec , logger
40
+ # deploy flower
41
+ flower_dep_gen_instance = FlowerDeploymentGenerator (
42
+ namespace = namespace , celery_cr = celery_cr
44
43
)
45
-
46
- # 4. Expose flower service
47
- flower_svc = expose_flower_service (
48
- api , namespace , spec , logger
44
+ flower_deployment = flower_dep_gen_instance .get_flower_deployment ()
45
+ kopf .adopt (flower_deployment )
46
+ apps_api_instance .create_namespaced_deployment (
47
+ namespace = namespace ,
48
+ body = flower_deployment
49
49
)
50
50
51
- children = [
52
- {
53
- 'name' : worker_deployment .metadata .name ,
54
- 'replicas' : worker_deployment .spec .replicas ,
55
- 'kind' : constants .DEPLOYMENT_KIND ,
56
- 'type' : constants .WORKER_TYPE
57
- },
58
- {
59
- 'name' : flower_deployment .metadata .name ,
60
- 'replicas' : flower_deployment .spec .replicas ,
61
- 'kind' : constants .DEPLOYMENT_KIND ,
62
- 'type' : constants .FLOWER_TYPE
63
- },
64
- {
65
- 'name' : flower_svc .metadata .name ,
66
- 'spec' : flower_svc .spec .to_dict (),
67
- 'kind' : constants .SERVICE_KIND ,
68
- 'type' : constants .FLOWER_TYPE
69
- }
70
- ]
51
+ # expose service
52
+ flower_svc = flower_dep_gen_instance .get_flower_svc ()
53
+ kopf .adopt (flower_svc )
54
+ api .create_namespaced_service (namespace = namespace , body = flower_svc )
71
55
56
+ # TODO: Decide the return structure
72
57
return {
73
- 'children' : children ,
74
- 'children_count' : len (children ),
58
+ 'children' : 3 ,
75
59
'status' : constants .STATUS_CREATED
76
60
}
77
61
@@ -172,7 +156,7 @@ def get_flower_svc_host(status):
172
156
173
157
174
158
@kopf .timer ('celeryproject.org' , 'v1alpha1' , 'celery' ,
175
- initial_delay = 5 , interval = 10 , idle = 10 )
159
+ initial_delay = 50000 , interval = 10000 , idle = 10 )
176
160
def message_queue_length (spec , status , ** kwargs ):
177
161
flower_svc_host = get_flower_svc_host (status )
178
162
if not flower_svc_host :
@@ -242,23 +226,4 @@ def horizontal_autoscale(spec, status, namespace, **kwargs):
242
226
return {
243
227
'deploymentName' : updated_deployment .metadata .name ,
244
228
'updated_num_of_replicas' : updated_num_of_replicas
245
- }
246
-
247
-
248
- def validate_stuff (spec ):
249
- """
250
- 1. If the deployment/svc already exists, k8s throws error
251
- 2. Response and spec classes and enums
252
- """
253
- pass
254
-
255
-
256
- def validate_spec (spec ):
257
- """
258
- Validates the incoming spec
259
- @returns - True/False, Error Message
260
- """
261
- # size = spec.get('size')
262
- # if not size:
263
- # return size, "Size must be set"
264
- return None , None
229
+ }
0 commit comments