Author: justi9
Date: 2010-08-12 17:44:33 -0400 (Thu, 12 Aug 2010)
New Revision: 4207
Modified:
mgmt/newdata/cumin/python/cumin/grid/main.py
mgmt/newdata/cumin/python/cumin/grid/submission.py
mgmt/newdata/cumin/python/cumin/usergrid/widgets.py
mgmt/newdata/cumin/python/cumin/usergrid/widgets.strings
Log:
* Based on design review, simplified fields for vm submit; more
optional fields will follow
* Moved vm submit logic into a dedicated task
Modified: mgmt/newdata/cumin/python/cumin/grid/main.py
===================================================================
--- mgmt/newdata/cumin/python/cumin/grid/main.py 2010-08-12 21:21:44 UTC (rev 4206)
+++ mgmt/newdata/cumin/python/cumin/grid/main.py 2010-08-12 21:44:33 UTC (rev 4207)
@@ -17,6 +17,7 @@
super(Module, self).__init__(app, name)
self.job_submit = JobSubmit(app)
+ self.vm_job_submit = VmJobSubmit(app)
# cls = app.model.com_redhat_grid.Job
Modified: mgmt/newdata/cumin/python/cumin/grid/submission.py
===================================================================
--- mgmt/newdata/cumin/python/cumin/grid/submission.py 2010-08-12 21:21:44 UTC (rev 4206)
+++ mgmt/newdata/cumin/python/cumin/grid/submission.py 2010-08-12 21:44:33 UTC (rev 4207)
@@ -85,14 +85,29 @@
col = ObjectTableColumn(app, attr.name, attr)
self.insert_column(2, col)
- link = self.PoolSubmitLink(app, "add", app.grid.job_submit)
+ link = self.PoolSubmitLink(app, "job_submit", app.grid.job_submit)
self.links.add_child(link)
+ link = self.PoolSubmitLink \
+ (app, "vm_job_submit", app.grid.vm_job_submit)
+ self.links.add_child(link)
+
class PoolSubmitLink(TaskLink):
def do_enter(self, session, obj, form_session):
pool = self.parent.pool.get(session)
self.form.pool_name.set(form_session, pool.Pool)
+class JobDescriptionField(StringField):
+ def __init__(self, app, name):
+ super(JobDescriptionField, self).__init__(app, name)
+
+ self.input.size = 50
+ self.required = True
+ self.help = "This text will identify the submission"
+
+ def render_title(self, session):
+ return "Description"
+
class JobSubmit(Task):
def __init__(self, app):
super(JobSubmit, self).__init__(app)
@@ -117,8 +132,8 @@
ad = dict()
ad["Submission"] = description
+ ad["Owner"] = invoc.user.name
ad["Cmd"] = executable
- ad["Owner"] = invoc.user.name
def put(name, value):
if value:
@@ -153,10 +168,7 @@
self.pool_name = Attribute(app, "pool")
self.add_attribute(self.pool_name)
- self.description = self.DescriptionField(app, "description")
- self.description.input.size = 50
- self.description.required = True
- self.description.help = "This text will identify the submission"
+ self.description = JobDescriptionField(app, "description")
self.add_field(self.description)
self.command = self.CommandField(app, "command")
@@ -326,10 +338,6 @@
def render_item_content(self, session, item):
return item
- class DescriptionField(StringField):
- def render_title(self, session):
- return "Description"
-
class CommandField(MultilineStringField):
def render_title(self, session):
return "Command"
@@ -411,93 +419,112 @@
def render_title(self, session):
return "Extra attributes"
-# class SubmissionVMAdd(SubmissionAdd):
-# def get_add_form(self, app):
-# return SubmissionAddVMForm(app, self.name, self)
+class VmJobSubmit(Task):
+ def __init__(self, app):
+ super(VmJobSubmit, self).__init__(app)
-# def get_title(self, session):
-# return "Create VM submission"
+ self.form = VmJobSubmitForm(app, self.name, self)
-# def do_invoke(self, invoc, scheduler,
-# description,
-# executable,
-# arguments=None,
-# requirements=None,
-# universe=None,
-# iwd=None,
-# stdin=None,
-# stdout=None,
-# stderr=None,
-# usrlog=None,
-# attrs={}):
+ def get_title(self, session, scheduler):
+ return "Submit VM job"
-# cmd = "%s %s" % (executable, arguments)
-# arguments = None
-# super(SubmissionVMAdd, self).do_invoke(invoc, scheduler,
-# description, cmd, arguments,
-# requirements, universe, iwd,
-# stdin, stdout, stderr, usrlog,
-# attrs)
+ def do_invoke(self, session, scheduler, invoc,
+ description, image, memory):
+ ad = dict()
-# class SubmissionAddVMForm(SubmissionAddForm):
-# def add_fields(self, app):
-# self.disk = self.DiskField(app, "disk")
-# self.disk.input.size = 50
-# self.disk.required = True
-# self.disk.help = "VM disk img file location"
-# self.add_field(self.disk)
+ # General
-# self.requirements = self.RequirementsField(app, "requirements")
-# self.requirements.input.columns = 50
-# self.requirements.required = True
-# self.requirements.help = "Attributes controlling where and when " +
\
-# "this submission will run"
-# self.add_field(self.requirements)
+ ad["Submission"] = description
+ ad["Owner"] = invoc.user.name
+ ad["Cmd"] = image # This is just an identifier in this context
+ ad["Iwd"] = "/tmp"
+ ad["ShouldTransferFiles"] = "NEVER" # try submit without
+ ad["RequestMemory"] = \
+ "ceiling(ifThenElse(JobVMMemory =!= undefined," + \
+ "JobVMMemory, " + \
+ "ImageSize / 1024.000000))"
-# self.universe = Attribute(app, "universe")
-# self.universe.default = self.task.UNIVERSE["VM"]
-# self.add_attribute(self.universe)
+ # VM
-# self.attributes_ = self.VMAttributes(app, "attributes")
-# self.add_attribute(self.attributes_)
+ ad["VMPARAM_Kvm_Disk"] = "%s:vda:w" % image
+ ad["JobVMType"] = "kvm"
+ ad["JobVMMemory"] = memory
+ ad["JobVM_VCPUS"] = 1
+ ad["JobVMNetworking"] = False
+ ad["JobVMCheckpoint"] = False
+ ad["JobVMMemory"] = memory
+ ad["JobVMMemory"] = memory
+
+ # Requirements
-# self.command = Attribute(app, "command")
-# self.command.default = "QMF Submitted VM"
-# self.add_attribute(self.command)
+ exprs = list()
+
+ exprs.append('VM_Type == "KVM"')
+ exprs.append('Arch == "X86_64"') # parameterize
+ exprs.append('HasVM')
+ exprs.append('VM_AvailNum > 0')
+ exprs.append('TotalDisk >= DiskUsage')
+ exprs.append('TotalMemory >= %i' % memory)
+ exprs.append('VM_Memory >= %i' % memory)
-# self.directory = Attribute(app, "directory")
-# self.directory.default = "/tmp"
-# self.add_attribute(self.directory)
+ # needs further consideration
+ #exprs.append('TARGET.FileSystemDomain == MY.FileSystemDomain')
-# self.stdin = Attribute(app, "stdin")
-# self.add_attribute(self.stdin)
+ ad["Requirements"] = " && ".join(exprs)
-# self.stdout = Attribute(app, "stdout")
-# self.add_attribute(self.stdout)
+ # Descriptors
-# self.stderr = Attribute(app, "stderr")
-# self.add_attribute(self.stderr)
+ descriptors = dict()
+ descriptors["Requirements"] = "com.redhat.grid.Expression"
-# self.usrlog = Attribute(app, "usrlog")
-# self.add_attribute(self.usrlog)
+ ad["!!descriptors"] = descriptors
-# class DiskField(StringField):
-# def render_title(self, session):
-# return "Disk"
+ invoc.description = "Submit VM job '%s'" % description
-# class VMAttributes(Attribute):
-# def get(self, session):
-# vm_ads = list()
-# vm_ads.append("ShouldTransferFiles=NEVER")
-# vm_ads.append("JobVMType=kvm")
-# vm_ads.append("JobVMMemory=512")
-# vm_ads.append("VMPARAM_Xen_Kernel=included")
+ self.qmf_call(invoc, scheduler, "SubmitJob", ad)
-# disk = self.widget.disk.get(session)
-# vm_ads.append("VMPARAM_Xen_Disk=%s:hda:w" % disk)
+class VmJobSubmitForm(ObjectTaskForm):
+ def __init__(self, app, name, task):
+ cls = app.model.com_redhat_grid.Scheduler
+ super(VmJobSubmitForm, self).__init__(app, name, task, cls)
-# return "\n".join(vm_ads)
+ self.pool_name = Attribute(app, "pool")
+ self.add_attribute(self.pool_name)
+ self.description = JobDescriptionField(app, "description")
+ self.add_field(self.description)
+
+ self.image = self.ImageField(app, "image")
+ self.image.input.size = 50
+ self.image.required = True
+ self.add_field(self.image)
+
+ 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)
+
+ def process_submit(self, session):
+ self.validate(session)
+
+ if not self.errors.get(session):
+ scheduler = self.scheduler.get(session)
+ description = self.description.get(session)
+ image = self.image.get(session)
+
+ self.task.invoke(session,
+ scheduler,
+ description,
+ image,
+ 512)
+
+ self.task.exit_with_redirect(session, scheduler)
+
+ class ImageField(StringField):
+ def render_title(self, session):
+ return "Image location"
+
# class SubmissionDagAdd(SubmissionAdd):
# def __init__(self, app, frame):
# super(SubmissionDagAdd, self).__init__(app, frame)
Modified: mgmt/newdata/cumin/python/cumin/usergrid/widgets.py
===================================================================
--- mgmt/newdata/cumin/python/cumin/usergrid/widgets.py 2010-08-12 21:21:44 UTC (rev
4206)
+++ mgmt/newdata/cumin/python/cumin/usergrid/widgets.py 2010-08-12 21:44:33 UTC (rev
4207)
@@ -73,6 +73,9 @@
link = TaskLink(app, "job_submit", app.grid.job_submit)
self.add_child(link)
+ link = TaskLink(app, "vm_job_submit", app.grid.vm_job_submit)
+ self.add_child(link)
+
# XXX
# task = SubmissionVMAdd(app)
# self.vm_link = ObjectTaskLink(app, "submissionvmadd", task)
@@ -109,9 +112,12 @@
col = ObjectLinkColumn(app, "name", self.cls.Name, self.cls._id,
frame)
self.insert_column(1, col)
- link = TaskLink(app, "add", app.grid.job_submit)
+ link = TaskLink(app, "job_submit", app.grid.job_submit)
self.links.add_child(link)
+ link = TaskLink(app, "vm_job_submit", app.grid.vm_job_submit)
+ self.links.add_child(link)
+
class UserJobStatSet(NewStatSet):
def __init__(self, app, name, user):
super(UserJobStatSet, self).__init__(app, name)
Modified: mgmt/newdata/cumin/python/cumin/usergrid/widgets.strings
===================================================================
--- mgmt/newdata/cumin/python/cumin/usergrid/widgets.strings 2010-08-12 21:21:44 UTC (rev
4206)
+++ mgmt/newdata/cumin/python/cumin/usergrid/widgets.strings 2010-08-12 21:44:33 UTC (rev
4207)
@@ -36,6 +36,7 @@
<ul style="list-style-type: none; margin: 1 0; padding: 0;">
<li>{job_submit}</li>
+ <li>{vm_job_submit}</li>
</ul>
</td>
</tr>