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