def get_all(self) -> List[Task]: """Obtain the list of tasks.""" response = requests.get(self.base_url + '/tasks') if response.status_code == HTTPStatus.OK: return Task.Schema().load(response.json(), many=True) else: raise StatusError(response.json()['error'])
def add(service, device, name, runtime, deadline, period, file): """Add a new task.""" try: task = Task.Schema().load({ 'name': name, 'runtime': runtime, 'deadline': deadline, 'period': period, }) task.devices = list(d for d in device) new_id = service.create(task, file) click.echo(f'Added new task with ID {new_id}') except Exception as e: click.echo('Unable to add new task:\n' + str(e))
def update(service, file, key, values): """ Update a task's values. The task is identified by a given KEY, which can be either the task's ID or its name. """ try: Task.Schema().load(values) service.update(key, values, file) click.echo('The task\'s values were updated correctly.') except ValidationError as e: click.echo('Unable to update the task\'s values:\n' + str(e.messages)) except Exception as e: click.echo('Unable to update the task\'s values:\n' + str(e))
def create(self, task: Task, file: io.BufferedReader) -> str: """Create a new task.""" response = requests.post(self.base_url + '/tasks', files={ 'file': (os.path.basename(file.name), file), 'specs': (None, Task.Schema(exclude=['_id']).dumps(task), 'application/json') }) if response.status_code == HTTPStatus.OK: return response.json()['_id'] else: raise StatusError(response.json()['error'])
def get_one(self, task_key: str) -> Task: """ Obtain detailed information about a task. The given task key can be either its ID or name. """ if bson.ObjectId.is_valid(task_key): uri = '/tasks/' + task_key else: uri = '/tasks?name=' + task_key response = requests.get(self.base_url + uri) if response.status_code == HTTPStatus.OK: return Task.Schema().load(response.json()) else: raise StatusError(response.json()['error'])
class MockService(): test_tasks = Task.Schema().load([{ '_id': ObjectId(), 'name': 'Test1', 'runtime': 1000, 'deadline': 1000, 'period': 1000 }, { '_id': ObjectId(), 'name': 'Test2', 'runtime': 1000, 'deadline': 1000, 'period': 1000 }], many=True) def __init__(self, server_url: str, server_port: str): pass def get_all(self) -> List[Task]: return self.test_tasks def get_one(self, task_key: str) -> Task: for task in self.test_tasks: if str(task._id) == task_key: return task raise StatusError('Task not found.') def create(self, task: Task, file: io.BufferedReader) -> str: for test_task in self.test_tasks: if test_task.name == task.name: raise StatusError('Name already present.') return ObjectId() def update(self, task_key: str, new_values: dict, new_file: io.BufferedReader) -> Task: for task in self.test_tasks: if str(task._id) == task_key: return Task.Schema().load(new_values) raise StatusError('Task not found.') def delete(self, task_key: str) -> Task: for task in self.test_tasks: if str(task._id) == task_key: return task raise StatusError('Task not found.')
def delete(self, task_key: str) -> Task: """ Delete a task. The given task key can be either its ID or name. """ if not bson.ObjectId.is_valid(task_key): response = requests.get(self.base_url + '/tasks?name=' + task_key) if response.status_code != HTTPStatus.OK: raise StatusError(response.json()['error']) task_key = response.json()['_id'] response = requests.delete(self.base_url + '/tasks/' + task_key) if response.status_code == HTTPStatus.OK: return Task.Schema().load(response.json()) else: raise StatusError(response.json()['error'])
def update(self, task_key: str, new_values: dict, new_file: io.BufferedReader) -> Task: """ Change the values of a task. The given task key can be either its ID or name. """ if not bson.ObjectId.is_valid(task_key): response = requests.get(self.base_url + '/tasks?name=' + task_key) if response.status_code != HTTPStatus.OK: raise StatusError(response.json()['error']) task_key = response.json()['_id'] files = {'specs': (None, json.dumps(new_values), 'application/json')} if new_file: files['file'] = (os.path.basename(new_file.name), new_file) response = requests.put(self.base_url + '/tasks/' + task_key, files=files) if response.status_code == HTTPStatus.OK: return Task.Schema().load(response.json()) else: raise StatusError(response.json()['error'])
class MockService(): test_nodes = Node.Schema().load([ { '_id': ObjectId(), 'name': 'Test1', 'ip': '1.1.1.1', 'ssh_user': '******', 'tasks': [ { '_id': ObjectId(), 'name': 'Test', 'runtime': 1000, 'deadline': 1000, 'period': 1000 } ], 'devices': [ '/dev/test1', '/dev/test2' ] }, { '_id': ObjectId(), 'name': 'Test2', 'ip': '2.2.2.2', 'ssh_user': '******', } ], many=True) test_tasks = Task.Schema().load([ { '_id': ObjectId(), 'name': 'Test1', 'runtime': 1000, 'deadline': 1000, 'period': 1000 }, { '_id': ObjectId(), 'name': 'Test2', 'runtime': 1000, 'deadline': 1000, 'period': 1000 } ], many=True) def __init__(self, server_url: str, server_port: str): pass def deploy_task(self, node_key: str, task_key: str): for node in self.test_nodes: if str(node._id) == node_key: for task in self.test_tasks: if str(task._id) == task_key: return raise StatusError('Task not found.') raise StatusError('Node not found.') def remove_task(self, node_key: str, task_key: str): for node in self.test_nodes: if str(node._id) == node_key: for task in self.test_tasks: if str(task._id) == task_key: return raise StatusError('Task not found.') raise StatusError('Node not found.')
def update(self, task_key: str, new_values: dict, new_file: io.BufferedReader) -> Task: for task in self.test_tasks: if str(task._id) == task_key: return Task.Schema().load(new_values) raise StatusError('Task not found.')