Skip to content

Commit 100e68b

Browse files
jrxFiveSebastian Gumprich
andauthored
Rndmh3ro namespace get job with tests (#121)
* add support for namespace argument in get_job * fixes #118 * add tests for get_jobs with namespace override. Update responses dependency. * update requests minor version * check for namespace to get_job, if not pass empty dict * add namespace tests for get_job Co-authored-by: Sebastian Gumprich <sebastian.gumprich@t-systems.com> Co-authored-by: Jonathan Cross <>
1 parent 1cc1077 commit 100e68b

8 files changed

Lines changed: 105 additions & 19 deletions

File tree

.travis.yml

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,15 @@ services:
1414
- docker
1515
language: python
1616
python:
17-
- '3.6'
1817
- '3.7'
19-
- '3.8'
2018
env:
2119
global:
2220
- NOMAD_IP="127.0.0.1"
2321
- NOMAD_PORT="4646"
22+
- NOMAD_LATEST="1.1.4"
2423
matrix:
25-
- NOMAD_VERSION="0.3.2"
26-
- NOMAD_VERSION="0.4.1"
27-
- NOMAD_VERSION="0.5.6"
28-
- NOMAD_VERSION="0.6.0"
29-
- NOMAD_VERSION="0.7.1"
30-
- NOMAD_VERSION="0.8.1"
31-
- NOMAD_VERSION="0.8.3"
24+
- NOMAD_VERSION="1.0.0"
25+
- NOMAD_VERSION="1.1.4"
3226
before_install:
3327
- curl -L -o /tmp/nomad_${NOMAD_VERSION}_linux_amd64.zip https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_linux_amd64.zip
3428
- yes | unzip -d /tmp /tmp/nomad_${NOMAD_VERSION}_linux_amd64.zip
@@ -48,4 +42,4 @@ before_script:
4842
script:
4943
- py.test --cov=nomad --cov-report=term-missing --runxfail tests/
5044
after_success:
51-
- test $NOMAD_VERSION=="0.8.3" && codecov
45+
- test $NOMAD_VERSION = $NOMAD_LATEST && codecov

nomad/api/job.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,26 @@ def __getitem__(self, item):
4848
except nomad.api.exceptions.URLNotFoundNomadException:
4949
raise KeyError
5050

51-
def get_job(self, id):
51+
def get_job(self, id, namespace=None):
5252
""" Query a single job for its specification and status.
5353
5454
https://www.nomadproject.io/docs/http/job.html
5555
5656
arguments:
5757
- id
58+
- namespace :(str) optional, specifies the target namespace. Specifying * would return all jobs.
59+
This is specified as a querystring parameter.
5860
returns: dict
5961
raises:
6062
- nomad.api.exceptions.BaseNomadException
6163
- nomad.api.exceptions.URLNotFoundNomadException
6264
"""
63-
return self.request(id, method="get").json()
65+
params = {}
66+
67+
if namespace:
68+
params["namespace"] = namespace
69+
70+
return self.request(id, method="get", params=params).json()
6471

6572
def get_versions(self, id):
6673
""" This endpoint reads information about all versions of a job.

nomad/api/jobs.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ def get_jobs(self, prefix=None, namespace=None):
7777
- nomad.api.exceptions.BaseNomadException
7878
- nomad.api.exceptions.URLNotFoundNomadException
7979
"""
80-
params = {"prefix": prefix, "namespace": namespace}
80+
params = {"prefix": prefix}
81+
if namespace:
82+
params["namespace"] = namespace
83+
8184
return self.request(method="get", params=params).json()
8285

8386
def register_job(self, job):

requirements-dev.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ pytest==6.2.4
33
pytest-cov==2.12.1
44
mkdocs==0.15.3
55
mock==1.2.0
6-
responses==0.9.0
7-
flaky==3.7.0
6+
flaky==3.7.0
7+
responses==0.13.4

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
requests==2.20.0
1+
requests==2.26.0

tests/test_job.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import json
22
import os
3+
import uuid
34

45
import pytest
6+
import responses
7+
58
import nomad
9+
import tests.common as common
610

711
from flaky import flaky
812

@@ -22,6 +26,43 @@ def test_get_job(nomad_setup):
2226
assert isinstance(nomad_setup.job.get_job("example"), dict) == True
2327

2428

29+
@responses.activate
30+
def test_get_jobs_with_namespace_override_no_namespace_declared_on_create_incorrect_declared_namespace(nomad_setup):
31+
responses.add(
32+
responses.GET,
33+
"http://{ip}:{port}/v1/job/18a0f501-41d5-ae43-ff61-1d8ec3ec8314?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace=common.NOMAD_NAMESPACE),
34+
status=200,
35+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
36+
)
37+
38+
with pytest.raises(exceptions.BaseNomadException):
39+
nomad_setup.job.get_job(id=str(uuid.uuid4()))
40+
41+
42+
@responses.activate
43+
def test_get_jobs_with_namespace_override_no_namespace_declared_on_create(nomad_setup):
44+
responses.add(
45+
responses.GET,
46+
"http://{ip}:{port}/v1/job/18a0f501-41d5-ae43-ff61-1d8ec3ec8314?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace=common.NOMAD_NAMESPACE),
47+
status=200,
48+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
49+
)
50+
51+
nomad_setup.job.get_job(id="18a0f501-41d5-ae43-ff61-1d8ec3ec8314", namespace=common.NOMAD_NAMESPACE)
52+
53+
54+
@responses.activate
55+
def test_get_jobs_with_namespace_override_namespace_declared_on_create(nomad_setup_with_namespace):
56+
responses.add(
57+
responses.GET,
58+
"http://{ip}:{port}/v1/job/18a0f501-41d5-ae43-ff61-1d8ec3ec8314?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace="override-namespace"),
59+
status=200,
60+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
61+
)
62+
63+
nomad_setup_with_namespace.job.get_job(id="18a0f501-41d5-ae43-ff61-1d8ec3ec8314", namespace="override-namespace")
64+
65+
2566
def test_get_allocations(nomad_setup):
2667
j = nomad_setup.job["example"]
2768
a = nomad_setup.job.get_allocations("example")

tests/test_jobs.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
import responses
55
import tests.common as common
66

7+
8+
from nomad.api.exceptions import BaseNomadException
9+
10+
711
# integration tests requires nomad Vagrant VM or Binary running
812
def test_register_job(nomad_setup):
913

@@ -72,10 +76,9 @@ def test_dunder_iter(nomad_setup):
7276
def test_dunder_len(nomad_setup):
7377
assert len(nomad_setup.jobs) >= 0
7478

75-
@responses.activate
76-
#
79+
7780
# fix No data when you are using namespaces #82
78-
#
81+
@responses.activate
7982
def test_get_jobs_with_namespace(nomad_setup_with_namespace):
8083
responses.add(
8184
responses.GET,
@@ -84,3 +87,40 @@ def test_get_jobs_with_namespace(nomad_setup_with_namespace):
8487
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
8588
)
8689
assert common.NOMAD_NAMESPACE in nomad_setup_with_namespace.jobs.get_jobs()[0]["Namespace"]
90+
91+
92+
@responses.activate
93+
def test_get_jobs_with_namespace_override_no_namespace_declared_on_create_incorrect_declared_namespace(nomad_setup):
94+
responses.add(
95+
responses.GET,
96+
"http://{ip}:{port}/v1/jobs?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace=common.NOMAD_NAMESPACE),
97+
status=200,
98+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
99+
)
100+
101+
with pytest.raises(BaseNomadException):
102+
nomad_setup.jobs.get_jobs(namespace="should-raise")
103+
104+
105+
@responses.activate
106+
def test_get_jobs_with_namespace_override_no_namespace_declared_on_create(nomad_setup):
107+
responses.add(
108+
responses.GET,
109+
"http://{ip}:{port}/v1/jobs?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace=common.NOMAD_NAMESPACE),
110+
status=200,
111+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
112+
)
113+
114+
nomad_setup.jobs.get_jobs(namespace=common.NOMAD_NAMESPACE)
115+
116+
117+
@responses.activate
118+
def test_get_jobs_with_namespace_override_namespace_declared_on_create(nomad_setup_with_namespace):
119+
responses.add(
120+
responses.GET,
121+
"http://{ip}:{port}/v1/jobs?namespace={namespace}".format(ip=common.IP, port=common.NOMAD_PORT, namespace="override-namespace"),
122+
status=200,
123+
json=[{"Region": "global","ID": "my-job", "ParentID": "", "Name": "my-job","Namespace": common.NOMAD_NAMESPACE, "Type": "batch", "Priority": 50}]
124+
)
125+
126+
nomad_setup_with_namespace.jobs.get_jobs(namespace="override-namespace")

tests/test_node.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def test_evaluate_node(nomad_setup):
2323
assert "EvalIDs" in nomad_setup.node.evaluate_node(nodeID)
2424

2525

26+
@pytest.mark.skipif(tuple(int(i) for i in os.environ.get("NOMAD_VERSION").split(".")) > (1, 1, 0), reason="Not supported in version")
2627
def test_drain_node(nomad_setup):
2728
nodeID = nomad_setup.nodes["pynomad1"]["ID"]
2829
assert "EvalIDs" in nomad_setup.node.drain_node(nodeID)

0 commit comments

Comments
 (0)