From 30676926ef79a0e6b9bade2ad277c82a322f5f3d Mon Sep 17 00:00:00 2001 From: Maciej Tronowski Date: Tue, 24 Mar 2015 17:34:25 +0100 Subject: [PATCH] enhancements in selecting file from gridftp & moved submitting jobs to separate file --- qcg/forms.py | 16 +++++++---- qcg/service.py | 43 +++++++++++++++++++++++++++++- qcg/templates/qcg/job_new.html | 56 ++++++++++++++++++++++++++++++++------- qcg/views.py | 57 +++++++++++----------------------------- 4 files changed, 115 insertions(+), 57 deletions(-) diff --git a/qcg/forms.py b/qcg/forms.py index 33eeeaf..74eec37 100644 --- a/qcg/forms.py +++ b/qcg/forms.py @@ -136,9 +136,9 @@ class JobDescriptionForm(forms.Form): reservation = forms.CharField(label=u"Rezerwacja", max_length=100, required=False) # TODO grid ftp - input = forms.CharField(label=u"Standardowe wejście", max_length=500, required=False) - stage_in = forms.CharField(label=u"Stage in", max_length=500, required=False) - stage_out = forms.CharField(label=u"Stage out", max_length=500, required=False) + input = forms.MultipleChoiceField(label=u"Standardowe wejście", required=False) + stage_in = forms.MultipleChoiceField(label=u"Stage in", required=False) + # stage_out = forms.MultipleChoiceField(label=u"Stage out", required=False) monitoring = forms.BooleanField(label=u"Portal QCG-Monitoring", required=False) notify_type = forms.ChoiceField(label=u"Monitorowanie stanu", choices=PROTOCOL_CHOICES, required=False, initial='', @@ -169,6 +169,9 @@ class JobDescriptionForm(forms.Form): self.fields['arguments'].choices += ((v, v) for v in data.getlist('arguments')) self.fields['properties'].choices += ((v, v) for v in data.getlist('properties')) self.fields['native'].choices += ((v, v) for v in data.getlist('native')) + self.fields['input'].choices += ((v, v) for v in data.getlist('input')) + self.fields['stage_in'].choices += ((v, v) for v in data.getlist('stage_in')) + # self.fields['stage_out'].choices += ((v, v) for v in data.getlist('stage_out')) def clean(self): data = super(JobDescriptionForm, self).clean() @@ -196,10 +199,13 @@ class JobDescriptionForm(forms.Form): data['postprocess'] = '' def clean_application(self): - return self.cleaned_data['application'].split('/', 1) + return self.cleaned_data['application'].split('/', 1) if self.cleaned_data['application'] else '' + + def clean_executable(self): + return 'gsiftp://' + self.cleaned_data['executable'] if self.cleaned_data['executable'] else '' def clean_nodes(self): - return map(int, self.cleaned_data['nodes'].split(':', 2)) if self.cleaned_data['nodes'] else None + return map(int, self.cleaned_data['nodes'].split(':', 2)) if self.cleaned_data['nodes'] else '' class EnvForm(forms.Form): diff --git a/qcg/service.py b/qcg/service.py index fb312c7..6f44f49 100644 --- a/qcg/service.py +++ b/qcg/service.py @@ -3,7 +3,8 @@ import time from django.db import transaction from django.utils.timezone import now - +from pyqcg import QCG +from pyqcg.description import JobDescription from pyqcg.service import Registry from pyqcg.utils import Credential, TimePeriod @@ -14,6 +15,7 @@ logger = logging.getLogger(__name__) @transaction.atomic def update_user_data(user, proxy): ts = time.time() + QCG.start() from qcg.models import User, Job, Task, Allocation, NodeInfo credential = Credential(proxy) @@ -75,3 +77,42 @@ def update_user_data(user, proxy): elapsed_py = elapsed - elapsed_jobs - elapsed_tasks logger.info('(%.3f) USER = %s, JOBS = %s (%.3f), TASKS = %s (%.3f), TIME = %.3f', elapsed, user, jobs_count, elapsed_jobs, task_count, elapsed_tasks, elapsed_py) + + +def submit_job(params, proxy): + # print params + + QCG.start() + desc = JobDescription(Credential(proxy)) + + direct_map = ('env_variables', 'executable', 'arguments', 'note', 'grant', 'hosts', 'properties', 'queue', 'procs', + 'wall_time', 'memory', 'memory_per_slot', 'modules', 'native', 'notify', 'preprocess', 'postprocess', + 'persistent') + + for name in direct_map: + if params[name]: + setattr(desc, name, params[name]) + + if params['application']: + desc.set_application(*params['application']) + if params['nodes']: + desc.set_nodes(*params['nodes']) + if params['reservation']: + desc.set_reservation(params['reservation']) + if params['watch_output']: + desc.set_watch_output(params['watch_output'], params['watch_output_pattern']) + # TODO script + # TODO executable + # TODO input + # TODO stage_in + # TODO stage_out + # TODO monitoring + + # for prop in direct_map + ('application', 'nodes', 'env_variables', 'reservation', 'watch_output'): + # print prop, type(getattr(desc, prop)), repr(getattr(desc, prop)) + + # print desc.xml_description + + # job = desc.submit() + + # return job.job_id diff --git a/qcg/templates/qcg/job_new.html b/qcg/templates/qcg/job_new.html index eb3d973..cac10a6 100644 --- a/qcg/templates/qcg/job_new.html +++ b/qcg/templates/qcg/job_new.html @@ -13,20 +13,52 @@