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
17 from plugins.apply import ApplyPlugin
18 from plugins.querytable import QueryTable
19 from plugins.googlemap import GoogleMap
20 #from plugins.queryupdater import QueryUpdater
21 from plugins.filter_status import FilterStatusPlugin
22 from plugins.testbeds import TestbedsPlugin
23 from plugins.scheduler2 import Scheduler2
24 from plugins.columns_editor import ColumnsEditor
25 from plugins.sladialog import SlaDialog
26 from plugins.lists.simplelist import SimpleList
28 from myslice.theme import ThemeView
30 class SliceResourceView (LoginRequiredView, ThemeView):
31 template_name = "slice-resource-view.html"
33 def get(self, request, slicename):
35 if request.GET.get('message') :
36 msg = "Slice successfully updated"
41 metadata = page.get_metadata()
42 page.expose_js_metadata()
44 resource_md = metadata.details_by_object('resource')
45 resource_fields = [column['name'] for column in resource_md['column']]
47 user_md = metadata.details_by_object('user')
48 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
50 # TODO The query to run is embedded in the URL
51 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
52 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
54 'slice_urn', # XXX We need the key otherwise the storage of records bugs !
57 'resource.hostname', 'resource.type',
58 'resource.network_hrn',
63 #'application.measurement_point.counter'
65 # for internal use in the querytable plugin;
66 # needs to be a unique column present for each returned record
67 main_query_init_key = 'urn'
68 aq = AnalyzedQuery(main_query, metadata=metadata)
69 page.enqueue_query(main_query, analyzed_query=aq)
70 sq_resource = aq.subquery('resource')
71 sq_lease = aq.subquery('lease')
73 query_resource_all = Query.get('resource').select(resource_fields)
74 #page.enqueue_query(query_resource_all)
77 lease_md = metadata.details_by_object('lease')
78 lease_fields = [column['name'] for column in lease_md['column']]
80 query_lease_all = Query.get('lease').select(lease_fields)
81 page.enqueue_query(query_lease_all)
83 # --------------------------------------------------------------------------
85 # resources as a list using datatable plugin
87 list_resources = QueryTable(
89 domid = 'resources-list',
92 query_all = query_resource_all,
95 datatables_options = {
97 'bLengthChange' : True,
103 # --------------------------------------------------------------------------
104 # RESERVED RESOURCES LIST
105 # resources as a list using datatable plugin
107 list_reserved_resources = SimpleList(
114 list_reserved_leases = SimpleList(
121 # list_reserved_resources = QueryTable(
123 # domid = 'resources-reserved-list',
124 # title = 'List view',
125 # query = sq_resource,
126 # query_all = sq_resource,
129 # datatables_options = {
130 # 'iDisplayLength': 25,
131 # 'bLengthChange' : True,
132 # 'bAutoWidth' : True,
136 # --------------------------------------------------------------------------
138 # list of fields to be applied on the query
139 # this will add/remove columns in QueryTable plugin
141 filter_column_editor = ColumnsEditor(
144 query_all = query_resource_all,
145 title = "Select Columns",
146 domid = 'select-columns',
149 # --------------------------------------------------------------------------
151 # the resources part is made of a Tabs (Geographic, List),
153 map_resources = GoogleMap(
155 title = 'Geographic view',
156 domid = 'resources-map',
157 # tab's sons preferably turn this off
160 # this key is the one issued by google
161 googlemap_api_key = ConfigEngine().googlemap_api_key(),
162 # the key to use at init-time
163 init_key = main_query_init_key,
171 # --------------------------------------------------------------------------
172 # LEASES Nitos Scheduler
173 # Display the leases reservation timeslots of the resources
175 resources_as_scheduler2 = Scheduler2(
179 # this is the query at the core of the slice list
181 query_lease = sq_lease,
184 # --------------------------------------------------------------------------
185 # QueryUpdater (Pending Operations)
187 #DEPRECATED| pending_resources = QueryUpdater(
188 #DEPRECATED| page = page,
189 #DEPRECATED| title = 'Pending operations',
190 #DEPRECATED| query = main_query,
191 #DEPRECATED| togglable = False,
192 #DEPRECATED| # start turned off, it will open up itself when stuff comes in
193 #DEPRECATED| toggled = False,
194 #DEPRECATED| domid = 'pending',
195 #DEPRECATED| outline_complete = True,
196 #DEPRECATED| username = request.user,
199 # --------------------------------------------------------------------------
201 # testbeds as a list of filters
203 network_md = metadata.details_by_object('network')
204 network_fields = [column['name'] for column in network_md['column']]
206 query_networks = Query.get('network').select(network_fields)
207 page.enqueue_query(query_networks)
209 filter_testbeds = TestbedsPlugin(
211 domid = 'testbeds-filter',
212 title = 'Filter by testbeds',
214 query_networks = query_networks,
215 init_key = "network_hrn",
217 datatables_options = {
218 'iDisplayLength': 25,
219 'bLengthChange' : True,
224 filter_status = FilterStatusPlugin(
226 domid = "filter-status",
236 # --------------------------------------------------------------------------
237 # SLA View and accept dialog
239 sla_dialog = SlaDialog(
241 title = 'sla dialog',
244 # start turned off, it will open up itself when stuff comes in
246 domid = 'sla_dialog',
247 outline_complete = True,
248 username = request.user,
252 template_env['list_resources'] = list_resources.render(self.request)
253 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
254 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
256 template_env['columns_editor'] = filter_column_editor.render(self.request)
258 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
259 template_env['filter_status'] = filter_status.render(self.request)
260 template_env['apply'] = apply.render(self.request)
262 template_env['map_resources'] = map_resources.render(self.request)
263 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
264 # template_env['pending_resources'] = pending_resources.render(self.request)
265 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
266 template_env["theme"] = self.theme
267 template_env["username"] = request.user
268 template_env["slice"] = slicename
269 template_env["section"] = "resources"
270 template_env["msg"] = msg
271 template_env.update(page.prelude_env())
273 return render_to_response(self.template, template_env, context_instance=RequestContext(request))