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