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