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
7 from django.views.generic.base import TemplateView
9 from unfold.loginrequired import LoginRequiredView
10 from django.http import HttpResponse
11 from django.shortcuts import render
13 from unfold.page import Page
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 from plugins.lists.simplelist import SimpleList
25 from myslice.theme import ThemeView
27 class SliceResourceView (LoginRequiredView, ThemeView):
28 template_name = "slice-resource-view.html"
30 def get(self, request, slicename):
32 if request.GET.get('message') :
33 msg = "Slice successfully updated"
38 metadata = page.get_metadata()
39 page.expose_js_metadata()
41 resource_md = metadata.details_by_object('resource')
42 resource_fields = [column['name'] for column in resource_md['column']]
44 user_md = metadata.details_by_object('user')
45 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
47 # TODO The query to run is embedded in the URL
48 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
49 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
53 'resource.hostname', 'resource.type',
54 'resource.network_hrn',
59 #'application.measurement_point.counter'
61 # for internal use in the querytable plugin;
62 # needs to be a unique column present for each returned record
63 main_query_init_key = 'urn'
64 aq = AnalyzedQuery(main_query, metadata=metadata)
65 page.enqueue_query(main_query, analyzed_query=aq)
66 sq_resource = aq.subquery('resource')
67 sq_lease = aq.subquery('lease')
69 query_resource_all = Query.get('resource').select(resource_fields)
70 page.enqueue_query(query_resource_all)
73 lease_md = metadata.details_by_object('lease')
74 lease_fields = [column['name'] for column in lease_md['column']]
76 query_lease_all = Query.get('lease').select(lease_fields)
77 page.enqueue_query(query_lease_all)
79 # --------------------------------------------------------------------------
81 # resources as a list using datatable plugin
83 list_resources = QueryTable(
85 domid = 'resources-list',
88 query_all = query_resource_all,
91 datatables_options = {
93 'bLengthChange' : True,
99 # --------------------------------------------------------------------------
100 # RESERVED RESOURCES LIST
101 # resources as a list using datatable plugin
103 list_reserved_resources = SimpleList(
110 list_reserved_leases = SimpleList(
117 # list_reserved_resources = QueryTable(
119 # domid = 'resources-reserved-list',
120 # title = 'List view',
121 # query = sq_resource,
122 # query_all = sq_resource,
125 # datatables_options = {
126 # 'iDisplayLength': 25,
127 # 'bLengthChange' : True,
128 # 'bAutoWidth' : True,
132 # --------------------------------------------------------------------------
134 # list of fields to be applied on the query
135 # this will add/remove columns in QueryTable plugin
137 filter_column_editor = ColumnsEditor(
140 query_all = query_resource_all,
141 title = "Select Columns",
142 domid = 'select-columns',
145 # --------------------------------------------------------------------------
147 # the resources part is made of a Tabs (Geographic, List),
149 map_resources = GoogleMap(
151 title = 'Geographic view',
152 domid = 'resources-map',
153 # tab's sons preferably turn this off
156 query_all = query_resource_all,
157 # this key is the one issued by google
158 googlemap_api_key = ConfigEngine().googlemap_api_key(),
159 # the key to use at init-time
160 init_key = main_query_init_key,
168 # --------------------------------------------------------------------------
169 # LEASES Nitos Scheduler
170 # Display the leases reservation timeslots of the resources
172 resources_as_scheduler2 = Scheduler2(
176 # this is the query at the core of the slice list
178 query_lease = sq_lease,
179 query_all_resources = query_resource_all,
180 query_all_leases = query_lease_all,
183 # --------------------------------------------------------------------------
184 # QueryUpdater (Pending Operations)
186 pending_resources = QueryUpdater(
188 title = 'Pending operations',
191 # start turned off, it will open up itself when stuff comes in
194 outline_complete = True,
195 username = request.user,
198 # --------------------------------------------------------------------------
200 # testbeds as a list of filters
202 network_md = metadata.details_by_object('network')
203 network_fields = [column['name'] for column in network_md['column']]
205 #query_network = Query.get('network').select(network_fields)
206 #page.enqueue_query(query_network)
208 filter_testbeds = TestbedsPlugin(
210 domid = 'testbeds-filter',
211 title = 'Filter by testbeds',
213 query_all = query_resource_all,
214 #query_network = query_network,
215 init_key = "network_hrn",
217 datatables_options = {
218 'iDisplayLength': 25,
219 'bLengthChange' : True,
224 # --------------------------------------------------------------------------
225 # SLA View and accept dialog
227 sla_dialog = SlaDialog(
229 title = 'sla dialog',
232 # start turned off, it will open up itself when stuff comes in
234 domid = 'sla_dialog',
235 outline_complete = True,
236 username = request.user,
240 template_env['list_resources'] = list_resources.render(self.request)
241 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
242 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
244 template_env['columns_editor'] = filter_column_editor.render(self.request)
246 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
247 template_env['map_resources'] = map_resources.render(self.request)
248 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
249 template_env['pending_resources'] = pending_resources.render(self.request)
250 template_env['sla_dialog'] = sla_dialog.render(self.request)
251 template_env["theme"] = self.theme
252 template_env["username"] = request.user
253 template_env["slice"] = slicename
254 template_env["section"] = "resources"
255 template_env["msg"] = msg
256 template_env.update(page.prelude_env())
258 return render_to_response(self.template, template_env, context_instance=RequestContext(request))