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',
64 #'application.measurement_point.counter'
66 # for internal use in the querytable plugin;
67 # needs to be a unique column present for each returned record
68 main_query_init_key = 'urn'
69 aq = AnalyzedQuery(main_query, metadata=metadata)
70 page.enqueue_query(main_query, analyzed_query=aq)
71 sq_resource = aq.subquery('resource')
72 sq_lease = aq.subquery('lease')
74 query_resource_all = Query.get('resource').select(resource_fields)
75 #page.enqueue_query(query_resource_all)
78 lease_md = metadata.details_by_object('lease')
79 lease_fields = [column['name'] for column in lease_md['column']]
81 query_lease_all = Query.get('lease').select(lease_fields)
82 page.enqueue_query(query_lease_all)
84 # --------------------------------------------------------------------------
86 # resources as a list using datatable plugin
88 list_resources = QueryTable(
90 domid = 'resources-list',
93 query_all = query_resource_all,
96 datatables_options = {
98 'bLengthChange' : True,
104 # --------------------------------------------------------------------------
105 # RESERVED RESOURCES LIST
106 # resources as a list using datatable plugin
108 list_reserved_resources = SimpleList(
115 list_reserved_leases = SimpleList(
122 # list_reserved_resources = QueryTable(
124 # domid = 'resources-reserved-list',
125 # title = 'List view',
126 # query = sq_resource,
127 # query_all = sq_resource,
130 # datatables_options = {
131 # 'iDisplayLength': 25,
132 # 'bLengthChange' : True,
133 # 'bAutoWidth' : True,
137 # --------------------------------------------------------------------------
139 # list of fields to be applied on the query
140 # this will add/remove columns in QueryTable plugin
142 filter_column_editor = ColumnsEditor(
145 query_all = query_resource_all,
146 title = "Select Columns",
147 domid = 'select-columns',
150 # --------------------------------------------------------------------------
152 # the resources part is made of a Tabs (Geographic, List),
154 map_resources = GoogleMap(
156 title = 'Geographic view',
157 domid = 'resources-map',
158 # tab's sons preferably turn this off
161 # this key is the one issued by google
162 googlemap_api_key = ConfigEngine().googlemap_api_key(),
163 # the key to use at init-time
164 init_key = main_query_init_key,
172 # --------------------------------------------------------------------------
173 # LEASES Nitos Scheduler
174 # Display the leases reservation timeslots of the resources
176 resources_as_scheduler2 = Scheduler2(
180 # this is the query at the core of the slice list
182 query_lease = sq_lease,
185 # --------------------------------------------------------------------------
186 # QueryUpdater (Pending Operations)
188 # pending_resources = QueryUpdaterPlugin(
190 # title = 'Pending operations',
191 # query = main_query,
193 # # start turned off, it will open up itself when stuff comes in
196 # outline_complete = True,
197 # username = request.user,
200 # --------------------------------------------------------------------------
202 # testbeds as a list of filters
204 network_md = metadata.details_by_object('network')
205 network_fields = [column['name'] for column in network_md['column']]
207 query_networks = Query.get('network').select(network_fields)
208 page.enqueue_query(query_networks)
210 filter_testbeds = TestbedsPlugin(
212 domid = 'testbeds-filter',
213 title = 'Filter by testbeds',
215 query_networks = query_networks,
216 init_key = "network_hrn",
218 datatables_options = {
219 'iDisplayLength': 25,
220 'bLengthChange' : True,
225 filter_status = FilterStatusPlugin(
227 domid = "filter-status",
233 query = main_query #sq_resource,
237 # --------------------------------------------------------------------------
238 # SLA View and accept dialog
240 sla_dialog = SlaDialog(
242 title = 'sla dialog',
245 # start turned off, it will open up itself when stuff comes in
247 domid = 'sla_dialog',
248 outline_complete = True,
249 username = request.user,
252 ## check user is pi or not
253 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
254 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
255 platform_details = execute_query(self.request, platform_query)
256 account_details = execute_query(self.request, account_query)
257 for platform_detail in platform_details:
258 for account_detail in account_details:
259 if platform_detail['platform_id'] == account_detail['platform_id']:
260 if 'config' in account_detail and account_detail['config'] is not '':
261 account_config = json.loads(account_detail['config'])
262 if 'myslice' in platform_detail['platform']:
263 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
265 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
271 template_env['list_resources'] = list_resources.render(self.request)
272 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
273 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
275 template_env['columns_editor'] = filter_column_editor.render(self.request)
277 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
278 template_env['filter_status'] = filter_status.render(self.request)
279 template_env['apply'] = apply.render(self.request)
281 template_env['map_resources'] = map_resources.render(self.request)
282 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
283 # template_env['pending_resources'] = pending_resources.render(self.request)
284 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
285 template_env["theme"] = self.theme
286 template_env["username"] = request.user
287 template_env["pi"] = pi
288 template_env["slice"] = slicename
289 template_env["section"] = "resources"
290 template_env["msg"] = msg
291 template_env.update(page.prelude_env())
293 return render_to_response(self.template, template_env, context_instance=RequestContext(request))