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.lists.simplelist import SimpleList
24 from myslice.theme import ThemeView
26 class SliceResourceView (LoginRequiredView, ThemeView):
27 template_name = "slice-resource-view.html"
29 def get(self, request, slicename):
31 if request.GET.get('message') :
32 msg = "Slice successfully updated"
37 metadata = page.get_metadata()
38 page.expose_js_metadata()
40 resource_md = metadata.details_by_object('resource')
41 resource_fields = [column['name'] for column in resource_md['column']]
43 user_md = metadata.details_by_object('user')
44 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
46 # TODO The query to run is embedded in the URL
47 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
48 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
52 'resource.hostname', 'resource.type',
53 'resource.network_hrn',
58 #'application.measurement_point.counter'
60 # for internal use in the querytable plugin;
61 # needs to be a unique column present for each returned record
62 main_query_init_key = 'urn'
63 aq = AnalyzedQuery(main_query, metadata=metadata)
64 page.enqueue_query(main_query, analyzed_query=aq)
65 sq_resource = aq.subquery('resource')
66 sq_lease = aq.subquery('lease')
68 query_resource_all = Query.get('resource').select(resource_fields)
69 page.enqueue_query(query_resource_all)
72 lease_md = metadata.details_by_object('lease')
73 lease_fields = [column['name'] for column in lease_md['column']]
75 query_lease_all = Query.get('lease').select(lease_fields)
76 page.enqueue_query(query_lease_all)
78 # --------------------------------------------------------------------------
80 # resources as a list using datatable plugin
82 list_resources = QueryTable(
84 domid = 'resources-list',
87 query_all = query_resource_all,
90 datatables_options = {
92 'bLengthChange' : True,
98 # --------------------------------------------------------------------------
99 # RESERVED RESOURCES LIST
100 # resources as a list using datatable plugin
102 list_reserved_resources = SimpleList(
109 list_reserved_leases = SimpleList(
116 # list_reserved_resources = QueryTable(
118 # domid = 'resources-reserved-list',
119 # title = 'List view',
120 # query = sq_resource,
121 # query_all = sq_resource,
124 # datatables_options = {
125 # 'iDisplayLength': 25,
126 # 'bLengthChange' : True,
127 # 'bAutoWidth' : True,
131 # --------------------------------------------------------------------------
133 # list of fields to be applied on the query
134 # this will add/remove columns in QueryTable plugin
136 filter_column_editor = ColumnsEditor(
139 query_all = query_resource_all,
140 title = "Select Columns",
141 domid = 'select-columns',
144 # --------------------------------------------------------------------------
146 # the resources part is made of a Tabs (Geographic, List),
148 map_resources = GoogleMap(
150 title = 'Geographic view',
151 domid = 'resources-map',
152 # tab's sons preferably turn this off
155 query_all = query_resource_all,
156 # this key is the one issued by google
157 googlemap_api_key = ConfigEngine().googlemap_api_key(),
158 # the key to use at init-time
159 init_key = main_query_init_key,
167 # --------------------------------------------------------------------------
168 # LEASES Nitos Scheduler
169 # Display the leases reservation timeslots of the resources
171 resources_as_scheduler2 = Scheduler2(
175 # this is the query at the core of the slice list
177 query_lease = sq_lease,
178 query_all_resources = query_resource_all,
179 query_all_leases = query_lease_all,
182 # --------------------------------------------------------------------------
183 # QueryUpdater (Pending Operations)
185 pending_resources = QueryUpdater(
187 title = 'Pending operations',
190 # start turned off, it will open up itself when stuff comes in
193 outline_complete = True,
196 # --------------------------------------------------------------------------
198 # testbeds as a list of filters
200 network_md = metadata.details_by_object('network')
201 network_fields = [column['name'] for column in network_md['column']]
203 query_network = Query.get('network').select(network_fields)
204 page.enqueue_query(query_network)
206 filter_testbeds = TestbedsPlugin(
208 domid = 'testbeds-filter',
209 title = 'Filter by testbeds',
211 query_all = query_resource_all,
212 query_network = query_network,
213 init_key = "network_hrn",
215 datatables_options = {
216 'iDisplayLength': 25,
217 'bLengthChange' : True,
223 template_env['list_resources'] = list_resources.render(self.request)
224 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
225 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
227 template_env['columns_editor'] = filter_column_editor.render(self.request)
229 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
230 template_env['map_resources'] = map_resources.render(self.request)
231 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
232 template_env['pending_resources'] = pending_resources.render(self.request)
233 template_env["theme"] = self.theme
234 template_env["username"] = request.user
235 template_env["slice"] = slicename
236 template_env["section"] = "resources"
237 template_env["msg"] = msg
238 template_env.update(page.prelude_env())
240 return render_to_response(self.template, template_env, context_instance=RequestContext(request))