Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab
[myslice.git] / portal / sliceresourceview.py
1 from django.template                 import RequestContext
2 from django.shortcuts                import render_to_response
3
4 from manifold.core.query             import Query, AnalyzedQuery
5 from manifoldapi.manifoldapi         import execute_query
6 import json
7
8 from django.views.generic.base      import TemplateView
9
10 from unfold.loginrequired           import LoginRequiredView
11 from django.http import HttpResponse
12 from django.shortcuts import render
13
14 from unfold.page                     import Page
15
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
25
26 from myslice.theme import ThemeView
27
28 class SliceResourceView (LoginRequiredView, ThemeView):
29     template_name = "slice-resource-view.html"
30     
31     def get(self, request, slicename):
32
33         if request.GET.get('message') : 
34             msg = "Slice successfully updated"
35         else :
36             msg = None
37
38         page = Page(request)
39         metadata = page.get_metadata()
40         page.expose_js_metadata()
41
42         resource_md = metadata.details_by_object('resource')
43         resource_fields = [column['name'] for column in resource_md['column']]
44
45         user_md = metadata.details_by_object('user')
46         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
47
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)
51         main_query.select(
52                 'slice_hrn',
53                 'resource.urn', 
54                 'resource.hostname', 'resource.type',
55                 'resource.network_hrn',
56                 'lease.resource',
57                 'lease.start_time',
58                 'lease.end_time',
59                 #'user.user_hrn',
60                 #'application.measurement_point.counter'
61         )
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')
69
70         query_resource_all = Query.get('resource').select(resource_fields)
71         page.enqueue_query(query_resource_all)
72
73         # leases query
74         lease_md = metadata.details_by_object('lease')
75         lease_fields = [column['name'] for column in lease_md['column']]
76
77         query_lease_all = Query.get('lease').select(lease_fields)
78         page.enqueue_query(query_lease_all)
79
80         # --------------------------------------------------------------------------
81         # ALL RESOURCES LIST
82         # resources as a list using datatable plugin
83  
84         list_resources = QueryTable(
85             page       = page,
86             domid      = 'resources-list',
87             title      = 'List view',
88             query      = sq_resource,
89             query_all  = query_resource_all,
90             init_key   = "urn",
91             checkboxes = True,
92             datatables_options = {
93                 'iDisplayLength': 25,
94                 'bLengthChange' : True,
95                 'bAutoWidth'    : True,
96                 },
97         )
98
99
100         # --------------------------------------------------------------------------
101         # RESERVED RESOURCES LIST
102         # resources as a list using datatable plugin
103  
104         list_reserved_resources = SimpleList(
105             title = None,
106             page  = page,
107             key   = 'urn',
108             query = sq_resource,
109         )
110
111         list_reserved_leases = SimpleList(
112             title = None,
113             page  = page,
114             key   = 'resource',
115             query = sq_lease,
116         )
117
118 #        list_reserved_resources = QueryTable(
119 #            page       = page,
120 #            domid      = 'resources-reserved-list',
121 #            title      = 'List view',
122 #            query      = sq_resource,
123 #            query_all  = sq_resource,
124 #            init_key   = "urn",
125 #            checkboxes = True,
126 #            datatables_options = {
127 #                'iDisplayLength': 25,
128 #                'bLengthChange' : True,
129 #                'bAutoWidth'    : True,
130 #                },
131 #        )
132
133         # --------------------------------------------------------------------------
134         # COLUMNS EDITOR
135         # list of fields to be applied on the query 
136         # this will add/remove columns in QueryTable plugin
137  
138         filter_column_editor = ColumnsEditor(
139             page  = page,
140             query = sq_resource, 
141             query_all = query_resource_all,
142             title = "Select Columns",
143             domid = 'select-columns',
144         )
145
146         # --------------------------------------------------------------------------
147         # RESOURCES MAP
148         # the resources part is made of a Tabs (Geographic, List), 
149
150         map_resources  = GoogleMap(
151             page       = page,
152             title      = 'Geographic view',
153             domid      = 'resources-map',
154             # tab's sons preferably turn this off
155             togglable  = False,
156             query      = sq_resource,
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,
162             checkboxes = True,
163             # center on Paris
164             latitude   = 49.,
165             longitude  = 9,
166             zoom       = 8,
167         )
168
169         # --------------------------------------------------------------------------
170         # LEASES Nitos Scheduler
171         # Display the leases reservation timeslots of the resources
172
173         resources_as_scheduler2 = Scheduler2( 
174             page       = page,
175             domid      = 'scheduler',
176             title      = 'Scheduler',
177             # this is the query at the core of the slice list
178             query = sq_resource,
179             query_lease = sq_lease,
180             query_all_resources = query_resource_all,
181             query_all_leases = query_lease_all,
182         )
183
184         # --------------------------------------------------------------------------
185         # QueryUpdater (Pending Operations)
186  
187         pending_resources = QueryUpdater(
188             page                = page,
189             title               = 'Pending operations',
190             query               = main_query,
191             togglable           = False,
192             # start turned off, it will open up itself when stuff comes in
193             toggled             = False,
194             domid               = 'pending',
195             outline_complete    = True,
196             username            = request.user,
197         )
198
199         # --------------------------------------------------------------------------
200         # NETWORKS
201         # testbeds as a list of filters 
202
203         network_md = metadata.details_by_object('network')
204         network_fields = [column['name'] for column in network_md['column']]
205
206         #query_network = Query.get('network').select(network_fields)
207         #page.enqueue_query(query_network)
208
209         filter_testbeds = TestbedsPlugin(
210             page          = page,
211             domid         = 'testbeds-filter',
212             title         = 'Filter by testbeds',
213             query         = sq_resource,
214             query_all     = query_resource_all,
215             #query_network = query_network,
216             init_key      = "network_hrn",
217             checkboxes    = True,
218             datatables_options = {
219                 'iDisplayLength': 25,
220                 'bLengthChange' : True,
221                 'bAutoWidth'    : True,
222                 },
223         )
224
225         # --------------------------------------------------------------------------
226         # SLA View and accept dialog
227         
228         sla_dialog = SlaDialog(
229             page                = page,
230             title               = 'sla dialog',
231             query               = main_query,
232             togglable           = False,
233             # start turned off, it will open up itself when stuff comes in
234             toggled             = True,
235             domid               = 'sla_dialog',
236             outline_complete    = True,
237             username            = request.user,
238         )
239         
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')
252         # assigning values
253         if acc_auth_cred == {} or acc_auth_cred == 'N/A':
254             pi = "is_not_pi"
255         else:
256             pi = "is_pi"
257         
258         template_env = {}
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)
262
263         template_env['columns_editor'] = filter_column_editor.render(self.request)
264
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())
277
278         return render_to_response(self.template, template_env, context_instance=RequestContext(request))