Chrysostomos for scheduler
[myslice.git] / portal / sliceview.py
old mode 100644 (file)
new mode 100755 (executable)
index 3822321..e28ef01
@@ -1,3 +1,4 @@
+import json
 from django.template                 import RequestContext
 from django.shortcuts                import render_to_response
 
 from django.template                 import RequestContext
 from django.shortcuts                import render_to_response
 
@@ -5,24 +6,31 @@ from unfold.loginrequired            import LoginRequiredAutoLogoutView
 
 from unfold.page                     import Page
 from manifold.core.query             import Query, AnalyzedQuery
 
 from unfold.page                     import Page
 from manifold.core.query             import Query, AnalyzedQuery
+from manifold.manifoldapi            import execute_query
 
 
-from ui.topmenu                      import topmenu_items, the_user
+from ui.topmenu                      import topmenu_items_live, the_user
 
 from plugins.raw                     import Raw
 from plugins.stack                   import Stack
 from plugins.tabs                    import Tabs
 from plugins.querytable              import QueryTable 
 
 from plugins.raw                     import Raw
 from plugins.stack                   import Stack
 from plugins.tabs                    import Tabs
 from plugins.querytable              import QueryTable 
+from plugins.querygrid               import QueryGrid
 from plugins.queryupdater            import QueryUpdater
 from plugins.googlemap               import GoogleMap
 from plugins.senslabmap              import SensLabMap
 from plugins.queryupdater            import QueryUpdater
 from plugins.googlemap               import GoogleMap
 from plugins.senslabmap              import SensLabMap
+#from plugins.scheduler               import Scheduler
+from plugins.scheduler2              import Scheduler2
 from plugins.querycode               import QueryCode
 from plugins.querycode               import QueryCode
+# Thierry
+# stay away from query editor for now as it seems to make things go very slow
+# see https://lists.myslice.info/pipermail/devel-myslice/2013-December/000221.html 
 from plugins.query_editor            import QueryEditor
 from plugins.active_filters          import ActiveFilters
 from plugins.quickfilter             import QuickFilter
 from plugins.messages                import Messages
 from plugins.slicestat               import SliceStat
 
 from plugins.query_editor            import QueryEditor
 from plugins.active_filters          import ActiveFilters
 from plugins.quickfilter             import QuickFilter
 from plugins.messages                import Messages
 from plugins.slicestat               import SliceStat
 
-from myslice.config                  import Config
+from myslice.configengine            import ConfigEngine
 
 tmp_default_slice='ple.upmc.myslicedemo'
 
 
 tmp_default_slice='ple.upmc.myslicedemo'
 
@@ -30,6 +38,12 @@ tmp_default_slice='ple.upmc.myslicedemo'
 #do_query_users=True
 do_query_users=False
 
 #do_query_users=True
 do_query_users=False
 
+#do_query_leases=True
+do_query_leases=False
+
+insert_grid=False
+#insert_grid=True
+
 insert_messages=False
 #insert_messages=True
 
 insert_messages=False
 #insert_messages=True
 
@@ -42,10 +56,9 @@ class SliceView (LoginRequiredAutoLogoutView):
         page.add_js_files  ( [ "js/common.functions.js" ] )
         page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
         page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
         page.add_js_files  ( [ "js/common.functions.js" ] )
         page.add_js_chunks ('$(function() { messages.debug("sliceview: jQuery version " + $.fn.jquery); });')
         page.add_js_chunks ('$(function() { messages.debug("sliceview: users turned %s"); });'%("on" if do_query_users else "off"))
-        config=Config()
-        page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(config.manifold_url()))
-        page.expose_js_metadata()
-    
+        page.add_js_chunks ('$(function() { messages.debug("sliceview: leases turned %s"); });'%("on" if do_query_leases else "off"))
+        page.add_js_chunks ('$(function() { messages.debug("manifold URL %s"); });'%(ConfigEngine().manifold_url()))
+
         metadata = page.get_metadata()
         resource_md = metadata.details_by_object('resource')
         resource_fields = [column['name'] for column in resource_md['column']]
         metadata = page.get_metadata()
         resource_md = metadata.details_by_object('resource')
         resource_fields = [column['name'] for column in resource_md['column']]
@@ -57,22 +70,49 @@ class SliceView (LoginRequiredAutoLogoutView):
         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
         main_query.select(
                 'slice_hrn',
         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
         main_query.select(
                 'slice_hrn',
-                'resource.hrn', 'resource.hostname', 'resource.type', 
+                #'resource.hrn', 'resource.urn', 
+                'resource.hostname', 'resource.type', 
                 'resource.network_hrn',
                 'resource.network_hrn',
-                #'lease.urn',
+                'lease.urn',
                 'user.user_hrn',
                 #'application.measurement_point.counter'
         )
                 'user.user_hrn',
                 #'application.measurement_point.counter'
         )
+        # for internal use in the querytable plugin;
+        # needs to be a unique column present for each returned record
+        main_query_init_key = 'hostname'
     
         query_resource_all = Query.get('resource').select(resource_fields)
     
         query_resource_all = Query.get('resource').select(resource_fields)
-        if do_query_users:
-            query_user_all = Query.get('user').select(user_fields)
-    
+
         aq = AnalyzedQuery(main_query, metadata=metadata)
         page.enqueue_query(main_query, analyzed_query=aq)
         page.enqueue_query(query_resource_all)
         if do_query_users:
         aq = AnalyzedQuery(main_query, metadata=metadata)
         page.enqueue_query(main_query, analyzed_query=aq)
         page.enqueue_query(query_resource_all)
         if do_query_users:
-            page.enqueue_query(query_user_all)
+            # Required: the user must have an authority in its user.config
+            # XXX Temporary solution
+            user_query  = Query().get('local:user').select('config','email')
+            user_details = execute_query(self.request, user_query)
+            
+            # not always found in user_details...
+            config={}
+#            for user_detail in user_details:
+#                #email = user_detail['email']
+#                if user_detail['config']:
+#                    config = json.loads(user_detail['config'])
+#            user_detail['authority'] = config.get('authority',"Unknown Authority")
+#
+#            if user_detail['authority'] is not None:
+#                sub_authority = user_detail['authority'].split('.')
+#                root_authority = sub_authority[0]
+#                query_user_all = Query.get(root_authority+':user').select(user_fields)
+#
+#                # XXX TODO this filter doesn't work - to be improved in Manifold
+#                #.filter_by('authority.authority_hrn', '=', user_detail['authority'])
+#
+#                page.enqueue_query(query_user_all)
+#            else:
+#                print "authority of the user is not in local:user db"
+            query_user_all = Query.get('user').select(user_fields)
+            #    query_user_all = None
     
         # ... and for the relations
         # XXX Let's hardcode resources for now
     
         # ... and for the relations
         # XXX Let's hardcode resources for now
@@ -121,6 +161,7 @@ class SliceView (LoginRequiredAutoLogoutView):
         # --------------------------------------------------------------------------
         # Filter Resources
        
         # --------------------------------------------------------------------------
         # Filter Resources
        
+# turn off for now -- see above
         filter_query_editor = QueryEditor(
             page  = page,
             query = sq_resource, 
         filter_query_editor = QueryEditor(
             page  = page,
             query = sq_resource, 
@@ -137,7 +178,8 @@ class SliceView (LoginRequiredAutoLogoutView):
             page                = page,
             title               = 'Filter Resources',
             domid               = 'filters',
             page                = page,
             title               = 'Filter Resources',
             domid               = 'filters',
-            sons                = [filter_query_editor, filter_active_filters],
+            sons                = [filter_query_editor, 
+                                   filter_active_filters],
             togglable           = True,
             toggled             = 'persistent',
             outline_complete    = True, 
             togglable           = True,
             toggled             = 'persistent',
             outline_complete    = True, 
@@ -156,6 +198,10 @@ class SliceView (LoginRequiredAutoLogoutView):
             togglable  = False,
             query      = sq_resource,
             query_all  = query_resource_all,
             togglable  = False,
             query      = sq_resource,
             query_all  = query_resource_all,
+            # this key is the one issued by google
+            googlemap_api_key = ConfigEngine().googlemap_api_key(),
+            # the key to use at init-time
+            init_key   = main_query_init_key,
             checkboxes = True,
             # center on Paris
             latitude   = 49.,
             checkboxes = True,
             # center on Paris
             latitude   = 49.,
@@ -163,16 +209,13 @@ class SliceView (LoginRequiredAutoLogoutView):
             zoom       = 4,
         )
 
             zoom       = 4,
         )
 
-# because (senslab)map.css changes stuff for *all* canvas elements
-# it destroys the googlemap behaviour
-# turning this off for now until Anthony can fix that
-#        resources_as_3dmap = SensLabMap(
-#            page       = page,
-#            title      = '3D Map',
-#            domid      = 'senslabmap',
-#            query      = sq_resource,
-#            query_all  = query_resource_all,
-#        )
+        resources_as_3dmap = SensLabMap(
+            page       = page,
+            title      = '3D Map',
+            domid      = 'senslabmap',
+            query      = sq_resource,
+            query_all  = query_resource_all,
+        )
 
         resources_as_list = QueryTable( 
             page       = page,
 
         resources_as_list = QueryTable( 
             page       = page,
@@ -181,6 +224,7 @@ class SliceView (LoginRequiredAutoLogoutView):
             # this is the query at the core of the slice list
             query      = sq_resource,
             query_all  = query_resource_all,
             # this is the query at the core of the slice list
             query      = sq_resource,
             query_all  = query_resource_all,
+            init_key     = main_query_init_key,
             checkboxes = True,
             datatables_options = { 
                 'iDisplayLength': 25,
             checkboxes = True,
             datatables_options = { 
                 'iDisplayLength': 25,
@@ -189,26 +233,75 @@ class SliceView (LoginRequiredAutoLogoutView):
                 },
             )
 
                 },
             )
 
+        if insert_grid:
+            resources_as_grid = QueryGrid( 
+                page       = page,
+                domid      = 'resources-grid',
+                title      = 'Grid view',
+                # this is the query at the core of the slice list
+                query      = sq_resource,
+                query_all  = query_resource_all,
+                init_key     = main_query_init_key,
+                checkboxes = True,
+                )
+
+        
+
+        #if do_query_leases:
+        #    resources_as_scheduler = Scheduler(
+
+        #        page        = page,
+        #        title       = 'Scheduler',
+        #        domid       = 'scheduler',
+        #        query       = sq_resource,
+        #        query_all_resources = query_resource_all,
+        #        query_lease = sq_lease,
+
+        #        )
+
+        resources_as_scheduler2 = Scheduler2( 
+            page       = page,
+            domid      = 'scheduler',
+            title      = 'Scheduler',
+            # this is the query at the core of the slice list
+            query = sq_resource,
+            query_all_resources = query_resource_all,
+            query_lease = sq_lease,
+            )
+
        # with the new 'Filter' stuff on top, no need for anything but the querytable
         resources_as_list_area = resources_as_list 
 
        # with the new 'Filter' stuff on top, no need for anything but the querytable
         resources_as_list_area = resources_as_list 
 
+        resources_sons = [
+            resources_as_gmap, 
+            resources_as_3dmap,
+            resources_as_scheduler2,
+            resources_as_list_area,
+            ] if do_query_leases else [
+            resources_as_gmap, 
+            resources_as_3dmap,
+            resources_as_list_area,
+            resources_as_scheduler2,
+            ]
+        if insert_grid:
+            resources_sons.append(resources_as_grid)
+
         resources_area = Tabs ( page=page, 
                                 domid="resources",
                                 togglable=True,
                                 title="Resources",
                                 outline_complete=True,
         resources_area = Tabs ( page=page, 
                                 domid="resources",
                                 togglable=True,
                                 title="Resources",
                                 outline_complete=True,
-                                sons=[ resources_as_gmap, 
-# see above
-#                                       resources_as_3dmap,
-                                       resources_as_list_area, ],
-                                active_domid = 'resources-map',
+                                sons= resources_sons,
+
+                                active_domid = 'scheduler',
+                                persistent_active=True,
                                 )
         main_stack.insert (resources_area)
 
         # --------------------------------------------------------------------------
         # USERS
     
                                 )
         main_stack.insert (resources_area)
 
         # --------------------------------------------------------------------------
         # USERS
     
-        if do_query_users:
+        if do_query_users and query_user_all is not None:
             tab_users = Tabs(
                 page                = page,
                 domid               = 'users',
             tab_users = Tabs(
                 page                = page,
                 domid               = 'users',
@@ -284,13 +377,14 @@ class SliceView (LoginRequiredAutoLogoutView):
         )
 
         tab_measurements = Tabs ( page=page,
         )
 
         tab_measurements = Tabs ( page=page,
-                                domid="measurements",
-                                togglable=True,
-                                toggled  = False,
-                                title="Measurements",
+                                domid = "measurements",
+                                togglable = True,
+                                toggled = 'persistent',
+                                title = "Measurements",
                                 outline_complete=True,
                                 outline_complete=True,
-                                sons=[ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ],
-                                active_domid = 'measurements_stats_cpu',
+                                sons = [ measurements_stats_cpu, measurements_stats_mem, measurements_stats_asb, measurements_stats_arb ],
+                                active_domid = 'resources-stats-cpu',
+                                persistent_active = True,
                                 )
         main_stack.insert (tab_measurements)
         
                                 )
         main_stack.insert (tab_measurements)
         
@@ -338,7 +432,6 @@ class SliceView (LoginRequiredAutoLogoutView):
                     outline_complete = True,
                     ))
     
                     outline_complete = True,
                     ))
     
-    
         # variables that will get passed to the view-unfold1.html template
         template_env = {}
         
         # variables that will get passed to the view-unfold1.html template
         template_env = {}
         
@@ -348,20 +441,15 @@ class SliceView (LoginRequiredAutoLogoutView):
         # more general variables expected in the template
         template_env [ 'title' ] = '%(slicename)s'%locals()
         # the menu items on the top
         # more general variables expected in the template
         template_env [ 'title' ] = '%(slicename)s'%locals()
         # the menu items on the top
-        template_env [ 'topmenu_items' ] = topmenu_items('Slice', request
+        template_env [ 'topmenu_items' ] = topmenu_items_live('Slice', page
         # so we can sho who is logged
         template_env [ 'username' ] = the_user (request) 
     
         # don't forget to run the requests
         # so we can sho who is logged
         template_env [ 'username' ] = the_user (request) 
     
         # don't forget to run the requests
-        page.expose_queries ()
-    
-        # xxx create another plugin with the same query and a different layout (with_datatables)
-        # show that it worls as expected, one single api call to backend and 2 refreshed views
-    
+        page.expose_js_metadata()
         # the prelude object in page contains a summary of the requirements() for all plugins
         # define {js,css}_{files,chunks}
         # the prelude object in page contains a summary of the requirements() for all plugins
         # define {js,css}_{files,chunks}
-        prelude_env = page.prelude_env()
-        template_env.update(prelude_env)
-        result=render_to_response ('view-unfold1.html',template_env,
+        template_env.update(page.prelude_env())
+
+        return render_to_response ('view-unfold1.html',template_env,
                                    context_instance=RequestContext(request))
                                    context_instance=RequestContext(request))
-        return result