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",
234 username = request.user,
238 # --------------------------------------------------------------------------
239 # SLA View and accept dialog
241 sla_dialog = SlaDialog(
243 title = 'sla dialog',
246 # start turned off, it will open up itself when stuff comes in
248 domid = 'sla_dialog',
249 outline_complete = True,
250 username = request.user,
253 ## check user is pi or not
254 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
255 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
256 platform_details = execute_query(self.request, platform_query)
257 account_details = execute_query(self.request, account_query)
258 for platform_detail in platform_details:
259 for account_detail in account_details:
260 if platform_detail['platform_id'] == account_detail['platform_id']:
261 if 'config' in account_detail and account_detail['config'] is not '':
262 account_config = json.loads(account_detail['config'])
263 if 'myslice' in platform_detail['platform']:
264 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
266 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
272 template_env['list_resources'] = list_resources.render(self.request)
273 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
274 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
276 template_env['columns_editor'] = filter_column_editor.render(self.request)
278 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
279 template_env['filter_status'] = filter_status.render(self.request)
280 template_env['apply'] = apply.render(self.request)
282 template_env['map_resources'] = map_resources.render(self.request)
283 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
284 # template_env['pending_resources'] = pending_resources.render(self.request)
285 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
286 template_env["theme"] = self.theme
287 template_env["username"] = request.user
288 template_env["pi"] = pi
289 template_env["slice"] = slicename
290 template_env["section"] = "resources"
291 template_env["msg"] = msg
292 template_env.update(page.prelude_env())
294 return render_to_response(self.template, template_env, context_instance=RequestContext(request))