Skip to content

Commit 290399e

Browse files
author
Naor Livne
committed
adding cron job support
1 parent b08ca64 commit 290399e

File tree

4 files changed

+144
-1
lines changed

4 files changed

+144
-1
lines changed

NebulaPythonSDK/sdk.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,46 @@ def create_user_group(self, user, config):
282282
response = requests.request("POST", url, data=payload, headers=headers, timeout=self.request_timeout)
283283
filtered_response = {"status_code": response.status_code, "reply": response.json()}
284284
return filtered_response
285+
286+
# list all of the cron_jobs managed by nebula
287+
def list_cron_jobs(self):
288+
url = self.host + "/api/" + self.API_VERSION + "/cron_jobs"
289+
headers = self.headers
290+
response = requests.request("GET", url, headers=headers, timeout=self.request_timeout)
291+
filtered_response = {"status_code": response.status_code, "reply": response.json()}
292+
return filtered_response
293+
294+
# delete an existing nebula cron_job, no confirmation required in SDK so be careful
295+
def delete_cron_job(self, cron_job):
296+
url = self.host + "/api/" + self.API_VERSION + "/cron_jobs/" + cron_job
297+
headers = self.headers
298+
response = requests.request("DELETE", url, headers=headers, timeout=self.request_timeout)
299+
filtered_response = {"status_code": response.status_code, "reply": response.json()}
300+
return filtered_response
301+
302+
# list the config of a nebula cron_job, only requires the app name
303+
def list_cron_job_info(self, cron_job):
304+
url = self.host + "/api/" + self.API_VERSION + "/cron_jobs/" + cron_job
305+
headers = self.headers
306+
response = requests.request("GET", url, headers=headers, timeout=self.request_timeout)
307+
filtered_response = {"status_code": response.status_code, "reply": response.json()}
308+
return filtered_response
309+
310+
# create a new nebula cron_job, requires the cron_job name to create and a complete dict of the config values for it
311+
def create_cron_job(self, cron_job, config):
312+
url = self.host + "/api/" + self.API_VERSION + "/cron_jobs/" + cron_job
313+
payload = json.dumps(config)
314+
headers = self.headers
315+
response = requests.request("POST", url, data=payload, headers=headers, timeout=self.request_timeout)
316+
filtered_response = {"status_code": response.status_code, "reply": response.json()}
317+
return filtered_response
318+
319+
# update a nebula cron_job, requires the cron_job name and a dict of the config values you want to change, any
320+
# combination of config values is accepted as it keeps the rest unchanged
321+
def update_cron_job(self, cron_job, config):
322+
url = self.host + "/api/" + self.API_VERSION + "/cron_jobs/" + cron_job + "/update"
323+
payload = json.dumps(config)
324+
headers = self.headers
325+
response = requests.request("PUT", url, data=payload, headers=headers, timeout=self.request_timeout)
326+
filtered_response = {"status_code": response.status_code, "reply": response.json()}
327+
return filtered_response

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,32 @@ connection.update_user_group("user_group_name", user_group_config)
148148
# delete a user group
149149
connection.delete_user_group("user_group_name")
150150

151+
# list all cron jobs
152+
connection.list_cron_jobs()
153+
154+
# delete a cron job
155+
connection.delete_cron_job("cron_job_name")
156+
157+
# list a cron job
158+
connection.list_cron_job_info("cron_job_name")
159+
160+
# create a cron job
161+
cron_job_config = {
162+
"env_vars": {"test": "test123"},
163+
"docker_image" : "nginx",
164+
"running": True,
165+
"volumes": [],
166+
"networks": ["nebula", "bridge"],
167+
"devices": [],
168+
"privileged": False,
169+
"schedule": "0 * * * *"
170+
}
171+
connection.create_cron_job("cron_job_name", cron_job_config)
172+
173+
# update a cron job
174+
cron_job_config = {
175+
"schedule": "5 * * * *"
176+
}
177+
connection.create_cron_job("cron_job_name", cron_job_config)
178+
151179
```

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
__author__ = 'Naor Livne'
44
__author_email__ = 'naorlivne@gmail.com'
5-
__version__ = '2.4.1'
5+
__version__ = '2.5.0'
66

77
with open('README.md') as f:
88
long_description = f.read()

test/test_nebula_python_sdk.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,75 @@ def test_user_group_workflow(self, user="unit_test_user", user_group="unit_test_
345345
reply = nebula_connection_object.delete_user_group(user_group)
346346
self.assertEqual(reply["status_code"], 200)
347347
self.assertEqual(reply["reply"], {})
348+
349+
def test_list_all_cron_jobs(self):
350+
nebula_connection_object = nebula_connection()
351+
reply = nebula_connection_object.list_cron_jobs()
352+
cron_jobs_list = reply["reply"]["cron_jobs"]
353+
self.assertEqual(reply["status_code"], 200)
354+
self.assertTrue(isinstance(cron_jobs_list, list))
355+
for cron_job in cron_jobs_list:
356+
self.assertTrue(isinstance(cron_job, str))
357+
358+
def test_delete_cron_job_does_not_exist(self, cron_job="cron_job_that_does_not_exist"):
359+
nebula_connection_object = nebula_connection()
360+
# deleting twice so even if the app does exist prior to running the check it won't on the 2nd run
361+
nebula_connection_object.delete_cron_job(cron_job)
362+
reply = nebula_connection_object.delete_cron_job(cron_job)
363+
self.assertEqual(reply["status_code"], 403)
364+
self.assertFalse(reply["reply"]["cron_job_exists"])
365+
366+
def test_cron_job_flow(self, cron_job="unit_test_cron_job"):
367+
nebula_connection_object = nebula_connection()
368+
cron_job_config = {
369+
"env_vars": {"test": "test123"},
370+
"docker_image": "hello-world",
371+
"running": True,
372+
"volumes": [],
373+
"networks": ["nebula", "bridge"],
374+
"devices": [],
375+
"privileged": False,
376+
"schedule": "0 0 * * *"
377+
}
378+
379+
# deleting the cron job to make sure we start from a clean slate
380+
nebula_connection_object.delete_cron_job(cron_job)
381+
382+
# check creating a cron_jon works
383+
reply = nebula_connection_object.create_cron_job(cron_job, cron_job_config)
384+
self.assertEqual(reply["status_code"], 200)
385+
self.assertEqual(reply["reply"]["cron_job_id"], 1)
386+
self.assertEqual(reply["reply"]["cron_job_name"], cron_job)
387+
self.assertEqual(reply["reply"]["schedule"], cron_job_config["schedule"])
388+
self.assertEqual(reply["reply"]["env_vars"], cron_job_config["env_vars"])
389+
self.assertEqual(reply["reply"]["docker_image"], cron_job_config["docker_image"])
390+
self.assertTrue(reply["reply"]["running"])
391+
self.assertEqual(reply["reply"]["networks"], cron_job_config["networks"])
392+
self.assertEqual(reply["reply"]["volumes"], cron_job_config["volumes"])
393+
self.assertEqual(reply["reply"]["devices"], cron_job_config["devices"])
394+
self.assertFalse(reply["reply"]["privileged"])
395+
396+
# check listing a cron_jon info works
397+
reply = nebula_connection_object.list_cron_job_info(cron_job)
398+
self.assertEqual(reply["status_code"], 200)
399+
self.assertEqual(reply["reply"]["cron_job_id"], 1)
400+
self.assertEqual(reply["reply"]["cron_job_name"], cron_job)
401+
self.assertEqual(reply["reply"]["schedule"], cron_job_config["schedule"])
402+
self.assertEqual(reply["reply"]["env_vars"], cron_job_config["env_vars"])
403+
self.assertEqual(reply["reply"]["docker_image"], cron_job_config["docker_image"])
404+
self.assertTrue(reply["reply"]["running"])
405+
self.assertEqual(reply["reply"]["networks"], cron_job_config["networks"])
406+
self.assertEqual(reply["reply"]["volumes"], cron_job_config["volumes"])
407+
self.assertEqual(reply["reply"]["devices"], cron_job_config["devices"])
408+
self.assertFalse(reply["reply"]["privileged"])
409+
410+
# check updating a cron_jon works
411+
reply = nebula_connection_object.update_cron_job(cron_job, {"schedule": "5 5 * * *"})
412+
self.assertEqual(reply["status_code"], 202)
413+
self.assertEqual(reply["reply"]["cron_job_id"], 2)
414+
self.assertEqual(reply["reply"]["schedule"], "5 5 * * *")
415+
416+
# check cron_jon deletion works
417+
reply = nebula_connection_object.delete_cron_job(cron_job)
418+
self.assertEqual(reply["status_code"], 200)
419+
self.assertEqual(reply["reply"], {})

0 commit comments

Comments
 (0)