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