List of testbeds based on the resources all_query
[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
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 from plugins.querytable              import QueryTable
17 from plugins.googlemap               import GoogleMap
18 from plugins.queryupdater            import QueryUpdater
19 from plugins.testbeds                import TestbedsPlugin
20 from plugins.scheduler2              import Scheduler2
21 from plugins.columns_editor          import ColumnsEditor
22 from plugins.sladialog               import SlaDialog
23 from plugins.lists.simplelist        import SimpleList
24
25 from myslice.theme import ThemeView
26
27 class SliceResourceView (LoginRequiredView, ThemeView):
28     template_name = "slice-resource-view.html"
29     
30     def get(self, request, slicename):
31
32         if request.GET.get('message') : 
33             msg = "Slice successfully updated"
34         else :
35             msg = None
36
37         page = Page(request)
38         metadata = page.get_metadata()
39         page.expose_js_metadata()
40
41         resource_md = metadata.details_by_object('resource')
42         resource_fields = [column['name'] for column in resource_md['column']]
43
44         user_md = metadata.details_by_object('user')
45         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
46
47         # TODO The query to run is embedded in the URL
48         # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
49         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
50         main_query.select(
51                 'slice_hrn',
52                 'resource.urn', 
53                 'resource.hostname', 'resource.type',
54                 'resource.network_hrn',
55                 'lease.resource',
56                 'lease.start_time',
57                 'lease.end_time',
58                 #'user.user_hrn',
59                 #'application.measurement_point.counter'
60         )
61         # for internal use in the querytable plugin;
62         # needs to be a unique column present for each returned record
63         main_query_init_key = 'urn'
64         aq = AnalyzedQuery(main_query, metadata=metadata)
65         page.enqueue_query(main_query, analyzed_query=aq)
66         sq_resource    = aq.subquery('resource')
67         sq_lease       = aq.subquery('lease')
68
69         query_resource_all = Query.get('resource').select(resource_fields)
70         page.enqueue_query(query_resource_all)
71
72         # leases query
73         lease_md = metadata.details_by_object('lease')
74         lease_fields = [column['name'] for column in lease_md['column']]
75
76         query_lease_all = Query.get('lease').select(lease_fields)
77         page.enqueue_query(query_lease_all)
78
79         # --------------------------------------------------------------------------
80         # ALL RESOURCES LIST
81         # resources as a list using datatable plugin
82  
83         list_resources = QueryTable(
84             page       = page,
85             domid      = 'resources-list',
86             title      = 'List view',
87             query      = sq_resource,
88             query_all  = query_resource_all,
89             init_key   = "urn",
90             checkboxes = True,
91             datatables_options = {
92                 'iDisplayLength': 25,
93                 'bLengthChange' : True,
94                 'bAutoWidth'    : True,
95                 },
96         )
97
98
99         # --------------------------------------------------------------------------
100         # RESERVED RESOURCES LIST
101         # resources as a list using datatable plugin
102  
103         list_reserved_resources = SimpleList(
104             title = None,
105             page  = page,
106             key   = 'urn',
107             query = sq_resource,
108         )
109
110         list_reserved_leases = SimpleList(
111             title = None,
112             page  = page,
113             key   = 'resource',
114             query = sq_lease,
115         )
116
117 #        list_reserved_resources = QueryTable(
118 #            page       = page,
119 #            domid      = 'resources-reserved-list',
120 #            title      = 'List view',
121 #            query      = sq_resource,
122 #            query_all  = sq_resource,
123 #            init_key   = "urn",
124 #            checkboxes = True,
125 #            datatables_options = {
126 #                'iDisplayLength': 25,
127 #                'bLengthChange' : True,
128 #                'bAutoWidth'    : True,
129 #                },
130 #        )
131
132         # --------------------------------------------------------------------------
133         # COLUMNS EDITOR
134         # list of fields to be applied on the query 
135         # this will add/remove columns in QueryTable plugin
136  
137         filter_column_editor = ColumnsEditor(
138             page  = page,
139             query = sq_resource, 
140             query_all = query_resource_all,
141             title = "Select Columns",
142             domid = 'select-columns',
143         )
144
145         # --------------------------------------------------------------------------
146         # RESOURCES MAP
147         # the resources part is made of a Tabs (Geographic, List), 
148
149         map_resources  = GoogleMap(
150             page       = page,
151             title      = 'Geographic view',
152             domid      = 'resources-map',
153             # tab's sons preferably turn this off
154             togglable  = False,
155             query      = sq_resource,
156             query_all  = query_resource_all,
157             # this key is the one issued by google
158             googlemap_api_key = ConfigEngine().googlemap_api_key(),
159             # the key to use at init-time
160             init_key   = main_query_init_key,
161             checkboxes = True,
162             # center on Paris
163             latitude   = 49.,
164             longitude  = 9,
165             zoom       = 8,
166         )
167
168         # --------------------------------------------------------------------------
169         # LEASES Nitos Scheduler
170         # Display the leases reservation timeslots of the resources
171
172         resources_as_scheduler2 = Scheduler2( 
173             page       = page,
174             domid      = 'scheduler',
175             title      = 'Scheduler',
176             # this is the query at the core of the slice list
177             query = sq_resource,
178             query_lease = sq_lease,
179             query_all_resources = query_resource_all,
180             query_all_leases = query_lease_all,
181         )
182
183         # --------------------------------------------------------------------------
184         # QueryUpdater (Pending Operations)
185  
186         pending_resources = QueryUpdater(
187             page                = page,
188             title               = 'Pending operations',
189             query               = main_query,
190             togglable           = False,
191             # start turned off, it will open up itself when stuff comes in
192             toggled             = False,
193             domid               = 'pending',
194             outline_complete    = True,
195             username            = request.user,
196         )
197
198         # --------------------------------------------------------------------------
199         # NETWORKS
200         # testbeds as a list of filters 
201
202         network_md = metadata.details_by_object('network')
203         network_fields = [column['name'] for column in network_md['column']]
204
205         #query_network = Query.get('network').select(network_fields)
206         #page.enqueue_query(query_network)
207
208         filter_testbeds = TestbedsPlugin(
209             page          = page,
210             domid         = 'testbeds-filter',
211             title         = 'Filter by testbeds',
212             query         = sq_resource,
213             query_all     = query_resource_all,
214             #query_network = query_network,
215             init_key      = "network_hrn",
216             checkboxes    = True,
217             datatables_options = {
218                 'iDisplayLength': 25,
219                 'bLengthChange' : True,
220                 'bAutoWidth'    : True,
221                 },
222         )
223
224         # --------------------------------------------------------------------------
225         # SLA View and accept dialog
226         
227         sla_dialog = SlaDialog(
228             page                = page,
229             title               = 'sla dialog',
230             query               = main_query,
231             togglable           = False,
232             # start turned off, it will open up itself when stuff comes in
233             toggled             = True,
234             domid               = 'sla_dialog',
235             outline_complete    = True,
236             username            = request.user,
237         )
238
239         template_env = {}
240         template_env['list_resources'] = list_resources.render(self.request)
241         template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
242         template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
243
244         template_env['columns_editor'] = filter_column_editor.render(self.request)
245
246         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
247         template_env['map_resources'] = map_resources.render(self.request)
248         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
249         template_env['pending_resources'] = pending_resources.render(self.request)
250         template_env['sla_dialog'] = sla_dialog.render(self.request)
251         template_env["theme"] = self.theme
252         template_env["username"] = request.user
253         template_env["slice"] = slicename
254         template_env["section"] = "resources"
255         template_env["msg"] = msg
256         template_env.update(page.prelude_env())
257
258         return render_to_response(self.template, template_env, context_instance=RequestContext(request))