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)
55 'slice_urn', # XXX We need the key otherwise the storage of records bugs !
58 'resource.hostname', 'resource.type',
59 'resource.network_hrn',
63 'lease.lease_id', # Important for NITOS identify already existing leases
65 #'application.measurement_point.counter'
67 # for internal use in the querytable plugin;
68 # needs to be a unique column present for each returned record
69 main_query_init_key = 'urn'
70 aq = AnalyzedQuery(main_query, metadata=metadata)
71 page.enqueue_query(main_query, analyzed_query=aq)
72 sq_resource = aq.subquery('resource')
73 sq_lease = aq.subquery('lease')
75 query_resource_all = Query.get('resource').select(resource_fields)
76 #page.enqueue_query(query_resource_all)
79 #lease_md = metadata.details_by_object('lease')
80 #lease_fields = [column['name'] for column in lease_md['column']]
82 #query_lease_all = Query.get('lease').select(lease_fields)
83 #page.enqueue_query(query_lease_all)
85 # --------------------------------------------------------------------------
87 # resources as a list using datatable plugin
89 list_resources = QueryTable(
91 domid = 'resources-list',
94 query_all = query_resource_all,
97 datatables_options = {
99 'bLengthChange' : True,
105 # --------------------------------------------------------------------------
106 # RESERVED RESOURCES LIST
107 # resources as a list using datatable plugin
109 list_reserved_resources = SimpleList(
116 list_reserved_leases = SimpleList(
123 # list_reserved_resources = QueryTable(
125 # domid = 'resources-reserved-list',
126 # title = 'List view',
127 # query = sq_resource,
128 # query_all = sq_resource,
131 # datatables_options = {
132 # 'iDisplayLength': 25,
133 # 'bLengthChange' : True,
134 # 'bAutoWidth' : True,
138 # --------------------------------------------------------------------------
140 # list of fields to be applied on the query
141 # this will add/remove columns in QueryTable plugin
143 filter_column_editor = ColumnsEditor(
146 query_all = query_resource_all,
147 title = "Select Columns",
148 domid = 'select-columns',
151 # --------------------------------------------------------------------------
153 # the resources part is made of a Tabs (Geographic, List),
155 map_resources = GoogleMap(
157 title = 'Geographic view',
158 domid = 'resources-map',
159 # tab's sons preferably turn this off
162 # this key is the one issued by google
163 googlemap_api_key = ConfigEngine().googlemap_api_key(),
164 # the key to use at init-time
165 init_key = main_query_init_key,
168 # To center around Europe : 53,9 / 3
174 # --------------------------------------------------------------------------
175 # LEASES Nitos Scheduler
176 # Display the leases reservation timeslots of the resources
178 resources_as_scheduler2 = Scheduler2(
182 # this is the query at the core of the slice list
184 query_lease = sq_lease,
187 # --------------------------------------------------------------------------
188 # QueryUpdater (Pending Operations)
190 # pending_resources = QueryUpdaterPlugin(
192 # title = 'Pending operations',
193 # query = main_query,
195 # # start turned off, it will open up itself when stuff comes in
198 # outline_complete = True,
199 # username = request.user,
202 # --------------------------------------------------------------------------
204 # testbeds as a list of filters
206 network_md = metadata.details_by_object('network')
207 network_fields = [column['name'] for column in network_md['column']]
209 query_networks = Query.get('network').select(network_fields)
210 page.enqueue_query(query_networks)
212 filter_testbeds = TestbedsPlugin(
214 domid = 'testbeds-filter',
215 title = 'Filter by testbeds',
217 query_networks = query_networks,
218 init_key = "network_hrn",
220 datatables_options = {
221 'iDisplayLength': 25,
222 'bLengthChange' : True,
227 filter_status = FilterStatusPlugin(
229 domid = "filter-status",
236 username = request.user,
240 # --------------------------------------------------------------------------
241 # SLA View and accept dialog
243 sla_dialog = SlaDialog(
245 title = 'sla dialog',
248 # start turned off, it will open up itself when stuff comes in
250 domid = 'sla_dialog',
251 outline_complete = True,
252 username = request.user,
255 ## check user is pi or not
256 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
257 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
258 platform_details = execute_query(self.request, platform_query)
259 account_details = execute_query(self.request, account_query)
261 # XXX When session has expired, this is None and thus not iterable
262 for platform_detail in platform_details:
263 for account_detail in account_details:
264 if platform_detail['platform_id'] == account_detail['platform_id']:
265 if 'config' in account_detail and account_detail['config'] is not '':
266 account_config = json.loads(account_detail['config'])
267 if 'myslice' in platform_detail['platform']:
268 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
270 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
276 template_env['list_resources'] = list_resources.render(self.request)
277 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
278 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
280 template_env['columns_editor'] = filter_column_editor.render(self.request)
282 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
283 template_env['filter_status'] = filter_status.render(self.request)
284 template_env['apply'] = apply.render(self.request)
286 template_env['map_resources'] = map_resources.render(self.request)
287 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
288 # template_env['pending_resources'] = pending_resources.render(self.request)
289 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
290 template_env["theme"] = self.theme
291 template_env["username"] = request.user
292 template_env["pi"] = pi
293 template_env["slice"] = slicename
294 template_env["section"] = "resources"
295 template_env["msg"] = msg
296 template_env.update(page.prelude_env())
298 return render_to_response(self.template, template_env, context_instance=RequestContext(request))