translate most modules to using print() as imported from __future__
[myslice.git] / portal / sliceresourceview.py
1 from __future__ import print_function
2
3 from django.template                    import RequestContext
4 from django.shortcuts                   import render_to_response
5
6 from manifold.core.query                import Query, AnalyzedQuery
7 from manifoldapi.manifoldapi            import execute_query
8 import json
9
10 from django.views.generic.base          import TemplateView
11
12 from unfold.loginrequired               import LoginRequiredView
13 from django.http import HttpResponse
14 from django.shortcuts import render
15
16 from unfold.page                        import Page
17
18 from myslice.configengine               import ConfigEngine
19
20 from plugins.apply                      import ApplyPlugin
21 from plugins.querytable                 import QueryTable
22 from plugins.googlemap                  import GoogleMap
23 # from plugins.queryupdater               import QueryUpdaterPlugin
24 from plugins.filter_status              import FilterStatusPlugin
25 from plugins.testbeds                   import TestbedsPlugin
26 from plugins.scheduler2                 import Scheduler2
27
28 # Bristol plugin
29 from plugins.univbris                   import Univbris
30 from plugins.univbrisfoam               import UnivbrisFoam
31 from plugins.univbrisfv                 import UnivbrisFv
32 from plugins.univbrisfvf                import UnivbrisFvf
33 from plugins.univbrisfvfo               import UnivbrisFvfo
34 from plugins.univbristopo               import UnivbrisTopo
35 from plugins.univbrisvtam                   import UnivbrisVtam as UnivbrisVtamPlugin
36 from plugins.univbrisvtamform           import UnivbrisVtamForm
37
38 from plugins.columns_editor             import ColumnsEditor
39 from plugins.sladialog                  import SlaDialog
40 from plugins.lists.simplelist           import SimpleList
41
42 from myslice.theme import ThemeView
43
44 class SliceResourceView (LoginRequiredView, ThemeView):
45     template_name = "slice-resource-view.html"
46     
47     def get(self, request, slicename):
48
49         if request.GET.get('message') : 
50             msg = "Slice successfully updated"
51         else :
52             msg = None
53
54         page = Page(request)
55         metadata = page.get_metadata()
56         page.expose_js_metadata()
57
58         resource_md = metadata.details_by_object('resource')
59         resource_fields = [column['name'] for column in resource_md['column']]
60
61         user_md = metadata.details_by_object('user')
62         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
63
64         query_resource_all = Query.get('resource').select(resource_fields)
65         #page.enqueue_query(query_resource_all)
66
67         # leases query
68         #lease_md = metadata.details_by_object('lease')
69         #lease_fields = [column['name'] for column in lease_md['column']]
70
71         #query_lease_all = Query.get('lease').select(lease_fields)
72         #page.enqueue_query(query_lease_all)
73
74         slice_md = metadata.details_by_object('slice')
75         slice_fields = [column['name'] for column in slice_md['column']]
76         print("SLICE RES VIEW fields = %s" % slice_fields)
77         # TODO The query to run is embedded in the URL
78         # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
79         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
80         main_query.select(slice_fields)
81
82         # Columns shown by default in Query_table plugin
83         page.expose_js_var("QUERYTABLE_MAP","{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Status':'boot_state'}")
84        
85         # Columns checked by default in Columns_selector plugin
86         query_default_fields = ['hostname', 'type', 'facility_name', 'testbed_name', 'boot_state']
87
88         QUERYTABLE_MAP = { 
89             'hostname'      :   'Resource name',
90             'type'          :   'Type',
91             'facility_name' :   'Facility',
92             'testbed_name'  :   'Testbed',
93             'boot_state'    :   'Status',
94         }
95
96
97         #        # SLICE
98         #        'slice_hrn',
99         #        # - The record key is needed otherwise the storage of records
100         #        #   bugs !
101         #        'slice_urn',
102         #        # RESOURCES
103         #        'resource',
104         #        'lease',
105         #        'resource.urn',
106         #        'resource.hostname', 'resource.type',
107         #        # - The facility_name and testbed_name are required for the
108         #        #   testbeds plugin to properly work.
109         #        'resource.facility_name',
110         #        'resource.testbed_name',
111         #        # LEASES
112         #        'lease.resource',
113         #        'lease.start_time',
114         #        'lease.end_time',
115         #        # - The lease_id is important for NITOS identify already existing
116         #        #   leases
117         #        'lease.lease_id',
118
119         #        # FLOWSPACE
120         #        #'flowspace',
121         #        # VMS
122         #        #'vms',
123
124
125         #        #'user.user_hrn',
126         #        #'application.measurement_point.counter'
127         #)
128         # for internal use in the querytable plugin;
129         # needs to be a unique column present for each returned record
130         main_query_init_key = 'urn'
131         aq = AnalyzedQuery(main_query, metadata=metadata)
132         page.enqueue_query(main_query, analyzed_query=aq)
133         sq_resource    = aq.subquery('resource')
134         sq_lease       = aq.subquery('lease')
135         #sq_flowspace   = aq.subquery('flowspace')
136         #sq_vms         = aq.subquery('vms')
137
138         # --------------------------------------------------------------------------
139         # ALL RESOURCES LIST
140         # resources as a list using datatable plugin
141  
142         list_resources     = QueryTable(
143             page           = page,
144             domid          = 'resources-list',
145             title          = 'List view',
146             query          = sq_resource,
147             query_all      = query_resource_all,
148             mapping        = QUERYTABLE_MAP,
149             default_fields = query_default_fields,
150             init_key       = "urn",
151             checkboxes     = True,
152             datatables_options = {
153                 'iDisplayLength': 25,
154                 'bLengthChange' : True,
155                 'bAutoWidth'    : True,
156                 },
157         )
158
159
160         # --------------------------------------------------------------------------
161         # RESERVED RESOURCES LIST
162         # resources as a list using datatable plugin
163  
164         list_reserved_resources = SimpleList(
165             title = None,
166             page  = page,
167             key   = 'urn',
168             query = sq_resource,
169         )
170
171         list_reserved_leases = SimpleList(
172             title = None,
173             page  = page,
174             key   = 'resource',
175             query = sq_lease,
176         )
177
178 #        list_reserved_resources = QueryTable(
179 #            page       = page,
180 #            domid      = 'resources-reserved-list',
181 #            title      = 'List view',
182 #            query      = sq_resource,
183 #            query_all  = sq_resource,
184 #            init_key   = "urn",
185 #            checkboxes = True,
186 #            datatables_options = {
187 #                'iDisplayLength': 25,
188 #                'bLengthChange' : True,
189 #                'bAutoWidth'    : True,
190 #                },
191 #        )
192
193         # --------------------------------------------------------------------------
194         # COLUMNS EDITOR
195         # list of fields to be applied on the query 
196         # this will add/remove columns in QueryTable plugin
197  
198         filter_column_editor = ColumnsEditor(
199             page  = page,
200             query = sq_resource, 
201             query_all = query_resource_all,
202             default_fields = query_default_fields,
203             title = "Select Columns",
204             domid = 'select-columns',
205         )
206
207         # --------------------------------------------------------------------------
208         # RESOURCES MAP
209         # the resources part is made of a Tabs (Geographic, List), 
210
211         map_resources  = GoogleMap(
212             page       = page,
213             title      = 'Geographic view',
214             domid      = 'resources-map',
215             # tab's sons preferably turn this off
216             togglable  = False,
217             query      = sq_resource,
218             # this key is the one issued by google
219             googlemap_api_key = ConfigEngine().googlemap_api_key(),
220             # the key to use at init-time
221             init_key   = main_query_init_key,
222             checkboxes = True,
223             
224             # To center around Europe : 53,9 / 3
225             latitude   = 53.,
226             longitude  = 9.,
227             zoom       = 3,
228         )
229
230         # --------------------------------------------------------------------------
231         # LEASES Nitos Scheduler
232         # Display the leases reservation timeslots of the resources
233
234         resources_as_scheduler2 = Scheduler2( 
235             page       = page,
236             domid      = 'scheduler',
237             title      = 'Scheduler',
238             # this is the query at the core of the slice list
239             query = sq_resource,
240             query_lease = sq_lease,
241         )
242
243         # --------------------------------------------------------------------------
244         # QueryUpdater (Pending Operations)
245  
246 #         pending_resources = QueryUpdaterPlugin(
247 #             page                = page,
248 #             title               = 'Pending operations',
249 #             query               = main_query,
250 #             togglable           = False,
251 #             # start turned off, it will open up itself when stuff comes in
252 #             toggled             = False,
253 #             domid               = 'pending',
254 #             outline_complete    = True,
255 #             username            = request.user,
256 #         )
257
258         # --------------------------------------------------------------------------
259         # NETWORKS
260         # testbeds as a list of filters 
261
262         network_md = metadata.details_by_object('network')
263         network_fields = [column['name'] for column in network_md['column']]
264
265         #query_networks = Query.get('network').select(network_fields)
266         #page.enqueue_query(query_networks)
267
268         filter_testbeds = TestbedsPlugin(
269             page            = page,
270             domid           = 'testbeds-filter',
271             title           = 'Filter by testbeds',
272             query           = sq_resource,
273             #query_networks  = query_networks,
274             #init_key        = "network_hrn",
275             #checkboxes      = True,
276             #datatables_options = {
277             #    'iDisplayLength': 25,
278             #    'bLengthChange' : True,
279             #    'bAutoWidth'    : True,
280             #    },
281         )
282
283         filter_status = FilterStatusPlugin(
284             page            = page,
285             domid           = "filter-status",
286             query           = sq_resource,
287         )
288         apply = ApplyPlugin(
289             page            = page,
290             domid           = "apply",
291             query           = main_query,
292             username            = request.user,
293         )
294             
295         # --------------------------------------------------------------------------
296         # Ofelia OpenFlow Plugin 
297         # Bristol plugin
298
299         # plugin which display a "gathering resources" message 
300         # waiting for all resources to be returned by manifold
301        # univbriswelcome = Univbris(
302        #     page  = page,
303        #     title = 'univbris_welcome',
304        #     domid = 'univbris_welcome',
305        #     query = query_resource_all,
306        # )
307
308        # univbrisfoamlist = UnivbrisFoam(
309        #     page  = page,
310        #     title = 'univbris_foam_ports_selection',
311        #     domid = 'univbris_foam_ports_selection',
312        #     query = query_resource_all,
313        #     query_all = query_resource_all,
314        #     checkboxes = False,
315        #     datatables_options = {
316        #         'iDisplayLength': 10,
317        #         'bLengthChange' : True,
318        #         'bAutoWidth'    : True,
319        #         },
320        # )
321
322        # #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
323        # univbrisfvlist = UnivbrisFv(
324        #         page  = page,
325        #         title = 'univbris_flowspace_selection',
326        #         domid = 'univbris_flowspace_selection',
327        #         query = sq_flowspace,
328        #         query_all = query_resource_all,
329        #         datatables_options = {
330        #             'iDisplayLength': 5,
331        #             'bLengthChange' : True,
332        #             'bAutoWidth'    : True,
333        #             },
334        # )
335
336        # #plugin which allows the definition of a single flowspace
337        # univbrisfvform = UnivbrisFvf(
338        #         page  = page,
339        #         title = 'univbris_flowspace_form',
340        #         domid = 'univbris_flowspace_form',
341        #         query = query_resource_all,
342        #         query_all = None,
343        #         datatables_options = {
344        #             'iDisplayLength': 3,
345        #             'bLengthChange' : True,
346        #             'bAutoWidth'    : True,
347        #             },
348        # )
349
350            # #plugin which allows the definition the match criteria on a single OPTICAL flowspace
351        # univbrisofvform = UnivbrisFvfo(
352        #     page  = page,
353        #     title = 'univbris_oflowspace_form',
354        #     domid = 'univbris_oflowspace_form',
355            #     query = None,
356        #     query_all = None,
357        #     datatables_options = { 
358        #         'iDisplayLength': 3,
359        #         'bLengthChange' : True,
360        #         'bAutoWidth'    : True,
361        #         },
362        # )
363
364        # #plugin which display the gathered topology
365        # univbristopology = UnivbrisTopo(
366        #     page  = page,
367        #     title = 'univbris_topology',
368        #     domid = 'univbris_topology',
369        #     query = query_resource_all,
370        # )
371
372        # # --------------------------------------------------------------------------
373        # # Ofelia VTAM Plugin 
374        # # Bristol Plugin
375
376        # #plugin which display a table where an experimenter will add VMs to according to his needs
377        # # responsible to send the data to Manifold
378        # univbrisvtamplugin = UnivbrisVtamPlugin(
379        #     page  = page,
380        #     title = 'univbris_vtam',
381        #     domid = 'univbris_vtam',
382        #     query = sq_vms,
383        #     #query = sq_resource,
384        # )
385
386        # #plugin which display a form where an experimenter will specify 
387        # # in which testbed and which physical server to setup the VM
388        # univbrisvtamform = UnivbrisVtamForm(
389        #     page  = page,
390        #     title = 'univbris_vtam_form',
391        #     domid = 'univbris_vtam_form',
392            #     query =  query_resource_all,
393        #     query_all = None,
394        #     datatables_options = { 
395        #         'iDisplayLength': 3,
396        #         'bLengthChange' : True,
397        #         'bAutoWidth'    : True,
398        #         },
399        # )
400
401        # # --------------------------------------------------------------------------
402        # # SLA View and accept dialog
403        # 
404        # sla_dialog = SlaDialog(
405        #     page                = page,
406        #     title               = 'sla dialog',
407        #     query               = main_query,
408        #     togglable           = False,
409        #     # start turned off, it will open up itself when stuff comes in
410        #     toggled             = True,
411        #     domid               = 'sla_dialog',
412        #     outline_complete    = True,
413        #     username            = request.user,
414        # )
415        # 
416         ## check user is pi or not
417         platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
418         account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
419         platform_details = execute_query(self.request, platform_query)
420         account_details = execute_query(self.request, account_query)
421
422         # XXX When session has expired, this is None and thus not iterable
423         for platform_detail in platform_details:
424             for account_detail in account_details:
425                 if platform_detail['platform_id'] == account_detail['platform_id']:
426                     if 'config' in account_detail and account_detail['config'] is not '':
427                         account_config = json.loads(account_detail['config'])
428                         if 'myslice' in platform_detail['platform']:
429                             acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
430         # assigning values
431         if acc_auth_cred == {} or acc_auth_cred == 'N/A':
432             pi = "is_not_pi"
433         else:
434             pi = "is_pi"
435         
436         template_env = {}
437         template_env['list_resources'] = list_resources.render(self.request)
438         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
439         template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
440
441         template_env['columns_editor'] = filter_column_editor.render(self.request)
442
443         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
444         template_env['filter_status'] = filter_status.render(self.request)
445         template_env['apply'] = apply.render(self.request)
446
447         template_env['map_resources'] = map_resources.render(self.request)
448         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
449
450         # Bristol plugin
451        # template_env['welcome'] = univbriswelcome.render(self.request)
452        # template_env['resources'] = univbrisfoamlist.render(self.request)
453        # template_env['flowspaces'] = univbrisfvlist.render(self.request)
454        # template_env['oflowspaces_form'] = univbrisofvform.render(self.request)
455        # template_env['flowspaces_form'] = univbrisfvform.render(self.request)
456        # template_env['topology'] = univbristopology.render(self.request)
457        # template_env['vms_list'] = univbrisvtamplugin.render(self.request)
458        # template_env['vm_form'] = univbrisvtamform.render(self.request)
459
460 #        template_env['pending_resources'] = pending_resources.render(self.request)
461        # template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
462         template_env["theme"] = self.theme
463         template_env["username"] = request.user
464         template_env["pi"] = pi
465         template_env["slice"] = slicename
466         template_env["section"] = "resources"
467         template_env["msg"] = msg
468         template_env.update(page.prelude_env())
469
470         return render_to_response(self.template, template_env, context_instance=RequestContext(request))