Author: tmckay
Date: 2010-12-15 14:11:58 +0000 (Wed, 15 Dec 2010)
New Revision: 4436
Modified:
trunk/cumin/bin/cumin-web
trunk/cumin/python/cumin/config.py
trunk/cumin/python/cumin/grid/submission.py
trunk/cumin/python/cumin/main.py
trunk/cumin/python/cumin/model.py
Log:
Add RequestMemory and RequestDisk fields to job submission form, with defaults.
Add RequestDisk field to VM job submission form, with default.
RequestMemory is already set to an expression for VM jobs.
These fields are necessary for scheduling to partitionable slots.
BZ 654305
Modified: trunk/cumin/bin/cumin-web
===================================================================
--- trunk/cumin/bin/cumin-web 2010-12-14 19:45:52 UTC (rev 4435)
+++ trunk/cumin/bin/cumin-web 2010-12-15 14:11:58 UTC (rev 4436)
@@ -32,6 +32,12 @@
cumin.user = values.web.user
cumin.update_interval = values.web.update_interval
+ # set default values for form inputs
+ cumin.set_form_defaults(values.web.request_memory,
+ values.web.request_memory_vm,
+ values.web.request_disk,
+ values.web.request_disk_vm)
+
cumin.check()
cumin.init()
Modified: trunk/cumin/python/cumin/config.py
===================================================================
--- trunk/cumin/python/cumin/config.py 2010-12-14 19:45:52 UTC (rev 4435)
+++ trunk/cumin/python/cumin/config.py 2010-12-15 14:11:58 UTC (rev 4436)
@@ -33,6 +33,15 @@
param = ConfigParameter(web, "user", str)
+ param = ConfigParameter(web, "request-memory", int)
+ param.default = 512 # MB
+ param = ConfigParameter(web, "request-memory-vm", int)
+ param.default = 512 # MB
+ param = ConfigParameter(web, "request-disk", int)
+ param.default = 1024 #MB
+ param = ConfigParameter(web, "request-disk-vm", int)
+ param.default = 5 * 1024 #MB
+
data = CuminConfigSection(self, "data")
data.log_file.default = os.path.join(self.home, "log",
"data.log")
Modified: trunk/cumin/python/cumin/grid/submission.py
===================================================================
--- trunk/cumin/python/cumin/grid/submission.py 2010-12-14 19:45:52 UTC (rev 4435)
+++ trunk/cumin/python/cumin/grid/submission.py 2010-12-15 14:11:58 UTC (rev 4436)
@@ -326,6 +326,8 @@
stdout=None,
stderr=None,
usrlog=None,
+ request_mem_MB=None,
+ request_disk_KB=None,
attrs={}):
ad = dict()
@@ -345,6 +347,8 @@
put("Out", stdout)
put("Err", stderr)
put("UserLog", usrlog)
+ put("RequestMemory", request_mem_MB)
+ put("RequestDisk", request_disk_KB)
ad.update(standard_job_attributes)
ad.update(attrs)
@@ -416,6 +420,12 @@
self.usrlog.help = "User log file"
self.add_extra_field(self.usrlog)
+ self.request_mem_MB = self.RequestMemField(app, "requestmem")
+ self.add_extra_field(self.request_mem_MB)
+
+ self.request_disk_MB = self.RequestDiskField(app, "requestdisk")
+ self.add_extra_field(self.request_disk_MB)
+
#self.options = self.OptionsField(app, "options")
#self.add_extra_field(self.options)
@@ -423,6 +433,8 @@
self.add_extra_field(self.attrs)
def process_display(self, session):
+ self.request_mem_MB.set(session, self.app.form_defaults.request_memory)
+ self.request_disk_MB.set(session, self.app.form_defaults.request_disk)
self.scheduler.validate(session)
def process_submit(self, session):
@@ -441,6 +453,8 @@
stdout = self.stdout.get(session)
stderr = self.stderr.get(session)
usrlog = self.usrlog.get(session)
+ request_mem_MB = self.request_mem_MB.get(session)
+ request_disk_KB = self.request_disk_MB.get(session) * 1024
tokens = shlex.split(command)
@@ -459,6 +473,8 @@
stdout=stdout,
stderr=stderr,
usrlog=usrlog,
+ request_mem_MB=request_mem_MB,
+ request_disk_KB=request_disk_KB,
attrs=attrs)
self.task.exit_with_redirect(session, scheduler)
@@ -545,6 +561,22 @@
def render_title(self, session):
return "User Log"
+ class RequestMemField(IntegerField):
+ def render_title(self, session):
+ return "Request Memory"
+
+ def render_help(self, session):
+ return "Requested memory size (MB), required by " \
+ "partitionable slots."
+
+ class RequestDiskField(IntegerField):
+ def render_title(self, session):
+ return "Request Disk"
+
+ def render_help(self, session):
+ return "Requested disk space (MB), required by " \
+ "partitionable slots."
+
# class OptionsField(CheckboxField):
# def __init__(self, app, name):
# super(SubmissionAddForm.OptionsField, self).__init__(app, name)
@@ -573,7 +605,7 @@
return "Submit VM job"
def do_invoke(self, session, scheduler, invoc,
- description, image, memory, attrs={}):
+ description, image, memory, attrs={}, request_disk_KB=0):
ad = dict()
# General
@@ -588,6 +620,7 @@
"ceiling(ifThenElse(JobVMMemory =!= undefined," + \
"JobVMMemory, " + \
"ImageSize / 1024.000000))"
+ ad["RequestDisk"] = request_disk_KB
# VM
@@ -652,10 +685,11 @@
self.add_field(self.image)
self.memory = self.MemoryField(app, "memory")
- self.memory.help = "In megabytes"
self.memory.required = True
- self.memory.input.param.default = 512
self.add_extra_field(self.memory)
+
+ self.request_disk_MB = self.RequestDiskField(app, "requestdisk")
+ self.add_extra_field(self.request_disk_MB)
self.scheduler = JobSchedulerField(app, "scheduler", self.pool_name)
self.add_extra_field(self.scheduler)
@@ -665,6 +699,8 @@
def process_display(self, session):
self.scheduler.validate(session)
+ self.memory.set(session, self.app.form_defaults.request_memory_vm)
+ self.request_disk_MB.set(session, self.app.form_defaults.request_disk_vm)
def process_submit(self, session):
self.validate(session)
@@ -676,13 +712,15 @@
description = self.description.get(session)
image = self.image.get(session)
memory = self.memory.get(session)
+ request_disk_KB = self.request_disk_MB.get(session) * 1024
self.task.invoke(session,
scheduler,
description,
image,
memory,
- attrs=attrs)
+ attrs=attrs,
+ request_disk_KB=request_disk_KB)
self.task.exit_with_redirect(session, scheduler)
@@ -698,8 +736,15 @@
return "Memory"
def render_help(self, session):
- return "The VM's memory size in megabytes"
+ return "The VM's memory size (MB)"
+ class RequestDiskField(IntegerField):
+ def render_title(self, session):
+ return "Request Disk"
+
+ def render_help(self, session):
+ return "The VM's image size (MB), required by partitionable
slots."
+
class DagJobSubmit(Task):
def __init__(self, app):
super(DagJobSubmit, self).__init__(app)
Modified: trunk/cumin/python/cumin/main.py
===================================================================
--- trunk/cumin/python/cumin/main.py 2010-12-14 19:45:52 UTC (rev 4435)
+++ trunk/cumin/python/cumin/main.py 2010-12-15 14:11:58 UTC (rev 4436)
@@ -54,6 +54,8 @@
self.operator_email = None
self.update_interval = 10
+ self.form_defaults = self.CuminFormDefaults()
+
# self.model.sql_logging_enabled = True
def check(self):
@@ -124,6 +126,23 @@
self.server.stop()
self.session.stop()
+ def set_form_defaults(self,
+ request_memory,
+ request_memory_vm,
+ request_disk,
+ request_disk_vm):
+ self.form_defaults.request_memory = request_memory
+ self.form_defaults.request_memory_vm = request_memory_vm
+ self.form_defaults.request_disk = request_disk
+ self.form_defaults.request_disk_vm = request_disk_vm
+
+ class CuminFormDefaults(object):
+ def __init__(self):
+ self.request_memory = 0
+ self.request_memory_vm = 0
+ self.request_disk = 0
+ self.request_disk_vm = 0
+
class CuminModule(object):
def __init__(self, app, name):
self.app = app
Modified: trunk/cumin/python/cumin/model.py
===================================================================
--- trunk/cumin/python/cumin/model.py 2010-12-14 19:45:52 UTC (rev 4435)
+++ trunk/cumin/python/cumin/model.py 2010-12-15 14:11:58 UTC (rev 4436)
@@ -1614,6 +1614,14 @@
prop.group = "Other"
prop.writable = False
+ prop = AdProperty(self, "RequestMemory")
+ prop.description = "Required for scheduling to partitionable slots."
+ prop.group = "Other"
+
+ prop = AdProperty(self, "RequestDisk")
+ prop.description = "Required for scheduling to partitionable slots."
+ prop.group = "Other"
+
class JobStatusProperty(AdProperty):
def render_status(self, session, status):
return JobStatusInfo.get_status_string(status)