Author: croberts
Date: 2013-01-16 19:27:04 +0000 (Wed, 16 Jan 2013)
New Revision: 5653
Added:
branches/elephant/cumin/python/cumin/gridhadoop/hadoopobjectframe.py
Modified:
branches/elephant/cumin/python/cumin/gridhadoop/datanode.py
branches/elephant/cumin/python/cumin/gridhadoop/jobtracker.py
branches/elephant/cumin/python/cumin/gridhadoop/main.py
branches/elephant/cumin/python/cumin/gridhadoop/namenode.py
branches/elephant/cumin/python/cumin/gridhadoop/tasktracker.py
Log:
Starting rework of gridoop UI
Modified: branches/elephant/cumin/python/cumin/gridhadoop/datanode.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/datanode.py 2013-01-15 22:40:03 UTC
(rev 5652)
+++ branches/elephant/cumin/python/cumin/gridhadoop/datanode.py 2013-01-16 19:27:04 UTC
(rev 5653)
@@ -39,7 +39,7 @@
def render_title(self, session):
return "HDFS data nodes"
-
+
class DataNodeTable(ObjectQmfSelectorTable):
def __init__(self, app, name, cls):
super(DataNodeTable, self).__init__(app, name, cls)
@@ -97,10 +97,9 @@
super(DataNodeCreate, self).__init__(app, name)
cls = app.model.com_redhat_cumin_grid_hadoop.DataNode
- self.form = DataNodeCreateForm(app, self.name, self, cls)
+ self.form = DataNodeCreateForm(app, self.name + ".createform", self,
cls)
self.invoc = None
-
-
+
def callback(self, result):
if result == False:
self.invoc.status = self.invoc.FAILED
@@ -124,23 +123,42 @@
def get_title(self, session, x):
return "Create data nodes"
+ def enter(self, session, obj):
+ form_session = wooly.Session(self.app.form_page)
+ if obj:
+ self.form.id.set(form_session, obj._id)
+
+ ## TODO find a better way to do this
+ self.form.nn_id.set(form_session,
self.app.gridhadoop.frame.children_by_name["gridhadoop.namenodeframe"].id.get(session))
+ self.form.return_url.set(form_session, session.marshal())
+ self.form.show(form_session)
+
+ self.do_enter(session, obj, form_session)
+ return form_session
+
+ def get_href(self, session, obj):
+
+ return self.enter(session, obj).marshal()
+
+
class DataNodeCreateForm(HadoopNodeCreateForm):
def __init__(self, app, name, task, cls):
super(DataNodeCreateForm, self).__init__(app, name, task, cls)
- self.nameNode = NameNodeField(app, "namenode")
- self.add_field(self.nameNode)
-
- self.binfile = BinFileLoc(app, "binfile")
+ self.binfile = BinFileLoc(app, name + ".binfile")
self.add_field(self.binfile)
- self.count = self.CountField(app, "count")
+ self.count = self.CountField(app, name + ".count")
self.add_field(self.count)
- self.hadoophost = HadoopHostField(app, "hadoophost")
+ self.hadoophost = HadoopHostField(app, name + ".hadoophost")
self.add_field(self.hadoophost)
-
+
+ self.nn_id = Parameter(app, "nn_id")
+ self.add_parameter(self.nn_id)
+
+
def process_display(self, session):
self.scheduler.validate(session)
@@ -155,7 +173,7 @@
owner = session.client_session.username()
hadoophost = self.hadoophost.get(session)
count = self.count.get(session)
- name_node = self.nameNode.get(session)
+ name_node = self.nn_id.get(session)
self.task.invoke(session, None, (binfile, owner, hadoophost, count,
name_node))
self.task.exit_with_redirect(session, url)
Added: branches/elephant/cumin/python/cumin/gridhadoop/hadoopobjectframe.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/hadoopobjectframe.py
(rev 0)
+++ branches/elephant/cumin/python/cumin/gridhadoop/hadoopobjectframe.py 2013-01-16
19:27:04 UTC (rev 5653)
@@ -0,0 +1,60 @@
+from cumin.widgets import *
+from cumin.parameters import *
+from cumin.objectframe import ObjectView
+
+class HadoopObjectFrame(CuminFrame):
+ '''
+ This frame houses the view page for a hadoop object
+ '''
+ def __init__(self, app, name):
+ super(HadoopObjectFrame, self).__init__(app, name)
+
+ # This will hold the id of the object that should be assigned
+ # to self.object. The id and the object are typically determined during
+ # the "process" pass before a page is rendered.
+ self.id = StringParameter(app, "id")
+ self.add_parameter(self.id)
+
+ self.host = StringParameter(app, "host")
+ self.add_parameter(self.host)
+
+ # This will be given a value during the "process" pass after
+ # self.id is determined (lookup by id)
+ self.object = Attribute(app, "object")
+ self.add_attribute(self.object)
+ self.view = HadoopObjectView(app, "view", self.object)
+ self.add_child(self.view)
+ self.icon_href = "resource?name=action-36.png"
+ self.tasks = list()
+
+ def init(self):
+ super(HadoopObjectFrame, self).init()
+ assert self
+ for task in self.tasks:
+ task.init()
+
+ def get_href(self, session, id, host):
+ branch = session.branch()
+ self.id.set(branch, id)
+ self.host.set(branch, host)
+ self.view.show(branch)
+ return branch.marshal()
+
+ def do_process(self, session):
+ id = self.id.get(session)
+ assert id
+ obj = self.get_object(session, id)
+ self.object.set(session, obj)
+ super(HadoopObjectFrame, self).do_process(session)
+
+
+class HadoopObjectView(ObjectView):
+ def render_title(self, session):
+ obj = self.object.get(session)
+ if obj is not None:
+ return "%s" % xml_escape(obj.id)
+ else:
+ return ""
+
+ def add_details_tab(self):
+ pass
\ No newline at end of file
Property changes on: branches/elephant/cumin/python/cumin/gridhadoop/hadoopobjectframe.py
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: branches/elephant/cumin/python/cumin/gridhadoop/jobtracker.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/jobtracker.py 2013-01-15 22:40:03 UTC
(rev 5652)
+++ branches/elephant/cumin/python/cumin/gridhadoop/jobtracker.py 2013-01-16 19:27:04 UTC
(rev 5653)
@@ -8,7 +8,10 @@
from wooly.forms import StringField
from hadoop import *
+from hadoopobjectframe import *
+from tasktracker import TaskTrackerSelector
+
from sage.util import *
class JobTrackerAdapter(HadoopAdapter):
@@ -44,7 +47,7 @@
def __init__(self, app, name, cls):
super(JobTrackerTable, self).__init__(app, name, cls)
- self.id_col = ObjectTableColumn(app, "idcol", cls.Id)
+ self.id_col = self.JobTrackerColumn(app, "idcol", cls.Id, cls.Id,
".jobtrackerframe")
self.ipc_col = ObjectTableColumn(app, "ipc", cls.Ipc)
self.ipc_col.width = "20%"
self.sub_col = SubmittedColumn(app, "sub", cls.Submitted)
@@ -59,6 +62,15 @@
self.add_column(self.uptime_col)
self.add_column(self.owner_col)
+ class JobTrackerColumn(ObjectLinkColumn):
+ def render_cell_href(self, session, record):
+ id = unescape_entity(record[self.id_field.index])
+ #need to make this work for user/grid-hadoop path too somehow
+ frame = self.page.page_widgets_by_path[self.path.rsplit(".", 7)[0]
+ self.frame_path]
+
+ #if isinstance(frame, TagObjectFrame):
+ return frame.get_href(session, id, "grid2.lab.bos.redhat.com")
+
class JobTrackerDelete(ObjectSelectorTask):
def __init__(self, app, selector, name):
super(JobTrackerDelete, self).__init__(app, selector)
@@ -157,3 +169,54 @@
def render_title(self, session):
return "Create a job tracker"
+
+class JobTrackerFrame(HadoopObjectFrame):
+ def __init__(self, app, name):
+ super(JobTrackerFrame, self).__init__(app, name)
+
+ self.view = JobTrackerObjectView(app, "view", self.object)
+ self.replace_child(self.view)
+
+ self.overview = JobTrackerOverview(app, self.name + ".jtoverview",
self.object)
+ self.view.add_tab(self.overview)
+
+ def get_title(self, session):
+ retval = ""
+ try:
+ retval = "Job tracker:'%s' (%s)" %
(xml_escape(self.object.get(session).name), xml_escape(self.object.get(session).id))
+ except Exception, e:
+ pass
+ return retval
+
+ def get_object(self, session, id):
+ class Object(object):
+ pass
+ fake = Object()
+ fake.name = "fake object"
+ fake.id = id
+ return fake
+
+class JobTrackerObjectView(HadoopObjectView):
+ def add_details_tab(self):
+ self.add_tab(JobTrackerDetails(self.app, "details", self.object))
+
+class JobTrackerOverview(Widget):
+ def __init__(self, app, name, node):
+ super(JobTrackerOverview, self).__init__(app, name)
+ self.add_child(TaskTrackerSelector(app, self.name + ".ttforjt",
False))
+
+ def render_title(self, session):
+ return "Task trackers"
+
+class JobTrackerDetails(Widget):
+ def __init__(self, app, name, object):
+ super(JobTrackerDetails, self).__init__(app, name)
+ self.object = object
+
+ def render_title(self, session):
+ return "Details"
+
+ def render_name(self, session):
+ '''sample....would only be called if JobTrackerDetails display was
overridden to say {name}'''
+ obj = self.object.get(session)
+ return obj.name
\ No newline at end of file
Modified: branches/elephant/cumin/python/cumin/gridhadoop/main.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/main.py 2013-01-15 22:40:03 UTC (rev
5652)
+++ branches/elephant/cumin/python/cumin/gridhadoop/main.py 2013-01-16 19:27:04 UTC (rev
5653)
@@ -6,6 +6,9 @@
from cumin.widgets import *
from cumin.util import *
+from namenode import NameNodeFrame
+from jobtracker import JobTrackerFrame
+
from namenode import NameNodeSelector
from datanode import DataNodeSelector
from jobtracker import JobTrackerSelector
@@ -34,6 +37,12 @@
self.view = GridHadoopView(app, name + ".view", check_owner)
self.add_mode(self.view)
+ self.name_node_frame = NameNodeFrame(app, name + ".namenodeframe")
+ self.add_mode(self.name_node_frame)
+
+ self.job_tracker_frame = JobTrackerFrame(app, name +
".jobtrackerframe")
+ self.add_mode(self.job_tracker_frame)
+
def render_title(self, session):
return "Grid-hadoop"
@@ -48,7 +57,4 @@
self.add_child(self.tabs)
self.tabs.add_tab(NameNodeSelector(app, name + ".namenodes",
check_owner))
- self.tabs.add_tab(DataNodeSelector(app, name + ".datanodes",
check_owner))
- self.tabs.add_tab(JobTrackerSelector(app, name + ".jobtrackers",
check_owner))
- self.tabs.add_tab(TaskTrackerSelector(app, name + ".tasktrackers",
check_owner))
-
+ self.tabs.add_tab(JobTrackerSelector(app, name + ".jobtrackers",
check_owner))
Modified: branches/elephant/cumin/python/cumin/gridhadoop/namenode.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/namenode.py 2013-01-15 22:40:03 UTC
(rev 5652)
+++ branches/elephant/cumin/python/cumin/gridhadoop/namenode.py 2013-01-16 19:27:04 UTC
(rev 5653)
@@ -7,6 +7,8 @@
from wooly.forms import StringField
from hadoop import *
+from hadoopobjectframe import *
+from datanode import DataNodeSelector
from sage.util import *
@@ -43,7 +45,8 @@
def __init__(self, app, name, cls):
super(NameNodeTable, self).__init__(app, name, cls)
- self.id_col = ObjectTableColumn(app, "idcol", cls.Id)
+ #probably doesnt' work for user/grid-hadoop path
+ self.id_col = self.NameNodeColumn(app, "idcol", cls.Id, cls.Id,
".namenodeframe")
self.ipc_col = ObjectTableColumn(app, "ipc", cls.Ipc)
self.ipc_col.width = "20%"
self.sub_col = SubmittedColumn(app, "sub", cls.Submitted)
@@ -58,6 +61,18 @@
self.add_column(self.uptime_col)
self.add_column(self.owner_col)
+ class NameNodeColumn(ObjectLinkColumn):
+ def render_cell_href(self, session, record):
+ id = unescape_entity(record[self.id_field.index])
+ #need to make this work for user/grid-hadoop path too somehow
+ # this is way less than ideal
+ frame = self.page.page_widgets_by_path[self.path.rsplit(".", 7)[0]
+ self.frame_path]
+
+ #if isinstance(frame, TagObjectFrame):
+ return frame.get_href(session, id, "grid2.lab.bos.redhat.com")
+# else:
+# return id #not able to get a link
+
class NameNodeCreate(Task):
def __init__(self, app, name):
super(NameNodeCreate, self).__init__(app, name)
@@ -143,3 +158,56 @@
def render_title(self, session):
return "Remove name nodes"
+class NameNodeFrame(HadoopObjectFrame):
+ def __init__(self, app, name):
+ super(NameNodeFrame, self).__init__(app, name)
+
+# self.set_tags = TagsNodeEditTask(app, self)
+# self.set_nodes = TagsTagEditTask(app, self)
+# self.set_features = TagsFeatureEditTask(app, self)
+ self.view = NameNodeObjectView(app, "view", self.object)
+ self.replace_child(self.view)
+
+ self.overview = NameNodeOverview(app, self.name + ".nnoverview",
self.object)
+ self.view.add_tab(self.overview)
+
+ def get_title(self, session):
+ retval = ""
+ try:
+ retval = "Name node:'%s' (%s)" %
(xml_escape(self.object.get(session).name), xml_escape(self.object.get(session).id))
+ except Exception, e:
+ pass
+ return retval
+
+ def get_object(self, session, id):
+ class Object(object):
+ pass
+ fake = Object()
+ fake.name = "fake object"
+ fake.id = id
+ return fake
+
+class NameNodeObjectView(HadoopObjectView):
+ def add_details_tab(self):
+ self.add_tab(NameNodeDetails(self.app, self.name + ".details",
self.object))
+
+class NameNodeOverview(Widget):
+ def __init__(self, app, name, node):
+ super(NameNodeOverview, self).__init__(app, name)
+ self.add_child(DataNodeSelector(app, self.name + ".dnfornn", False))
+
+ def render_title(self, session):
+ return "Data nodes"
+
+class NameNodeDetails(Widget):
+ def __init__(self, app, name, object):
+ super(NameNodeDetails, self).__init__(app, name)
+ self.object = object
+
+ def render_title(self, session):
+ return "Details"
+
+ def render_name(self, session):
+ '''sample....would only be called if NameNodeDetails display was
overridden to say {name}'''
+ obj = self.object.get(session)
+ return obj.name
\ No newline at end of file
Modified: branches/elephant/cumin/python/cumin/gridhadoop/tasktracker.py
===================================================================
--- branches/elephant/cumin/python/cumin/gridhadoop/tasktracker.py 2013-01-15 22:40:03 UTC
(rev 5652)
+++ branches/elephant/cumin/python/cumin/gridhadoop/tasktracker.py 2013-01-16 19:27:04 UTC
(rev 5653)
@@ -115,8 +115,22 @@
except Exception, e:
invoc.status = invoc.FAILED
log.debug("Creating task trackers failed", exc_info=True)
- invoc.end()
+ invoc.end()
+
+ def enter(self, session, obj):
+ form_session = wooly.Session(self.app.form_page)
+ if obj:
+ self.form.id.set(form_session, obj._id)
+
+ ## TODO find a better way to do this
+ self.form.jt_id.set(form_session,
self.app.gridhadoop.frame.children_by_name["gridhadoop.jobtrackerframe"].id.get(session))
+ self.form.return_url.set(form_session, session.marshal())
+ self.form.show(form_session)
+
+ self.do_enter(session, obj, form_session)
+ return form_session
+
def get_title(self, session, x):
return "Create task trackers"
@@ -125,9 +139,6 @@
def __init__(self, app, name, task, cls):
super(TaskTrackerCreateForm, self).__init__(app, name, task, cls)
- self.jobTracker = JobTrackerField(app, "jobtracker")
- self.add_field(self.jobTracker)
-
self.binfile = BinFileLoc(app, "binfile")
self.add_field(self.binfile)
@@ -136,6 +147,9 @@
self.hadoophost = HadoopHostField(app, "hadoophost")
self.add_field(self.hadoophost)
+
+ self.jt_id = Parameter(app, "jt_id")
+ self.add_parameter(self.jt_id)
def process_display(self, session):
self.scheduler.validate(session)
@@ -151,7 +165,7 @@
owner = session.client_session.username()
hadoophost = self.hadoophost.get(session)
count = self.count.get(session)
- job_tracker = self.jobTracker.get(session)
+ job_tracker = self.jt_id.get(session)
self.task.invoke(session, None, (binfile, owner, hadoophost, count,
job_tracker))
self.task.exit_with_redirect(session, url)