root / snf-astakos-app / astakos / im / presentation.py @ b1cb2583
History | View | Annotate | Download (10.3 kB)
1 | 4161cb70 | Giorgos Korfiatis | # Copyright 2012, 2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 4161cb70 | Giorgos Korfiatis | #
|
3 | 4161cb70 | Giorgos Korfiatis | # Redistribution and use in source and binary forms, with or
|
4 | 4161cb70 | Giorgos Korfiatis | # without modification, are permitted provided that the following
|
5 | 4161cb70 | Giorgos Korfiatis | # conditions are met:
|
6 | 4161cb70 | Giorgos Korfiatis | #
|
7 | 4161cb70 | Giorgos Korfiatis | # 1. Redistributions of source code must retain the above
|
8 | 4161cb70 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
9 | 4161cb70 | Giorgos Korfiatis | # disclaimer.
|
10 | 4161cb70 | Giorgos Korfiatis | #
|
11 | 4161cb70 | Giorgos Korfiatis | # 2. Redistributions in binary form must reproduce the above
|
12 | 4161cb70 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
13 | 4161cb70 | Giorgos Korfiatis | # disclaimer in the documentation and/or other materials
|
14 | 4161cb70 | Giorgos Korfiatis | # provided with the distribution.
|
15 | 4161cb70 | Giorgos Korfiatis | #
|
16 | 4161cb70 | Giorgos Korfiatis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 4161cb70 | Giorgos Korfiatis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 4161cb70 | Giorgos Korfiatis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 4161cb70 | Giorgos Korfiatis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 4161cb70 | Giorgos Korfiatis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 4161cb70 | Giorgos Korfiatis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 4161cb70 | Giorgos Korfiatis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 4161cb70 | Giorgos Korfiatis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 4161cb70 | Giorgos Korfiatis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 4161cb70 | Giorgos Korfiatis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 4161cb70 | Giorgos Korfiatis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 4161cb70 | Giorgos Korfiatis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 4161cb70 | Giorgos Korfiatis | #
|
29 | 4161cb70 | Giorgos Korfiatis | # The views and conclusions contained in the software and
|
30 | 4161cb70 | Giorgos Korfiatis | # documentation are those of the authors and should not be
|
31 | 4161cb70 | Giorgos Korfiatis | # interpreted as representing official policies, either expressed
|
32 | 4161cb70 | Giorgos Korfiatis | # or implied, of GRNET S.A.
|
33 | 4161cb70 | Giorgos Korfiatis | |
34 | 75380308 | Kostas Papadimitriou | from astakos.im import settings |
35 | 37d59b27 | Kostas Papadimitriou | from synnefo.lib.utils import dict_merge |
36 | 75380308 | Kostas Papadimitriou | |
37 | 75380308 | Kostas Papadimitriou | RESOURCES = { |
38 | 4161cb70 | Giorgos Korfiatis | 'groups': {
|
39 | 4161cb70 | Giorgos Korfiatis | 'compute': {
|
40 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('Compute resources ' |
41 | 4161cb70 | Giorgos Korfiatis | '(amount of VMs, CPUs, RAM, System disk) '),
|
42 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
43 | 4161cb70 | Giorgos Korfiatis | 'report_desc': '', |
44 | 4161cb70 | Giorgos Korfiatis | 'verbose_name': 'compute', |
45 | 4161cb70 | Giorgos Korfiatis | }, |
46 | 4161cb70 | Giorgos Korfiatis | 'storage': {
|
47 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('Storage resources ' |
48 | 4161cb70 | Giorgos Korfiatis | '(amount of space to store files on Pithos) '),
|
49 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
50 | 4161cb70 | Giorgos Korfiatis | 'report_desc': '', |
51 | 4161cb70 | Giorgos Korfiatis | 'verbose_name': 'storage', |
52 | 4161cb70 | Giorgos Korfiatis | }, |
53 | 4161cb70 | Giorgos Korfiatis | 'network': {
|
54 | 4161cb70 | Giorgos Korfiatis | 'help_text': ' Network resources (number of Private Networks) ', |
55 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
56 | 4161cb70 | Giorgos Korfiatis | 'report_desc': '', |
57 | 4161cb70 | Giorgos Korfiatis | 'verbose_name': 'network', |
58 | 4161cb70 | Giorgos Korfiatis | }, |
59 | 4161cb70 | Giorgos Korfiatis | }, |
60 | 4161cb70 | Giorgos Korfiatis | 'resources': {
|
61 | 75380308 | Kostas Papadimitriou | 'pithos.diskspace': {
|
62 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('This is the space on Pithos for storing files ' |
63 | 4161cb70 | Giorgos Korfiatis | 'and VM Images. '),
|
64 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ('This is the total amount of space on ' |
65 | 4161cb70 | Giorgos Korfiatis | 'Pithos that will be granted to each '
|
66 | 4161cb70 | Giorgos Korfiatis | 'user of this Project '),
|
67 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
68 | 4161cb70 | Giorgos Korfiatis | 'report_desc': 'Storage Space', |
69 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 10GB', |
70 | 4161cb70 | Giorgos Korfiatis | 'verbose_name': 'Storage Space', |
71 | 75380308 | Kostas Papadimitriou | 'group': 'storage' |
72 | 4161cb70 | Giorgos Korfiatis | }, |
73 | 4161cb70 | Giorgos Korfiatis | 'cyclades.disk': {
|
74 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('This is the System Disk that the VMs have that ' |
75 | 4161cb70 | Giorgos Korfiatis | 'run the OS '),
|
76 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ("This is the total amount of System Disk " |
77 | 4161cb70 | Giorgos Korfiatis | "that will be granted to each user of "
|
78 | 4161cb70 | Giorgos Korfiatis | "this Project (this refers to the total "
|
79 | 4161cb70 | Giorgos Korfiatis | "System Disk of all VMs, not each VM's "
|
80 | 4161cb70 | Giorgos Korfiatis | "System Disk) "),
|
81 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
82 | 4161cb70 | Giorgos Korfiatis | 'report_desc': 'System Disk', |
83 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 5GB, 2GB etc', |
84 | 75380308 | Kostas Papadimitriou | 'verbose_name': 'System Disk', |
85 | 75380308 | Kostas Papadimitriou | 'group': 'compute' |
86 | 4161cb70 | Giorgos Korfiatis | }, |
87 | 5083fc47 | Christos Stavrakakis | 'cyclades.total_ram': {
|
88 | 4161cb70 | Giorgos Korfiatis | 'help_text': 'RAM used by VMs ', |
89 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ('This is the total amount of RAM that ' |
90 | 4161cb70 | Giorgos Korfiatis | 'will be granted to each user of this '
|
91 | 4161cb70 | Giorgos Korfiatis | 'Project (on all VMs) '),
|
92 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': True, |
93 | 5083fc47 | Christos Stavrakakis | 'report_desc': 'Total RAM', |
94 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 4GB', |
95 | 5083fc47 | Christos Stavrakakis | 'verbose_name': 'Total ram', |
96 | 75380308 | Kostas Papadimitriou | 'group': 'compute' |
97 | 75380308 | Kostas Papadimitriou | |
98 | 4161cb70 | Giorgos Korfiatis | }, |
99 | 5083fc47 | Christos Stavrakakis | 'cyclades.ram': {
|
100 | 447475de | Giorgos Korfiatis | 'help_text': 'RAM used by active VMs ', |
101 | 447475de | Giorgos Korfiatis | 'help_text_input_each': ('This is the total amount of RAM that ' |
102 | 447475de | Giorgos Korfiatis | 'will be granted to each user of this '
|
103 | 447475de | Giorgos Korfiatis | 'Project (on all active VMs) '),
|
104 | 447475de | Giorgos Korfiatis | 'is_abbreviation': False, |
105 | 5083fc47 | Christos Stavrakakis | 'report_desc': 'RAM', |
106 | 447475de | Giorgos Korfiatis | 'placeholder': 'eg. 4GB', |
107 | 5083fc47 | Christos Stavrakakis | 'verbose_name': 'RAM', |
108 | 447475de | Giorgos Korfiatis | 'group': 'compute' |
109 | 447475de | Giorgos Korfiatis | |
110 | 447475de | Giorgos Korfiatis | }, |
111 | 5083fc47 | Christos Stavrakakis | 'cyclades.total_cpu': {
|
112 | 4161cb70 | Giorgos Korfiatis | 'help_text': 'CPUs used by VMs ', |
113 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ('This is the total number of CPUs that ' |
114 | 4161cb70 | Giorgos Korfiatis | 'will be granted to each user of this '
|
115 | 4161cb70 | Giorgos Korfiatis | 'Project (on all VMs) '),
|
116 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': True, |
117 | 5083fc47 | Christos Stavrakakis | 'report_desc': 'Total CPUs', |
118 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 1', |
119 | 5083fc47 | Christos Stavrakakis | 'verbose_name': 'Total cpu', |
120 | 75380308 | Kostas Papadimitriou | 'group': 'compute' |
121 | 75380308 | Kostas Papadimitriou | |
122 | 4161cb70 | Giorgos Korfiatis | }, |
123 | 5083fc47 | Christos Stavrakakis | 'cyclades.cpu': {
|
124 | 447475de | Giorgos Korfiatis | 'help_text': 'CPUs used by active VMs ', |
125 | 447475de | Giorgos Korfiatis | 'help_text_input_each': ('This is the total number of CPUs that ' |
126 | 447475de | Giorgos Korfiatis | 'will be granted to each user of this '
|
127 | 447475de | Giorgos Korfiatis | 'Project (on all active VMs) '),
|
128 | 447475de | Giorgos Korfiatis | 'is_abbreviation': False, |
129 | 5083fc47 | Christos Stavrakakis | 'report_desc': 'CPUs', |
130 | 447475de | Giorgos Korfiatis | 'placeholder': 'eg. 1', |
131 | 5083fc47 | Christos Stavrakakis | 'verbose_name': 'CPU', |
132 | 447475de | Giorgos Korfiatis | 'group': 'compute' |
133 | 447475de | Giorgos Korfiatis | |
134 | 447475de | Giorgos Korfiatis | }, |
135 | 4161cb70 | Giorgos Korfiatis | 'cyclades.vm': {
|
136 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('These are the VMs one can create on the ' |
137 | 4161cb70 | Giorgos Korfiatis | 'Cyclades UI '),
|
138 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ('This is the total number of VMs that ' |
139 | 4161cb70 | Giorgos Korfiatis | 'will be granted to each user of this '
|
140 | 4161cb70 | Giorgos Korfiatis | 'Project '),
|
141 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': True, |
142 | 4161cb70 | Giorgos Korfiatis | 'report_desc': 'Virtual Machines', |
143 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 2', |
144 | 4161cb70 | Giorgos Korfiatis | 'verbose_name': 'vm', |
145 | 75380308 | Kostas Papadimitriou | 'group': 'compute' |
146 | 75380308 | Kostas Papadimitriou | |
147 | 4161cb70 | Giorgos Korfiatis | }, |
148 | 4161cb70 | Giorgos Korfiatis | 'cyclades.network.private': {
|
149 | 4161cb70 | Giorgos Korfiatis | 'help_text': ('These are the Private Networks one can create on ' |
150 | 4161cb70 | Giorgos Korfiatis | 'the Cyclades UI. '),
|
151 | 4161cb70 | Giorgos Korfiatis | 'help_text_input_each': ('This is the total number of Private ' |
152 | 4161cb70 | Giorgos Korfiatis | 'Networks that will be granted to each '
|
153 | 4161cb70 | Giorgos Korfiatis | 'user of this Project '),
|
154 | 4161cb70 | Giorgos Korfiatis | 'is_abbreviation': False, |
155 | 4161cb70 | Giorgos Korfiatis | 'report_desc': 'Private Networks', |
156 | 4161cb70 | Giorgos Korfiatis | 'placeholder': 'eg. 1', |
157 | 75380308 | Kostas Papadimitriou | 'verbose_name': 'Private Network', |
158 | 75380308 | Kostas Papadimitriou | 'group': 'network' |
159 | 75380308 | Kostas Papadimitriou | |
160 | 37d59b27 | Kostas Papadimitriou | }, |
161 | 447475de | Giorgos Korfiatis | 'cyclades.floating_ip': {
|
162 | 447475de | Giorgos Korfiatis | 'help_text': ('These are the Public (Floating) IPs one can ' |
163 | 447475de | Giorgos Korfiatis | 'reserve on the Cyclades UI. '),
|
164 | 447475de | Giorgos Korfiatis | 'help_text_input_each': ('This is the total number of Public ' |
165 | 447475de | Giorgos Korfiatis | '(Floating) IPs that will be granted to '
|
166 | 447475de | Giorgos Korfiatis | 'each user of this Project '),
|
167 | 447475de | Giorgos Korfiatis | 'is_abbreviation': False, |
168 | 447475de | Giorgos Korfiatis | 'report_desc': 'Public (Floating) IPs', |
169 | 447475de | Giorgos Korfiatis | 'placeholder': 'eg. 1', |
170 | 447475de | Giorgos Korfiatis | 'verbose_name': 'Public (Floating) IP', |
171 | 447475de | Giorgos Korfiatis | 'group': 'network' |
172 | 447475de | Giorgos Korfiatis | |
173 | 447475de | Giorgos Korfiatis | }, |
174 | 37d59b27 | Kostas Papadimitriou | 'astakos.pending_app': {
|
175 | 37d59b27 | Kostas Papadimitriou | 'help_text': ('Pending project applications limit'), |
176 | 37d59b27 | Kostas Papadimitriou | 'help_text_input_each': ('Total pending project applications user ' |
177 | 37d59b27 | Kostas Papadimitriou | 'is allowed to create'),
|
178 | 37d59b27 | Kostas Papadimitriou | 'is_abbreviation': False, |
179 | 37d59b27 | Kostas Papadimitriou | 'report_desc': 'Pending Project Applications', |
180 | 37d59b27 | Kostas Papadimitriou | 'placeholder': 'eg. 2', |
181 | 37d59b27 | Kostas Papadimitriou | 'verbose_name': 'pending project application', |
182 | 37d59b27 | Kostas Papadimitriou | 'group': 'accounts' |
183 | 37d59b27 | Kostas Papadimitriou | |
184 | 37d59b27 | Kostas Papadimitriou | }, |
185 | 4161cb70 | Giorgos Korfiatis | }, |
186 | 37d59b27 | Kostas Papadimitriou | 'groups_order': ['storage', 'compute', 'network', 'accounts'], |
187 | 75380308 | Kostas Papadimitriou | 'resources_order': ['pithos.diskspace', |
188 | 4161cb70 | Giorgos Korfiatis | 'cyclades.disk',
|
189 | 5083fc47 | Christos Stavrakakis | 'cyclades.total_cpu',
|
190 | 4161cb70 | Giorgos Korfiatis | 'cyclades.cpu',
|
191 | 5083fc47 | Christos Stavrakakis | 'cyclades.total_ram',
|
192 | 4161cb70 | Giorgos Korfiatis | 'cyclades.ram',
|
193 | 4161cb70 | Giorgos Korfiatis | 'cyclades.vm',
|
194 | 37d59b27 | Kostas Papadimitriou | 'cyclades.network.private',
|
195 | 447475de | Giorgos Korfiatis | 'cyclades.floating_ip',
|
196 | 37d59b27 | Kostas Papadimitriou | 'astakos.pending_app'
|
197 | 37d59b27 | Kostas Papadimitriou | ], |
198 | 4161cb70 | Giorgos Korfiatis | } |
199 | 0156e40c | Kostas Papadimitriou | |
200 | 37d59b27 | Kostas Papadimitriou | # extend from settings
|
201 | 37d59b27 | Kostas Papadimitriou | RESOURCES = dict_merge(RESOURCES, settings.RESOURCES_META) |
202 | 37d59b27 | Kostas Papadimitriou | |
203 | 0156e40c | Kostas Papadimitriou | |
204 | bea584e1 | Giorgos Korfiatis | def component_defaults(service_name): |
205 | 0156e40c | Kostas Papadimitriou | """
|
206 | 0156e40c | Kostas Papadimitriou | Metadata for unkown services
|
207 | 0156e40c | Kostas Papadimitriou | """
|
208 | 0156e40c | Kostas Papadimitriou | return {
|
209 | 0156e40c | Kostas Papadimitriou | 'name': service_name,
|
210 | 0156e40c | Kostas Papadimitriou | 'order': 1000, |
211 | 0156e40c | Kostas Papadimitriou | 'verbose_name': service_name.title(),
|
212 | 0156e40c | Kostas Papadimitriou | 'cloudbar': {
|
213 | 0156e40c | Kostas Papadimitriou | 'show': True, |
214 | 0156e40c | Kostas Papadimitriou | 'title': service_name
|
215 | 0156e40c | Kostas Papadimitriou | }, |
216 | 0156e40c | Kostas Papadimitriou | 'dashboard': {
|
217 | 0156e40c | Kostas Papadimitriou | 'show': True, |
218 | 0156e40c | Kostas Papadimitriou | 'order': 1000, |
219 | 0156e40c | Kostas Papadimitriou | 'description': '%s service' % service_name |
220 | 0156e40c | Kostas Papadimitriou | } |
221 | 0156e40c | Kostas Papadimitriou | } |
222 | 0156e40c | Kostas Papadimitriou | |
223 | 0156e40c | Kostas Papadimitriou | |
224 | bea584e1 | Giorgos Korfiatis | COMPONENTS = { |
225 | 0156e40c | Kostas Papadimitriou | 'astakos': {
|
226 | 0156e40c | Kostas Papadimitriou | 'order': 1, |
227 | 0156e40c | Kostas Papadimitriou | 'dashboard': {
|
228 | 0156e40c | Kostas Papadimitriou | 'order': 3, |
229 | 0156e40c | Kostas Papadimitriou | 'show': True, |
230 | 0156e40c | Kostas Papadimitriou | 'description': "Access the dashboard from the top right corner " |
231 | 0156e40c | Kostas Papadimitriou | "of your screen. Here you can manage your profile, "
|
232 | 0156e40c | Kostas Papadimitriou | "see the usage of your resources and manage "
|
233 | 0156e40c | Kostas Papadimitriou | "projects to share virtual resources with "
|
234 | 0156e40c | Kostas Papadimitriou | "colleagues."
|
235 | 0156e40c | Kostas Papadimitriou | }, |
236 | 0156e40c | Kostas Papadimitriou | 'cloudbar': {
|
237 | 0156e40c | Kostas Papadimitriou | 'show': False |
238 | 0156e40c | Kostas Papadimitriou | } |
239 | 0156e40c | Kostas Papadimitriou | }, |
240 | 0156e40c | Kostas Papadimitriou | 'pithos': {
|
241 | 0156e40c | Kostas Papadimitriou | 'order': 2, |
242 | 0156e40c | Kostas Papadimitriou | 'dashboard': {
|
243 | 0156e40c | Kostas Papadimitriou | 'order': 1, |
244 | 0156e40c | Kostas Papadimitriou | 'show': True, |
245 | 0156e40c | Kostas Papadimitriou | 'description': "Pithos is the File Storage service. " |
246 | 0156e40c | Kostas Papadimitriou | "Click to start uploading and managing your "
|
247 | 0156e40c | Kostas Papadimitriou | "files on the cloud."
|
248 | 0156e40c | Kostas Papadimitriou | }, |
249 | 0156e40c | Kostas Papadimitriou | 'cloudbar': {
|
250 | 0156e40c | Kostas Papadimitriou | 'show': True |
251 | 0156e40c | Kostas Papadimitriou | } |
252 | 0156e40c | Kostas Papadimitriou | }, |
253 | 0156e40c | Kostas Papadimitriou | 'cyclades': {
|
254 | 0156e40c | Kostas Papadimitriou | 'order': 3, |
255 | 0156e40c | Kostas Papadimitriou | 'dashboard': {
|
256 | 0156e40c | Kostas Papadimitriou | 'order': 2, |
257 | 0156e40c | Kostas Papadimitriou | 'show': True, |
258 | 0156e40c | Kostas Papadimitriou | 'description': "Cyclades is the Compute and Network Service. " |
259 | 0156e40c | Kostas Papadimitriou | "Click to start creating Virtual Machines and "
|
260 | 0156e40c | Kostas Papadimitriou | "connect them to arbitrary Networks."
|
261 | 0156e40c | Kostas Papadimitriou | }, |
262 | 0156e40c | Kostas Papadimitriou | 'cloudbar': {
|
263 | 0156e40c | Kostas Papadimitriou | 'show': True |
264 | 0156e40c | Kostas Papadimitriou | } |
265 | 0156e40c | Kostas Papadimitriou | } |
266 | 0156e40c | Kostas Papadimitriou | } |
267 | 251b83be | Giorgos Korfiatis | |
268 | 251b83be | Giorgos Korfiatis | |
269 | 251b83be | Giorgos Korfiatis | PROJECT_MEMBER_JOIN_POLICIES = { |
270 | 251b83be | Giorgos Korfiatis | 1: 'automatically accepted', |
271 | 251b83be | Giorgos Korfiatis | 2: 'owner accepts', |
272 | 251b83be | Giorgos Korfiatis | 3: 'closed', |
273 | 251b83be | Giorgos Korfiatis | } |
274 | 251b83be | Giorgos Korfiatis | |
275 | 251b83be | Giorgos Korfiatis | |
276 | 251b83be | Giorgos Korfiatis | PROJECT_MEMBER_LEAVE_POLICIES = { |
277 | 251b83be | Giorgos Korfiatis | 1: 'automatically accepted', |
278 | 251b83be | Giorgos Korfiatis | 2: 'owner accepts', |
279 | 251b83be | Giorgos Korfiatis | 3: 'closed', |
280 | 251b83be | Giorgos Korfiatis | } |