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
25 from plugins.columns_editor import ColumnsEditor
26 from plugins.sladialog import SlaDialog
27 from plugins.lists.simplelist import SimpleList
29 from myslice.theme import ThemeView
31 class SliceResourceView (LoginRequiredView, ThemeView):
32 template_name = "slice-resource-view.html"
34 def get(self, request, slicename):
36 if request.GET.get('message') :
37 msg = "Slice successfully updated"
42 metadata = page.get_metadata()
43 page.expose_js_metadata()
45 resource_md = metadata.details_by_object('resource')
46 resource_fields = [column['name'] for column in resource_md['column']]
48 user_md = metadata.details_by_object('user')
49 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
51 # TODO The query to run is embedded in the URL
52 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
53 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
57 # - The record key is needed otherwise the storage of records
62 'resource.hostname', 'resource.type',
63 'resource.network_hrn',
64 # - The facility_name and testbed_name are required for the
65 # testbeds plugin to properly work.
66 'resource.facility_name',
67 'resource.testbed_name',
72 # - The lease_id is important for NITOS identify already existing
77 #'application.measurement_point.counter'
79 # for internal use in the querytable plugin;
80 # needs to be a unique column present for each returned record
81 main_query_init_key = 'urn'
82 aq = AnalyzedQuery(main_query, metadata=metadata)
83 page.enqueue_query(main_query, analyzed_query=aq)
84 sq_resource = aq.subquery('resource')
85 sq_lease = aq.subquery('lease')
87 query_resource_all = Query.get('resource').select(resource_fields)
88 #page.enqueue_query(query_resource_all)
91 #lease_md = metadata.details_by_object('lease')
92 #lease_fields = [column['name'] for column in lease_md['column']]
94 #query_lease_all = Query.get('lease').select(lease_fields)
95 #page.enqueue_query(query_lease_all)
97 # --------------------------------------------------------------------------
99 # resources as a list using datatable plugin
101 list_resources = QueryTable(
103 domid = 'resources-list',
106 query_all = query_resource_all,
109 datatables_options = {
110 'iDisplayLength': 25,
111 'bLengthChange' : True,
117 # --------------------------------------------------------------------------
118 # RESERVED RESOURCES LIST
119 # resources as a list using datatable plugin
121 list_reserved_resources = SimpleList(
128 list_reserved_leases = SimpleList(
135 # list_reserved_resources = QueryTable(
137 # domid = 'resources-reserved-list',
138 # title = 'List view',
139 # query = sq_resource,
140 # query_all = sq_resource,
143 # datatables_options = {
144 # 'iDisplayLength': 25,
145 # 'bLengthChange' : True,
146 # 'bAutoWidth' : True,
150 # --------------------------------------------------------------------------
152 # list of fields to be applied on the query
153 # this will add/remove columns in QueryTable plugin
155 filter_column_editor = ColumnsEditor(
158 query_all = query_resource_all,
159 title = "Select Columns",
160 domid = 'select-columns',
163 # --------------------------------------------------------------------------
165 # the resources part is made of a Tabs (Geographic, List),
167 map_resources = GoogleMap(
169 title = 'Geographic view',
170 domid = 'resources-map',
171 # tab's sons preferably turn this off
174 # this key is the one issued by google
175 googlemap_api_key = ConfigEngine().googlemap_api_key(),
176 # the key to use at init-time
177 init_key = main_query_init_key,
180 # To center around Europe : 53,9 / 3
186 # --------------------------------------------------------------------------
187 # LEASES Nitos Scheduler
188 # Display the leases reservation timeslots of the resources
190 resources_as_scheduler2 = Scheduler2(
194 # this is the query at the core of the slice list
196 query_lease = sq_lease,
199 # --------------------------------------------------------------------------
200 # QueryUpdater (Pending Operations)
202 # pending_resources = QueryUpdaterPlugin(
204 # title = 'Pending operations',
205 # query = main_query,
207 # # start turned off, it will open up itself when stuff comes in
210 # outline_complete = True,
211 # username = request.user,
214 # --------------------------------------------------------------------------
216 # testbeds as a list of filters
218 network_md = metadata.details_by_object('network')
219 network_fields = [column['name'] for column in network_md['column']]
221 #query_networks = Query.get('network').select(network_fields)
222 #page.enqueue_query(query_networks)
224 filter_testbeds = TestbedsPlugin(
226 domid = 'testbeds-filter',
227 title = 'Filter by testbeds',
229 #query_networks = query_networks,
230 #init_key = "network_hrn",
232 #datatables_options = {
233 # 'iDisplayLength': 25,
234 # 'bLengthChange' : True,
235 # 'bAutoWidth' : True,
239 filter_status = FilterStatusPlugin(
241 domid = "filter-status",
248 username = request.user,
252 # --------------------------------------------------------------------------
253 # SLA View and accept dialog
255 sla_dialog = SlaDialog(
257 title = 'sla dialog',
260 # start turned off, it will open up itself when stuff comes in
262 domid = 'sla_dialog',
263 outline_complete = True,
264 username = request.user,
267 ## check user is pi or not
268 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
269 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
270 platform_details = execute_query(self.request, platform_query)
271 account_details = execute_query(self.request, account_query)
273 # XXX When session has expired, this is None and thus not iterable
274 for platform_detail in platform_details:
275 for account_detail in account_details:
276 if platform_detail['platform_id'] == account_detail['platform_id']:
277 if 'config' in account_detail and account_detail['config'] is not '':
278 account_config = json.loads(account_detail['config'])
279 if 'myslice' in platform_detail['platform']:
280 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
282 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
288 template_env['list_resources'] = list_resources.render(self.request)
289 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
290 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
292 template_env['columns_editor'] = filter_column_editor.render(self.request)
294 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
295 template_env['filter_status'] = filter_status.render(self.request)
296 template_env['apply'] = apply.render(self.request)
298 template_env['map_resources'] = map_resources.render(self.request)
299 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
300 # template_env['pending_resources'] = pending_resources.render(self.request)
301 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
302 template_env["theme"] = self.theme
303 template_env["username"] = request.user
304 template_env["pi"] = pi
305 template_env["slice"] = slicename
306 template_env["section"] = "resources"
307 template_env["msg"] = msg
308 template_env.update(page.prelude_env())
310 return render_to_response(self.template, template_env, context_instance=RequestContext(request))