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