# Copyright 2019-present Lenovo
# Confidential and Proprietary
import json
from py.path import local
from pytest import mark
from rest_framework.status import HTTP_200_OK
@mark.django_db
def test_template_job_for_kube(
client, mocker, settings, user
):
settings.LICO_OPERATOR = 'kube'
from antilles.common.utils import encode_base64url
uuid = 'c12c00ec9d4c11e9ac32000c29fde54a'
ingress_ctrl_addr = mocker.patch(
"antilles.kubernetes.utils.get_user_context",
return_value={"ingress_ctrl_addr": "http://127.0.0.1:8000"}
)
jobfile_mock = mocker.patch(
'antilles.scheduler_ext.models.Template.generate_jobfile',
return_value={
"job_name": "pv2_test1",
"jobfilecontent": "123",
"job_log_file": "",
"job_workspace": str(local(user.workspace).join('test')),
"internal_name": uuid
}
)
mock_create_job = mocker.patch(
'antilles.scheduler.job_proxy.JobManagerProxy.request_create_job',
return_value={'id': 102, "ports": {"12": 50000}}
)
import base64
password = '123456'
mocker.patch(
'antilles.devtools.utils.passwd',
return_value=password
)
data = {
"job_queue": "compute",
"job_workspace": 'test',
"language": "py2",
"password": base64.b64encode("123456"),
"job_name": "pv2_test1",
"image_path": "/home/hpcadmin/new_image_628/jupyter-cpu.image",
"nodes": 1,
"conda_env": "test"
}
response = client.post(
'/submit/',
data=json.dumps(data),
content_type="application/json",
)
assert response.status_code == HTTP_200_OK
ingress_ctrl_addr.assert_called_once()
jobfile_mock.assert_called_once_with(
user,
dict(
data,
password=password,
job_workspace=str(local(user.workspace).join('test')),
conda_env=str(local(user.workspace).join('test')),
host='lico.lenovo.com',
base_url=encode_base64url('127.0.0.1:8000'),
container_port=6006,
command='/opt/start'
)
)
mock_create_job.assert_called_once_with(
workspace=str(local(user.workspace).join('test')),
jobname=data['job_name'],
jobfilecontent='123',
type="jupyter",
json_body=mocker.ANY,
output_file='',
submitter=user
)
@mark.django_db
def test_jupyter_list_for_kube(
client, settings, user, jupyter, mocker
):
settings.LICO_OPERATOR = 'kube'
ingress_ctrl_addr = mocker.patch(
"antilles.kubernetes.utils.get_user_context",
return_value={"ingress_ctrl_addr": "http://127.0.0.1:8000"}
)
from antilles.devtools.models import Devtools
jupyter1 = Devtools.objects.create(
user=user,
password='123456',
port=80001,
language='pv2',
uuid='88e20b0e9be011e994be000c29fde54a',
job=2
)
jupyter2 = Devtools.objects.create(
user=user,
password='123456',
port=80003,
language='pv2',
uuid='88e20b0e9be011e994be000c29fde54a',
job=3
)
mock_job_query = mocker.patch(
'antilles.scheduler.job_proxy.JobObjectsQuery.filter_with_commit',
return_value=[
{
"status": "complete",
"exechosts": "localhost*1",
"cpuscount": 1,
"jobname": "test",
"gpuscount": 2,
"starttime": 1561611663,
"endtime": 1561611665,
"id": jupyter.job,
"json_body": "test",
"submiter": "test",
"priority": "test"
},
{
"status": "running",
"exechosts": "localhost*1",
"cpuscount": 1,
"jobname": "test",
"gpuscount": 2,
"starttime": 1561611663,
"endtime": 1561611665,
"id": jupyter1.job,
"json_body": "test",
"submiter": "test",
"priority": "test"
},
{
"status": "running",
"exechosts": "localhost*1",
"cpuscount": 1,
"jobname": "test",
"gpuscount": 2,
"starttime": 1561611663,
"endtime": 1561611665,
"id": jupyter2.job,
"json_body": "test",
"submiter": "test",
"priority": "test"
}
]
)
response = client.get(
'/'
)
import operator
expect_list = sorted(['uuid', 'endtime', 'create_time', 'id', 'status',
'exechosts', 'gpuscount', 'jobname', 'language',
'port', 'jupyter_id', 'job', 'cpuscount'])
assert response.status_code == HTTP_200_OK
assert operator.eq(sorted(list(response.data['data'][0].keys())),
expect_list)
assert operator.eq(sorted(list(response.data['data'][1].keys())),
expect_list)
assert operator.eq(sorted(list(response.data['data'][2].keys())),
expect_list)
assert response.data['data'][0]['status'] == "running"
assert response.data['data'][1]['status'] == "running"
assert response.data['data'][0]['id'] in [jupyter1.job, jupyter2.job]
assert response.data['data'][1]['id'] in [jupyter1.job, jupyter2.job]
assert response.data['data'][2]['status'] == "complete"
assert response.data['data'][2]['id'] == jupyter.job
mock_job_query.assert_called_once()
ingress_ctrl_addr.assert_called()
@mark.django_db
def test_jupyter_rerun_for_kube(
client, settings, user, mocker, jupyter
):
settings.LICO_OPERATOR = 'kube'
uuid = 'c12c00ec9d4c11e9ac32000c29fde54a'
jobfile_mock = mocker.patch(
'antilles.scheduler_ext.models.Template.generate_jobfile',
return_value={
"internal_name": uuid,
"job_workspace": str(local(user.workspace).join('test')),
"job_name": "pv2_test1",
"jobfilecontent": "123",
"job_log_file": "123"
}
)
mock_create_job = mocker.patch(
'antilles.scheduler.job_proxy.JobManagerProxy.request_create_job',
return_value={'id': 100, "ports": {"13": 50000}}
)
mock_job_query = mocker.patch(
'antilles.scheduler.job_proxy.JobObjectsQuery.get_with_commit',
return_value={
"json_body": json.dumps(
{
"parameters": {
"job_queue": "compute",
"job_workspace": str(local(user.workspace).
join('test')),
"py_version": "py2",
"password": "123456",
"job_name": "pv2_test1",
"image_path": "/home/hpcadmin/jupyter-cpu.image",
"nodes": 1,
"conda_env": str(local(user.workspace).join('test')),
"host": "lico.lenovo.com",
"base_url": '127.0.0.1:8000',
"container_port": 6006,
"command": "/opt/start"
}
}
)
}
)
response = client.put(
'/1/'
)
from antilles.devtools.models import Devtools
jupyter1 = Devtools.objects.get(id=1)
jobfile_mock.assert_called_once()
mock_create_job.assert_called_once()
mock_job_query.assert_called_once()
assert response.status_code == HTTP_200_OK
assert jupyter1.job == 100
import operator
assert jupyter1.uuid == operator.concat('u', uuid)
jobfile_mock.assert_called_once_with(
user,
{
"job_queue": "compute",
"job_workspace": str(local(user.workspace).join('test')),
"py_version": "py2",
"password": "123456",
"job_name": "pv2_test1",
"image_path": "/home/hpcadmin/jupyter-cpu.image",
"nodes": 1,
"conda_env": str(local(user.workspace).join('test')),
"host": "lico.lenovo.com",
"base_url": '127.0.0.1:8000',
"container_port": 6006,
"command": "/opt/start"
}
)
mock_create_job.assert_called_once_with(
workspace=str(local(user.workspace).join('test')),
jobname="pv2_test1",
jobfilecontent='123',
type="jupyter",
json_body=mocker.ANY,
output_file='123',
submitter=user
)
@mark.django_db
def test_jupyter_delete(
client, settings, user, mocker, jupyter
):
settings.LICO_OPERATOR = 'kube'
mock_job_query = mocker.patch(
'antilles.scheduler.job_proxy.JobObjectsQuery.get_with_commit',
return_value={
"json_body": json.dumps(
{
"parameters": {
"job_queue": "compute",
"job_workspace": 'test',
"py_version": "py2",
"password": "123456",
"job_name": "pv2_test1",
"image_path": "/home/hpcadmin/jupyter-cpu.image",
"nodes": 1,
"conda_env": 'test'
}
}
)
}
)
operator = mocker.patch(
'antilles.devtools.devtools.get_file_operator'
).return_value
operator.path_exists.return_value = True
operator.path_isdir.return_value = True
response = client.delete(
'/1/',
data=json.dumps({"delete_completely": True}),
content_type="application/json"
)
from antilles.devtools.models import Devtools
jupyter1 = Devtools.objects.filter(id=1)
mock_job_query.assert_called_once()
operator.mkdir.assert_called_once_with(
str(local(user.workspace).join('test'))
)
operator.rmtree.assert_called_with(
str(local(user.workspace).join('test'))
)
assert response.status_code == HTTP_200_OK
assert jupyter1.exists() is False
assert operator.rmtree.call_count == 1
assert operator.mkdir.call_count == 1
assert operator.chown.call_count == 1