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