1 from django.template import RequestContext
2 from django.shortcuts import render_to_response
4 from manifold.core.query import Query, AnalyzedQuery
5 from manifoldapi.manifoldapi import execute_query
8 from django.views.generic.base import TemplateView
10 from unfold.loginrequired import LoginRequiredView
11 from django.http import HttpResponse
12 from django.shortcuts import render
14 from unfold.page import Page
16 from myslice.configengine import ConfigEngine
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
27 from plugins.univbrisfoam import UnivbrisFoam
28 from plugins.univbrisfv import UnivbrisFv
29 from plugins.univbrisfvf import UnivbrisFvf
31 from plugins.columns_editor import ColumnsEditor
32 from plugins.sladialog import SlaDialog
33 from plugins.lists.simplelist import SimpleList
35 from myslice.theme import ThemeView
37 class SliceResourceView (LoginRequiredView, ThemeView):
38 template_name = "slice-resource-view.html"
40 def get(self, request, slicename):
42 if request.GET.get('message') :
43 msg = "Slice successfully updated"
48 metadata = page.get_metadata()
49 page.expose_js_metadata()
52 univbrisfoam_query=Query().get('ofelia-bristol-of:resource').select('urn')
53 page.enqueue_query(univbrisfoam_query)
56 resource_md = metadata.details_by_object('resource')
57 resource_fields = [column['name'] for column in resource_md['column']]
59 user_md = metadata.details_by_object('user')
60 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
62 # TODO The query to run is embedded in the URL
63 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
64 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
66 'slice_urn', # XXX We need the key otherwise the storage of records bugs !
69 'resource.hostname', 'resource.type',
70 'resource.network_hrn',
74 'lease.lease_id', # Important for NITOS identify already existing leases
76 #'application.measurement_point.counter'
78 # for internal use in the querytable plugin;
79 # needs to be a unique column present for each returned record
80 main_query_init_key = 'urn'
81 aq = AnalyzedQuery(main_query, metadata=metadata)
82 page.enqueue_query(main_query, analyzed_query=aq)
83 sq_resource = aq.subquery('resource')
84 sq_lease = aq.subquery('lease')
86 query_resource_all = Query.get('resource').select(resource_fields)
87 #page.enqueue_query(query_resource_all)
90 #lease_md = metadata.details_by_object('lease')
91 #lease_fields = [column['name'] for column in lease_md['column']]
93 #query_lease_all = Query.get('lease').select(lease_fields)
94 #page.enqueue_query(query_lease_all)
96 # --------------------------------------------------------------------------
98 # resources as a list using datatable plugin
100 list_resources = QueryTable(
102 domid = 'resources-list',
105 query_all = query_resource_all,
108 datatables_options = {
109 'iDisplayLength': 25,
110 'bLengthChange' : True,
116 # --------------------------------------------------------------------------
117 # RESERVED RESOURCES LIST
118 # resources as a list using datatable plugin
120 list_reserved_resources = SimpleList(
127 list_reserved_leases = SimpleList(
134 # list_reserved_resources = QueryTable(
136 # domid = 'resources-reserved-list',
137 # title = 'List view',
138 # query = sq_resource,
139 # query_all = sq_resource,
142 # datatables_options = {
143 # 'iDisplayLength': 25,
144 # 'bLengthChange' : True,
145 # 'bAutoWidth' : True,
149 # --------------------------------------------------------------------------
151 # list of fields to be applied on the query
152 # this will add/remove columns in QueryTable plugin
154 filter_column_editor = ColumnsEditor(
157 query_all = query_resource_all,
158 title = "Select Columns",
159 domid = 'select-columns',
162 # --------------------------------------------------------------------------
164 # the resources part is made of a Tabs (Geographic, List),
166 map_resources = GoogleMap(
168 title = 'Geographic view',
169 domid = 'resources-map',
170 # tab's sons preferably turn this off
173 # this key is the one issued by google
174 googlemap_api_key = ConfigEngine().googlemap_api_key(),
175 # the key to use at init-time
176 init_key = main_query_init_key,
184 # --------------------------------------------------------------------------
185 # LEASES Nitos Scheduler
186 # Display the leases reservation timeslots of the resources
188 resources_as_scheduler2 = Scheduler2(
192 # this is the query at the core of the slice list
194 query_lease = sq_lease,
197 # --------------------------------------------------------------------------
198 # QueryUpdater (Pending Operations)
200 # pending_resources = QueryUpdaterPlugin(
202 # title = 'Pending operations',
203 # query = main_query,
205 # # start turned off, it will open up itself when stuff comes in
208 # outline_complete = True,
209 # username = request.user,
212 # --------------------------------------------------------------------------
214 # testbeds as a list of filters
216 network_md = metadata.details_by_object('network')
217 network_fields = [column['name'] for column in network_md['column']]
219 query_networks = Query.get('network').select(network_fields)
220 page.enqueue_query(query_networks)
222 filter_testbeds = TestbedsPlugin(
224 domid = 'testbeds-filter',
225 title = 'Filter by testbeds',
227 query_networks = query_networks,
228 init_key = "network_hrn",
230 datatables_options = {
231 'iDisplayLength': 25,
232 'bLengthChange' : True,
237 filter_status = FilterStatusPlugin(
239 domid = "filter-status",
246 username = request.user,
250 univbrisfoamlist = UnivbrisFoam(
252 title = 'univbris_foam_ports_selection',
253 domid = 'univbris_foam_ports_selection',
254 query = univbrisfoam_query,
255 query_all = univbrisfoam_query,
257 datatables_options = {
258 'iDisplayLength': 10,
259 'bLengthChange' : True,
264 #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
265 univbrisfvlist = UnivbrisFv(
267 title = 'univbris_flowspace_selection',
268 domid = 'univbris_flowspace_selection',
271 datatables_options = {
273 'bLengthChange' : True,
278 #plugin which allows the definition of a single flowspace
279 univbrisfvform = UnivbrisFvf(
281 title = 'univbris_flowspace_form',
282 domid = 'univbris_flowspace_form',
285 datatables_options = {
287 'bLengthChange' : True,
294 # --------------------------------------------------------------------------
295 # SLA View and accept dialog
297 sla_dialog = SlaDialog(
299 title = 'sla dialog',
302 # start turned off, it will open up itself when stuff comes in
304 domid = 'sla_dialog',
305 outline_complete = True,
306 username = request.user,
309 ## check user is pi or not
310 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
311 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
312 platform_details = execute_query(self.request, platform_query)
313 account_details = execute_query(self.request, account_query)
315 # XXX When session has expired, this is None and thus not iterable
316 for platform_detail in platform_details:
317 for account_detail in account_details:
318 if platform_detail['platform_id'] == account_detail['platform_id']:
319 if 'config' in account_detail and account_detail['config'] is not '':
320 account_config = json.loads(account_detail['config'])
321 if 'myslice' in platform_detail['platform']:
322 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
324 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
330 template_env['list_resources'] = list_resources.render(self.request)
331 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
332 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
334 template_env['columns_editor'] = filter_column_editor.render(self.request)
336 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
337 template_env['filter_status'] = filter_status.render(self.request)
338 template_env['apply'] = apply.render(self.request)
340 template_env['map_resources'] = map_resources.render(self.request)
341 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
344 template_env['resources'] = univbrisfoamlist.render(self.request)
345 template_env['flowspaces']= univbrisfvlist.render(self.request)
346 template_env['flowspaces_form']= univbrisfvform.render(self.request)
349 # template_env['pending_resources'] = pending_resources.render(self.request)
350 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
351 template_env["theme"] = self.theme
352 template_env["username"] = request.user
353 template_env["pi"] = pi
354 template_env["slice"] = slicename
355 template_env["section"] = "resources"
356 template_env["msg"] = msg
357 template_env.update(page.prelude_env())
359 return render_to_response(self.template, template_env, context_instance=RequestContext(request))