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