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.univbris import Univbris
28 from plugins.univbrisfoam import UnivbrisFoam
29 from plugins.univbrisfv import UnivbrisFv
30 from plugins.univbrisfvf import UnivbrisFvf
31 from plugins.univbrisfvfo import UnivbrisFvfo
32 from plugins.univbristopo import UnivbrisTopo
33 from plugins.univbrisvtam import UnivbrisVtam as UnivbrisVtamPlugin
34 from plugins.univbrisvtamform import UnivbrisVtamForm
36 from plugins.columns_editor import ColumnsEditor
37 from plugins.sladialog import SlaDialog
38 from plugins.lists.simplelist import SimpleList
40 from myslice.theme import ThemeView
42 class SliceResourceView (LoginRequiredView, ThemeView):
43 template_name = "slice-resource-view.html"
45 def get(self, request, slicename):
47 if request.GET.get('message') :
48 msg = "Slice successfully updated"
53 metadata = page.get_metadata()
54 page.expose_js_metadata()
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)
68 # - The record key is needed otherwise the storage of records
73 'resource.hostname', 'resource.type',
74 # - The facility_name and testbed_name are required for the
75 # testbeds plugin to properly work.
76 'resource.facility_name',
77 'resource.testbed_name',
82 # - The lease_id is important for NITOS identify already existing
87 #'application.measurement_point.counter'
89 # for internal use in the querytable plugin;
90 # needs to be a unique column present for each returned record
91 main_query_init_key = 'urn'
92 aq = AnalyzedQuery(main_query, metadata=metadata)
93 page.enqueue_query(main_query, analyzed_query=aq)
94 sq_resource = aq.subquery('resource')
95 sq_lease = aq.subquery('lease')
97 query_resource_all = Query.get('resource').select(resource_fields)
98 page.enqueue_query(query_resource_all)
101 #lease_md = metadata.details_by_object('lease')
102 #lease_fields = [column['name'] for column in lease_md['column']]
104 #query_lease_all = Query.get('lease').select(lease_fields)
105 #page.enqueue_query(query_lease_all)
107 # --------------------------------------------------------------------------
109 # resources as a list using datatable plugin
111 list_resources = QueryTable(
113 domid = 'resources-list',
116 query_all = query_resource_all,
119 datatables_options = {
120 'iDisplayLength': 25,
121 'bLengthChange' : True,
127 # --------------------------------------------------------------------------
128 # RESERVED RESOURCES LIST
129 # resources as a list using datatable plugin
131 list_reserved_resources = SimpleList(
138 list_reserved_leases = SimpleList(
145 # list_reserved_resources = QueryTable(
147 # domid = 'resources-reserved-list',
148 # title = 'List view',
149 # query = sq_resource,
150 # query_all = sq_resource,
153 # datatables_options = {
154 # 'iDisplayLength': 25,
155 # 'bLengthChange' : True,
156 # 'bAutoWidth' : True,
160 # --------------------------------------------------------------------------
162 # list of fields to be applied on the query
163 # this will add/remove columns in QueryTable plugin
165 filter_column_editor = ColumnsEditor(
168 query_all = query_resource_all,
169 title = "Select Columns",
170 domid = 'select-columns',
173 # --------------------------------------------------------------------------
175 # the resources part is made of a Tabs (Geographic, List),
177 map_resources = GoogleMap(
179 title = 'Geographic view',
180 domid = 'resources-map',
181 # tab's sons preferably turn this off
184 # this key is the one issued by google
185 googlemap_api_key = ConfigEngine().googlemap_api_key(),
186 # the key to use at init-time
187 init_key = main_query_init_key,
190 # To center around Europe : 53,9 / 3
196 # --------------------------------------------------------------------------
197 # LEASES Nitos Scheduler
198 # Display the leases reservation timeslots of the resources
200 resources_as_scheduler2 = Scheduler2(
204 # this is the query at the core of the slice list
206 query_lease = sq_lease,
209 # --------------------------------------------------------------------------
210 # QueryUpdater (Pending Operations)
212 # pending_resources = QueryUpdaterPlugin(
214 # title = 'Pending operations',
215 # query = main_query,
217 # # start turned off, it will open up itself when stuff comes in
220 # outline_complete = True,
221 # username = request.user,
224 # --------------------------------------------------------------------------
226 # testbeds as a list of filters
228 network_md = metadata.details_by_object('network')
229 network_fields = [column['name'] for column in network_md['column']]
231 #query_networks = Query.get('network').select(network_fields)
232 #page.enqueue_query(query_networks)
234 filter_testbeds = TestbedsPlugin(
236 domid = 'testbeds-filter',
237 title = 'Filter by testbeds',
239 #query_networks = query_networks,
240 #init_key = "network_hrn",
242 #datatables_options = {
243 # 'iDisplayLength': 25,
244 # 'bLengthChange' : True,
245 # 'bAutoWidth' : True,
249 filter_status = FilterStatusPlugin(
251 domid = "filter-status",
258 username = request.user,
261 # --------------------------------------------------------------------------
262 # Ofelia OpenFlow Plugin
265 # plugin which display a "gathering resources" message
266 # waiting for all resources to be returned by manifold
267 univbriswelcome = Univbris(
269 title = 'univbris_welcome',
270 domid = 'univbris_welcome',
271 query = query_resource_all,
274 univbrisfoamlist = UnivbrisFoam(
276 title = 'univbris_foam_ports_selection',
277 domid = 'univbris_foam_ports_selection',
278 query = query_resource_all,
279 query_all = query_resource_all,
281 datatables_options = {
282 'iDisplayLength': 10,
283 'bLengthChange' : True,
288 #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
289 univbrisfvlist = UnivbrisFv(
291 title = 'univbris_flowspace_selection',
292 domid = 'univbris_flowspace_selection',
295 sync_query = query_resource_all,
296 datatables_options = {
298 'bLengthChange' : True,
303 #plugin which allows the definition of a single flowspace
304 univbrisfvform = UnivbrisFvf(
306 title = 'univbris_flowspace_form',
307 domid = 'univbris_flowspace_form',
308 query = query_resource_all,
310 datatables_options = {
312 'bLengthChange' : True,
317 #plugin which allows the definition the match criteria on a single OPTICAL flowspace
318 univbrisofvform = UnivbrisFvfo(
320 title = 'univbris_oflowspace_form',
321 domid = 'univbris_oflowspace_form',
324 datatables_options = {
326 'bLengthChange' : True,
331 #plugin which display the gathered topology
332 univbristopology = UnivbrisTopo(
334 title = 'univbris_topology',
335 domid = 'univbris_topology',
336 query = query_resource_all,
339 # --------------------------------------------------------------------------
343 #plugin which display a table where an experimenter will add VMs to according to his needs
344 univbrisvtamplugin = UnivbrisVtamPlugin(
346 title = 'univbris_vtam',
347 domid = 'univbris_vtam',
351 #plugin which display a form where an experimenter will specify where a
352 univbrisvtamform = UnivbrisVtamForm(
354 title = 'univbris_vtam_form',
355 domid = 'univbris_vtam_form',
356 query = query_resource_all,
358 datatables_options = {
360 'bLengthChange' : True,
365 # --------------------------------------------------------------------------
366 # SLA View and accept dialog
368 sla_dialog = SlaDialog(
370 title = 'sla dialog',
373 # start turned off, it will open up itself when stuff comes in
375 domid = 'sla_dialog',
376 outline_complete = True,
377 username = request.user,
380 ## check user is pi or not
381 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
382 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
383 platform_details = execute_query(self.request, platform_query)
384 account_details = execute_query(self.request, account_query)
386 # XXX When session has expired, this is None and thus not iterable
387 for platform_detail in platform_details:
388 for account_detail in account_details:
389 if platform_detail['platform_id'] == account_detail['platform_id']:
390 if 'config' in account_detail and account_detail['config'] is not '':
391 account_config = json.loads(account_detail['config'])
392 if 'myslice' in platform_detail['platform']:
393 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
395 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
401 template_env['list_resources'] = list_resources.render(self.request)
402 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
403 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
405 template_env['columns_editor'] = filter_column_editor.render(self.request)
407 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
408 template_env['filter_status'] = filter_status.render(self.request)
409 template_env['apply'] = apply.render(self.request)
411 template_env['map_resources'] = map_resources.render(self.request)
412 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
415 template_env['welcome'] = univbriswelcome.render(self.request)
416 template_env['resources'] = univbrisfoamlist.render(self.request)
417 template_env['flowspaces'] = univbrisfvlist.render(self.request)
418 template_env['oflowspaces_form'] = univbrisofvform.render(self.request)
419 template_env['flowspaces_form'] = univbrisfvform.render(self.request)
420 template_env['topology'] = univbristopology.render(self.request)
421 template_env['vms_list'] = univbrisvtamplugin.render(self.request)
422 template_env['vm_form'] = univbrisvtamform.render(self.request)
424 # template_env['pending_resources'] = pending_resources.render(self.request)
425 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
426 template_env["theme"] = self.theme
427 template_env["username"] = request.user
428 template_env["pi"] = pi
429 template_env["slice"] = slicename
430 template_env["section"] = "resources"
431 template_env["msg"] = msg
432 template_env.update(page.prelude_env())
434 return render_to_response(self.template, template_env, context_instance=RequestContext(request))