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
17 from plugins.querytable import QueryTable
18 from plugins.googlemap import GoogleMap
19 from plugins.queryupdater import QueryUpdater
20 from plugins.testbeds import TestbedsPlugin
21 from plugins.scheduler2 import Scheduler2
22 from plugins.columns_editor import ColumnsEditor
23 from plugins.sladialog import SlaDialog
24 from plugins.lists.simplelist import SimpleList
26 from myslice.theme import ThemeView
28 class SliceResourceView (LoginRequiredView, ThemeView):
29 template_name = "slice-resource-view.html"
31 def get(self, request, slicename):
33 if request.GET.get('message') :
34 msg = "Slice successfully updated"
39 metadata = page.get_metadata()
40 page.expose_js_metadata()
42 resource_md = metadata.details_by_object('resource')
43 resource_fields = [column['name'] for column in resource_md['column']]
45 user_md = metadata.details_by_object('user')
46 user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
48 # TODO The query to run is embedded in the URL
49 # Example: select slice_hrn, resource.urn, lease.resource, lease.start_time, lease.end_time from slice where slice_hrn == "ple.upmc.myslicedemo"
50 main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
54 'resource.hostname', 'resource.type',
55 'resource.network_hrn',
60 #'application.measurement_point.counter'
62 # for internal use in the querytable plugin;
63 # needs to be a unique column present for each returned record
64 main_query_init_key = 'urn'
65 aq = AnalyzedQuery(main_query, metadata=metadata)
66 page.enqueue_query(main_query, analyzed_query=aq)
67 sq_resource = aq.subquery('resource')
68 sq_lease = aq.subquery('lease')
70 query_resource_all = Query.get('resource').select(resource_fields)
71 page.enqueue_query(query_resource_all)
74 lease_md = metadata.details_by_object('lease')
75 lease_fields = [column['name'] for column in lease_md['column']]
77 query_lease_all = Query.get('lease').select(lease_fields)
78 page.enqueue_query(query_lease_all)
80 # --------------------------------------------------------------------------
82 # resources as a list using datatable plugin
84 list_resources = QueryTable(
86 domid = 'resources-list',
89 query_all = query_resource_all,
92 datatables_options = {
94 'bLengthChange' : True,
100 # --------------------------------------------------------------------------
101 # RESERVED RESOURCES LIST
102 # resources as a list using datatable plugin
104 list_reserved_resources = SimpleList(
111 list_reserved_leases = SimpleList(
118 # list_reserved_resources = QueryTable(
120 # domid = 'resources-reserved-list',
121 # title = 'List view',
122 # query = sq_resource,
123 # query_all = sq_resource,
126 # datatables_options = {
127 # 'iDisplayLength': 25,
128 # 'bLengthChange' : True,
129 # 'bAutoWidth' : True,
133 # --------------------------------------------------------------------------
135 # list of fields to be applied on the query
136 # this will add/remove columns in QueryTable plugin
138 filter_column_editor = ColumnsEditor(
141 query_all = query_resource_all,
142 title = "Select Columns",
143 domid = 'select-columns',
146 # --------------------------------------------------------------------------
148 # the resources part is made of a Tabs (Geographic, List),
150 map_resources = GoogleMap(
152 title = 'Geographic view',
153 domid = 'resources-map',
154 # tab's sons preferably turn this off
157 query_all = query_resource_all,
158 # this key is the one issued by google
159 googlemap_api_key = ConfigEngine().googlemap_api_key(),
160 # the key to use at init-time
161 init_key = main_query_init_key,
169 # --------------------------------------------------------------------------
170 # LEASES Nitos Scheduler
171 # Display the leases reservation timeslots of the resources
173 resources_as_scheduler2 = Scheduler2(
177 # this is the query at the core of the slice list
179 query_lease = sq_lease,
180 query_all_resources = query_resource_all,
181 query_all_leases = query_lease_all,
184 # --------------------------------------------------------------------------
185 # QueryUpdater (Pending Operations)
187 pending_resources = QueryUpdater(
189 title = 'Pending operations',
192 # start turned off, it will open up itself when stuff comes in
195 outline_complete = True,
196 username = request.user,
199 # --------------------------------------------------------------------------
201 # testbeds as a list of filters
203 network_md = metadata.details_by_object('network')
204 network_fields = [column['name'] for column in network_md['column']]
206 #query_network = Query.get('network').select(network_fields)
207 #page.enqueue_query(query_network)
209 filter_testbeds = TestbedsPlugin(
211 domid = 'testbeds-filter',
212 title = 'Filter by testbeds',
214 query_all = query_resource_all,
215 #query_network = query_network,
216 init_key = "network_hrn",
218 datatables_options = {
219 'iDisplayLength': 25,
220 'bLengthChange' : True,
225 # --------------------------------------------------------------------------
226 # SLA View and accept dialog
228 sla_dialog = SlaDialog(
230 title = 'sla dialog',
233 # start turned off, it will open up itself when stuff comes in
235 domid = 'sla_dialog',
236 outline_complete = True,
237 username = request.user,
240 ## check user is pi or not
241 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
242 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
243 platform_details = execute_query(self.request, platform_query)
244 account_details = execute_query(self.request, account_query)
245 for platform_detail in platform_details:
246 for account_detail in account_details:
247 if platform_detail['platform_id'] == account_detail['platform_id']:
248 if 'config' in account_detail and account_detail['config'] is not '':
249 account_config = json.loads(account_detail['config'])
250 if 'myslice' in platform_detail['platform']:
251 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
253 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
259 template_env['list_resources'] = list_resources.render(self.request)
260 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
261 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
263 template_env['columns_editor'] = filter_column_editor.render(self.request)
265 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
266 template_env['map_resources'] = map_resources.render(self.request)
267 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
268 template_env['pending_resources'] = pending_resources.render(self.request)
269 template_env['sla_dialog'] = sla_dialog.render(self.request)
270 template_env["theme"] = self.theme
271 template_env["username"] = request.user
272 template_env["pi"] = pi
273 template_env["slice"] = slicename
274 template_env["section"] = "resources"
275 template_env["msg"] = msg
276 template_env.update(page.prelude_env())
278 return render_to_response(self.template, template_env, context_instance=RequestContext(request))