Author: justi9
Date: 2010-08-23 14:32:08 -0400 (Mon, 23 Aug 2010)
New Revision: 4218
Modified:
mgmt/newdata/cumin/python/cumin/grid/submission.py
Log:
* Added two new optional fields to vm submit: memory and extra
attributes
* Now that we're reusing the extra attrs field, moved its parsing
logic onto a common field class
Modified: mgmt/newdata/cumin/python/cumin/grid/submission.py
===================================================================
--- mgmt/newdata/cumin/python/cumin/grid/submission.py 2010-08-23 16:02:10 UTC (rev 4217)
+++ mgmt/newdata/cumin/python/cumin/grid/submission.py 2010-08-23 18:32:08 UTC (rev 4218)
@@ -108,6 +108,66 @@
def render_title(self, session):
return "Description"
+class JobAttributesField(MultilineStringField):
+ def __init__(self, app, name):
+ super(JobAttributesField, self).__init__(app, name)
+
+ self.input.columns = 50
+
+ def render_title(self, session):
+ return "Extra attributes"
+
+ def parse_attributes(self, session):
+ attrs = dict()
+
+ text = self.get(session)
+ text = text.strip()
+
+ for line in text.split("\n"):
+ line = line.strip()
+
+ if not line:
+ continue
+
+ try:
+ name, value = self.parse_attribute(line)
+ except:
+ error = FormError("Failed parsing attribute: %s" % line)
+ self.form.errors.get(session).append(error)
+
+ continue
+
+ attrs[name] = value
+
+ return attrs
+
+ def parse_attribute(self, line):
+ name, value = line.split("=", 1)
+
+ name = name.strip()
+ value = self.unmarshal_value(value.strip())
+
+ return name, value
+
+ def unmarshal_value(self, value):
+ if value.lower() == "true":
+ return True
+
+ if value.lower() == "false":
+ return False
+
+ try:
+ return int(value)
+ except ValueError:
+ pass
+
+ try:
+ return float(value)
+ except ValueError:
+ pass
+
+ return value
+
class JobSubmit(Task):
def __init__(self, app):
super(JobSubmit, self).__init__(app)
@@ -222,14 +282,13 @@
#self.options = self.OptionsField(app, "options")
#self.add_extra_field(self.options)
- self.attributes_ = self.AttributesField(app, "attributes")
- self.attributes_.input.columns = 50
- self.add_extra_field(self.attributes_)
+ self.attrs = JobAttributesField(app, "attrs")
+ self.add_extra_field(self.attrs)
def process_submit(self, session):
self.validate(session)
- attrs = self.parse_attributes(session)
+ attrs = self.attrs.parse_attributes(session)
if not self.errors.get(session):
scheduler = self.scheduler.get(session)
@@ -264,57 +323,6 @@
self.task.exit_with_redirect(session, scheduler)
- def parse_attributes(self, session):
- attrs = dict()
-
- text = self.attributes_.get(session)
- text = text.strip()
-
- for line in text.split("\n"):
- line = line.strip()
-
- if not line:
- continue
-
- try:
- name, value = self.parse_attribute(line)
- except:
- error = FormError("Failed parsing attribute: %s" % line)
- self.errors.get(session).append(error)
-
- continue
-
- attrs[name] = value
-
- return attrs
-
- def parse_attribute(self, line):
- name, value = line.split("=", 1)
-
- name = name.strip()
- value = self.unmarshal_value(value.strip())
-
- return name, value
-
- def unmarshal_value(self, value):
- if value.lower() == "true":
- return True
-
- if value.lower() == "false":
- return False
-
- try:
- return int(value)
- except ValueError:
- pass
-
- try:
- return float(value)
- except ValueError:
- pass
-
- return value
-
class TemplateField(FormField):
def __init__(self, app, name):
super(JobSubmitForm.TemplateField, self).__init__(app, name)
@@ -415,10 +423,6 @@
# def render_title(self, session):
# return "Use cloud"
- class AttributesField(MultilineStringField):
- def render_title(self, session):
- return "Extra attributes"
-
class VmJobSubmit(Task):
def __init__(self, app):
super(VmJobSubmit, self).__init__(app)
@@ -429,7 +433,7 @@
return "Submit VM job"
def do_invoke(self, session, scheduler, invoc,
- description, image, memory):
+ description, image, memory, attrs={}):
ad = dict()
# General
@@ -444,6 +448,9 @@
"JobVMMemory, " + \
"ImageSize / 1024.000000))"
+ for name, value in attrs.items():
+ ad[name] = value
+
# VM
ad["VMPARAM_Kvm_Disk"] = "%s:vda:w" % image
@@ -499,25 +506,38 @@
self.image.required = True
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)
+
from scheduler import SchedulerSelectField # XXX
self.scheduler = SchedulerSelectField(app, "scheduler",
self.pool_name)
self.scheduler.help = "Submit job to this schedd"
self.add_extra_field(self.scheduler)
+ self.attrs = JobAttributesField(app, "attrs")
+ self.add_extra_field(self.attrs)
+
def process_submit(self, session):
self.validate(session)
+ attrs = self.attrs.parse_attributes(session)
+
if not self.errors.get(session):
scheduler = self.scheduler.get(session)
description = self.description.get(session)
image = self.image.get(session)
+ memory = self.memory.get(session)
self.task.invoke(session,
scheduler,
description,
image,
- 512)
+ memory,
+ attrs=attrs)
self.task.exit_with_redirect(session, scheduler)
@@ -525,6 +545,10 @@
def render_title(self, session):
return "Image location"
+ class MemoryField(IntegerField):
+ def render_title(self, session):
+ return "Memory"
+
# class SubmissionDagAdd(SubmissionAdd):
# def __init__(self, app, frame):
# super(SubmissionDagAdd, self).__init__(app, frame)