3 from django.template import RequestContext
4 from django.shortcuts import render_to_response
5 from django.views.generic.base import TemplateView
6 from django.http import HttpResponse
7 from django.shortcuts import render
9 from manifold.core.query import Query, AnalyzedQuery
10 from manifoldapi.manifoldapi import execute_query
13 from unfold.loginrequired import LoginRequiredView
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
41 from myslice.settings import logger
43 class SliceResourceView (LoginRequiredView, ThemeView):
44 template_name = "slice-resource-view.html"
46 def get(self, request, slicename):
48 if request.GET.get('message') :
49 msg = "Slice successfully updated"
54 metadata = page.get_metadata()
55 page.expose_js_metadata()
57 resource_md = metadata.details_by_object('resource')
58 resource_fields = [column['name'] for column in resource_md['column']]
60 user_md = metadata.details_by_object('user')
61 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
63 query_resource_all = Query.get('resource').select(resource_fields)
64 #page.enqueue_query(query_resource_all)
67 #lease_md = metadata.details_by_object('lease')
68 #lease_fields = [column['name'] for column in lease_md['column']]
70 #query_lease_all = Query.get('lease').select(lease_fields)
71 #page.enqueue_query(query_lease_all)
73 slice_md = metadata.details_by_object('slice')
74 slice_fields = [column['name'] for column in slice_md['column']]
75 logger.debug("SLICE RES VIEW fields = {}".format(slice_fields))
76 # TODO The query to run is embedded in the URL
77 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
78 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
79 main_query.select(slice_fields)
81 # Columns shown by default in Query_table plugin
82 page.expose_js_var("QUERYTABLE_MAP","{'Resource name': 'hostname', 'Type': 'type', 'Facility': 'facility_name','Testbed': 'testbed_name', 'Status':'boot_state'}")
84 # Columns checked by default in Columns_selector plugin
85 query_default_fields = ['hostname', 'type', 'facility_name', 'testbed_name', 'boot_state']
88 'hostname' : 'Resource name',
90 'facility_name' : 'Facility',
91 'testbed_name' : 'Testbed',
92 'boot_state' : 'Status',
98 # # - The record key is needed otherwise the storage of records
105 # 'resource.hostname', 'resource.type',
106 # # - The facility_name and testbed_name are required for the
107 # # testbeds plugin to properly work.
108 # 'resource.facility_name',
109 # 'resource.testbed_name',
112 # 'lease.start_time',
114 # # - The lease_id is important for NITOS identify already existing
125 # #'application.measurement_point.counter'
127 # for internal use in the querytable plugin;
128 # needs to be a unique column present for each returned record
129 main_query_init_key = 'urn'
130 aq = AnalyzedQuery(main_query, metadata=metadata)
131 page.enqueue_query(main_query, analyzed_query=aq)
132 sq_resource = aq.subquery('resource')
133 sq_lease = aq.subquery('lease')
134 #sq_flowspace = aq.subquery('flowspace')
135 #sq_vms = aq.subquery('vms')
137 # --------------------------------------------------------------------------
139 # resources as a list using datatable plugin
141 list_resources = QueryTable(
143 domid = 'resources-list',
146 query_all = query_resource_all,
147 mapping = QUERYTABLE_MAP,
148 default_fields = query_default_fields,
151 datatables_options = {
152 'iDisplayLength': 25,
153 'bLengthChange' : True,
159 # --------------------------------------------------------------------------
160 # RESERVED RESOURCES LIST
161 # resources as a list using datatable plugin
163 list_reserved_resources = SimpleList(
170 list_reserved_leases = SimpleList(
177 # list_reserved_resources = QueryTable(
179 # domid = 'resources-reserved-list',
180 # title = 'List view',
181 # query = sq_resource,
182 # query_all = sq_resource,
185 # datatables_options = {
186 # 'iDisplayLength': 25,
187 # 'bLengthChange' : True,
188 # 'bAutoWidth' : True,
192 # --------------------------------------------------------------------------
194 # list of fields to be applied on the query
195 # this will add/remove columns in QueryTable plugin
197 filter_column_editor = ColumnsEditor(
200 query_all = query_resource_all,
201 default_fields = query_default_fields,
202 title = "Select Columns",
203 domid = 'select-columns',
206 # --------------------------------------------------------------------------
208 # the resources part is made of a Tabs (Geographic, List),
210 map_resources = GoogleMap(
212 title = 'Geographic view',
213 domid = 'resources-map',
214 # tab's sons preferably turn this off
217 # this key is the one issued by google
218 googlemap_api_key = ConfigEngine().googlemap_api_key(),
219 # the key to use at init-time
220 init_key = main_query_init_key,
223 # To center around Europe : 53,9 / 3
229 # --------------------------------------------------------------------------
230 # LEASES Nitos Scheduler
231 # Display the leases reservation timeslots of the resources
233 resources_as_scheduler2 = Scheduler2(
237 # this is the query at the core of the slice list
239 query_lease = sq_lease,
242 # --------------------------------------------------------------------------
243 # QueryUpdater (Pending Operations)
245 # pending_resources = QueryUpdaterPlugin(
247 # title = 'Pending operations',
248 # query = main_query,
250 # # start turned off, it will open up itself when stuff comes in
253 # outline_complete = True,
254 # username = request.user,
257 # --------------------------------------------------------------------------
259 # testbeds as a list of filters
261 network_md = metadata.details_by_object('network')
262 network_fields = [column['name'] for column in network_md['column']]
264 #query_networks = Query.get('network').select(network_fields)
265 #page.enqueue_query(query_networks)
267 filter_testbeds = TestbedsPlugin(
269 domid = 'testbeds-filter',
270 title = 'Filter by testbeds',
272 #query_networks = query_networks,
273 #init_key = "network_hrn",
275 #datatables_options = {
276 # 'iDisplayLength': 25,
277 # 'bLengthChange' : True,
278 # 'bAutoWidth' : True,
282 filter_status = FilterStatusPlugin(
284 domid = "filter-status",
291 username = request.user,
294 # --------------------------------------------------------------------------
295 # Ofelia OpenFlow Plugin
298 # plugin which display a "gathering resources" message
299 # waiting for all resources to be returned by manifold
300 # univbriswelcome = Univbris(
302 # title = 'univbris_welcome',
303 # domid = 'univbris_welcome',
304 # query = query_resource_all,
307 # univbrisfoamlist = UnivbrisFoam(
309 # title = 'univbris_foam_ports_selection',
310 # domid = 'univbris_foam_ports_selection',
311 # query = query_resource_all,
312 # query_all = query_resource_all,
313 # checkboxes = False,
314 # datatables_options = {
315 # 'iDisplayLength': 10,
316 # 'bLengthChange' : True,
317 # 'bAutoWidth' : True,
321 # #plugin which manages the different flowspaces that the user creates, and also sends flowspaces to manifold
322 # univbrisfvlist = UnivbrisFv(
324 # title = 'univbris_flowspace_selection',
325 # domid = 'univbris_flowspace_selection',
326 # query = sq_flowspace,
327 # query_all = query_resource_all,
328 # datatables_options = {
329 # 'iDisplayLength': 5,
330 # 'bLengthChange' : True,
331 # 'bAutoWidth' : True,
335 # #plugin which allows the definition of a single flowspace
336 # univbrisfvform = UnivbrisFvf(
338 # title = 'univbris_flowspace_form',
339 # domid = 'univbris_flowspace_form',
340 # query = query_resource_all,
342 # datatables_options = {
343 # 'iDisplayLength': 3,
344 # 'bLengthChange' : True,
345 # 'bAutoWidth' : True,
349 # #plugin which allows the definition the match criteria on a single OPTICAL flowspace
350 # univbrisofvform = UnivbrisFvfo(
352 # title = 'univbris_oflowspace_form',
353 # domid = 'univbris_oflowspace_form',
356 # datatables_options = {
357 # 'iDisplayLength': 3,
358 # 'bLengthChange' : True,
359 # 'bAutoWidth' : True,
363 # #plugin which display the gathered topology
364 # univbristopology = UnivbrisTopo(
366 # title = 'univbris_topology',
367 # domid = 'univbris_topology',
368 # query = query_resource_all,
371 # # --------------------------------------------------------------------------
372 # # Ofelia VTAM Plugin
375 # #plugin which display a table where an experimenter will add VMs to according to his needs
376 # # responsible to send the data to Manifold
377 # univbrisvtamplugin = UnivbrisVtamPlugin(
379 # title = 'univbris_vtam',
380 # domid = 'univbris_vtam',
382 # #query = sq_resource,
385 # #plugin which display a form where an experimenter will specify
386 # # in which testbed and which physical server to setup the VM
387 # univbrisvtamform = UnivbrisVtamForm(
389 # title = 'univbris_vtam_form',
390 # domid = 'univbris_vtam_form',
391 # query = query_resource_all,
393 # datatables_options = {
394 # 'iDisplayLength': 3,
395 # 'bLengthChange' : True,
396 # 'bAutoWidth' : True,
400 # # --------------------------------------------------------------------------
401 # # SLA View and accept dialog
403 # sla_dialog = SlaDialog(
405 # title = 'sla dialog',
406 # query = main_query,
408 # # start turned off, it will open up itself when stuff comes in
410 # domid = 'sla_dialog',
411 # outline_complete = True,
412 # username = request.user,
415 ## check user is pi or not
416 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
417 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
418 platform_details = execute_query(self.request, platform_query)
419 account_details = execute_query(self.request, account_query)
421 # XXX When session has expired, this is None and thus not iterable
422 for platform_detail in platform_details:
423 for account_detail in account_details:
424 if platform_detail['platform_id'] == account_detail['platform_id']:
425 if 'config' in account_detail and account_detail['config'] is not '':
426 account_config = json.loads(account_detail['config'])
427 if 'myslice' in platform_detail['platform']:
428 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
430 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
436 template_env['list_resources'] = list_resources.render(self.request)
437 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
438 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
440 template_env['columns_editor'] = filter_column_editor.render(self.request)
442 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
443 template_env['filter_status'] = filter_status.render(self.request)
444 template_env['apply'] = apply.render(self.request)
446 template_env['map_resources'] = map_resources.render(self.request)
447 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
450 # template_env['welcome'] = univbriswelcome.render(self.request)
451 # template_env['resources'] = univbrisfoamlist.render(self.request)
452 # template_env['flowspaces'] = univbrisfvlist.render(self.request)
453 # template_env['oflowspaces_form'] = univbrisofvform.render(self.request)
454 # template_env['flowspaces_form'] = univbrisfvform.render(self.request)
455 # template_env['topology'] = univbristopology.render(self.request)
456 # template_env['vms_list'] = univbrisvtamplugin.render(self.request)
457 # template_env['vm_form'] = univbrisvtamform.render(self.request)
459 # template_env['pending_resources'] = pending_resources.render(self.request)
460 # template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
461 template_env["theme"] = self.theme
462 template_env["username"] = request.user
463 template_env["pi"] = pi
464 template_env["slice"] = slicename
465 template_env["section"] = "resources"
466 template_env["msg"] = msg
467 template_env.update(page.prelude_env())
469 return render_to_response(self.template, template_env, context_instance=RequestContext(request))