Filter status: All, Available, Unavailable, Unconfigured, Pending, Reserved
[myslice.git] / portal / sliceresourceview.py
index 2034eac..cdd5f13 100644 (file)
@@ -1,26 +1,45 @@
-from django.template                 import RequestContext
-from django.shortcuts                import render_to_response
+import json
 
-from manifold.core.query             import Query, AnalyzedQuery
-from manifoldapi.manifoldapi         import execute_query
-
-from django.views.generic.base      import TemplateView
-
-from unfold.loginrequired           import LoginRequiredView
+from django.template                    import RequestContext
+from django.shortcuts                   import render_to_response
+from django.views.generic.base          import TemplateView
 from django.http import HttpResponse
 from django.shortcuts import render
 
-from unfold.page                     import Page
+from manifold.core.query                import Query, AnalyzedQuery
+from manifoldapi.manifoldapi            import execute_query
+
+
+from unfold.loginrequired               import LoginRequiredView
+from unfold.page                        import Page
+
+from myslice.configengine               import ConfigEngine
+
+from plugins.apply                      import ApplyPlugin
+from plugins.querytable                 import QueryTable
+from plugins.googlemap                  import GoogleMap
+# from plugins.queryupdater               import QueryUpdaterPlugin
+from plugins.filter_status              import FilterStatusPlugin
+from plugins.testbeds                   import TestbedsPlugin
+from plugins.scheduler2                 import Scheduler2
+from plugins.asap                       import AsapPlugin
+
+# Bristol plugin
+from plugins.univbris                   import Univbris
+from plugins.univbrisfoam               import UnivbrisFoam
+from plugins.univbrisfv                 import UnivbrisFv
+from plugins.univbrisfvf                import UnivbrisFvf
+from plugins.univbrisfvfo              import UnivbrisFvfo
+from plugins.univbristopo               import UnivbrisTopo
+from plugins.univbrisvtam               import UnivbrisVtam as UnivbrisVtamPlugin
+from plugins.univbrisvtamform          import UnivbrisVtamForm
 
-from myslice.configengine            import ConfigEngine
-from plugins.querytable              import QueryTable
-from plugins.googlemap               import GoogleMap
-from plugins.queryupdater            import QueryUpdater
-from plugins.testbeds                import TestbedsPlugin
-from plugins.scheduler2              import Scheduler2
-from plugins.columns_editor          import ColumnsEditor
+from plugins.columns_editor             import ColumnsEditor
+from plugins.sladialog                  import SlaDialog
+from plugins.lists.simplelist           import SimpleList
 
 from myslice.theme import ThemeView
+from myslice.settings import logger
 
 class SliceResourceView (LoginRequiredView, ThemeView):
     template_name = "slice-resource-view.html"
@@ -42,17 +61,70 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         user_md = metadata.details_by_object('user')
         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
 
+        query_resource_all = Query.get('resource').select(resource_fields)
+        #page.enqueue_query(query_resource_all)
+
+        # leases query
+        #lease_md = metadata.details_by_object('lease')
+        #lease_fields = [column['name'] for column in lease_md['column']]
+
+        #query_lease_all = Query.get('lease').select(lease_fields)
+        #page.enqueue_query(query_lease_all)
+
+        slice_md = metadata.details_by_object('slice')
+        slice_fields = [column['name'] for column in slice_md['column']]
+        logger.debug("SLICE RES VIEW fields = {}".format(slice_fields))
         # TODO The query to run is embedded in the URL
+        # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
-        main_query.select(
-                'slice_hrn',
-                'resource.urn', 
-                'resource.hostname', 'resource.type',
-                'resource.network_hrn',
-                'lease.urn',
-                #'user.user_hrn',
-                #'application.measurement_point.counter'
-        )
+        main_query.select(slice_fields)
+
+        # Columns shown by default in Query_table plugin
+        page.expose_js_var("QUERYTABLE_MAP","{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Available':'available'}")
+       
+        # Columns checked by default in Columns_selector plugin
+        query_default_fields = ['hostname', 'type', 'facility_name', 'testbed_name', 'available']
+
+        QUERYTABLE_MAP = { 
+            'hostname'      :   'Resource name',
+            'type'          :   'Type',
+            'facility_name' :   'Facility',
+            'testbed_name'  :   'Testbed',
+            'available'     :   'Available',
+        }
+
+
+        #        # SLICE
+        #        'slice_hrn',
+        #        # - The record key is needed otherwise the storage of records
+        #        #   bugs !
+        #        'slice_urn',
+        #        # RESOURCES
+        #        'resource',
+        #        'lease',
+        #        'resource.urn',
+        #        'resource.hostname', 'resource.type',
+        #        # - The facility_name and testbed_name are required for the
+        #        #   testbeds plugin to properly work.
+        #        'resource.facility_name',
+        #        'resource.testbed_name',
+        #        # LEASES
+        #        'lease.resource',
+        #        'lease.start_time',
+        #        'lease.end_time',
+        #        # - The lease_id is important for NITOS identify already existing
+        #        #   leases
+        #        'lease.lease_id',
+
+        #        # FLOWSPACE
+        #        #'flowspace',
+        #        # VMS
+        #        #'vms',
+
+
+        #        #'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 = 'urn'
@@ -60,29 +132,23 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         page.enqueue_query(main_query, analyzed_query=aq)
         sq_resource    = aq.subquery('resource')
         sq_lease       = aq.subquery('lease')
-
-        query_resource_all = Query.get('resource').select(resource_fields)
-        page.enqueue_query(query_resource_all)
-
-        # leases query
-        lease_md = metadata.details_by_object('lease')
-        lease_fields = [column['name'] for column in lease_md['column']]
-
-        query_lease_all = Query.get('lease').select(lease_fields)
-        page.enqueue_query(query_lease_all)
+        #sq_flowspace   = aq.subquery('flowspace')
+        #sq_vms         = aq.subquery('vms')
 
         # --------------------------------------------------------------------------
         # ALL RESOURCES LIST
         # resources as a list using datatable plugin
  
-        list_resources = QueryTable(
-            page       = page,
-            domid      = 'resources-list',
-            title      = 'List view',
-            query      = sq_resource,
-            query_all  = query_resource_all,
-            init_key   = "urn",
-            checkboxes = True,
+        list_resources     = QueryTable(
+            page           = page,
+            domid          = 'resources-list',
+            title          = 'List view',
+            query          = sq_resource,
+            query_all      = query_resource_all,
+            mapping        = QUERYTABLE_MAP,
+            default_fields = query_default_fields,
+            init_key       = "urn",
+            checkboxes     = True,
             datatables_options = {
                 'iDisplayLength': 25,
                 'bLengthChange' : True,
@@ -95,21 +161,35 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         # RESERVED RESOURCES LIST
         # resources as a list using datatable plugin
  
-        list_reserved_resources = QueryTable(
-            page       = page,
-            domid      = 'resources-reserved-list',
-            title      = 'List view',
-            query      = sq_resource,
-            query_all  = sq_resource,
-            init_key   = "urn",
-            checkboxes = True,
-            datatables_options = {
-                'iDisplayLength': 25,
-                'bLengthChange' : True,
-                'bAutoWidth'    : True,
-                },
+        list_reserved_resources = SimpleList(
+            title = None,
+            page  = page,
+            key   = 'urn',
+            query = sq_resource,
         )
 
+        list_reserved_leases = SimpleList(
+            title = None,
+            page  = page,
+            key   = 'resource',
+            query = sq_lease,
+        )
+
+#        list_reserved_resources = QueryTable(
+#            page       = page,
+#            domid      = 'resources-reserved-list',
+#            title      = 'List view',
+#            query      = sq_resource,
+#            query_all  = sq_resource,
+#            init_key   = "urn",
+#            checkboxes = True,
+#            datatables_options = {
+#                'iDisplayLength': 25,
+#                'bLengthChange' : True,
+#                'bAutoWidth'    : True,
+#                },
+#        )
+
         # --------------------------------------------------------------------------
         # COLUMNS EDITOR
         # list of fields to be applied on the query 
@@ -119,6 +199,7 @@ class SliceResourceView (LoginRequiredView, ThemeView):
             page  = page,
             query = sq_resource, 
             query_all = query_resource_all,
+            default_fields = query_default_fields,
             title = "Select Columns",
             domid = 'select-columns',
         )
@@ -134,16 +215,16 @@ class SliceResourceView (LoginRequiredView, ThemeView):
             # tab's sons preferably turn this off
             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.,
-            longitude  = 9,
-            zoom       = 8,
+            
+            # To center around Europe : 53,9 / 3
+            latitude   = 53.,
+            longitude  = 9.,
+            zoom       = 3,
         )
 
         # --------------------------------------------------------------------------
@@ -157,23 +238,36 @@ class SliceResourceView (LoginRequiredView, ThemeView):
             # this is the query at the core of the slice list
             query = sq_resource,
             query_lease = sq_lease,
-            query_all_resources = query_resource_all,
-            query_all_leases = query_lease_all,
         )
 
+        # --------------------------------------------------------------------------
+        # LEASES Asap Scheduler
+        # Select an end_time for all unconfigured resources
+        # start_time is as soon as possible
+
+        #resources_as_asap = AsapPlugin( 
+        #    page       = page,
+        #    domid      = 'asap',
+        #    title      = 'Asap',
+        #    # this is the query at the core of the slice list
+        #    query = sq_resource,
+        #    query_lease = sq_lease,
+        #)
+
         # --------------------------------------------------------------------------
         # QueryUpdater (Pending Operations)
  
-        pending_resources = QueryUpdater(
-            page                = page,
-            title               = 'Pending operations',
-            query               = main_query,
-            togglable           = False,
-            # start turned off, it will open up itself when stuff comes in
-            toggled             = False,
-            domid               = 'pending',
-            outline_complete    = True,
-        )
+#         pending_resources = QueryUpdaterPlugin(
+#             page                = page,
+#             title               = 'Pending operations',
+#             query               = main_query,
+#             togglable           = False,
+#             # start turned off, it will open up itself when stuff comes in
+#             toggled             = False,
+#             domid               = 'pending',
+#             outline_complete    = True,
+#             username            = request.user,
+#         )
 
         # --------------------------------------------------------------------------
         # NETWORKS
@@ -182,35 +276,188 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         network_md = metadata.details_by_object('network')
         network_fields = [column['name'] for column in network_md['column']]
 
-        query_network = Query.get('network').select(network_fields)
-        page.enqueue_query(query_network)
+        #query_networks = Query.get('network').select(network_fields)
+        #page.enqueue_query(query_networks)
 
         filter_testbeds = TestbedsPlugin(
-            page          = page,
-            domid         = 'testbeds-filter',
-            title         = 'Filter by testbeds',
-            query         = sq_resource,
-            query_all     = query_resource_all,
-            query_network = query_network,
-            init_key      = "network_hrn",
-            checkboxes    = True,
-            datatables_options = {
-                'iDisplayLength': 25,
-                'bLengthChange' : True,
-                'bAutoWidth'    : True,
-                },
+            page            = page,
+            domid           = 'testbeds-filter',
+            title           = 'Filter by testbeds',
+            query           = sq_resource,
+            #query_networks  = query_networks,
+            #init_key        = "network_hrn",
+            #checkboxes      = True,
+            #datatables_options = {
+            #    'iDisplayLength': 25,
+            #    'bLengthChange' : True,
+            #    'bAutoWidth'    : True,
+            #    },
         )
 
+        filter_status = FilterStatusPlugin(
+            page            = page,
+            domid           = "filter-status",
+            query           = sq_resource,
+            query_lease     = sq_lease,
+        )
+        apply = ApplyPlugin(
+            page            = page,
+            domid           = "apply",
+            query           = main_query,
+            username            = request.user,
+        )
+            
+        # --------------------------------------------------------------------------
+        # Ofelia OpenFlow Plugin 
+        # Bristol plugin
+
+       # plugin which display a "gathering resources" message 
+        # waiting for all resources to be returned by manifold
+       # univbriswelcome = Univbris(
+       #     page  = page,
+       #     title = 'univbris_welcome',
+       #     domid = 'univbris_welcome',
+       #     query = query_resource_all,
+       # )
+
+       # univbrisfoamlist = UnivbrisFoam(
+       #     page  = page,
+       #     title = 'univbris_foam_ports_selection',
+       #     domid = 'univbris_foam_ports_selection',
+       #     query = query_resource_all,
+       #     query_all = query_resource_all,
+       #     checkboxes = False,
+       #     datatables_options = {
+       #         'iDisplayLength': 10,
+       #         'bLengthChange' : True,
+       #         'bAutoWidth'    : True,
+       #         },
+       # )
+
+       # #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
+       # univbrisfvlist = UnivbrisFv(
+       #         page  = page,
+       #         title = 'univbris_flowspace_selection',
+       #         domid = 'univbris_flowspace_selection',
+       #         query = sq_flowspace,
+       #         query_all = query_resource_all,
+       #         datatables_options = {
+       #             'iDisplayLength': 5,
+       #             'bLengthChange' : True,
+       #             'bAutoWidth'    : True,
+       #             },
+       # )
+
+       # #plugin which allows the definition of a single flowspace
+       # univbrisfvform = UnivbrisFvf(
+       #         page  = page,
+       #         title = 'univbris_flowspace_form',
+       #         domid = 'univbris_flowspace_form',
+       #         query = query_resource_all,
+       #         query_all = None,
+       #         datatables_options = {
+       #             'iDisplayLength': 3,
+       #             'bLengthChange' : True,
+       #             'bAutoWidth'    : True,
+       #             },
+       # )
+
+          # #plugin which allows the definition the match criteria on a single OPTICAL flowspace
+       # univbrisofvform = UnivbrisFvfo(
+       #     page  = page,
+       #     title = 'univbris_oflowspace_form',
+       #     domid = 'univbris_oflowspace_form',
+          #     query = None,
+       #     query_all = None,
+       #     datatables_options = { 
+       #         'iDisplayLength': 3,
+       #         'bLengthChange' : True,
+       #         'bAutoWidth'    : True,
+       #         },
+       # )
+
+       # #plugin which display the gathered topology
+       # univbristopology = UnivbrisTopo(
+       #     page  = page,
+       #     title = 'univbris_topology',
+       #     domid = 'univbris_topology',
+       #     query = query_resource_all,
+       # )
+
+       # # --------------------------------------------------------------------------
+       # # Ofelia VTAM Plugin 
+       # # Bristol Plugin
+
+       # #plugin which display a table where an experimenter will add VMs to according to his needs
+       # # responsible to send the data to Manifold
+       # univbrisvtamplugin = UnivbrisVtamPlugin(
+       #     page  = page,
+       #     title = 'univbris_vtam',
+       #     domid = 'univbris_vtam',
+       #     query = sq_vms,
+       #     #query = sq_resource,
+       # )
+
+       # #plugin which display a form where an experimenter will specify 
+       # # in which testbed and which physical server to setup the VM
+       # univbrisvtamform = UnivbrisVtamForm(
+       #     page  = page,
+       #     title = 'univbris_vtam_form',
+       #     domid = 'univbris_vtam_form',
+          #     query =  query_resource_all,
+       #     query_all = None,
+       #     datatables_options = { 
+       #         'iDisplayLength': 3,
+       #         'bLengthChange' : True,
+       #         'bAutoWidth'    : True,
+       #         },
+       # )
+
+        # --------------------------------------------------------------------------
+        # SLA View and accept dialog
+
+        sla_dialog = SlaDialog(
+           page                = page,
+           title               = 'sla dialog',
+           query               = main_query,
+           #togglable           = False,
+           # start turned off, it will open up itself when stuff comes in
+           #toggled             = True,
+           domid               = 'sla_dialog',
+           #outline_complete    = True,
+           username            = request.user,
+        )
+        
         template_env = {}
+
+        template_env['request'] = self.request       
+
         template_env['list_resources'] = list_resources.render(self.request)
-#         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
+        template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
+        template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
 
         template_env['columns_editor'] = filter_column_editor.render(self.request)
 
         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
+        template_env['filter_status'] = filter_status.render(self.request)
+        template_env['apply'] = apply.render(self.request)
+
         template_env['map_resources'] = map_resources.render(self.request)
         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
-        template_env['pending_resources'] = pending_resources.render(self.request)
+        #template_env['asap'] = resources_as_asap.render(self.request)
+
+        # Bristol plugin
+       # template_env['welcome'] = univbriswelcome.render(self.request)
+       # template_env['resources'] = univbrisfoamlist.render(self.request)
+       # template_env['flowspaces'] = univbrisfvlist.render(self.request)
+       # template_env['oflowspaces_form'] = univbrisofvform.render(self.request)
+       # template_env['flowspaces_form'] = univbrisfvform.render(self.request)
+       # template_env['topology'] = univbristopology.render(self.request)
+       # template_env['vms_list'] = univbrisvtamplugin.render(self.request)
+       # template_env['vm_form'] = univbrisvtamform.render(self.request)
+
+       # template_env['pending_resources'] = pending_resources.render(self.request)
+        template_env['sla_dialog'] = sla_dialog.render(self.request)
         template_env["theme"] = self.theme
         template_env["username"] = request.user
         template_env["slice"] = slicename