Skip to content

Commit 7a581ec

Browse files
authored
feat: verify deeploy resources with what has been paid in bc (#263)
* feat: verify deeploy resources with what has been paid in bc * feat: add storage limits in resource specs * chore: inc ver
1 parent d6b57e6 commit 7a581ec

3 files changed

Lines changed: 88 additions & 8 deletions

File tree

‎extensions/business/deeploy/deeploy_const.py‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class DEEPLOY_RESOURCES:
100100
# Resource types
101101
CPU = 'cpu'
102102
MEMORY = 'memory'
103+
STORAGE = 'storage'
103104

104105
# Units
105106
CORES = 'cores'
@@ -128,6 +129,53 @@ class DEFAULT_CONTAINER_RESOURCES:
128129
CPU = 1
129130
MEMORY = '512m'
130131

132+
JOB_TYPE_RESOURCE_SPECS = {
133+
# Generic Apps
134+
1: {DEEPLOY_RESOURCES.CPU: 1, DEEPLOY_RESOURCES.MEMORY: '2g', DEEPLOY_RESOURCES.STORAGE: '8g'}, # entry
135+
2: {DEEPLOY_RESOURCES.CPU: 2, DEEPLOY_RESOURCES.MEMORY: '4g', DEEPLOY_RESOURCES.STORAGE: '16g'}, # low1
136+
3: {DEEPLOY_RESOURCES.CPU: 2, DEEPLOY_RESOURCES.MEMORY: '8g', DEEPLOY_RESOURCES.STORAGE: '32g'}, # low2
137+
4: {DEEPLOY_RESOURCES.CPU: 3, DEEPLOY_RESOURCES.MEMORY: '12g', DEEPLOY_RESOURCES.STORAGE: '48g'}, # med1
138+
5: {DEEPLOY_RESOURCES.CPU: 6, DEEPLOY_RESOURCES.MEMORY: '14g', DEEPLOY_RESOURCES.STORAGE: '56g'}, # med2
139+
6: {DEEPLOY_RESOURCES.CPU: 8, DEEPLOY_RESOURCES.MEMORY: '22g', DEEPLOY_RESOURCES.STORAGE: '88g'}, # high1
140+
7: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g', DEEPLOY_RESOURCES.STORAGE: '120g'}, # high2
141+
8: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '62g', DEEPLOY_RESOURCES.STORAGE: '248g'}, # ultra1
142+
9: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g', DEEPLOY_RESOURCES.STORAGE: '496g'}, # ultra2
143+
# Services
144+
10: {DEEPLOY_RESOURCES.CPU: 1, DEEPLOY_RESOURCES.MEMORY: '2g', DEEPLOY_RESOURCES.STORAGE: '50g'}, # pgsql_low
145+
11: {DEEPLOY_RESOURCES.CPU: 2, DEEPLOY_RESOURCES.MEMORY: '4g', DEEPLOY_RESOURCES.STORAGE: '200g'}, # pgsql_med
146+
12: {DEEPLOY_RESOURCES.CPU: 1, DEEPLOY_RESOURCES.MEMORY: '2g', DEEPLOY_RESOURCES.STORAGE: '50g'}, # mysql_low
147+
13: {DEEPLOY_RESOURCES.CPU: 2, DEEPLOY_RESOURCES.MEMORY: '4g', DEEPLOY_RESOURCES.STORAGE: '200g'}, # mysql_med
148+
14: {DEEPLOY_RESOURCES.CPU: 1, DEEPLOY_RESOURCES.MEMORY: '2g', DEEPLOY_RESOURCES.STORAGE: '50g'}, # nosql_low
149+
15: {DEEPLOY_RESOURCES.CPU: 2, DEEPLOY_RESOURCES.MEMORY: '4g', DEEPLOY_RESOURCES.STORAGE: '200g'}, # nosql_med
150+
# Native Apps
151+
16: {DEEPLOY_RESOURCES.CPU: 3, DEEPLOY_RESOURCES.MEMORY: '14g'}, # n_entry
152+
17: {DEEPLOY_RESOURCES.CPU: 8, DEEPLOY_RESOURCES.MEMORY: '22g'}, # n_med1
153+
18: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g'}, # n_med2
154+
19: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '60g'}, # n_high
155+
20: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g'}, # n_ultra
156+
# GPU Extra
157+
21: {DEEPLOY_RESOURCES.CPU: 3, DEEPLOY_RESOURCES.MEMORY: '12g', DEEPLOY_RESOURCES.STORAGE: '48g'}, # g_entry + med1
158+
22: {DEEPLOY_RESOURCES.CPU: 6, DEEPLOY_RESOURCES.MEMORY: '14g', DEEPLOY_RESOURCES.STORAGE: '56g'}, # g_entry + med2
159+
23: {DEEPLOY_RESOURCES.CPU: 3, DEEPLOY_RESOURCES.MEMORY: '14g'}, # g_entry + n_entry
160+
24: {DEEPLOY_RESOURCES.CPU: 8, DEEPLOY_RESOURCES.MEMORY: '22g'}, # g_entry + n_med1
161+
25: {DEEPLOY_RESOURCES.CPU: 6, DEEPLOY_RESOURCES.MEMORY: '14g', DEEPLOY_RESOURCES.STORAGE: '56g'}, # g_med + med2
162+
26: {DEEPLOY_RESOURCES.CPU: 8, DEEPLOY_RESOURCES.MEMORY: '22g', DEEPLOY_RESOURCES.STORAGE: '88g'}, # g_med + high1
163+
27: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g', DEEPLOY_RESOURCES.STORAGE: '120g'}, # g_med + high2
164+
28: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '62g', DEEPLOY_RESOURCES.STORAGE: '248g'}, # g_med + ultra1
165+
29: {DEEPLOY_RESOURCES.CPU: 8, DEEPLOY_RESOURCES.MEMORY: '22g'}, # g_med + n_med1
166+
30: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g'}, # g_med + n_med2
167+
31: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '60g'}, # g_med + n_high
168+
32: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g', DEEPLOY_RESOURCES.STORAGE: '120g'}, # g_high + high2
169+
33: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '62g', DEEPLOY_RESOURCES.STORAGE: '248g'}, # g_high + ultra1
170+
34: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g', DEEPLOY_RESOURCES.STORAGE: '496g'}, # g_high + ultra2
171+
35: {DEEPLOY_RESOURCES.CPU: 12, DEEPLOY_RESOURCES.MEMORY: '30g'}, # g_high + n_med2
172+
36: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '60g'}, # g_high + n_high
173+
37: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g'}, # g_high + n_ultra
174+
38: {DEEPLOY_RESOURCES.CPU: 16, DEEPLOY_RESOURCES.MEMORY: '62g', DEEPLOY_RESOURCES.STORAGE: '248g'}, # g_ultra + ultra1
175+
39: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g', DEEPLOY_RESOURCES.STORAGE: '496g'}, # g_ultra + ultra2
176+
40: {DEEPLOY_RESOURCES.CPU: 22, DEEPLOY_RESOURCES.MEMORY: '124g'}, # g_ultra + n_ultra
177+
}
178+
131179
class DEEPLOY_PLUGIN_DATA:
132180
PLUGIN_SIGNATURE = "plugin_signature"
133181
PLUGIN_INSTANCE = "plugin_instance"

‎extensions/business/deeploy/deeploy_mixin.py‎

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from naeural_core import constants as ct
44

55
from extensions.business.deeploy.deeploy_const import DEEPLOY_ERRORS, DEEPLOY_KEYS, \
6-
DEEPLOY_STATUS, DEEPLOY_PLUGIN_DATA, DEEPLOY_FORBIDDEN_SIGNATURES, CONTAINER_APP_RUNNER_SIGNATURE, DEEPLOY_RESOURCES
6+
DEEPLOY_STATUS, DEEPLOY_PLUGIN_DATA, DEEPLOY_FORBIDDEN_SIGNATURES, CONTAINER_APP_RUNNER_SIGNATURE, \
7+
DEEPLOY_RESOURCES, JOB_TYPE_RESOURCE_SPECS
78

89
DEEPLOY_DEBUG = True
910

@@ -505,12 +506,43 @@ def deeploy_check_payment_and_job_owner(self, inputs, sender, debug=False):
505506
if job:
506507
job_owner = job.get('escrowOwner', None)
507508
is_valid = (sender == job_owner) if sender and job_owner else False
508-
if debug:
509-
self.P(f"Job {job_id} is paid:\n{self.json_dumps(job, indent=2)}")
510-
else:
511-
if debug:
512-
self.P(f"Job {job_id} is not paid or does not exist.")
513-
# endif
509+
if is_valid:
510+
job_type = job.get('jobType')
511+
if job_type is None:
512+
self.P(f"Job type missing or invalid for job {job_id}. Cannot validate resources.")
513+
return False
514+
#endif
515+
expected_resources = JOB_TYPE_RESOURCE_SPECS.get(job_type)
516+
if expected_resources is None:
517+
self.P(f"No resource specs configured for job type {job_type}. Cannot validate resources.")
518+
return False
519+
#endif
520+
if expected_resources:
521+
required_resources = inputs.app_params.get(DEEPLOY_RESOURCES.CONTAINER_RESOURCES, {})
522+
requested_cpu = required_resources.get(DEEPLOY_RESOURCES.CPU)
523+
requested_memory = required_resources.get(DEEPLOY_RESOURCES.MEMORY)
524+
expected_cpu = expected_resources.get(DEEPLOY_RESOURCES.CPU)
525+
expected_memory = expected_resources.get(DEEPLOY_RESOURCES.MEMORY)
526+
#TODO should also check disk and gpu as soon as they are supported and sent in the request
527+
resources_match = (
528+
requested_cpu is not None and
529+
requested_memory is not None and
530+
requested_cpu == expected_cpu and
531+
requested_memory == expected_memory
532+
)
533+
if not resources_match:
534+
self.P(
535+
f"Requested resources {required_resources} do not match paid resources "
536+
f"{expected_resources} for job type {job_type}."
537+
)
538+
is_valid = False
539+
#endif resources match
540+
#endif expected resources
541+
# endif is valid
542+
else: # job not found
543+
self.P(f"Job {job_id} not found.")
544+
is_valid = False
545+
# endif job found
514546
except Exception as e:
515547
self.P(f"Error checking payment for job {job_id}: {e}")
516548
is_valid = False

‎ver.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__VER__ = '2.9.708'
1+
__VER__ = '2.9.709'
22

0 commit comments

Comments
 (0)