apply wip
[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
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
28
29 from myslice.theme import ThemeView
30
31 class SliceResourceView (LoginRequiredView, ThemeView):
32     template_name = "slice-resource-view.html"
33     
34     def get(self, request, slicename):
35
36         if request.GET.get('message') : 
37             msg = "Slice successfully updated"
38         else :
39             msg = None
40
41         page = Page(request)
42         metadata = page.get_metadata()
43         page.expose_js_metadata()
44
45         resource_md = metadata.details_by_object('resource')
46         resource_fields = [column['name'] for column in resource_md['column']]
47
48         user_md = metadata.details_by_object('user')
49         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
50
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)
54         main_query.select(
55                 'slice_urn', # XXX We need the key otherwise the storage of records bugs !
56                 'slice_hrn',
57                 'resource.urn',
58                 'resource.hostname', 'resource.type',
59                 'resource.network_hrn',
60                 'lease.resource',
61                 'lease.start_time',
62                 'lease.end_time',
63                 #'user.user_hrn',
64                 #'application.measurement_point.counter'
65         )
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')
73
74         query_resource_all = Query.get('resource').select(resource_fields)
75         #page.enqueue_query(query_resource_all)
76
77         # leases query
78         lease_md = metadata.details_by_object('lease')
79         lease_fields = [column['name'] for column in lease_md['column']]
80
81         query_lease_all = Query.get('lease').select(lease_fields)
82         page.enqueue_query(query_lease_all)
83
84         # --------------------------------------------------------------------------
85         # ALL RESOURCES LIST
86         # resources as a list using datatable plugin
87  
88         list_resources = QueryTable(
89             page       = page,
90             domid      = 'resources-list',
91             title      = 'List view',
92             query      = sq_resource,
93             query_all  = query_resource_all,
94             init_key   = "urn",
95             checkboxes = True,
96             datatables_options = {
97                 'iDisplayLength': 25,
98                 'bLengthChange' : True,
99                 'bAutoWidth'    : True,
100                 },
101         )
102
103
104         # --------------------------------------------------------------------------
105         # RESERVED RESOURCES LIST
106         # resources as a list using datatable plugin
107  
108         list_reserved_resources = SimpleList(
109             title = None,
110             page  = page,
111             key   = 'urn',
112             query = sq_resource,
113         )
114
115         list_reserved_leases = SimpleList(
116             title = None,
117             page  = page,
118             key   = 'resource',
119             query = sq_lease,
120         )
121
122 #        list_reserved_resources = QueryTable(
123 #            page       = page,
124 #            domid      = 'resources-reserved-list',
125 #            title      = 'List view',
126 #            query      = sq_resource,
127 #            query_all  = sq_resource,
128 #            init_key   = "urn",
129 #            checkboxes = True,
130 #            datatables_options = {
131 #                'iDisplayLength': 25,
132 #                'bLengthChange' : True,
133 #                'bAutoWidth'    : True,
134 #                },
135 #        )
136
137         # --------------------------------------------------------------------------
138         # COLUMNS EDITOR
139         # list of fields to be applied on the query 
140         # this will add/remove columns in QueryTable plugin
141  
142         filter_column_editor = ColumnsEditor(
143             page  = page,
144             query = sq_resource, 
145             query_all = query_resource_all,
146             title = "Select Columns",
147             domid = 'select-columns',
148         )
149
150         # --------------------------------------------------------------------------
151         # RESOURCES MAP
152         # the resources part is made of a Tabs (Geographic, List), 
153
154         map_resources  = GoogleMap(
155             page       = page,
156             title      = 'Geographic view',
157             domid      = 'resources-map',
158             # tab's sons preferably turn this off
159             togglable  = False,
160             query      = sq_resource,
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,
165             checkboxes = True,
166             # center on Paris
167             latitude   = 49.,
168             longitude  = 9,
169             zoom       = 8,
170         )
171
172         # --------------------------------------------------------------------------
173         # LEASES Nitos Scheduler
174         # Display the leases reservation timeslots of the resources
175
176         resources_as_scheduler2 = Scheduler2( 
177             page       = page,
178             domid      = 'scheduler',
179             title      = 'Scheduler',
180             # this is the query at the core of the slice list
181             query = sq_resource,
182             query_lease = sq_lease,
183         )
184
185         # --------------------------------------------------------------------------
186         # QueryUpdater (Pending Operations)
187  
188 #         pending_resources = QueryUpdaterPlugin(
189 #             page                = page,
190 #             title               = 'Pending operations',
191 #             query               = main_query,
192 #             togglable           = False,
193 #             # start turned off, it will open up itself when stuff comes in
194 #             toggled             = False,
195 #             domid               = 'pending',
196 #             outline_complete    = True,
197 #             username            = request.user,
198 #         )
199
200         # --------------------------------------------------------------------------
201         # NETWORKS
202         # testbeds as a list of filters 
203
204         network_md = metadata.details_by_object('network')
205         network_fields = [column['name'] for column in network_md['column']]
206
207         query_networks = Query.get('network').select(network_fields)
208         page.enqueue_query(query_networks)
209
210         filter_testbeds = TestbedsPlugin(
211             page            = page,
212             domid           = 'testbeds-filter',
213             title           = 'Filter by testbeds',
214             query           = sq_resource,
215             query_networks  = query_networks,
216             init_key        = "network_hrn",
217             checkboxes      = True,
218             datatables_options = {
219                 'iDisplayLength': 25,
220                 'bLengthChange' : True,
221                 'bAutoWidth'    : True,
222                 },
223         )
224
225         filter_status = FilterStatusPlugin(
226             page            = page,
227             domid           = "filter-status",
228             query           = sq_resource,
229         )
230         apply = ApplyPlugin(
231             page            = page,
232             domid           = "apply",
233             query           = main_query,
234             username            = request.user,
235         )
236             
237
238         # --------------------------------------------------------------------------
239         # SLA View and accept dialog
240         
241         sla_dialog = SlaDialog(
242             page                = page,
243             title               = 'sla dialog',
244             query               = main_query,
245             togglable           = False,
246             # start turned off, it will open up itself when stuff comes in
247             toggled             = True,
248             domid               = 'sla_dialog',
249             outline_complete    = True,
250             username            = request.user,
251         )
252         
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')
265         # assigning values
266         if acc_auth_cred == {} or acc_auth_cred == 'N/A':
267             pi = "is_not_pi"
268         else:
269             pi = "is_pi"
270         
271         template_env = {}
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)
275
276         template_env['columns_editor'] = filter_column_editor.render(self.request)
277
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)
281
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())
293
294         return render_to_response(self.template, template_env, context_instance=RequestContext(request))