root / kamaki / cli / commands / astakos.py @ dbe345ac
History | View | Annotate | Download (28.7 kB)
1 | e3f01d64 | Stavros Sachtouris | # Copyright 2011-2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 7493ccb6 | Stavros Sachtouris | #
|
3 | 7493ccb6 | Stavros Sachtouris | # Redistribution and use in source and binary forms, with or
|
4 | 7493ccb6 | Stavros Sachtouris | # without modification, are permitted provided that the following
|
5 | 7493ccb6 | Stavros Sachtouris | # conditions are met:
|
6 | 7493ccb6 | Stavros Sachtouris | #
|
7 | 7493ccb6 | Stavros Sachtouris | # 1. Redistributions of source code must retain the above
|
8 | 7493ccb6 | Stavros Sachtouris | # copyright notice, this list of conditions and the following
|
9 | 7493ccb6 | Stavros Sachtouris | # disclaimer.
|
10 | 7493ccb6 | Stavros Sachtouris | #
|
11 | 7493ccb6 | Stavros Sachtouris | # 2. Redistributions in binary form must reproduce the above
|
12 | 7493ccb6 | Stavros Sachtouris | # copyright notice, this list of conditions and the following
|
13 | 7493ccb6 | Stavros Sachtouris | # disclaimer in the documentation and/or other materials
|
14 | 7493ccb6 | Stavros Sachtouris | # provided with the distribution.
|
15 | 7493ccb6 | Stavros Sachtouris | #
|
16 | 7493ccb6 | Stavros Sachtouris | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 7493ccb6 | Stavros Sachtouris | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 7493ccb6 | Stavros Sachtouris | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 7493ccb6 | Stavros Sachtouris | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 7493ccb6 | Stavros Sachtouris | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 7493ccb6 | Stavros Sachtouris | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 7493ccb6 | Stavros Sachtouris | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 7493ccb6 | Stavros Sachtouris | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 7493ccb6 | Stavros Sachtouris | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 7493ccb6 | Stavros Sachtouris | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 7493ccb6 | Stavros Sachtouris | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 7493ccb6 | Stavros Sachtouris | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 7493ccb6 | Stavros Sachtouris | #
|
29 | 7493ccb6 | Stavros Sachtouris | # The views and conclusions contained in the software and
|
30 | 7493ccb6 | Stavros Sachtouris | # documentation are those of the authors and should not be
|
31 | 7493ccb6 | Stavros Sachtouris | # interpreted as representing official policies, either expressed
|
32 | 7493ccb6 | Stavros Sachtouris | # or implied, of GRNET S.A.command
|
33 | 7493ccb6 | Stavros Sachtouris | |
34 | ab863157 | Stavros Sachtouris | from json import load, loads |
35 | c308d73f | Stavros Sachtouris | from os.path import abspath |
36 | c308d73f | Stavros Sachtouris | |
37 | c2be5c96 | Stavros Sachtouris | from kamaki.cli import command |
38 | cd42f8d8 | Stavros Sachtouris | from kamaki.clients.astakos import LoggedAstakosClient |
39 | b4f69041 | Stavros Sachtouris | from kamaki.cli.commands import ( |
40 | ad696342 | Stavros Sachtouris | _command_init, errors, _optional_json, addLogSettings, _name_filter) |
41 | be99b6ad | Stavros Sachtouris | from kamaki.cli.command_tree import CommandTree |
42 | fa7d08b6 | Stavros Sachtouris | from kamaki.cli.errors import CLIBaseUrlError, CLISyntaxError, CLIError |
43 | ab863157 | Stavros Sachtouris | from kamaki.cli.argument import ( |
44 | ab863157 | Stavros Sachtouris | FlagArgument, ValueArgument, IntArgument, CommaSeparatedListArgument) |
45 | ad696342 | Stavros Sachtouris | from kamaki.cli.utils import format_size, filter_dicts_by_dict |
46 | 7493ccb6 | Stavros Sachtouris | |
47 | 25f9a991 | Stavros Sachtouris | # Mandatory
|
48 | 25f9a991 | Stavros Sachtouris | |
49 | e8d3b957 | Stavros Sachtouris | user_commands = CommandTree('user', 'Astakos/Identity API commands') |
50 | 25f9a991 | Stavros Sachtouris | quota_commands = CommandTree( |
51 | 25f9a991 | Stavros Sachtouris | 'quota', 'Astakos/Account API commands for quotas') |
52 | 25f9a991 | Stavros Sachtouris | resource_commands = CommandTree( |
53 | 25f9a991 | Stavros Sachtouris | 'resource', 'Astakos/Account API commands for resources') |
54 | e8d3b957 | Stavros Sachtouris | project_commands = CommandTree('project', 'Astakos project API commands') |
55 | 9d84caa4 | Stavros Sachtouris | membership_commands = CommandTree( |
56 | 9d84caa4 | Stavros Sachtouris | 'membership', 'Astakos project membership API commands') |
57 | 25f9a991 | Stavros Sachtouris | |
58 | 25f9a991 | Stavros Sachtouris | |
59 | 25f9a991 | Stavros Sachtouris | # Optional
|
60 | 25f9a991 | Stavros Sachtouris | |
61 | 25f9a991 | Stavros Sachtouris | endpoint_commands = CommandTree( |
62 | 25f9a991 | Stavros Sachtouris | 'endpoint', 'Astakos/Account API commands for endpoints') |
63 | 25f9a991 | Stavros Sachtouris | service_commands = CommandTree('service', 'Astakos API commands for services') |
64 | 25f9a991 | Stavros Sachtouris | commission_commands = CommandTree( |
65 | 25f9a991 | Stavros Sachtouris | 'commission', 'Astakos API commands for commissions') |
66 | 25f9a991 | Stavros Sachtouris | |
67 | 25f9a991 | Stavros Sachtouris | _commands = [ |
68 | 25f9a991 | Stavros Sachtouris | user_commands, quota_commands, resource_commands, project_commands, |
69 | 9d84caa4 | Stavros Sachtouris | service_commands, commission_commands, endpoint_commands, |
70 | 9d84caa4 | Stavros Sachtouris | membership_commands] |
71 | 234954d1 | Stavros Sachtouris | |
72 | 234954d1 | Stavros Sachtouris | |
73 | 392d902d | Stavros Sachtouris | def with_temp_token(func): |
74 | 392d902d | Stavros Sachtouris | """ Set token to self.client.token, run func, recover old token """
|
75 | ab863157 | Stavros Sachtouris | def wrap(self, *args, **kwargs): |
76 | ab863157 | Stavros Sachtouris | try:
|
77 | ab863157 | Stavros Sachtouris | token = kwargs.pop('token')
|
78 | ab863157 | Stavros Sachtouris | except KeyError: |
79 | 392d902d | Stavros Sachtouris | raise CLISyntaxError('A token is needed for %s' % func) |
80 | ab863157 | Stavros Sachtouris | token_bu = self.client.token
|
81 | ab863157 | Stavros Sachtouris | try:
|
82 | fa7d08b6 | Stavros Sachtouris | self.client.token = token or token_bu |
83 | 392d902d | Stavros Sachtouris | return func(self, *args, **kwargs) |
84 | ab863157 | Stavros Sachtouris | finally:
|
85 | ab863157 | Stavros Sachtouris | self.client.token = token_bu
|
86 | ab863157 | Stavros Sachtouris | return wrap
|
87 | ab863157 | Stavros Sachtouris | |
88 | ab863157 | Stavros Sachtouris | |
89 | e8d3b957 | Stavros Sachtouris | class _init_synnefo_astakosclient(_command_init): |
90 | 85115c12 | Stavros Sachtouris | |
91 | a03ade9e | Stavros Sachtouris | @errors.generic.all
|
92 | 4018326d | Stavros Sachtouris | @errors.user.load
|
93 | e8d3b957 | Stavros Sachtouris | @errors.user.astakosclient
|
94 | b4f69041 | Stavros Sachtouris | @addLogSettings
|
95 | 436bd910 | Stavros Sachtouris | def _run(self): |
96 | e8d3b957 | Stavros Sachtouris | if getattr(self, 'cloud', None): |
97 | b4f69041 | Stavros Sachtouris | base_url = self._custom_url('astakos') |
98 | b4f69041 | Stavros Sachtouris | if base_url:
|
99 | f5ff79d9 | Stavros Sachtouris | token = self._custom_token(
|
100 | ab863157 | Stavros Sachtouris | 'astakos') or self.config.get_cloud( |
101 | ab863157 | Stavros Sachtouris | self.cloud, 'token') |
102 | dc897a7e | Stavros Sachtouris | token = token.split()[0] if ' ' in token else token |
103 | cd42f8d8 | Stavros Sachtouris | self.client = LoggedAstakosClient(base_url, token)
|
104 | b4f69041 | Stavros Sachtouris | return
|
105 | b4f69041 | Stavros Sachtouris | else:
|
106 | b4f69041 | Stavros Sachtouris | self.cloud = 'default' |
107 | e8d3b957 | Stavros Sachtouris | if getattr(self, 'auth_base', None): |
108 | 5033585e | Stavros Sachtouris | self.client = self.auth_base.get_client() |
109 | b4f69041 | Stavros Sachtouris | return
|
110 | b4f69041 | Stavros Sachtouris | raise CLIBaseUrlError(service='astakos') |
111 | 7493ccb6 | Stavros Sachtouris | |
112 | 436bd910 | Stavros Sachtouris | def main(self): |
113 | 5fdccdec | Stavros Sachtouris | self._run()
|
114 | 436bd910 | Stavros Sachtouris | |
115 | 234954d1 | Stavros Sachtouris | |
116 | e8d3b957 | Stavros Sachtouris | @command(user_commands)
|
117 | fa7d08b6 | Stavros Sachtouris | class user_authenticate(_init_synnefo_astakosclient, _optional_json): |
118 | fa7d08b6 | Stavros Sachtouris | """Authenticate a user and get all authentication information"""
|
119 | 7493ccb6 | Stavros Sachtouris | |
120 | a03ade9e | Stavros Sachtouris | @errors.generic.all
|
121 | 4018326d | Stavros Sachtouris | @errors.user.authenticate
|
122 | e8d3b957 | Stavros Sachtouris | @errors.user.astakosclient
|
123 | 5033585e | Stavros Sachtouris | @with_temp_token
|
124 | 5033585e | Stavros Sachtouris | def _run(self): |
125 | fa7d08b6 | Stavros Sachtouris | self._print(self.client.authenticate(), self.print_dict) |
126 | 3185cd6d | Stavros Sachtouris | |
127 | e8d3b957 | Stavros Sachtouris | def main(self, token=None): |
128 | 9a8861d1 | Stavros Sachtouris | super(self.__class__, self)._run() |
129 | 5033585e | Stavros Sachtouris | self._run(token=token)
|
130 | 9a8861d1 | Stavros Sachtouris | |
131 | 9a8861d1 | Stavros Sachtouris | |
132 | e8d3b957 | Stavros Sachtouris | @command(user_commands)
|
133 | 5033585e | Stavros Sachtouris | class user_uuid2name(_init_synnefo_astakosclient, _optional_json): |
134 | 5033585e | Stavros Sachtouris | """Get user name(s) from uuid(s)"""
|
135 | 9a8861d1 | Stavros Sachtouris | |
136 | 8b4ba753 | Stavros Sachtouris | #@errors.generic.all
|
137 | 8b4ba753 | Stavros Sachtouris | #@errors.user.astakosclient
|
138 | e8d3b957 | Stavros Sachtouris | def _run(self, uuids): |
139 | e8d3b957 | Stavros Sachtouris | r = self.client.get_usernames(uuids)
|
140 | e8d3b957 | Stavros Sachtouris | self._print(r, self.print_dict) |
141 | e8d3b957 | Stavros Sachtouris | unresolved = set(uuids).difference(r)
|
142 | e8d3b957 | Stavros Sachtouris | if unresolved:
|
143 | e8d3b957 | Stavros Sachtouris | self.error('Unresolved uuids: %s' % ', '.join(unresolved)) |
144 | e8d3b957 | Stavros Sachtouris | |
145 | e8d3b957 | Stavros Sachtouris | def main(self, uuid, *more_uuids): |
146 | 9a8861d1 | Stavros Sachtouris | super(self.__class__, self)._run() |
147 | e8d3b957 | Stavros Sachtouris | self._run(uuids=((uuid, ) + more_uuids))
|
148 | b91111b9 | Stavros Sachtouris | |
149 | b91111b9 | Stavros Sachtouris | |
150 | e8d3b957 | Stavros Sachtouris | @command(user_commands)
|
151 | 5033585e | Stavros Sachtouris | class user_name2uuid(_init_synnefo_astakosclient, _optional_json): |
152 | 5033585e | Stavros Sachtouris | """Get user uuid(s) from name(s)"""
|
153 | b91111b9 | Stavros Sachtouris | |
154 | b91111b9 | Stavros Sachtouris | @errors.generic.all
|
155 | e8d3b957 | Stavros Sachtouris | @errors.user.astakosclient
|
156 | e8d3b957 | Stavros Sachtouris | def _run(self, usernames): |
157 | e8d3b957 | Stavros Sachtouris | r = self.client.get_uuids(usernames)
|
158 | e8d3b957 | Stavros Sachtouris | self._print(r, self.print_dict) |
159 | e8d3b957 | Stavros Sachtouris | unresolved = set(usernames).difference(r)
|
160 | e8d3b957 | Stavros Sachtouris | if unresolved:
|
161 | e8d3b957 | Stavros Sachtouris | self.error('Unresolved usernames: %s' % ', '.join(unresolved)) |
162 | e8d3b957 | Stavros Sachtouris | |
163 | e8d3b957 | Stavros Sachtouris | def main(self, username, *more_usernames): |
164 | b91111b9 | Stavros Sachtouris | super(self.__class__, self)._run() |
165 | e8d3b957 | Stavros Sachtouris | self._run(usernames=((username, ) + more_usernames))
|
166 | e8d3b957 | Stavros Sachtouris | |
167 | e8d3b957 | Stavros Sachtouris | |
168 | 6893e31c | Stavros Sachtouris | class _quota(_init_synnefo_astakosclient, _optional_json): |
169 | e8d3b957 | Stavros Sachtouris | |
170 | e8d3b957 | Stavros Sachtouris | _to_format = set(['cyclades.disk', 'pithos.diskspace', 'cyclades.ram']) |
171 | fe4940bc | Stavros Sachtouris | |
172 | e8d3b957 | Stavros Sachtouris | arguments = dict(
|
173 | e8d3b957 | Stavros Sachtouris | bytes=FlagArgument('Show data size in bytes', '--bytes') |
174 | e8d3b957 | Stavros Sachtouris | ) |
175 | fe4940bc | Stavros Sachtouris | |
176 | e8d3b957 | Stavros Sachtouris | def _print_quotas(self, quotas, *args, **kwargs): |
177 | e8d3b957 | Stavros Sachtouris | if not self['bytes']: |
178 | e8d3b957 | Stavros Sachtouris | for category in quotas.values(): |
179 | e8d3b957 | Stavros Sachtouris | for service in self._to_format.intersection(category): |
180 | e8d3b957 | Stavros Sachtouris | for attr, v in category[service].items(): |
181 | e8d3b957 | Stavros Sachtouris | category[service][attr] = format_size(v) |
182 | e8d3b957 | Stavros Sachtouris | self.print_dict(quotas, *args, **kwargs)
|
183 | fe4940bc | Stavros Sachtouris | |
184 | 6893e31c | Stavros Sachtouris | |
185 | 6893e31c | Stavros Sachtouris | @command(quota_commands)
|
186 | 6893e31c | Stavros Sachtouris | class quota_info(_quota): |
187 | 6893e31c | Stavros Sachtouris | """Get quota for a service (cyclades, pithos, astakos)"""
|
188 | 6893e31c | Stavros Sachtouris | |
189 | 6893e31c | Stavros Sachtouris | @errors.generic.all
|
190 | 6893e31c | Stavros Sachtouris | @errors.user.astakosclient
|
191 | 6893e31c | Stavros Sachtouris | def _run(self, service): |
192 | 6893e31c | Stavros Sachtouris | r = dict()
|
193 | 6893e31c | Stavros Sachtouris | for k, v in self.client.get_quotas()['system'].items(): |
194 | 6893e31c | Stavros Sachtouris | if (k.startswith(service)):
|
195 | 6893e31c | Stavros Sachtouris | r[k] = v |
196 | 6893e31c | Stavros Sachtouris | self._print({'%s*' % service: r}, self._print_quotas) |
197 | 6893e31c | Stavros Sachtouris | |
198 | 6893e31c | Stavros Sachtouris | def main(self, service): |
199 | 6893e31c | Stavros Sachtouris | super(self.__class__, self)._run() |
200 | 6893e31c | Stavros Sachtouris | self._run(service)
|
201 | 6893e31c | Stavros Sachtouris | |
202 | 6893e31c | Stavros Sachtouris | |
203 | 6893e31c | Stavros Sachtouris | @command(quota_commands)
|
204 | 6893e31c | Stavros Sachtouris | class quota_list(_quota): |
205 | 6893e31c | Stavros Sachtouris | """Get user quotas"""
|
206 | 6893e31c | Stavros Sachtouris | |
207 | fe4940bc | Stavros Sachtouris | @errors.generic.all
|
208 | e8d3b957 | Stavros Sachtouris | @errors.user.astakosclient
|
209 | e8d3b957 | Stavros Sachtouris | def _run(self): |
210 | e8d3b957 | Stavros Sachtouris | self._print(self.client.get_quotas(), self._print_quotas) |
211 | fe4940bc | Stavros Sachtouris | |
212 | e8d3b957 | Stavros Sachtouris | def main(self): |
213 | fe4940bc | Stavros Sachtouris | super(self.__class__, self)._run() |
214 | e8d3b957 | Stavros Sachtouris | self._run()
|
215 | c308d73f | Stavros Sachtouris | |
216 | c308d73f | Stavros Sachtouris | |
217 | fa7d08b6 | Stavros Sachtouris | # command user session
|
218 | fa7d08b6 | Stavros Sachtouris | |
219 | fa7d08b6 | Stavros Sachtouris | |
220 | fa7d08b6 | Stavros Sachtouris | @command(user_commands)
|
221 | 25f9a991 | Stavros Sachtouris | class user_info(_init_synnefo_astakosclient, _optional_json): |
222 | fa7d08b6 | Stavros Sachtouris | """Get info for (current) session user"""
|
223 | fa7d08b6 | Stavros Sachtouris | |
224 | fa7d08b6 | Stavros Sachtouris | arguments = dict(
|
225 | fa7d08b6 | Stavros Sachtouris | uuid=ValueArgument('Query user with uuid', '--uuid'), |
226 | fa7d08b6 | Stavros Sachtouris | name=ValueArgument('Query user with username/email', '--username') |
227 | fa7d08b6 | Stavros Sachtouris | ) |
228 | fa7d08b6 | Stavros Sachtouris | |
229 | fa7d08b6 | Stavros Sachtouris | @errors.generic.all
|
230 | fa7d08b6 | Stavros Sachtouris | @errors.user.astakosclient
|
231 | fa7d08b6 | Stavros Sachtouris | def _run(self): |
232 | fa7d08b6 | Stavros Sachtouris | if self['uuid'] and self['name']: |
233 | fa7d08b6 | Stavros Sachtouris | raise CLISyntaxError(
|
234 | fa7d08b6 | Stavros Sachtouris | 'Arguments uuid and username are mutually exclusive',
|
235 | fa7d08b6 | Stavros Sachtouris | details=['Use either uuid OR username OR none, not both'])
|
236 | fa7d08b6 | Stavros Sachtouris | uuid = self['uuid'] or (self._username2uuid(self['name']) if ( |
237 | fa7d08b6 | Stavros Sachtouris | self['name']) else None) |
238 | fa7d08b6 | Stavros Sachtouris | try:
|
239 | fa7d08b6 | Stavros Sachtouris | token = self.auth_base.get_token(uuid) if uuid else None |
240 | fa7d08b6 | Stavros Sachtouris | except KeyError: |
241 | fa7d08b6 | Stavros Sachtouris | msg = ('id %s' % self['uuid']) if ( |
242 | fa7d08b6 | Stavros Sachtouris | self['uuid']) else 'username %s' % self['name'] |
243 | fa7d08b6 | Stavros Sachtouris | raise CLIError(
|
244 | fa7d08b6 | Stavros Sachtouris | 'No user with %s in the cached session list' % msg, details=[
|
245 | fa7d08b6 | Stavros Sachtouris | 'To see all cached session users',
|
246 | 25f9a991 | Stavros Sachtouris | ' /user list',
|
247 | fa7d08b6 | Stavros Sachtouris | 'To authenticate and add a new user in the session list',
|
248 | 25f9a991 | Stavros Sachtouris | ' /user add <new token>'])
|
249 | fa7d08b6 | Stavros Sachtouris | self._print(self.auth_base.user_info(token), self.print_dict) |
250 | fa7d08b6 | Stavros Sachtouris | |
251 | fa7d08b6 | Stavros Sachtouris | |
252 | fa7d08b6 | Stavros Sachtouris | @command(user_commands)
|
253 | 25f9a991 | Stavros Sachtouris | class user_add(_init_synnefo_astakosclient, _optional_json): |
254 | 25f9a991 | Stavros Sachtouris | """Authenticate a user by token and add to kamaki session (cache)"""
|
255 | fa7d08b6 | Stavros Sachtouris | |
256 | fa7d08b6 | Stavros Sachtouris | @errors.generic.all
|
257 | fa7d08b6 | Stavros Sachtouris | @errors.user.astakosclient
|
258 | fa7d08b6 | Stavros Sachtouris | def _run(self, token=None): |
259 | fa7d08b6 | Stavros Sachtouris | ask = token and token not in self.auth_base._uuids |
260 | fa7d08b6 | Stavros Sachtouris | self._print(self.auth_base.authenticate(token), self.print_dict) |
261 | fa7d08b6 | Stavros Sachtouris | if ask and self.ask_user( |
262 | fa7d08b6 | Stavros Sachtouris | 'Token is temporarily stored in memory. If it is stored in'
|
263 | fa7d08b6 | Stavros Sachtouris | ' kamaki configuration file, it will be available in later'
|
264 | fa7d08b6 | Stavros Sachtouris | ' sessions. Do you want to permanently store this token?'):
|
265 | fa7d08b6 | Stavros Sachtouris | tokens = self.auth_base._uuids.keys()
|
266 | fa7d08b6 | Stavros Sachtouris | tokens.remove(self.auth_base.token)
|
267 | fa7d08b6 | Stavros Sachtouris | self['config'].set_cloud( |
268 | fa7d08b6 | Stavros Sachtouris | self.cloud, 'token', ' '.join([self.auth_base.token] + tokens)) |
269 | fa7d08b6 | Stavros Sachtouris | self['config'].write() |
270 | fa7d08b6 | Stavros Sachtouris | |
271 | fa7d08b6 | Stavros Sachtouris | def main(self, new_token=None): |
272 | fa7d08b6 | Stavros Sachtouris | super(self.__class__, self)._run() |
273 | fa7d08b6 | Stavros Sachtouris | self._run(token=new_token)
|
274 | fa7d08b6 | Stavros Sachtouris | |
275 | fa7d08b6 | Stavros Sachtouris | |
276 | fa7d08b6 | Stavros Sachtouris | @command(user_commands)
|
277 | 25f9a991 | Stavros Sachtouris | class user_list(_init_synnefo_astakosclient, _optional_json): |
278 | 25f9a991 | Stavros Sachtouris | """List (cached) session users"""
|
279 | fa7d08b6 | Stavros Sachtouris | |
280 | fa7d08b6 | Stavros Sachtouris | arguments = dict(
|
281 | fa7d08b6 | Stavros Sachtouris | detail=FlagArgument('Detailed listing', ('-l', '--detail')) |
282 | fa7d08b6 | Stavros Sachtouris | ) |
283 | fa7d08b6 | Stavros Sachtouris | |
284 | fa7d08b6 | Stavros Sachtouris | @errors.generic.all
|
285 | fa7d08b6 | Stavros Sachtouris | @errors.user.astakosclient
|
286 | fa7d08b6 | Stavros Sachtouris | def _run(self): |
287 | fa7d08b6 | Stavros Sachtouris | self._print([u if self['detail'] else (dict( |
288 | fa7d08b6 | Stavros Sachtouris | id=u['id'], name=u['name'])) for u in self.auth_base.list_users()]) |
289 | fa7d08b6 | Stavros Sachtouris | |
290 | fa7d08b6 | Stavros Sachtouris | def main(self): |
291 | fa7d08b6 | Stavros Sachtouris | super(self.__class__, self)._run() |
292 | fa7d08b6 | Stavros Sachtouris | self._run()
|
293 | fa7d08b6 | Stavros Sachtouris | |
294 | fa7d08b6 | Stavros Sachtouris | |
295 | fa7d08b6 | Stavros Sachtouris | @command(user_commands)
|
296 | 25f9a991 | Stavros Sachtouris | class user_select(_init_synnefo_astakosclient): |
297 | 25f9a991 | Stavros Sachtouris | """Select a user from the (cached) list as the current session user"""
|
298 | fa7d08b6 | Stavros Sachtouris | |
299 | fa7d08b6 | Stavros Sachtouris | @errors.generic.all
|
300 | fa7d08b6 | Stavros Sachtouris | @errors.user.astakosclient
|
301 | fa7d08b6 | Stavros Sachtouris | def _run(self, uuid): |
302 | fa7d08b6 | Stavros Sachtouris | try:
|
303 | fa7d08b6 | Stavros Sachtouris | first_token = self.auth_base.get_token(uuid)
|
304 | fa7d08b6 | Stavros Sachtouris | except KeyError: |
305 | fa7d08b6 | Stavros Sachtouris | raise CLIError(
|
306 | fa7d08b6 | Stavros Sachtouris | 'No user with uuid %s in the cached session list' % uuid,
|
307 | fa7d08b6 | Stavros Sachtouris | details=[ |
308 | fa7d08b6 | Stavros Sachtouris | 'To see all cached session users',
|
309 | 25f9a991 | Stavros Sachtouris | ' /user list',
|
310 | fa7d08b6 | Stavros Sachtouris | 'To authenticate and add a new user in the session list',
|
311 | 25f9a991 | Stavros Sachtouris | ' /user add <new token>'])
|
312 | fa7d08b6 | Stavros Sachtouris | if self.auth_base.token != first_token: |
313 | fa7d08b6 | Stavros Sachtouris | self.auth_base.token = first_token
|
314 | fa7d08b6 | Stavros Sachtouris | msg = 'User with id %s is now the current session user.\n' % uuid
|
315 | fa7d08b6 | Stavros Sachtouris | msg += 'Do you want future sessions to also start with this user?'
|
316 | fa7d08b6 | Stavros Sachtouris | if self.ask_user(msg): |
317 | fa7d08b6 | Stavros Sachtouris | tokens = self.auth_base._uuids.keys()
|
318 | fa7d08b6 | Stavros Sachtouris | tokens.remove(self.auth_base.token)
|
319 | fa7d08b6 | Stavros Sachtouris | tokens.insert(0, self.auth_base.token) |
320 | fa7d08b6 | Stavros Sachtouris | self['config'].set_cloud( |
321 | fa7d08b6 | Stavros Sachtouris | self.cloud, 'token', ' '.join(tokens)) |
322 | fa7d08b6 | Stavros Sachtouris | self['config'].write() |
323 | fa7d08b6 | Stavros Sachtouris | self.error('User is selected for next sessions') |
324 | fa7d08b6 | Stavros Sachtouris | else:
|
325 | fa7d08b6 | Stavros Sachtouris | self.error('User is not permanently selected') |
326 | fa7d08b6 | Stavros Sachtouris | else:
|
327 | fa7d08b6 | Stavros Sachtouris | self.error('User was already the selected session user') |
328 | fa7d08b6 | Stavros Sachtouris | |
329 | fa7d08b6 | Stavros Sachtouris | def main(self, user_uuid): |
330 | fa7d08b6 | Stavros Sachtouris | super(self.__class__, self)._run() |
331 | fa7d08b6 | Stavros Sachtouris | self._run(uuid=user_uuid)
|
332 | fa7d08b6 | Stavros Sachtouris | |
333 | fa7d08b6 | Stavros Sachtouris | |
334 | fa7d08b6 | Stavros Sachtouris | @command(user_commands)
|
335 | 25f9a991 | Stavros Sachtouris | class user_delete(_init_synnefo_astakosclient): |
336 | 25f9a991 | Stavros Sachtouris | """Delete a user (token) from the (cached) list of session users"""
|
337 | fa7d08b6 | Stavros Sachtouris | |
338 | fa7d08b6 | Stavros Sachtouris | @errors.generic.all
|
339 | fa7d08b6 | Stavros Sachtouris | @errors.user.astakosclient
|
340 | fa7d08b6 | Stavros Sachtouris | def _run(self, uuid): |
341 | fa7d08b6 | Stavros Sachtouris | if uuid == self.auth_base.user_term('id'): |
342 | fa7d08b6 | Stavros Sachtouris | raise CLIError('Cannot remove current session user', details=[ |
343 | fa7d08b6 | Stavros Sachtouris | 'To see all cached session users',
|
344 | 25f9a991 | Stavros Sachtouris | ' /user list',
|
345 | fa7d08b6 | Stavros Sachtouris | 'To see current session user',
|
346 | 25f9a991 | Stavros Sachtouris | ' /user info',
|
347 | fa7d08b6 | Stavros Sachtouris | 'To select a different session user',
|
348 | 25f9a991 | Stavros Sachtouris | ' /user select <user uuid>'])
|
349 | fa7d08b6 | Stavros Sachtouris | try:
|
350 | fa7d08b6 | Stavros Sachtouris | self.auth_base.remove_user(uuid)
|
351 | fa7d08b6 | Stavros Sachtouris | except KeyError: |
352 | fa7d08b6 | Stavros Sachtouris | raise CLIError('No user with uuid %s in session list' % uuid, |
353 | fa7d08b6 | Stavros Sachtouris | details=[ |
354 | fa7d08b6 | Stavros Sachtouris | 'To see all cached session users',
|
355 | 25f9a991 | Stavros Sachtouris | ' /user list',
|
356 | fa7d08b6 | Stavros Sachtouris | 'To authenticate and add a new user in the session list',
|
357 | 25f9a991 | Stavros Sachtouris | ' /user add <new token>'])
|
358 | fa7d08b6 | Stavros Sachtouris | if self.ask_user( |
359 | fa7d08b6 | Stavros Sachtouris | 'User is removed from current session, but will be restored in'
|
360 | fa7d08b6 | Stavros Sachtouris | ' the next session. Remove the user from future sessions?'):
|
361 | fa7d08b6 | Stavros Sachtouris | self['config'].set_cloud( |
362 | fa7d08b6 | Stavros Sachtouris | self.cloud, 'token', ' '.join(self.auth_base._uuids.keys())) |
363 | fa7d08b6 | Stavros Sachtouris | self['config'].write() |
364 | fa7d08b6 | Stavros Sachtouris | |
365 | fa7d08b6 | Stavros Sachtouris | def main(self, user_uuid): |
366 | fa7d08b6 | Stavros Sachtouris | super(self.__class__, self)._run() |
367 | fa7d08b6 | Stavros Sachtouris | self._run(uuid=user_uuid)
|
368 | fa7d08b6 | Stavros Sachtouris | |
369 | fa7d08b6 | Stavros Sachtouris | |
370 | ab863157 | Stavros Sachtouris | # command admin
|
371 | ab863157 | Stavros Sachtouris | |
372 | 25f9a991 | Stavros Sachtouris | @command(service_commands)
|
373 | 25f9a991 | Stavros Sachtouris | class service_list(_init_synnefo_astakosclient, _optional_json): |
374 | ab863157 | Stavros Sachtouris | """List available services"""
|
375 | ab863157 | Stavros Sachtouris | |
376 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
377 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
378 | ab863157 | Stavros Sachtouris | def _run(self): |
379 | ab863157 | Stavros Sachtouris | self._print(self.client.get_services()) |
380 | ab863157 | Stavros Sachtouris | |
381 | ab863157 | Stavros Sachtouris | def main(self): |
382 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
383 | ab863157 | Stavros Sachtouris | self._run()
|
384 | ab863157 | Stavros Sachtouris | |
385 | ab863157 | Stavros Sachtouris | |
386 | 25f9a991 | Stavros Sachtouris | @command(service_commands)
|
387 | 25f9a991 | Stavros Sachtouris | class service_uuid2username(_init_synnefo_astakosclient, _optional_json): |
388 | ab863157 | Stavros Sachtouris | """Get service username(s) from uuid(s)"""
|
389 | ab863157 | Stavros Sachtouris | |
390 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
391 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
392 | ab863157 | Stavros Sachtouris | @with_temp_token
|
393 | ab863157 | Stavros Sachtouris | def _run(self, uuids): |
394 | ab863157 | Stavros Sachtouris | if 1 == len(uuids): |
395 | ab863157 | Stavros Sachtouris | self._print(self.client.service_get_username(uuids[0])) |
396 | ab863157 | Stavros Sachtouris | else:
|
397 | ab863157 | Stavros Sachtouris | self._print(
|
398 | ab863157 | Stavros Sachtouris | self.client.service_get_usernames(uuids),
|
399 | ab863157 | Stavros Sachtouris | self.print_dict)
|
400 | ab863157 | Stavros Sachtouris | |
401 | ab863157 | Stavros Sachtouris | def main(self, service_token, uuid, *more_uuids): |
402 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
403 | ab863157 | Stavros Sachtouris | self._run([uuid] + list(more_uuids), token=service_token) |
404 | ab863157 | Stavros Sachtouris | |
405 | ab863157 | Stavros Sachtouris | |
406 | 25f9a991 | Stavros Sachtouris | @command(service_commands)
|
407 | 25f9a991 | Stavros Sachtouris | class service_username2uuid(_init_synnefo_astakosclient, _optional_json): |
408 | ab863157 | Stavros Sachtouris | """Get service uuid(s) from username(s)"""
|
409 | ab863157 | Stavros Sachtouris | |
410 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
411 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
412 | ab863157 | Stavros Sachtouris | @with_temp_token
|
413 | ab863157 | Stavros Sachtouris | def _run(self, usernames): |
414 | ab863157 | Stavros Sachtouris | if 1 == len(usernames): |
415 | ab863157 | Stavros Sachtouris | self._print(self.client.service_get_uuid(usernames[0])) |
416 | ab863157 | Stavros Sachtouris | else:
|
417 | ab863157 | Stavros Sachtouris | self._print(
|
418 | ab863157 | Stavros Sachtouris | self.client.service_get_uuids(usernames),
|
419 | ab863157 | Stavros Sachtouris | self.print_dict)
|
420 | ab863157 | Stavros Sachtouris | |
421 | ab863157 | Stavros Sachtouris | def main(self, service_token, usernames, *more_usernames): |
422 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
423 | ab863157 | Stavros Sachtouris | self._run([usernames] + list(more_usernames), token=service_token) |
424 | ab863157 | Stavros Sachtouris | |
425 | ab863157 | Stavros Sachtouris | |
426 | 25f9a991 | Stavros Sachtouris | @command(service_commands)
|
427 | 25f9a991 | Stavros Sachtouris | class service_quotas(_init_synnefo_astakosclient, _optional_json): |
428 | ab863157 | Stavros Sachtouris | """Get service quotas"""
|
429 | ab863157 | Stavros Sachtouris | |
430 | ab863157 | Stavros Sachtouris | arguments = dict(
|
431 | ab863157 | Stavros Sachtouris | uuid=ValueArgument('A user uuid to get quotas for', '--uuid') |
432 | ab863157 | Stavros Sachtouris | ) |
433 | ab863157 | Stavros Sachtouris | |
434 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
435 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
436 | ab863157 | Stavros Sachtouris | @with_temp_token
|
437 | ab863157 | Stavros Sachtouris | def _run(self): |
438 | ab863157 | Stavros Sachtouris | self._print(self.client.service_get_quotas(self['uuid'])) |
439 | ab863157 | Stavros Sachtouris | |
440 | ab863157 | Stavros Sachtouris | def main(self, service_token): |
441 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
442 | ab863157 | Stavros Sachtouris | self._run(token=service_token)
|
443 | ab863157 | Stavros Sachtouris | |
444 | ab863157 | Stavros Sachtouris | |
445 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
446 | 25f9a991 | Stavros Sachtouris | class commission_pending(_init_synnefo_astakosclient, _optional_json): |
447 | ab863157 | Stavros Sachtouris | """List pending commissions (special privileges required)"""
|
448 | ab863157 | Stavros Sachtouris | |
449 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
450 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
451 | ab863157 | Stavros Sachtouris | def _run(self): |
452 | ab863157 | Stavros Sachtouris | self._print(self.client.get_pending_commissions()) |
453 | ab863157 | Stavros Sachtouris | |
454 | ab863157 | Stavros Sachtouris | def main(self): |
455 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
456 | ab863157 | Stavros Sachtouris | self._run()
|
457 | ab863157 | Stavros Sachtouris | |
458 | ab863157 | Stavros Sachtouris | |
459 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
460 | 25f9a991 | Stavros Sachtouris | class commission_info(_init_synnefo_astakosclient, _optional_json): |
461 | ab863157 | Stavros Sachtouris | """Get commission info (special privileges required)"""
|
462 | ab863157 | Stavros Sachtouris | |
463 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
464 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
465 | ab863157 | Stavros Sachtouris | def _run(self, commission_id): |
466 | ab863157 | Stavros Sachtouris | commission_id = int(commission_id)
|
467 | ab863157 | Stavros Sachtouris | self._print(
|
468 | ab863157 | Stavros Sachtouris | self.client.get_commission_info(commission_id), self.print_dict) |
469 | ab863157 | Stavros Sachtouris | |
470 | ab863157 | Stavros Sachtouris | def main(self, commission_id): |
471 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
472 | ab863157 | Stavros Sachtouris | self._run(commission_id)
|
473 | ab863157 | Stavros Sachtouris | |
474 | ab863157 | Stavros Sachtouris | |
475 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
476 | 25f9a991 | Stavros Sachtouris | class commission_accept(_init_synnefo_astakosclient): |
477 | ab863157 | Stavros Sachtouris | """Accept a pending commission (special privileges required)"""
|
478 | ab863157 | Stavros Sachtouris | |
479 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
480 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
481 | ab863157 | Stavros Sachtouris | def _run(self, commission_id): |
482 | ab863157 | Stavros Sachtouris | commission_id = int(commission_id)
|
483 | ab863157 | Stavros Sachtouris | self.client.accept_commission(commission_id)
|
484 | ab863157 | Stavros Sachtouris | |
485 | ab863157 | Stavros Sachtouris | def main(self, commission_id): |
486 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
487 | ab863157 | Stavros Sachtouris | self._run(commission_id)
|
488 | ab863157 | Stavros Sachtouris | |
489 | ab863157 | Stavros Sachtouris | |
490 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
491 | 25f9a991 | Stavros Sachtouris | class commission_reject(_init_synnefo_astakosclient): |
492 | ab863157 | Stavros Sachtouris | """Reject a pending commission (special privileges required)"""
|
493 | ab863157 | Stavros Sachtouris | |
494 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
495 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
496 | ab863157 | Stavros Sachtouris | def _run(self, commission_id): |
497 | ab863157 | Stavros Sachtouris | commission_id = int(commission_id)
|
498 | ab863157 | Stavros Sachtouris | self.client.reject_commission(commission_id)
|
499 | ab863157 | Stavros Sachtouris | |
500 | ab863157 | Stavros Sachtouris | def main(self, commission_id): |
501 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
502 | ab863157 | Stavros Sachtouris | self._run(commission_id)
|
503 | ab863157 | Stavros Sachtouris | |
504 | ab863157 | Stavros Sachtouris | |
505 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
506 | 25f9a991 | Stavros Sachtouris | class commission_resolve(_init_synnefo_astakosclient, _optional_json): |
507 | ab863157 | Stavros Sachtouris | """Resolve multiple commissions (special privileges required)"""
|
508 | ab863157 | Stavros Sachtouris | |
509 | ab863157 | Stavros Sachtouris | arguments = dict(
|
510 | ab863157 | Stavros Sachtouris | accept=CommaSeparatedListArgument( |
511 | ab863157 | Stavros Sachtouris | 'commission ids to accept (e.g., --accept=11,12,13,...',
|
512 | ab863157 | Stavros Sachtouris | '--accept'),
|
513 | ab863157 | Stavros Sachtouris | reject=CommaSeparatedListArgument( |
514 | ab863157 | Stavros Sachtouris | 'commission ids to reject (e.g., --reject=11,12,13,...',
|
515 | ab863157 | Stavros Sachtouris | '--reject')
|
516 | ab863157 | Stavros Sachtouris | ) |
517 | ab863157 | Stavros Sachtouris | |
518 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
519 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
520 | ab863157 | Stavros Sachtouris | def _run(self): |
521 | ab863157 | Stavros Sachtouris | self.writeln('accepted ', self['accept']) |
522 | ab863157 | Stavros Sachtouris | self.writeln('rejected ', self['reject']) |
523 | ab863157 | Stavros Sachtouris | self._print(
|
524 | ab863157 | Stavros Sachtouris | self.client.resolve_commissions(self['accept'], self['reject']), |
525 | ab863157 | Stavros Sachtouris | self.print_dict)
|
526 | ab863157 | Stavros Sachtouris | |
527 | ab863157 | Stavros Sachtouris | def main(self): |
528 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
529 | ab863157 | Stavros Sachtouris | self._run()
|
530 | ab863157 | Stavros Sachtouris | |
531 | ab863157 | Stavros Sachtouris | |
532 | 25f9a991 | Stavros Sachtouris | @command(commission_commands)
|
533 | 25f9a991 | Stavros Sachtouris | class commission_issue(_init_synnefo_astakosclient, _optional_json): |
534 | ab863157 | Stavros Sachtouris | """Issue commissions as a json string (special privileges required)
|
535 | ab863157 | Stavros Sachtouris | Parameters:
|
536 | ab863157 | Stavros Sachtouris | holder -- user's id (string)
|
537 | ab863157 | Stavros Sachtouris | source -- commission's source (ex system) (string)
|
538 | ab863157 | Stavros Sachtouris | provisions -- resources with their quantity (json-dict from string to int)
|
539 | ab863157 | Stavros Sachtouris | name -- description of the commission (string)
|
540 | ab863157 | Stavros Sachtouris | """
|
541 | ab863157 | Stavros Sachtouris | |
542 | ab863157 | Stavros Sachtouris | arguments = dict(
|
543 | ab863157 | Stavros Sachtouris | force=FlagArgument('Force commission', '--force'), |
544 | ab863157 | Stavros Sachtouris | accept=FlagArgument('Do not wait for verification', '--accept') |
545 | ab863157 | Stavros Sachtouris | ) |
546 | ab863157 | Stavros Sachtouris | |
547 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
548 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
549 | ab863157 | Stavros Sachtouris | def _run(self, holder, source, provisions, name=''): |
550 | ab863157 | Stavros Sachtouris | provisions = loads(provisions) |
551 | ab863157 | Stavros Sachtouris | self._print(self.client.issue_one_commission( |
552 | ab863157 | Stavros Sachtouris | holder, source, provisions, name, |
553 | ab863157 | Stavros Sachtouris | self['force'], self['accept'])) |
554 | ab863157 | Stavros Sachtouris | |
555 | ab863157 | Stavros Sachtouris | def main(self, user_uuid, source, provisions_file, name=''): |
556 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
557 | ab863157 | Stavros Sachtouris | self._run(user_uuid, source, provisions_file, name)
|
558 | ab863157 | Stavros Sachtouris | |
559 | ab863157 | Stavros Sachtouris | |
560 | 25f9a991 | Stavros Sachtouris | @command(resource_commands)
|
561 | 25f9a991 | Stavros Sachtouris | class resource_list(_init_synnefo_astakosclient, _optional_json): |
562 | ab863157 | Stavros Sachtouris | """List user resources"""
|
563 | ab863157 | Stavros Sachtouris | |
564 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
565 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
566 | ab863157 | Stavros Sachtouris | def _run(self): |
567 | ab863157 | Stavros Sachtouris | self._print(self.client.get_resources(), self.print_dict) |
568 | ab863157 | Stavros Sachtouris | |
569 | ab863157 | Stavros Sachtouris | def main(self): |
570 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
571 | ab863157 | Stavros Sachtouris | self._run()
|
572 | ab863157 | Stavros Sachtouris | |
573 | ab863157 | Stavros Sachtouris | |
574 | 25f9a991 | Stavros Sachtouris | @command(endpoint_commands)
|
575 | ad696342 | Stavros Sachtouris | class endpoint_list( |
576 | ad696342 | Stavros Sachtouris | _init_synnefo_astakosclient, _optional_json, _name_filter): |
577 | ab863157 | Stavros Sachtouris | """Get endpoints service endpoints"""
|
578 | ab863157 | Stavros Sachtouris | |
579 | ad696342 | Stavros Sachtouris | arguments = dict(endpoint_type=ValueArgument('Filter by type', '--type')) |
580 | ad696342 | Stavros Sachtouris | |
581 | ab863157 | Stavros Sachtouris | @errors.generic.all
|
582 | ab863157 | Stavros Sachtouris | @errors.user.astakosclient
|
583 | ab863157 | Stavros Sachtouris | def _run(self): |
584 | ad696342 | Stavros Sachtouris | r = self.client.get_endpoints()['access']['serviceCatalog'] |
585 | ad696342 | Stavros Sachtouris | r = self._filter_by_name(r)
|
586 | ad696342 | Stavros Sachtouris | if self['endpoint_type']: |
587 | ad696342 | Stavros Sachtouris | r = filter_dicts_by_dict(r, dict(type=self['endpoint_type'])) |
588 | ad696342 | Stavros Sachtouris | self._print(r)
|
589 | ab863157 | Stavros Sachtouris | |
590 | ab863157 | Stavros Sachtouris | def main(self): |
591 | ab863157 | Stavros Sachtouris | super(self.__class__, self)._run() |
592 | ab863157 | Stavros Sachtouris | self._run()
|
593 | ab863157 | Stavros Sachtouris | |
594 | ab863157 | Stavros Sachtouris | |
595 | c308d73f | Stavros Sachtouris | # command project
|
596 | c308d73f | Stavros Sachtouris | |
597 | c308d73f | Stavros Sachtouris | |
598 | 6893e31c | Stavros Sachtouris | _project_specs = """{
|
599 | 6893e31c | Stavros Sachtouris | "name": name,
|
600 | 6893e31c | Stavros Sachtouris | "owner": uuid,
|
601 | 6893e31c | Stavros Sachtouris | "homepage": homepage, # optional
|
602 | 6893e31c | Stavros Sachtouris | "description": description, # optional
|
603 | 6893e31c | Stavros Sachtouris | "comments": comments, # optional
|
604 | 6893e31c | Stavros Sachtouris | "start_date": date, # optional
|
605 | 6893e31c | Stavros Sachtouris | "end_date": date,
|
606 | 6893e31c | Stavros Sachtouris | "join_policy": "auto" | "moderated" | "closed", # default: "moderated"
|
607 | 6893e31c | Stavros Sachtouris | "leave_policy": "auto" | "moderated" | "closed", # default: "auto"
|
608 | de329b4c | Stavros Sachtouris | "resources": {"cyclades.vm": {
|
609 | de329b4c | Stavros Sachtouris | "project_capacity": int or null,
|
610 | de329b4c | Stavros Sachtouris | "member_capacity": int
|
611 | de329b4c | Stavros Sachtouris | }}}
|
612 | de329b4c | Stavros Sachtouris |
|
613 | 6893e31c | Stavros Sachtouris | """
|
614 | c308d73f | Stavros Sachtouris | |
615 | c308d73f | Stavros Sachtouris | |
616 | 392d902d | Stavros Sachtouris | def apply_notification(func): |
617 | c308d73f | Stavros Sachtouris | def wrap(self, *args, **kwargs): |
618 | 392d902d | Stavros Sachtouris | r = func(self, *args, **kwargs)
|
619 | c308d73f | Stavros Sachtouris | self.writeln('Application is submitted successfully') |
620 | c308d73f | Stavros Sachtouris | return r
|
621 | c308d73f | Stavros Sachtouris | return wrap
|
622 | c308d73f | Stavros Sachtouris | |
623 | c308d73f | Stavros Sachtouris | |
624 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
625 | c308d73f | Stavros Sachtouris | class project_list(_init_synnefo_astakosclient, _optional_json): |
626 | c308d73f | Stavros Sachtouris | """List all projects"""
|
627 | c308d73f | Stavros Sachtouris | |
628 | c308d73f | Stavros Sachtouris | arguments = dict(
|
629 | 95f1b265 | Stavros Sachtouris | details=FlagArgument('Show details', ('-l', '--details')), |
630 | c308d73f | Stavros Sachtouris | name=ValueArgument('Filter by name', ('--with-name', )), |
631 | c308d73f | Stavros Sachtouris | state=ValueArgument('Filter by state', ('--with-state', )), |
632 | c308d73f | Stavros Sachtouris | owner=ValueArgument('Filter by owner', ('--with-owner', )) |
633 | c308d73f | Stavros Sachtouris | ) |
634 | c308d73f | Stavros Sachtouris | |
635 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
636 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
637 | c308d73f | Stavros Sachtouris | def _run(self): |
638 | 95f1b265 | Stavros Sachtouris | r = self.client.get_projects(
|
639 | 95f1b265 | Stavros Sachtouris | self['name'], self['state'], self['owner']) |
640 | 95f1b265 | Stavros Sachtouris | if not (self['details'] or self['output_format']): |
641 | 95f1b265 | Stavros Sachtouris | r = [dict(
|
642 | 95f1b265 | Stavros Sachtouris | id=i['id'],
|
643 | 95f1b265 | Stavros Sachtouris | name=i['name'],
|
644 | 95f1b265 | Stavros Sachtouris | description=i['description']) for i in r] |
645 | 95f1b265 | Stavros Sachtouris | self._print(r)
|
646 | c308d73f | Stavros Sachtouris | |
647 | c308d73f | Stavros Sachtouris | def main(self): |
648 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
649 | c308d73f | Stavros Sachtouris | self._run()
|
650 | c308d73f | Stavros Sachtouris | |
651 | c308d73f | Stavros Sachtouris | |
652 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
653 | c308d73f | Stavros Sachtouris | class project_info(_init_synnefo_astakosclient, _optional_json): |
654 | c308d73f | Stavros Sachtouris | """Get details for a project"""
|
655 | c308d73f | Stavros Sachtouris | |
656 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
657 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
658 | c308d73f | Stavros Sachtouris | def _run(self, project_id): |
659 | c308d73f | Stavros Sachtouris | self._print(
|
660 | c308d73f | Stavros Sachtouris | self.client.get_project(project_id), self.print_dict) |
661 | c308d73f | Stavros Sachtouris | |
662 | c308d73f | Stavros Sachtouris | def main(self, project_id): |
663 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
664 | c308d73f | Stavros Sachtouris | self._run(project_id)
|
665 | c308d73f | Stavros Sachtouris | |
666 | c308d73f | Stavros Sachtouris | |
667 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
668 | c308d73f | Stavros Sachtouris | class project_create(_init_synnefo_astakosclient, _optional_json): |
669 | 6893e31c | Stavros Sachtouris | """Apply for a new project (enter data though standard input or file path)
|
670 | de329b4c | Stavros Sachtouris |
|
671 | 6893e31c | Stavros Sachtouris | Project details must be provided as a json-formated dict from the
|
672 | 6893e31c | Stavros Sachtouris | standard input, or through a file
|
673 | c308d73f | Stavros Sachtouris | """
|
674 | c308d73f | Stavros Sachtouris | __doc__ += _project_specs |
675 | c308d73f | Stavros Sachtouris | |
676 | c308d73f | Stavros Sachtouris | arguments = dict(
|
677 | c308d73f | Stavros Sachtouris | specs_path=ValueArgument( |
678 | c308d73f | Stavros Sachtouris | 'Specification file path (content must be in json)', '--spec-file') |
679 | c308d73f | Stavros Sachtouris | ) |
680 | c308d73f | Stavros Sachtouris | |
681 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
682 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
683 | c308d73f | Stavros Sachtouris | @apply_notification
|
684 | c308d73f | Stavros Sachtouris | def _run(self): |
685 | c308d73f | Stavros Sachtouris | input_stream = open(abspath(self['specs_path'])) if ( |
686 | c308d73f | Stavros Sachtouris | self['specs_path']) else self._in |
687 | c308d73f | Stavros Sachtouris | specs = load(input_stream) |
688 | c308d73f | Stavros Sachtouris | self._print(
|
689 | c308d73f | Stavros Sachtouris | self.client.create_project(specs), self.print_dict) |
690 | c308d73f | Stavros Sachtouris | |
691 | c308d73f | Stavros Sachtouris | def main(self): |
692 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
693 | c308d73f | Stavros Sachtouris | self._run()
|
694 | c308d73f | Stavros Sachtouris | |
695 | c308d73f | Stavros Sachtouris | |
696 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
697 | c308d73f | Stavros Sachtouris | class project_modify(_init_synnefo_astakosclient, _optional_json): |
698 | c308d73f | Stavros Sachtouris | """Modify a project (input a json-dict)
|
699 | c308d73f | Stavros Sachtouris | Project details must be provided as a json-formated dict from the standard
|
700 | c308d73f | Stavros Sachtouris | input, or through a file
|
701 | c308d73f | Stavros Sachtouris | """
|
702 | c308d73f | Stavros Sachtouris | |
703 | c308d73f | Stavros Sachtouris | __doc__ += _project_specs |
704 | c308d73f | Stavros Sachtouris | |
705 | c308d73f | Stavros Sachtouris | arguments = dict(
|
706 | c308d73f | Stavros Sachtouris | specs_path=ValueArgument( |
707 | c308d73f | Stavros Sachtouris | 'Specification file path (content must be in json)', '--spec-file') |
708 | c308d73f | Stavros Sachtouris | ) |
709 | c308d73f | Stavros Sachtouris | |
710 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
711 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
712 | c308d73f | Stavros Sachtouris | @apply_notification
|
713 | c308d73f | Stavros Sachtouris | def _run(self, project_id): |
714 | c308d73f | Stavros Sachtouris | input_stream = open(abspath(self['specs_path'])) if ( |
715 | c308d73f | Stavros Sachtouris | self['specs_path']) else self._in |
716 | c308d73f | Stavros Sachtouris | specs = load(input_stream) |
717 | c308d73f | Stavros Sachtouris | self._print(
|
718 | c308d73f | Stavros Sachtouris | self.client.modify_project(project_id, specs),
|
719 | c308d73f | Stavros Sachtouris | self.print_dict)
|
720 | c308d73f | Stavros Sachtouris | |
721 | c308d73f | Stavros Sachtouris | def main(self, project_id): |
722 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
723 | c308d73f | Stavros Sachtouris | self._run(project_id)
|
724 | c308d73f | Stavros Sachtouris | |
725 | c308d73f | Stavros Sachtouris | |
726 | c308d73f | Stavros Sachtouris | class _project_action(_init_synnefo_astakosclient): |
727 | c308d73f | Stavros Sachtouris | |
728 | c308d73f | Stavros Sachtouris | action = ''
|
729 | c308d73f | Stavros Sachtouris | |
730 | 95f1b265 | Stavros Sachtouris | arguments = dict(
|
731 | 95f1b265 | Stavros Sachtouris | reason=ValueArgument('Quote a reason for this action', '--reason'), |
732 | 95f1b265 | Stavros Sachtouris | ) |
733 | 95f1b265 | Stavros Sachtouris | |
734 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
735 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
736 | c308d73f | Stavros Sachtouris | def _run(self, project_id, quote_a_reason): |
737 | c308d73f | Stavros Sachtouris | self.client.project_action(project_id, self.action, quote_a_reason) |
738 | c308d73f | Stavros Sachtouris | |
739 | 95f1b265 | Stavros Sachtouris | def main(self, project_id): |
740 | c308d73f | Stavros Sachtouris | super(_project_action, self)._run() |
741 | 95f1b265 | Stavros Sachtouris | self._run(project_id, self['reason'] or '') |
742 | c308d73f | Stavros Sachtouris | |
743 | c308d73f | Stavros Sachtouris | |
744 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
745 | c308d73f | Stavros Sachtouris | class project_suspend(_project_action): |
746 | c308d73f | Stavros Sachtouris | """Suspend a project (special privileges needed)"""
|
747 | c308d73f | Stavros Sachtouris | action = 'suspend'
|
748 | c308d73f | Stavros Sachtouris | |
749 | c308d73f | Stavros Sachtouris | |
750 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
751 | c308d73f | Stavros Sachtouris | class project_unsuspend(_project_action): |
752 | c308d73f | Stavros Sachtouris | """Resume a suspended project (special privileges needed)"""
|
753 | c308d73f | Stavros Sachtouris | action = 'unsuspend'
|
754 | c308d73f | Stavros Sachtouris | |
755 | c308d73f | Stavros Sachtouris | |
756 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
757 | c308d73f | Stavros Sachtouris | class project_terminate(_project_action): |
758 | c308d73f | Stavros Sachtouris | """Terminate a project (special privileges needed)"""
|
759 | c308d73f | Stavros Sachtouris | action = 'terminate'
|
760 | c308d73f | Stavros Sachtouris | |
761 | c308d73f | Stavros Sachtouris | |
762 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
763 | c308d73f | Stavros Sachtouris | class project_reinstate(_project_action): |
764 | c308d73f | Stavros Sachtouris | """Reinstate a terminated project (special privileges needed)"""
|
765 | c308d73f | Stavros Sachtouris | action = 'reinstate'
|
766 | c308d73f | Stavros Sachtouris | |
767 | c308d73f | Stavros Sachtouris | |
768 | 95f1b265 | Stavros Sachtouris | class _application_action(_init_synnefo_astakosclient): |
769 | c308d73f | Stavros Sachtouris | |
770 | 95f1b265 | Stavros Sachtouris | action = ''
|
771 | c308d73f | Stavros Sachtouris | |
772 | c308d73f | Stavros Sachtouris | arguments = dict(
|
773 | 95f1b265 | Stavros Sachtouris | app_id=ValueArgument('The application ID', '--app-id'), |
774 | 95f1b265 | Stavros Sachtouris | reason=ValueArgument('Quote a reason for this action', '--reason'), |
775 | c308d73f | Stavros Sachtouris | ) |
776 | 95f1b265 | Stavros Sachtouris | required = ('app_id', )
|
777 | c308d73f | Stavros Sachtouris | |
778 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
779 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
780 | 95f1b265 | Stavros Sachtouris | def _run(self, project_id, app_id, quote_a_reason): |
781 | 95f1b265 | Stavros Sachtouris | self.client.application_action(
|
782 | 95f1b265 | Stavros Sachtouris | project_id, app_id, self.action, quote_a_reason)
|
783 | c308d73f | Stavros Sachtouris | |
784 | 95f1b265 | Stavros Sachtouris | def main(self, project_id): |
785 | c308d73f | Stavros Sachtouris | super(_application_action, self)._run() |
786 | dbe345ac | Stavros Sachtouris | self._run(project_id, self['app_id'], self['reason'] or '') |
787 | c308d73f | Stavros Sachtouris | |
788 | c308d73f | Stavros Sachtouris | |
789 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
790 | 95f1b265 | Stavros Sachtouris | class project_approve(_application_action): |
791 | c308d73f | Stavros Sachtouris | """Approve an application (special privileges needed)"""
|
792 | c308d73f | Stavros Sachtouris | action = 'approve'
|
793 | c308d73f | Stavros Sachtouris | |
794 | c308d73f | Stavros Sachtouris | |
795 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
796 | 95f1b265 | Stavros Sachtouris | class project_deny(_application_action): |
797 | c308d73f | Stavros Sachtouris | """Deny an application (special privileges needed)"""
|
798 | c308d73f | Stavros Sachtouris | action = 'deny'
|
799 | c308d73f | Stavros Sachtouris | |
800 | c308d73f | Stavros Sachtouris | |
801 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
802 | 95f1b265 | Stavros Sachtouris | class project_dismiss(_application_action): |
803 | c308d73f | Stavros Sachtouris | """Dismiss your denied application"""
|
804 | c308d73f | Stavros Sachtouris | action = 'dismiss'
|
805 | c308d73f | Stavros Sachtouris | |
806 | c308d73f | Stavros Sachtouris | |
807 | c308d73f | Stavros Sachtouris | @command(project_commands)
|
808 | 95f1b265 | Stavros Sachtouris | class project_cancel(_application_action): |
809 | c308d73f | Stavros Sachtouris | """Cancel your application"""
|
810 | c308d73f | Stavros Sachtouris | action = 'cancel'
|
811 | c308d73f | Stavros Sachtouris | |
812 | c308d73f | Stavros Sachtouris | |
813 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
814 | 9d84caa4 | Stavros Sachtouris | class membership(_init_synnefo_astakosclient): |
815 | c308d73f | Stavros Sachtouris | """Project membership management commands"""
|
816 | c308d73f | Stavros Sachtouris | |
817 | c308d73f | Stavros Sachtouris | |
818 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
819 | 9d84caa4 | Stavros Sachtouris | class membership_list(_init_synnefo_astakosclient, _optional_json): |
820 | c308d73f | Stavros Sachtouris | """List all memberships"""
|
821 | c308d73f | Stavros Sachtouris | |
822 | c308d73f | Stavros Sachtouris | arguments = dict(
|
823 | c308d73f | Stavros Sachtouris | project=IntArgument('Filter by project id', '--with-project-id') |
824 | c308d73f | Stavros Sachtouris | ) |
825 | c308d73f | Stavros Sachtouris | |
826 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
827 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
828 | c308d73f | Stavros Sachtouris | def _run(self): |
829 | c308d73f | Stavros Sachtouris | self._print(self.client.get_memberships(self['project'])) |
830 | c308d73f | Stavros Sachtouris | |
831 | c308d73f | Stavros Sachtouris | def main(self): |
832 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
833 | c308d73f | Stavros Sachtouris | self._run()
|
834 | c308d73f | Stavros Sachtouris | |
835 | c308d73f | Stavros Sachtouris | |
836 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
837 | 9d84caa4 | Stavros Sachtouris | class membership_info(_init_synnefo_astakosclient, _optional_json): |
838 | c308d73f | Stavros Sachtouris | """Details on a membership"""
|
839 | c308d73f | Stavros Sachtouris | |
840 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
841 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
842 | c308d73f | Stavros Sachtouris | def _run(self, memb_id): |
843 | c308d73f | Stavros Sachtouris | self._print(
|
844 | c308d73f | Stavros Sachtouris | self.client.get_membership(memb_id), self.print_dict) |
845 | c308d73f | Stavros Sachtouris | |
846 | c308d73f | Stavros Sachtouris | def main(self, membership_id): |
847 | c308d73f | Stavros Sachtouris | super(self.__class__, self)._run() |
848 | c308d73f | Stavros Sachtouris | self._run(membership_id)
|
849 | c308d73f | Stavros Sachtouris | |
850 | c308d73f | Stavros Sachtouris | |
851 | c308d73f | Stavros Sachtouris | class _membership_action(_init_synnefo_astakosclient, _optional_json): |
852 | c308d73f | Stavros Sachtouris | |
853 | c308d73f | Stavros Sachtouris | action = ''
|
854 | c308d73f | Stavros Sachtouris | |
855 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
856 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
857 | c308d73f | Stavros Sachtouris | def _run(self, memb_id, quote_a_reason): |
858 | c308d73f | Stavros Sachtouris | self._print(self.client.membership_action( |
859 | c308d73f | Stavros Sachtouris | memb_id, self.action, quote_a_reason))
|
860 | c308d73f | Stavros Sachtouris | |
861 | c308d73f | Stavros Sachtouris | def main(self, membership_id, quote_a_reason=''): |
862 | c308d73f | Stavros Sachtouris | super(_membership_action, self)._run() |
863 | c308d73f | Stavros Sachtouris | self._run(membership_id, quote_a_reason)
|
864 | c308d73f | Stavros Sachtouris | |
865 | c308d73f | Stavros Sachtouris | |
866 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
867 | 9d84caa4 | Stavros Sachtouris | class membership_leave(_membership_action): |
868 | c308d73f | Stavros Sachtouris | """Leave a project you have membership to"""
|
869 | c308d73f | Stavros Sachtouris | action = 'leave'
|
870 | c308d73f | Stavros Sachtouris | |
871 | c308d73f | Stavros Sachtouris | |
872 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
873 | 9d84caa4 | Stavros Sachtouris | class membership_cancel(_membership_action): |
874 | c308d73f | Stavros Sachtouris | """Cancel your (probably pending) membership to a project"""
|
875 | c308d73f | Stavros Sachtouris | action = 'cancel'
|
876 | c308d73f | Stavros Sachtouris | |
877 | c308d73f | Stavros Sachtouris | |
878 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
879 | 9d84caa4 | Stavros Sachtouris | class membership_accept(_membership_action): |
880 | c308d73f | Stavros Sachtouris | """Accept a membership for a project you manage"""
|
881 | c308d73f | Stavros Sachtouris | action = 'accept'
|
882 | c308d73f | Stavros Sachtouris | |
883 | c308d73f | Stavros Sachtouris | |
884 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
885 | 9d84caa4 | Stavros Sachtouris | class membership_reject(_membership_action): |
886 | c308d73f | Stavros Sachtouris | """Reject a membership for a project you manage"""
|
887 | c308d73f | Stavros Sachtouris | action = 'reject'
|
888 | c308d73f | Stavros Sachtouris | |
889 | c308d73f | Stavros Sachtouris | |
890 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
891 | 9d84caa4 | Stavros Sachtouris | class membership_remove(_membership_action): |
892 | c308d73f | Stavros Sachtouris | """Remove a membership for a project you manage"""
|
893 | c308d73f | Stavros Sachtouris | action = 'remove'
|
894 | c308d73f | Stavros Sachtouris | |
895 | c308d73f | Stavros Sachtouris | |
896 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
897 | 9d84caa4 | Stavros Sachtouris | class membership_join(_init_synnefo_astakosclient): |
898 | c308d73f | Stavros Sachtouris | """Join a project"""
|
899 | c308d73f | Stavros Sachtouris | |
900 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
901 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
902 | c308d73f | Stavros Sachtouris | def _run(self, project_id): |
903 | c308d73f | Stavros Sachtouris | self.writeln(self.client.join_project(project_id)) |
904 | c308d73f | Stavros Sachtouris | |
905 | c308d73f | Stavros Sachtouris | def main(self, project_id): |
906 | 9d84caa4 | Stavros Sachtouris | super(membership_join, self)._run() |
907 | c308d73f | Stavros Sachtouris | self._run(project_id)
|
908 | c308d73f | Stavros Sachtouris | |
909 | c308d73f | Stavros Sachtouris | |
910 | 9d84caa4 | Stavros Sachtouris | @command(membership_commands)
|
911 | 9d84caa4 | Stavros Sachtouris | class membership_enroll(_init_synnefo_astakosclient): |
912 | c308d73f | Stavros Sachtouris | """Enroll somebody to a project you manage"""
|
913 | c308d73f | Stavros Sachtouris | |
914 | c308d73f | Stavros Sachtouris | @errors.generic.all
|
915 | c308d73f | Stavros Sachtouris | @errors.user.astakosclient
|
916 | c308d73f | Stavros Sachtouris | def _run(self, project_id, email): |
917 | c308d73f | Stavros Sachtouris | self.writeln(self.client.enroll_member(project_id, email)) |
918 | c308d73f | Stavros Sachtouris | |
919 | c308d73f | Stavros Sachtouris | def main(self, project_id, email): |
920 | f59635ab | Stavros Sachtouris | super(membership_enroll, self)._run() |
921 | c308d73f | Stavros Sachtouris | self._run(project_id, email) |