Revised version of the resource page + related plugins
[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
7 from django.views.generic.base          import TemplateView
8
9 from unfold.loginrequired               import LoginRequiredView
10 from django.http import HttpResponse
11 from django.shortcuts import render
12
13 from unfold.page                        import Page
14
15 from myslice.configengine               import ConfigEngine
16
17 from plugins.apply                      import ApplyPlugin
18 from plugins.querytable                 import QueryTable
19 from plugins.googlemap                  import GoogleMap
20 #from plugins.queryupdater               import QueryUpdater
21 from plugins.filter_status              import FilterStatusPlugin
22 from plugins.testbeds                   import TestbedsPlugin
23 from plugins.scheduler2                 import Scheduler2
24 from plugins.columns_editor             import ColumnsEditor
25 from plugins.sladialog                  import SlaDialog
26 from plugins.lists.simplelist           import SimpleList
27
28 from myslice.theme import ThemeView
29
30 class SliceResourceView (LoginRequiredView, ThemeView):
31     template_name = "slice-resource-view.html"
32     
33     def get(self, request, slicename):
34
35         if request.GET.get('message') : 
36             msg = "Slice successfully updated"
37         else :
38             msg = None
39
40         page = Page(request)
41         metadata = page.get_metadata()
42         page.expose_js_metadata()
43
44         resource_md = metadata.details_by_object('resource')
45         resource_fields = [column['name'] for column in resource_md['column']]
46
47         user_md = metadata.details_by_object('user')
48         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
49
50         # TODO The query to run is embedded in the URL
51         # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
52         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
53         main_query.select(
54                 'slice_urn', # XXX We need the key otherwise the storage of records bugs !
55                 'slice_hrn',
56                 'resource.urn', 
57                 'resource.hostname', 'resource.type',
58                 'resource.network_hrn',
59                 'lease.resource',
60                 'lease.start_time',
61                 'lease.end_time',
62                 #'user.user_hrn',
63                 #'application.measurement_point.counter'
64         )
65         # for internal use in the querytable plugin;
66         # needs to be a unique column present for each returned record
67         main_query_init_key = 'urn'
68         aq = AnalyzedQuery(main_query, metadata=metadata)
69         page.enqueue_query(main_query, analyzed_query=aq)
70         sq_resource    = aq.subquery('resource')
71         sq_lease       = aq.subquery('lease')
72
73         query_resource_all = Query.get('resource').select(resource_fields)
74         #page.enqueue_query(query_resource_all)
75
76         # leases query
77         lease_md = metadata.details_by_object('lease')
78         lease_fields = [column['name'] for column in lease_md['column']]
79
80         query_lease_all = Query.get('lease').select(lease_fields)
81         page.enqueue_query(query_lease_all)
82
83         # --------------------------------------------------------------------------
84         # ALL RESOURCES LIST
85         # resources as a list using datatable plugin
86  
87         list_resources = QueryTable(
88             page       = page,
89             domid      = 'resources-list',
90             title      = 'List view',
91             query      = sq_resource,
92             query_all  = query_resource_all,
93             init_key   = "urn",
94             checkboxes = True,
95             datatables_options = {
96                 'iDisplayLength': 25,
97                 'bLengthChange' : True,
98                 'bAutoWidth'    : True,
99                 },
100         )
101
102
103         # --------------------------------------------------------------------------
104         # RESERVED RESOURCES LIST
105         # resources as a list using datatable plugin
106  
107         list_reserved_resources = SimpleList(
108             title = None,
109             page  = page,
110             key   = 'urn',
111             query = sq_resource,
112         )
113
114         list_reserved_leases = SimpleList(
115             title = None,
116             page  = page,
117             key   = 'resource',
118             query = sq_lease,
119         )
120
121 #        list_reserved_resources = QueryTable(
122 #            page       = page,
123 #            domid      = 'resources-reserved-list',
124 #            title      = 'List view',
125 #            query      = sq_resource,
126 #            query_all  = sq_resource,
127 #            init_key   = "urn",
128 #            checkboxes = True,
129 #            datatables_options = {
130 #                'iDisplayLength': 25,
131 #                'bLengthChange' : True,
132 #                'bAutoWidth'    : True,
133 #                },
134 #        )
135
136         # --------------------------------------------------------------------------
137         # COLUMNS EDITOR
138         # list of fields to be applied on the query 
139         # this will add/remove columns in QueryTable plugin
140  
141         filter_column_editor = ColumnsEditor(
142             page  = page,
143             query = sq_resource, 
144             query_all = query_resource_all,
145             title = "Select Columns",
146             domid = 'select-columns',
147         )
148
149         # --------------------------------------------------------------------------
150         # RESOURCES MAP
151         # the resources part is made of a Tabs (Geographic, List), 
152
153         map_resources  = GoogleMap(
154             page       = page,
155             title      = 'Geographic view',
156             domid      = 'resources-map',
157             # tab's sons preferably turn this off
158             togglable  = False,
159             query      = sq_resource,
160             query_all  = query_resource_all,
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             query_all_resources = query_resource_all,
184             query_all_leases = query_lease_all,
185         )
186
187         # --------------------------------------------------------------------------
188         # QueryUpdater (Pending Operations)
189  
190 #DEPRECATED|        pending_resources = QueryUpdater(
191 #DEPRECATED|            page                = page,
192 #DEPRECATED|            title               = 'Pending operations',
193 #DEPRECATED|            query               = main_query,
194 #DEPRECATED|            togglable           = False,
195 #DEPRECATED|            # start turned off, it will open up itself when stuff comes in
196 #DEPRECATED|            toggled             = False,
197 #DEPRECATED|            domid               = 'pending',
198 #DEPRECATED|            outline_complete    = True,
199 #DEPRECATED|            username            = request.user,
200 #DEPRECATED|        )
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_network = Query.get('network').select(network_fields)
210         #page.enqueue_query(query_network)
211
212         filter_testbeds = TestbedsPlugin(
213             page            = page,
214             domid           = 'testbeds-filter',
215             title           = 'Filter by testbeds',
216             query           = sq_resource,
217             #query_network  = query_network,
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           = sq_resource,
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         template_env = {}
255         template_env['list_resources'] = list_resources.render(self.request)
256         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
257         template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
258
259         template_env['columns_editor'] = filter_column_editor.render(self.request)
260
261         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
262         template_env['filter_status'] = filter_status.render(self.request)
263         template_env['apply'] = apply.render(self.request)
264
265         template_env['map_resources'] = map_resources.render(self.request)
266         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
267 #        template_env['pending_resources'] = pending_resources.render(self.request)
268         template_env['sla_dialog'] = sla_dialog.render(self.request)
269         template_env["theme"] = self.theme
270         template_env["username"] = request.user
271         template_env["slice"] = slicename
272         template_env["section"] = "resources"
273         template_env["msg"] = msg
274         template_env.update(page.prelude_env())
275
276         return render_to_response(self.template, template_env, context_instance=RequestContext(request))