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
7 from django.views.generic.base      import TemplateView
8
9 from unfold.loginrequired           import LoginRequiredView
10 from django.http import HttpResponse
11 from django.shortcuts import render
12
13 from unfold.page                     import Page
14
15 from myslice.configengine            import ConfigEngine
16 from plugins.querytable              import QueryTable
17 from plugins.googlemap               import GoogleMap
18 from plugins.queryupdater            import QueryUpdater
19 from plugins.testbeds                import TestbedsPlugin
20 from plugins.scheduler2              import Scheduler2
21
22 from myslice.theme import ThemeView
23
24 class SliceResourceView (LoginRequiredView, ThemeView):
25     template_name = "slice-resource-view.html"
26     
27     def get(self, request, slicename):
28
29         if request.GET.get('message') : 
30             msg = "Slice successfully updated"
31         else :
32             msg = None
33
34         page = Page(request)
35         metadata = page.get_metadata()
36         page.expose_js_metadata()
37
38         resource_md = metadata.details_by_object('resource')
39         resource_fields = [column['name'] for column in resource_md['column']]
40
41         user_md = metadata.details_by_object('user')
42         user_fields = ['user_hrn'] # [column['name'] for column in user_md['column']]
43
44         # TODO The query to run is embedded in the URL
45         main_query = Query.get('slice').filter_by('slice_hrn', '=', slicename)
46         main_query.select(
47                 'slice_hrn',
48                 'resource.urn', 
49                 'resource.hostname', 'resource.type',
50                 'resource.network_hrn',
51                 'lease.urn',
52                 'user.user_hrn',
53                 #'application.measurement_point.counter'
54         )
55         # for internal use in the querytable plugin;
56         # needs to be a unique column present for each returned record
57         main_query_init_key = 'urn'
58         aq = AnalyzedQuery(main_query, metadata=metadata)
59         page.enqueue_query(main_query, analyzed_query=aq)
60         sq_resource    = aq.subquery('resource')
61         sq_lease       = aq.subquery('lease')
62
63         query_resource_all = Query.get('resource').select(resource_fields)
64         page.enqueue_query(query_resource_all)
65
66         # leases query
67         lease_md = metadata.details_by_object('lease')
68         lease_fields = [column['name'] for column in lease_md['column']]
69
70         query_all_lease = Query.get('lease').select(lease_fields)
71         page.enqueue_query(query_all_lease)
72
73         print "!!!!!!!!!!   query leases = ",query_all_lease
74
75         # --------------------------------------------------------------------------
76         # RESOURCES LIST
77         # resources as a list using datatable plugin
78  
79         list_resources = QueryTable(
80             page       = page,
81             domid      = 'resources-list',
82             title      = 'List view',
83             query      = sq_resource,
84             query_all  = query_resource_all,
85             init_key   = "urn",
86             checkboxes = True,
87             datatables_options = {
88                 'iDisplayLength': 25,
89                 'bLengthChange' : True,
90                 'bAutoWidth'    : True,
91                 },
92         )
93
94         # --------------------------------------------------------------------------
95         # RESOURCES MAP
96         # the resources part is made of a Tabs (Geographic, List), 
97
98         map_resources  = GoogleMap(
99             page       = page,
100             title      = 'Geographic view',
101             domid      = 'resources-map',
102             # tab's sons preferably turn this off
103             togglable  = False,
104             query      = sq_resource,
105             query_all  = query_resource_all,
106             # this key is the one issued by google
107             googlemap_api_key = ConfigEngine().googlemap_api_key(),
108             # the key to use at init-time
109             init_key   = main_query_init_key,
110             checkboxes = True,
111             # center on Paris
112             latitude   = 49.,
113             longitude  = 9,
114             zoom       = 4,
115         )
116
117         # --------------------------------------------------------------------------
118         # LEASES Nitos Scheduler
119         # Display the leases reservation timeslots of the resources
120
121         resources_as_scheduler2 = Scheduler2( 
122             page       = page,
123             domid      = 'scheduler',
124             title      = 'Scheduler',
125             # this is the query at the core of the slice list
126             query = sq_resource,
127             query_all_resources = query_resource_all,
128             query_lease = query_all_lease,
129         )
130
131         # --------------------------------------------------------------------------
132         # QueryUpdater (Pending Operations)
133  
134         pending_resources = QueryUpdater(
135             page                = page,
136             title               = 'Pending operations',
137             query               = main_query,
138             togglable           = True,
139             # start turned off, it will open up itself when stuff comes in
140             toggled             = False,
141             domid               = 'pending',
142             outline_complete    = True,
143         )
144
145         # --------------------------------------------------------------------------
146         # NETWORKS
147         # testbeds as a list of filters 
148
149         network_md = metadata.details_by_object('network')
150         network_fields = [column['name'] for column in network_md['column']]
151
152         query_network = Query.get('network').select(network_fields)
153         page.enqueue_query(query_network)
154
155         filter_testbeds = TestbedsPlugin(
156             page          = page,
157             domid         = 'testbeds-filter',
158             title         = 'Filter by testbeds',
159             query         = sq_resource,
160             query_all     = query_resource_all,
161             query_network = query_network,
162             init_key      = "network_hrn",
163             checkboxes    = True,
164             datatables_options = {
165                 'iDisplayLength': 25,
166                 'bLengthChange' : True,
167                 'bAutoWidth'    : True,
168                 },
169         )
170
171         template_env = {}
172         template_env['list_resources'] = list_resources.render(self.request)
173         template_env['filter_testbeds'] = filter_testbeds.render(self.request)
174         template_env['map_resources'] = map_resources.render(self.request)
175         template_env['scheduler'] = resources_as_scheduler2.render(self.request)
176         template_env['pending_resources'] = pending_resources.render(self.request)
177         template_env["theme"] = self.theme
178         template_env["username"] = request.user
179         template_env["slice"] = slicename
180         template_env["section"] = "resources"
181         template_env["msg"] = msg
182         template_env.update(page.prelude_env())
183
184         return render_to_response(self.template, template_env, context_instance=RequestContext(request))