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,
173 # --------------------------------------------------------------------------
174 # LEASES Nitos Scheduler
175 # Display the leases reservation timeslots of the resources
177 resources_as_scheduler2 = Scheduler2(
181 # this is the query at the core of the slice list
183 query_lease = sq_lease,
186 # --------------------------------------------------------------------------
187 # QueryUpdater (Pending Operations)
189 # pending_resources = QueryUpdaterPlugin(
191 # title = 'Pending operations',
192 # query = main_query,
194 # # start turned off, it will open up itself when stuff comes in
197 # outline_complete = True,
198 # username = request.user,
201 # --------------------------------------------------------------------------
203 # testbeds as a list of filters
205 network_md = metadata.details_by_object('network')
206 network_fields = [column['name'] for column in network_md['column']]
208 query_networks = Query.get('network').select(network_fields)
209 page.enqueue_query(query_networks)
211 filter_testbeds = TestbedsPlugin(
213 domid = 'testbeds-filter',
214 title = 'Filter by testbeds',
216 query_networks = query_networks,
217 init_key = "network_hrn",
219 datatables_options = {
220 'iDisplayLength': 25,
221 'bLengthChange' : True,
226 filter_status = FilterStatusPlugin(
228 domid = "filter-status",
235 username = request.user,
239 # --------------------------------------------------------------------------
240 # SLA View and accept dialog
242 sla_dialog = SlaDialog(
244 title = 'sla dialog',
247 # start turned off, it will open up itself when stuff comes in
249 domid = 'sla_dialog',
250 outline_complete = True,
251 username = request.user,
254 ## check user is pi or not
255 platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
256 account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config')
257 platform_details = execute_query(self.request, platform_query)
258 account_details = execute_query(self.request, account_query)
259 for platform_detail in platform_details:
260 for account_detail in account_details:
261 if platform_detail['platform_id'] == account_detail['platform_id']:
262 if 'config' in account_detail and account_detail['config'] is not '':
263 account_config = json.loads(account_detail['config'])
264 if 'myslice' in platform_detail['platform']:
265 acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
267 if acc_auth_cred == {} or acc_auth_cred == 'N/A':
273 template_env['list_resources'] = list_resources.render(self.request)
274 template_env['list_reserved_resources'] = list_reserved_resources.render(self.request)
275 template_env['list_reserved_leases'] = list_reserved_leases.render(self.request)
277 template_env['columns_editor'] = filter_column_editor.render(self.request)
279 template_env['filter_testbeds'] = filter_testbeds.render(self.request)
280 template_env['filter_status'] = filter_status.render(self.request)
281 template_env['apply'] = apply.render(self.request)
283 template_env['map_resources'] = map_resources.render(self.request)
284 template_env['scheduler'] = resources_as_scheduler2.render(self.request)
285 # template_env['pending_resources'] = pending_resources.render(self.request)
286 template_env['sla_dialog'] = '' # sla_dialog.render(self.request)
287 template_env["theme"] = self.theme
288 template_env["username"] = request.user
289 template_env["pi"] = pi
290 template_env["slice"] = slicename
291 template_env["section"] = "resources"
292 template_env["msg"] = msg
293 template_env.update(page.prelude_env())
295 return render_to_response(self.template, template_env, context_instance=RequestContext(request))