fixed naming for facility_name and testbed_name in QueryTable plugin
[unfold.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                 # - The facility_name and testbed_name are required for the
64                 #   testbeds plugin to properly work.
65                 'resource.facility_name', 
66                 'resource.testbed_name',
67                 # LEASES
68                 'lease.resource',
69                 'lease.start_time',
70                 'lease.end_time',
71                 # - The lease_id is important for NITOS identify already existing
72                 #   leases
73                 'lease.lease_id', 
74
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             
179             # To center around Europe : 53,9 / 3
180             latitude   = 53.,
181             longitude  = 9.,
182             zoom       = 3,
183         )
184
185         # --------------------------------------------------------------------------
186         # LEASES Nitos Scheduler
187         # Display the leases reservation timeslots of the resources
188
189         resources_as_scheduler2 = Scheduler2( 
190             page       = page,
191             domid      = 'scheduler',
192             title      = 'Scheduler',
193             # this is the query at the core of the slice list
194             query = sq_resource,
195             query_lease = sq_lease,
196         )
197
198         # --------------------------------------------------------------------------
199         # QueryUpdater (Pending Operations)
200  
201 #         pending_resources = QueryUpdaterPlugin(
202 #             page                = page,
203 #             title               = 'Pending operations',
204 #             query               = main_query,
205 #             togglable           = False,
206 #             # start turned off, it will open up itself when stuff comes in
207 #             toggled             = False,
208 #             domid               = 'pending',
209 #             outline_complete    = True,
210 #             username            = request.user,
211 #         )
212
213         # --------------------------------------------------------------------------
214         # NETWORKS
215         # testbeds as a list of filters 
216
217         network_md = metadata.details_by_object('network')
218         network_fields = [column['name'] for column in network_md['column']]
219
220         #query_networks = Query.get('network').select(network_fields)
221         #page.enqueue_query(query_networks)
222
223         filter_testbeds = TestbedsPlugin(
224             page            = page,
225             domid           = 'testbeds-filter',
226             title           = 'Filter by testbeds',
227             query           = sq_resource,
228             #query_networks  = query_networks,
229             #init_key        = "network_hrn",
230             #checkboxes      = True,
231             #datatables_options = {
232             #    'iDisplayLength': 25,
233             #    'bLengthChange' : True,
234             #    'bAutoWidth'    : True,
235             #    },
236         )
237
238         filter_status = FilterStatusPlugin(
239             page            = page,
240             domid           = "filter-status",
241             query           = sq_resource,
242         )
243         apply = ApplyPlugin(
244             page            = page,
245             domid           = "apply",
246             query           = main_query,
247             username            = request.user,
248         )
249             
250
251         # --------------------------------------------------------------------------
252         # SLA View and accept dialog
253         
254         sla_dialog = SlaDialog(
255             page                = page,
256             title               = 'sla dialog',
257             query               = main_query,
258             togglable           = False,
259             # start turned off, it will open up itself when stuff comes in
260             toggled             = True,
261             domid               = 'sla_dialog',
262             outline_complete    = True,
263             username            = request.user,
264         )
265         
266         ## check user is pi or not
267         platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
268         account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
269         platform_details = execute_query(self.request, platform_query)
270         account_details = execute_query(self.request, account_query)
271
272         # XXX When session has expired, this is None and thus not iterable
273         for platform_detail in platform_details:
274             for account_detail in account_details:
275                 if platform_detail['platform_id'] == account_detail['platform_id']:
276                     if 'config' in account_detail and account_detail['config'] is not '':
277                         account_config = json.loads(account_detail['config'])
278                         if 'myslice' in platform_detail['platform']:
279                             acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
280         # assigning values
281         if acc_auth_cred == {} or acc_auth_cred == 'N/A':
282             pi = "is_not_pi"
283         else:
284             pi = "is_pi"
285         
286         template_env = {}
287         template_env['list_resources'] = list_resources.render(self.request)
288         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
289         template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
290
291         template_env['columns_editor'] = filter_column_editor.render(self.request)
292
293         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
294         template_env['filter_status'] = filter_status.render(self.request)
295         template_env['apply'] = apply.render(self.request)
296
297         template_env['map_resources'] = map_resources.render(self.request)
298         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
299 #        template_env['pending_resources'] = pending_resources.render(self.request)
300         template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
301         template_env["theme"] = self.theme
302         template_env["username"] = request.user
303         template_env["pi"] = pi
304         template_env["slice"] = slicename
305         template_env["section"] = "resources"
306         template_env["msg"] = msg
307         template_env.update(page.prelude_env())
308
309         return render_to_response(self.template, template_env, context_instance=RequestContext(request))