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