Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / astakos.py @ 73bf1f64

History | View | Annotate | Download (28.9 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 5033585e Stavros Sachtouris
from kamaki.clients.astakos import SynnefoAstakosClient
39 b4f69041 Stavros Sachtouris
from kamaki.cli.commands import (
40 98c02f22 Stavros Sachtouris
    _command_init, errors, _optional_json, addLogSettings)
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 e8d3b957 Stavros Sachtouris
from kamaki.cli.utils import format_size
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 e8d3b957 Stavros Sachtouris
                self.client = SynnefoAstakosClient(
104 e8d3b957 Stavros Sachtouris
                    auth_url=base_url, token=token)
105 b4f69041 Stavros Sachtouris
                return
106 b4f69041 Stavros Sachtouris
        else:
107 b4f69041 Stavros Sachtouris
            self.cloud = 'default'
108 e8d3b957 Stavros Sachtouris
        if getattr(self, 'auth_base', None):
109 5033585e Stavros Sachtouris
            self.client = self.auth_base.get_client()
110 b4f69041 Stavros Sachtouris
            return
111 b4f69041 Stavros Sachtouris
        raise CLIBaseUrlError(service='astakos')
112 7493ccb6 Stavros Sachtouris
113 436bd910 Stavros Sachtouris
    def main(self):
114 5fdccdec Stavros Sachtouris
        self._run()
115 436bd910 Stavros Sachtouris
116 234954d1 Stavros Sachtouris
117 e8d3b957 Stavros Sachtouris
@command(user_commands)
118 fa7d08b6 Stavros Sachtouris
class user_authenticate(_init_synnefo_astakosclient, _optional_json):
119 fa7d08b6 Stavros Sachtouris
    """Authenticate a user and get all authentication information"""
120 7493ccb6 Stavros Sachtouris
121 a03ade9e Stavros Sachtouris
    @errors.generic.all
122 4018326d Stavros Sachtouris
    @errors.user.authenticate
123 e8d3b957 Stavros Sachtouris
    @errors.user.astakosclient
124 5033585e Stavros Sachtouris
    @with_temp_token
125 5033585e Stavros Sachtouris
    def _run(self):
126 fa7d08b6 Stavros Sachtouris
        self._print(self.client.authenticate(), self.print_dict)
127 3185cd6d Stavros Sachtouris
128 e8d3b957 Stavros Sachtouris
    def main(self, token=None):
129 9a8861d1 Stavros Sachtouris
        super(self.__class__, self)._run()
130 5033585e Stavros Sachtouris
        self._run(token=token)
131 9a8861d1 Stavros Sachtouris
132 9a8861d1 Stavros Sachtouris
133 e8d3b957 Stavros Sachtouris
@command(user_commands)
134 5033585e Stavros Sachtouris
class user_uuid2name(_init_synnefo_astakosclient, _optional_json):
135 5033585e Stavros Sachtouris
    """Get user name(s) from uuid(s)"""
136 9a8861d1 Stavros Sachtouris
137 9a8861d1 Stavros Sachtouris
    @errors.generic.all
138 e8d3b957 Stavros Sachtouris
    @errors.user.astakosclient
139 e8d3b957 Stavros Sachtouris
    def _run(self, uuids):
140 e8d3b957 Stavros Sachtouris
        r = self.client.get_usernames(uuids)
141 e8d3b957 Stavros Sachtouris
        self._print(r, self.print_dict)
142 e8d3b957 Stavros Sachtouris
        unresolved = set(uuids).difference(r)
143 e8d3b957 Stavros Sachtouris
        if unresolved:
144 e8d3b957 Stavros Sachtouris
            self.error('Unresolved uuids: %s' % ', '.join(unresolved))
145 e8d3b957 Stavros Sachtouris
146 e8d3b957 Stavros Sachtouris
    def main(self, uuid, *more_uuids):
147 9a8861d1 Stavros Sachtouris
        super(self.__class__, self)._run()
148 e8d3b957 Stavros Sachtouris
        self._run(uuids=((uuid, ) + more_uuids))
149 b91111b9 Stavros Sachtouris
150 b91111b9 Stavros Sachtouris
151 e8d3b957 Stavros Sachtouris
@command(user_commands)
152 5033585e Stavros Sachtouris
class user_name2uuid(_init_synnefo_astakosclient, _optional_json):
153 5033585e Stavros Sachtouris
    """Get user uuid(s) from name(s)"""
154 b91111b9 Stavros Sachtouris
155 b91111b9 Stavros Sachtouris
    @errors.generic.all
156 e8d3b957 Stavros Sachtouris
    @errors.user.astakosclient
157 e8d3b957 Stavros Sachtouris
    def _run(self, usernames):
158 e8d3b957 Stavros Sachtouris
        r = self.client.get_uuids(usernames)
159 e8d3b957 Stavros Sachtouris
        self._print(r, self.print_dict)
160 e8d3b957 Stavros Sachtouris
        unresolved = set(usernames).difference(r)
161 e8d3b957 Stavros Sachtouris
        if unresolved:
162 e8d3b957 Stavros Sachtouris
            self.error('Unresolved usernames: %s' % ', '.join(unresolved))
163 e8d3b957 Stavros Sachtouris
164 e8d3b957 Stavros Sachtouris
    def main(self, username, *more_usernames):
165 b91111b9 Stavros Sachtouris
        super(self.__class__, self)._run()
166 e8d3b957 Stavros Sachtouris
        self._run(usernames=((username, ) + more_usernames))
167 e8d3b957 Stavros Sachtouris
168 e8d3b957 Stavros Sachtouris
169 6893e31c Stavros Sachtouris
class _quota(_init_synnefo_astakosclient, _optional_json):
170 e8d3b957 Stavros Sachtouris
171 e8d3b957 Stavros Sachtouris
    _to_format = set(['cyclades.disk', 'pithos.diskspace', 'cyclades.ram'])
172 fe4940bc Stavros Sachtouris
173 e8d3b957 Stavros Sachtouris
    arguments = dict(
174 e8d3b957 Stavros Sachtouris
        bytes=FlagArgument('Show data size in bytes', '--bytes')
175 e8d3b957 Stavros Sachtouris
    )
176 fe4940bc Stavros Sachtouris
177 e8d3b957 Stavros Sachtouris
    def _print_quotas(self, quotas, *args, **kwargs):
178 e8d3b957 Stavros Sachtouris
        if not self['bytes']:
179 e8d3b957 Stavros Sachtouris
            for category in quotas.values():
180 e8d3b957 Stavros Sachtouris
                for service in self._to_format.intersection(category):
181 e8d3b957 Stavros Sachtouris
                    for attr, v in category[service].items():
182 e8d3b957 Stavros Sachtouris
                        category[service][attr] = format_size(v)
183 e8d3b957 Stavros Sachtouris
        self.print_dict(quotas, *args, **kwargs)
184 fe4940bc Stavros Sachtouris
185 6893e31c Stavros Sachtouris
186 6893e31c Stavros Sachtouris
@command(quota_commands)
187 6893e31c Stavros Sachtouris
class quota_info(_quota):
188 6893e31c Stavros Sachtouris
    """Get quota for a service (cyclades, pithos, astakos)"""
189 6893e31c Stavros Sachtouris
190 6893e31c Stavros Sachtouris
    @errors.generic.all
191 6893e31c Stavros Sachtouris
    @errors.user.astakosclient
192 6893e31c Stavros Sachtouris
    def _run(self, service):
193 6893e31c Stavros Sachtouris
        r = dict()
194 6893e31c Stavros Sachtouris
        for k, v in self.client.get_quotas()['system'].items():
195 6893e31c Stavros Sachtouris
            if (k.startswith(service)):
196 6893e31c Stavros Sachtouris
                r[k] = v
197 6893e31c Stavros Sachtouris
        self._print({'%s*' % service: r}, self._print_quotas)
198 6893e31c Stavros Sachtouris
199 6893e31c Stavros Sachtouris
    def main(self, service):
200 6893e31c Stavros Sachtouris
        super(self.__class__, self)._run()
201 6893e31c Stavros Sachtouris
        self._run(service)
202 6893e31c Stavros Sachtouris
203 6893e31c Stavros Sachtouris
204 6893e31c Stavros Sachtouris
@command(quota_commands)
205 6893e31c Stavros Sachtouris
class quota_list(_quota):
206 6893e31c Stavros Sachtouris
    """Get user quotas"""
207 6893e31c Stavros Sachtouris
208 fe4940bc Stavros Sachtouris
    @errors.generic.all
209 e8d3b957 Stavros Sachtouris
    @errors.user.astakosclient
210 e8d3b957 Stavros Sachtouris
    def _run(self):
211 e8d3b957 Stavros Sachtouris
        self._print(self.client.get_quotas(), self._print_quotas)
212 fe4940bc Stavros Sachtouris
213 e8d3b957 Stavros Sachtouris
    def main(self):
214 fe4940bc Stavros Sachtouris
        super(self.__class__, self)._run()
215 e8d3b957 Stavros Sachtouris
        self._run()
216 c308d73f Stavros Sachtouris
217 c308d73f Stavros Sachtouris
218 fa7d08b6 Stavros Sachtouris
#  command user session
219 fa7d08b6 Stavros Sachtouris
220 fa7d08b6 Stavros Sachtouris
221 fa7d08b6 Stavros Sachtouris
@command(user_commands)
222 25f9a991 Stavros Sachtouris
class user_info(_init_synnefo_astakosclient, _optional_json):
223 fa7d08b6 Stavros Sachtouris
    """Get info for (current) session user"""
224 fa7d08b6 Stavros Sachtouris
225 fa7d08b6 Stavros Sachtouris
    arguments = dict(
226 fa7d08b6 Stavros Sachtouris
        uuid=ValueArgument('Query user with uuid', '--uuid'),
227 fa7d08b6 Stavros Sachtouris
        name=ValueArgument('Query user with username/email', '--username')
228 fa7d08b6 Stavros Sachtouris
    )
229 fa7d08b6 Stavros Sachtouris
230 fa7d08b6 Stavros Sachtouris
    @errors.generic.all
231 fa7d08b6 Stavros Sachtouris
    @errors.user.astakosclient
232 fa7d08b6 Stavros Sachtouris
    def _run(self):
233 fa7d08b6 Stavros Sachtouris
        if self['uuid'] and self['name']:
234 fa7d08b6 Stavros Sachtouris
            raise CLISyntaxError(
235 fa7d08b6 Stavros Sachtouris
                'Arguments uuid and username are mutually exclusive',
236 fa7d08b6 Stavros Sachtouris
                details=['Use either uuid OR username OR none, not both'])
237 fa7d08b6 Stavros Sachtouris
        uuid = self['uuid'] or (self._username2uuid(self['name']) if (
238 fa7d08b6 Stavros Sachtouris
            self['name']) else None)
239 fa7d08b6 Stavros Sachtouris
        try:
240 fa7d08b6 Stavros Sachtouris
            token = self.auth_base.get_token(uuid) if uuid else None
241 fa7d08b6 Stavros Sachtouris
        except KeyError:
242 fa7d08b6 Stavros Sachtouris
            msg = ('id %s' % self['uuid']) if (
243 fa7d08b6 Stavros Sachtouris
                self['uuid']) else 'username %s' % self['name']
244 fa7d08b6 Stavros Sachtouris
            raise CLIError(
245 fa7d08b6 Stavros Sachtouris
                'No user with %s in the cached session list' % msg, details=[
246 fa7d08b6 Stavros Sachtouris
                    'To see all cached session users',
247 25f9a991 Stavros Sachtouris
                    '  /user list',
248 fa7d08b6 Stavros Sachtouris
                    'To authenticate and add a new user in the session list',
249 25f9a991 Stavros Sachtouris
                    '  /user add <new token>'])
250 fa7d08b6 Stavros Sachtouris
        self._print(self.auth_base.user_info(token), self.print_dict)
251 fa7d08b6 Stavros Sachtouris
252 fa7d08b6 Stavros Sachtouris
253 fa7d08b6 Stavros Sachtouris
@command(user_commands)
254 25f9a991 Stavros Sachtouris
class user_add(_init_synnefo_astakosclient, _optional_json):
255 25f9a991 Stavros Sachtouris
    """Authenticate a user by token and add to kamaki session (cache)"""
256 fa7d08b6 Stavros Sachtouris
257 fa7d08b6 Stavros Sachtouris
    @errors.generic.all
258 fa7d08b6 Stavros Sachtouris
    @errors.user.astakosclient
259 fa7d08b6 Stavros Sachtouris
    def _run(self, token=None):
260 fa7d08b6 Stavros Sachtouris
        ask = token and token not in self.auth_base._uuids
261 fa7d08b6 Stavros Sachtouris
        self._print(self.auth_base.authenticate(token), self.print_dict)
262 fa7d08b6 Stavros Sachtouris
        if ask and self.ask_user(
263 fa7d08b6 Stavros Sachtouris
                'Token is temporarily stored in memory. If it is stored in'
264 fa7d08b6 Stavros Sachtouris
                ' kamaki configuration file, it will be available in later'
265 fa7d08b6 Stavros Sachtouris
                ' sessions. Do you want to permanently store this token?'):
266 fa7d08b6 Stavros Sachtouris
            tokens = self.auth_base._uuids.keys()
267 fa7d08b6 Stavros Sachtouris
            tokens.remove(self.auth_base.token)
268 fa7d08b6 Stavros Sachtouris
            self['config'].set_cloud(
269 fa7d08b6 Stavros Sachtouris
                self.cloud, 'token', ' '.join([self.auth_base.token] + tokens))
270 fa7d08b6 Stavros Sachtouris
            self['config'].write()
271 fa7d08b6 Stavros Sachtouris
272 fa7d08b6 Stavros Sachtouris
    def main(self, new_token=None):
273 fa7d08b6 Stavros Sachtouris
        super(self.__class__, self)._run()
274 fa7d08b6 Stavros Sachtouris
        self._run(token=new_token)
275 fa7d08b6 Stavros Sachtouris
276 fa7d08b6 Stavros Sachtouris
277 fa7d08b6 Stavros Sachtouris
@command(user_commands)
278 25f9a991 Stavros Sachtouris
class user_list(_init_synnefo_astakosclient, _optional_json):
279 25f9a991 Stavros Sachtouris
    """List (cached) session users"""
280 fa7d08b6 Stavros Sachtouris
281 fa7d08b6 Stavros Sachtouris
    arguments = dict(
282 fa7d08b6 Stavros Sachtouris
        detail=FlagArgument('Detailed listing', ('-l', '--detail'))
283 fa7d08b6 Stavros Sachtouris
    )
284 fa7d08b6 Stavros Sachtouris
285 fa7d08b6 Stavros Sachtouris
    @errors.generic.all
286 fa7d08b6 Stavros Sachtouris
    @errors.user.astakosclient
287 fa7d08b6 Stavros Sachtouris
    def _run(self):
288 fa7d08b6 Stavros Sachtouris
        self._print([u if self['detail'] else (dict(
289 fa7d08b6 Stavros Sachtouris
            id=u['id'], name=u['name'])) for u in self.auth_base.list_users()])
290 fa7d08b6 Stavros Sachtouris
291 fa7d08b6 Stavros Sachtouris
    def main(self):
292 fa7d08b6 Stavros Sachtouris
        super(self.__class__, self)._run()
293 fa7d08b6 Stavros Sachtouris
        self._run()
294 fa7d08b6 Stavros Sachtouris
295 fa7d08b6 Stavros Sachtouris
296 fa7d08b6 Stavros Sachtouris
@command(user_commands)
297 25f9a991 Stavros Sachtouris
class user_select(_init_synnefo_astakosclient):
298 25f9a991 Stavros Sachtouris
    """Select a user from the (cached) list as the current session user"""
299 fa7d08b6 Stavros Sachtouris
300 fa7d08b6 Stavros Sachtouris
    @errors.generic.all
301 fa7d08b6 Stavros Sachtouris
    @errors.user.astakosclient
302 fa7d08b6 Stavros Sachtouris
    def _run(self, uuid):
303 fa7d08b6 Stavros Sachtouris
        try:
304 fa7d08b6 Stavros Sachtouris
            first_token = self.auth_base.get_token(uuid)
305 fa7d08b6 Stavros Sachtouris
        except KeyError:
306 fa7d08b6 Stavros Sachtouris
            raise CLIError(
307 fa7d08b6 Stavros Sachtouris
                'No user with uuid %s in the cached session list' % uuid,
308 fa7d08b6 Stavros Sachtouris
                details=[
309 fa7d08b6 Stavros Sachtouris
                    'To see all cached session users',
310 25f9a991 Stavros Sachtouris
                    '  /user list',
311 fa7d08b6 Stavros Sachtouris
                    'To authenticate and add a new user in the session list',
312 25f9a991 Stavros Sachtouris
                    '  /user add <new token>'])
313 fa7d08b6 Stavros Sachtouris
        if self.auth_base.token != first_token:
314 fa7d08b6 Stavros Sachtouris
            self.auth_base.token = first_token
315 fa7d08b6 Stavros Sachtouris
            msg = 'User with id %s is now the current session user.\n' % uuid
316 fa7d08b6 Stavros Sachtouris
            msg += 'Do you want future sessions to also start with this user?'
317 fa7d08b6 Stavros Sachtouris
            if self.ask_user(msg):
318 fa7d08b6 Stavros Sachtouris
                tokens = self.auth_base._uuids.keys()
319 fa7d08b6 Stavros Sachtouris
                tokens.remove(self.auth_base.token)
320 fa7d08b6 Stavros Sachtouris
                tokens.insert(0, self.auth_base.token)
321 fa7d08b6 Stavros Sachtouris
                self['config'].set_cloud(
322 fa7d08b6 Stavros Sachtouris
                    self.cloud, 'token',  ' '.join(tokens))
323 fa7d08b6 Stavros Sachtouris
                self['config'].write()
324 fa7d08b6 Stavros Sachtouris
                self.error('User is selected for next sessions')
325 fa7d08b6 Stavros Sachtouris
            else:
326 fa7d08b6 Stavros Sachtouris
                self.error('User is not permanently selected')
327 fa7d08b6 Stavros Sachtouris
        else:
328 fa7d08b6 Stavros Sachtouris
            self.error('User was already the selected session user')
329 fa7d08b6 Stavros Sachtouris
330 fa7d08b6 Stavros Sachtouris
    def main(self, user_uuid):
331 fa7d08b6 Stavros Sachtouris
        super(self.__class__, self)._run()
332 fa7d08b6 Stavros Sachtouris
        self._run(uuid=user_uuid)
333 fa7d08b6 Stavros Sachtouris
334 fa7d08b6 Stavros Sachtouris
335 fa7d08b6 Stavros Sachtouris
@command(user_commands)
336 25f9a991 Stavros Sachtouris
class user_delete(_init_synnefo_astakosclient):
337 25f9a991 Stavros Sachtouris
    """Delete a user (token) from the (cached) list of session users"""
338 fa7d08b6 Stavros Sachtouris
339 fa7d08b6 Stavros Sachtouris
    @errors.generic.all
340 fa7d08b6 Stavros Sachtouris
    @errors.user.astakosclient
341 fa7d08b6 Stavros Sachtouris
    def _run(self, uuid):
342 fa7d08b6 Stavros Sachtouris
        if uuid == self.auth_base.user_term('id'):
343 fa7d08b6 Stavros Sachtouris
            raise CLIError('Cannot remove current session user', details=[
344 fa7d08b6 Stavros Sachtouris
                'To see all cached session users',
345 25f9a991 Stavros Sachtouris
                '  /user list',
346 fa7d08b6 Stavros Sachtouris
                'To see current session user',
347 25f9a991 Stavros Sachtouris
                '  /user info',
348 fa7d08b6 Stavros Sachtouris
                'To select a different session user',
349 25f9a991 Stavros Sachtouris
                '  /user select <user uuid>'])
350 fa7d08b6 Stavros Sachtouris
        try:
351 fa7d08b6 Stavros Sachtouris
            self.auth_base.remove_user(uuid)
352 fa7d08b6 Stavros Sachtouris
        except KeyError:
353 fa7d08b6 Stavros Sachtouris
            raise CLIError('No user with uuid %s in session list' % uuid,
354 fa7d08b6 Stavros Sachtouris
                details=[
355 fa7d08b6 Stavros Sachtouris
                    'To see all cached session users',
356 25f9a991 Stavros Sachtouris
                    '  /user list',
357 fa7d08b6 Stavros Sachtouris
                    'To authenticate and add a new user in the session list',
358 25f9a991 Stavros Sachtouris
                    '  /user add <new token>'])
359 fa7d08b6 Stavros Sachtouris
        if self.ask_user(
360 fa7d08b6 Stavros Sachtouris
                'User is removed from current session, but will be restored in'
361 fa7d08b6 Stavros Sachtouris
                ' the next session. Remove the user from future sessions?'):
362 fa7d08b6 Stavros Sachtouris
            self['config'].set_cloud(
363 fa7d08b6 Stavros Sachtouris
                self.cloud, 'token', ' '.join(self.auth_base._uuids.keys()))
364 fa7d08b6 Stavros Sachtouris
            self['config'].write()
365 fa7d08b6 Stavros Sachtouris
366 fa7d08b6 Stavros Sachtouris
    def main(self, user_uuid):
367 fa7d08b6 Stavros Sachtouris
        super(self.__class__, self)._run()
368 fa7d08b6 Stavros Sachtouris
        self._run(uuid=user_uuid)
369 fa7d08b6 Stavros Sachtouris
370 fa7d08b6 Stavros Sachtouris
371 ab863157 Stavros Sachtouris
#  command admin
372 ab863157 Stavros Sachtouris
373 25f9a991 Stavros Sachtouris
@command(service_commands)
374 25f9a991 Stavros Sachtouris
class service_list(_init_synnefo_astakosclient, _optional_json):
375 ab863157 Stavros Sachtouris
    """List available services"""
376 ab863157 Stavros Sachtouris
377 ab863157 Stavros Sachtouris
    @errors.generic.all
378 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
379 ab863157 Stavros Sachtouris
    def _run(self):
380 ab863157 Stavros Sachtouris
        self._print(self.client.get_services())
381 ab863157 Stavros Sachtouris
382 ab863157 Stavros Sachtouris
    def main(self):
383 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
384 ab863157 Stavros Sachtouris
        self._run()
385 ab863157 Stavros Sachtouris
386 ab863157 Stavros Sachtouris
387 25f9a991 Stavros Sachtouris
@command(service_commands)
388 25f9a991 Stavros Sachtouris
class service_uuid2username(_init_synnefo_astakosclient, _optional_json):
389 ab863157 Stavros Sachtouris
    """Get service username(s) from uuid(s)"""
390 ab863157 Stavros Sachtouris
391 ab863157 Stavros Sachtouris
    @errors.generic.all
392 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
393 ab863157 Stavros Sachtouris
    @with_temp_token
394 ab863157 Stavros Sachtouris
    def _run(self, uuids):
395 ab863157 Stavros Sachtouris
        if 1 == len(uuids):
396 ab863157 Stavros Sachtouris
            self._print(self.client.service_get_username(uuids[0]))
397 ab863157 Stavros Sachtouris
        else:
398 ab863157 Stavros Sachtouris
            self._print(
399 ab863157 Stavros Sachtouris
                self.client.service_get_usernames(uuids),
400 ab863157 Stavros Sachtouris
                self.print_dict)
401 ab863157 Stavros Sachtouris
402 ab863157 Stavros Sachtouris
    def main(self, service_token, uuid, *more_uuids):
403 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
404 ab863157 Stavros Sachtouris
        self._run([uuid] + list(more_uuids), token=service_token)
405 ab863157 Stavros Sachtouris
406 ab863157 Stavros Sachtouris
407 25f9a991 Stavros Sachtouris
@command(service_commands)
408 25f9a991 Stavros Sachtouris
class service_username2uuid(_init_synnefo_astakosclient, _optional_json):
409 ab863157 Stavros Sachtouris
    """Get service uuid(s) from username(s)"""
410 ab863157 Stavros Sachtouris
411 ab863157 Stavros Sachtouris
    @errors.generic.all
412 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
413 ab863157 Stavros Sachtouris
    @with_temp_token
414 ab863157 Stavros Sachtouris
    def _run(self, usernames):
415 ab863157 Stavros Sachtouris
        if 1 == len(usernames):
416 ab863157 Stavros Sachtouris
            self._print(self.client.service_get_uuid(usernames[0]))
417 ab863157 Stavros Sachtouris
        else:
418 ab863157 Stavros Sachtouris
            self._print(
419 ab863157 Stavros Sachtouris
                self.client.service_get_uuids(usernames),
420 ab863157 Stavros Sachtouris
                self.print_dict)
421 ab863157 Stavros Sachtouris
422 ab863157 Stavros Sachtouris
    def main(self, service_token, usernames, *more_usernames):
423 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
424 ab863157 Stavros Sachtouris
        self._run([usernames] + list(more_usernames), token=service_token)
425 ab863157 Stavros Sachtouris
426 ab863157 Stavros Sachtouris
427 25f9a991 Stavros Sachtouris
@command(service_commands)
428 25f9a991 Stavros Sachtouris
class service_quotas(_init_synnefo_astakosclient, _optional_json):
429 ab863157 Stavros Sachtouris
    """Get service quotas"""
430 ab863157 Stavros Sachtouris
431 ab863157 Stavros Sachtouris
    arguments = dict(
432 ab863157 Stavros Sachtouris
        uuid=ValueArgument('A user uuid to get quotas for', '--uuid')
433 ab863157 Stavros Sachtouris
    )
434 ab863157 Stavros Sachtouris
435 ab863157 Stavros Sachtouris
    @errors.generic.all
436 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
437 ab863157 Stavros Sachtouris
    @with_temp_token
438 ab863157 Stavros Sachtouris
    def _run(self):
439 ab863157 Stavros Sachtouris
        self._print(self.client.service_get_quotas(self['uuid']))
440 ab863157 Stavros Sachtouris
441 ab863157 Stavros Sachtouris
    def main(self, service_token):
442 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
443 ab863157 Stavros Sachtouris
        self._run(token=service_token)
444 ab863157 Stavros Sachtouris
445 ab863157 Stavros Sachtouris
446 25f9a991 Stavros Sachtouris
@command(commission_commands)
447 25f9a991 Stavros Sachtouris
class commission_pending(_init_synnefo_astakosclient, _optional_json):
448 ab863157 Stavros Sachtouris
    """List pending commissions (special privileges required)"""
449 ab863157 Stavros Sachtouris
450 ab863157 Stavros Sachtouris
    @errors.generic.all
451 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
452 ab863157 Stavros Sachtouris
    def _run(self):
453 ab863157 Stavros Sachtouris
        self._print(self.client.get_pending_commissions())
454 ab863157 Stavros Sachtouris
455 ab863157 Stavros Sachtouris
    def main(self):
456 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
457 ab863157 Stavros Sachtouris
        self._run()
458 ab863157 Stavros Sachtouris
459 ab863157 Stavros Sachtouris
460 25f9a991 Stavros Sachtouris
@command(commission_commands)
461 25f9a991 Stavros Sachtouris
class commission_info(_init_synnefo_astakosclient, _optional_json):
462 ab863157 Stavros Sachtouris
    """Get commission info (special privileges required)"""
463 ab863157 Stavros Sachtouris
464 ab863157 Stavros Sachtouris
    @errors.generic.all
465 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
466 ab863157 Stavros Sachtouris
    def _run(self, commission_id):
467 ab863157 Stavros Sachtouris
        commission_id = int(commission_id)
468 ab863157 Stavros Sachtouris
        self._print(
469 ab863157 Stavros Sachtouris
            self.client.get_commission_info(commission_id), self.print_dict)
470 ab863157 Stavros Sachtouris
471 ab863157 Stavros Sachtouris
    def main(self, commission_id):
472 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
473 ab863157 Stavros Sachtouris
        self._run(commission_id)
474 ab863157 Stavros Sachtouris
475 ab863157 Stavros Sachtouris
476 25f9a991 Stavros Sachtouris
@command(commission_commands)
477 25f9a991 Stavros Sachtouris
class commission_accept(_init_synnefo_astakosclient):
478 ab863157 Stavros Sachtouris
    """Accept a pending commission  (special privileges required)"""
479 ab863157 Stavros Sachtouris
480 ab863157 Stavros Sachtouris
    @errors.generic.all
481 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
482 ab863157 Stavros Sachtouris
    def _run(self, commission_id):
483 ab863157 Stavros Sachtouris
        commission_id = int(commission_id)
484 ab863157 Stavros Sachtouris
        self.client.accept_commission(commission_id)
485 ab863157 Stavros Sachtouris
486 ab863157 Stavros Sachtouris
    def main(self, commission_id):
487 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
488 ab863157 Stavros Sachtouris
        self._run(commission_id)
489 ab863157 Stavros Sachtouris
490 ab863157 Stavros Sachtouris
491 25f9a991 Stavros Sachtouris
@command(commission_commands)
492 25f9a991 Stavros Sachtouris
class commission_reject(_init_synnefo_astakosclient):
493 ab863157 Stavros Sachtouris
    """Reject a pending commission (special privileges required)"""
494 ab863157 Stavros Sachtouris
495 ab863157 Stavros Sachtouris
    @errors.generic.all
496 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
497 ab863157 Stavros Sachtouris
    def _run(self, commission_id):
498 ab863157 Stavros Sachtouris
        commission_id = int(commission_id)
499 ab863157 Stavros Sachtouris
        self.client.reject_commission(commission_id)
500 ab863157 Stavros Sachtouris
501 ab863157 Stavros Sachtouris
    def main(self, commission_id):
502 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
503 ab863157 Stavros Sachtouris
        self._run(commission_id)
504 ab863157 Stavros Sachtouris
505 ab863157 Stavros Sachtouris
506 25f9a991 Stavros Sachtouris
@command(commission_commands)
507 25f9a991 Stavros Sachtouris
class commission_resolve(_init_synnefo_astakosclient, _optional_json):
508 ab863157 Stavros Sachtouris
    """Resolve multiple commissions (special privileges required)"""
509 ab863157 Stavros Sachtouris
510 ab863157 Stavros Sachtouris
    arguments = dict(
511 ab863157 Stavros Sachtouris
        accept=CommaSeparatedListArgument(
512 ab863157 Stavros Sachtouris
            'commission ids to accept (e.g., --accept=11,12,13,...',
513 ab863157 Stavros Sachtouris
            '--accept'),
514 ab863157 Stavros Sachtouris
        reject=CommaSeparatedListArgument(
515 ab863157 Stavros Sachtouris
            'commission ids to reject (e.g., --reject=11,12,13,...',
516 ab863157 Stavros Sachtouris
            '--reject')
517 ab863157 Stavros Sachtouris
    )
518 ab863157 Stavros Sachtouris
519 ab863157 Stavros Sachtouris
    @errors.generic.all
520 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
521 ab863157 Stavros Sachtouris
    def _run(self):
522 ab863157 Stavros Sachtouris
        self.writeln('accepted ', self['accept'])
523 ab863157 Stavros Sachtouris
        self.writeln('rejected ', self['reject'])
524 ab863157 Stavros Sachtouris
        self._print(
525 ab863157 Stavros Sachtouris
            self.client.resolve_commissions(self['accept'], self['reject']),
526 ab863157 Stavros Sachtouris
            self.print_dict)
527 ab863157 Stavros Sachtouris
528 ab863157 Stavros Sachtouris
    def main(self):
529 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
530 ab863157 Stavros Sachtouris
        self._run()
531 ab863157 Stavros Sachtouris
532 ab863157 Stavros Sachtouris
533 25f9a991 Stavros Sachtouris
@command(commission_commands)
534 25f9a991 Stavros Sachtouris
class commission_issue(_init_synnefo_astakosclient, _optional_json):
535 ab863157 Stavros Sachtouris
    """Issue commissions as a json string (special privileges required)
536 ab863157 Stavros Sachtouris
    Parameters:
537 ab863157 Stavros Sachtouris
    holder      -- user's id (string)
538 ab863157 Stavros Sachtouris
    source      -- commission's source (ex system) (string)
539 ab863157 Stavros Sachtouris
    provisions  -- resources with their quantity (json-dict from string to int)
540 ab863157 Stavros Sachtouris
    name        -- description of the commission (string)
541 ab863157 Stavros Sachtouris
    """
542 ab863157 Stavros Sachtouris
543 ab863157 Stavros Sachtouris
    arguments = dict(
544 ab863157 Stavros Sachtouris
        force=FlagArgument('Force commission', '--force'),
545 ab863157 Stavros Sachtouris
        accept=FlagArgument('Do not wait for verification', '--accept')
546 ab863157 Stavros Sachtouris
    )
547 ab863157 Stavros Sachtouris
548 ab863157 Stavros Sachtouris
    @errors.generic.all
549 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
550 ab863157 Stavros Sachtouris
    def _run(self, holder, source, provisions, name=''):
551 ab863157 Stavros Sachtouris
        provisions = loads(provisions)
552 ab863157 Stavros Sachtouris
        self._print(self.client.issue_one_commission(
553 ab863157 Stavros Sachtouris
            holder, source, provisions, name,
554 ab863157 Stavros Sachtouris
            self['force'], self['accept']))
555 ab863157 Stavros Sachtouris
556 ab863157 Stavros Sachtouris
    def main(self, user_uuid, source, provisions_file, name=''):
557 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
558 ab863157 Stavros Sachtouris
        self._run(user_uuid, source, provisions_file, name)
559 ab863157 Stavros Sachtouris
560 ab863157 Stavros Sachtouris
561 25f9a991 Stavros Sachtouris
@command(resource_commands)
562 25f9a991 Stavros Sachtouris
class resource_list(_init_synnefo_astakosclient, _optional_json):
563 ab863157 Stavros Sachtouris
    """List user resources"""
564 ab863157 Stavros Sachtouris
565 ab863157 Stavros Sachtouris
    @errors.generic.all
566 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
567 ab863157 Stavros Sachtouris
    def _run(self):
568 ab863157 Stavros Sachtouris
        self._print(self.client.get_resources(), self.print_dict)
569 ab863157 Stavros Sachtouris
570 ab863157 Stavros Sachtouris
    def main(self):
571 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
572 ab863157 Stavros Sachtouris
        self._run()
573 ab863157 Stavros Sachtouris
574 ab863157 Stavros Sachtouris
575 25f9a991 Stavros Sachtouris
@command(endpoint_commands)
576 25f9a991 Stavros Sachtouris
class endpoint_list(_init_synnefo_astakosclient, _optional_json):
577 ab863157 Stavros Sachtouris
    """Get endpoints service endpoints"""
578 ab863157 Stavros Sachtouris
579 ab863157 Stavros Sachtouris
    @errors.generic.all
580 ab863157 Stavros Sachtouris
    @errors.user.astakosclient
581 ab863157 Stavros Sachtouris
    def _run(self):
582 fa7d08b6 Stavros Sachtouris
        self._print(self.client.get_endpoints(), self.print_dict)
583 ab863157 Stavros Sachtouris
584 ab863157 Stavros Sachtouris
    def main(self):
585 ab863157 Stavros Sachtouris
        super(self.__class__, self)._run()
586 ab863157 Stavros Sachtouris
        self._run()
587 ab863157 Stavros Sachtouris
588 ab863157 Stavros Sachtouris
589 c308d73f Stavros Sachtouris
#  command project
590 c308d73f Stavros Sachtouris
591 c308d73f Stavros Sachtouris
592 6893e31c Stavros Sachtouris
_project_specs = """{
593 6893e31c Stavros Sachtouris
    "name": name,
594 6893e31c Stavros Sachtouris
    "owner": uuid,
595 6893e31c Stavros Sachtouris
    "homepage": homepage,         # optional
596 6893e31c Stavros Sachtouris
    "description": description,   # optional
597 6893e31c Stavros Sachtouris
    "comments": comments,         # optional
598 6893e31c Stavros Sachtouris
    "start_date": date,           # optional
599 6893e31c Stavros Sachtouris
    "end_date": date,
600 6893e31c Stavros Sachtouris
    "join_policy": "auto" | "moderated" | "closed",  # default: "moderated"
601 6893e31c Stavros Sachtouris
    "leave_policy": "auto" | "moderated" | "closed", # default: "auto"
602 de329b4c Stavros Sachtouris
    "resources": {"cyclades.vm": {
603 de329b4c Stavros Sachtouris
    "project_capacity": int or null,
604 de329b4c Stavros Sachtouris
    "member_capacity": int
605 de329b4c Stavros Sachtouris
    }}}
606 de329b4c Stavros Sachtouris

607 6893e31c Stavros Sachtouris
"""
608 c308d73f Stavros Sachtouris
609 c308d73f Stavros Sachtouris
610 392d902d Stavros Sachtouris
def apply_notification(func):
611 c308d73f Stavros Sachtouris
    def wrap(self, *args, **kwargs):
612 392d902d Stavros Sachtouris
        r = func(self, *args, **kwargs)
613 c308d73f Stavros Sachtouris
        self.writeln('Application is submitted successfully')
614 c308d73f Stavros Sachtouris
        return r
615 c308d73f Stavros Sachtouris
    return wrap
616 c308d73f Stavros Sachtouris
617 c308d73f Stavros Sachtouris
618 c308d73f Stavros Sachtouris
@command(project_commands)
619 c308d73f Stavros Sachtouris
class project_list(_init_synnefo_astakosclient, _optional_json):
620 c308d73f Stavros Sachtouris
    """List all projects"""
621 c308d73f Stavros Sachtouris
622 c308d73f Stavros Sachtouris
    arguments = dict(
623 c308d73f Stavros Sachtouris
        name=ValueArgument('Filter by name', ('--with-name', )),
624 c308d73f Stavros Sachtouris
        state=ValueArgument('Filter by state', ('--with-state', )),
625 c308d73f Stavros Sachtouris
        owner=ValueArgument('Filter by owner', ('--with-owner', ))
626 c308d73f Stavros Sachtouris
    )
627 c308d73f Stavros Sachtouris
628 c308d73f Stavros Sachtouris
    @errors.generic.all
629 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
630 c308d73f Stavros Sachtouris
    def _run(self):
631 c308d73f Stavros Sachtouris
        self._print(self.client.get_projects(
632 c308d73f Stavros Sachtouris
            self['name'], self['state'], self['owner']))
633 c308d73f Stavros Sachtouris
634 c308d73f Stavros Sachtouris
    def main(self):
635 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
636 c308d73f Stavros Sachtouris
        self._run()
637 c308d73f Stavros Sachtouris
638 c308d73f Stavros Sachtouris
639 c308d73f Stavros Sachtouris
@command(project_commands)
640 c308d73f Stavros Sachtouris
class project_info(_init_synnefo_astakosclient, _optional_json):
641 c308d73f Stavros Sachtouris
    """Get details for a project"""
642 c308d73f Stavros Sachtouris
643 c308d73f Stavros Sachtouris
    @errors.generic.all
644 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
645 c308d73f Stavros Sachtouris
    def _run(self, project_id):
646 c308d73f Stavros Sachtouris
        self._print(
647 c308d73f Stavros Sachtouris
            self.client.get_project(project_id), self.print_dict)
648 c308d73f Stavros Sachtouris
649 c308d73f Stavros Sachtouris
    def main(self, project_id):
650 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
651 c308d73f Stavros Sachtouris
        self._run(project_id)
652 c308d73f Stavros Sachtouris
653 c308d73f Stavros Sachtouris
654 c308d73f Stavros Sachtouris
@command(project_commands)
655 c308d73f Stavros Sachtouris
class project_create(_init_synnefo_astakosclient, _optional_json):
656 6893e31c Stavros Sachtouris
    """Apply for a new project (enter data though standard input or file path)
657 de329b4c Stavros Sachtouris

658 6893e31c Stavros Sachtouris
    Project details must be provided as a json-formated dict from the
659 6893e31c Stavros Sachtouris
    standard input, or through a file
660 c308d73f Stavros Sachtouris
    """
661 c308d73f Stavros Sachtouris
    __doc__ += _project_specs
662 c308d73f Stavros Sachtouris
663 c308d73f Stavros Sachtouris
    arguments = dict(
664 c308d73f Stavros Sachtouris
        specs_path=ValueArgument(
665 c308d73f Stavros Sachtouris
            'Specification file path (content must be in json)', '--spec-file')
666 c308d73f Stavros Sachtouris
    )
667 c308d73f Stavros Sachtouris
668 c308d73f Stavros Sachtouris
    @errors.generic.all
669 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
670 c308d73f Stavros Sachtouris
    @apply_notification
671 c308d73f Stavros Sachtouris
    def _run(self):
672 c308d73f Stavros Sachtouris
        input_stream = open(abspath(self['specs_path'])) if (
673 c308d73f Stavros Sachtouris
            self['specs_path']) else self._in
674 c308d73f Stavros Sachtouris
        specs = load(input_stream)
675 c308d73f Stavros Sachtouris
        self._print(
676 c308d73f Stavros Sachtouris
            self.client.create_project(specs), self.print_dict)
677 c308d73f Stavros Sachtouris
678 c308d73f Stavros Sachtouris
    def main(self):
679 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
680 c308d73f Stavros Sachtouris
        self._run()
681 c308d73f Stavros Sachtouris
682 c308d73f Stavros Sachtouris
683 c308d73f Stavros Sachtouris
@command(project_commands)
684 c308d73f Stavros Sachtouris
class project_modify(_init_synnefo_astakosclient, _optional_json):
685 c308d73f Stavros Sachtouris
    """Modify a project (input a json-dict)
686 c308d73f Stavros Sachtouris
    Project details must be provided as a json-formated dict from the standard
687 c308d73f Stavros Sachtouris
    input, or through a file
688 c308d73f Stavros Sachtouris
    """
689 c308d73f Stavros Sachtouris
690 c308d73f Stavros Sachtouris
    __doc__ += _project_specs
691 c308d73f Stavros Sachtouris
692 c308d73f Stavros Sachtouris
    arguments = dict(
693 c308d73f Stavros Sachtouris
        specs_path=ValueArgument(
694 c308d73f Stavros Sachtouris
            'Specification file path (content must be in json)', '--spec-file')
695 c308d73f Stavros Sachtouris
    )
696 c308d73f Stavros Sachtouris
697 c308d73f Stavros Sachtouris
    @errors.generic.all
698 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
699 c308d73f Stavros Sachtouris
    @apply_notification
700 c308d73f Stavros Sachtouris
    def _run(self, project_id):
701 c308d73f Stavros Sachtouris
        input_stream = open(abspath(self['specs_path'])) if (
702 c308d73f Stavros Sachtouris
            self['specs_path']) else self._in
703 c308d73f Stavros Sachtouris
        specs = load(input_stream)
704 c308d73f Stavros Sachtouris
        self._print(
705 c308d73f Stavros Sachtouris
            self.client.modify_project(project_id, specs),
706 c308d73f Stavros Sachtouris
            self.print_dict)
707 c308d73f Stavros Sachtouris
708 c308d73f Stavros Sachtouris
    def main(self, project_id):
709 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
710 c308d73f Stavros Sachtouris
        self._run(project_id)
711 c308d73f Stavros Sachtouris
712 c308d73f Stavros Sachtouris
713 c308d73f Stavros Sachtouris
class _project_action(_init_synnefo_astakosclient):
714 c308d73f Stavros Sachtouris
715 c308d73f Stavros Sachtouris
    action = ''
716 c308d73f Stavros Sachtouris
717 c308d73f Stavros Sachtouris
    @errors.generic.all
718 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
719 c308d73f Stavros Sachtouris
    def _run(self, project_id, quote_a_reason):
720 c308d73f Stavros Sachtouris
        self.client.project_action(project_id, self.action, quote_a_reason)
721 c308d73f Stavros Sachtouris
722 c308d73f Stavros Sachtouris
    def main(self, project_id, quote_a_reason=''):
723 c308d73f Stavros Sachtouris
        super(_project_action, self)._run()
724 c308d73f Stavros Sachtouris
        self._run(project_id, quote_a_reason)
725 c308d73f Stavros Sachtouris
726 c308d73f Stavros Sachtouris
727 c308d73f Stavros Sachtouris
@command(project_commands)
728 c308d73f Stavros Sachtouris
class project_suspend(_project_action):
729 c308d73f Stavros Sachtouris
    """Suspend a project (special privileges needed)"""
730 c308d73f Stavros Sachtouris
    action = 'suspend'
731 c308d73f Stavros Sachtouris
732 c308d73f Stavros Sachtouris
733 c308d73f Stavros Sachtouris
@command(project_commands)
734 c308d73f Stavros Sachtouris
class project_unsuspend(_project_action):
735 c308d73f Stavros Sachtouris
    """Resume a suspended project (special privileges needed)"""
736 c308d73f Stavros Sachtouris
    action = 'unsuspend'
737 c308d73f Stavros Sachtouris
738 c308d73f Stavros Sachtouris
739 c308d73f Stavros Sachtouris
@command(project_commands)
740 c308d73f Stavros Sachtouris
class project_terminate(_project_action):
741 c308d73f Stavros Sachtouris
    """Terminate a project (special privileges needed)"""
742 c308d73f Stavros Sachtouris
    action = 'terminate'
743 c308d73f Stavros Sachtouris
744 c308d73f Stavros Sachtouris
745 c308d73f Stavros Sachtouris
@command(project_commands)
746 c308d73f Stavros Sachtouris
class project_reinstate(_project_action):
747 c308d73f Stavros Sachtouris
    """Reinstate a terminated project (special privileges needed)"""
748 c308d73f Stavros Sachtouris
    action = 'reinstate'
749 c308d73f Stavros Sachtouris
750 c308d73f Stavros Sachtouris
751 c308d73f Stavros Sachtouris
@command(project_commands)
752 c308d73f Stavros Sachtouris
class project_application(_init_synnefo_astakosclient):
753 c308d73f Stavros Sachtouris
    """Application management commands"""
754 c308d73f Stavros Sachtouris
755 c308d73f Stavros Sachtouris
756 c308d73f Stavros Sachtouris
@command(project_commands)
757 c308d73f Stavros Sachtouris
class project_application_list(_init_synnefo_astakosclient, _optional_json):
758 c308d73f Stavros Sachtouris
    """List all applications (old and new)"""
759 c308d73f Stavros Sachtouris
760 c308d73f Stavros Sachtouris
    arguments = dict(
761 c308d73f Stavros Sachtouris
        project=IntArgument('Filter by project id', '--with-project-id')
762 c308d73f Stavros Sachtouris
    )
763 c308d73f Stavros Sachtouris
764 c308d73f Stavros Sachtouris
    @errors.generic.all
765 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
766 c308d73f Stavros Sachtouris
    def _run(self):
767 c308d73f Stavros Sachtouris
        self._print(self.client.get_applications(self['project']))
768 c308d73f Stavros Sachtouris
769 c308d73f Stavros Sachtouris
    def main(self):
770 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
771 c308d73f Stavros Sachtouris
        self._run()
772 c308d73f Stavros Sachtouris
773 c308d73f Stavros Sachtouris
774 c308d73f Stavros Sachtouris
@command(project_commands)
775 c308d73f Stavros Sachtouris
class project_application_info(_init_synnefo_astakosclient, _optional_json):
776 c308d73f Stavros Sachtouris
    """Get details on an application"""
777 c308d73f Stavros Sachtouris
778 c308d73f Stavros Sachtouris
    @errors.generic.all
779 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
780 c308d73f Stavros Sachtouris
    def _run(self, app_id):
781 c308d73f Stavros Sachtouris
        self._print(
782 c308d73f Stavros Sachtouris
            self.client.get_application(app_id), self.print_dict)
783 c308d73f Stavros Sachtouris
784 c308d73f Stavros Sachtouris
    def main(self, application_id):
785 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
786 c308d73f Stavros Sachtouris
        self._run(application_id)
787 c308d73f Stavros Sachtouris
788 c308d73f Stavros Sachtouris
789 c308d73f Stavros Sachtouris
class _application_action(_init_synnefo_astakosclient):
790 c308d73f Stavros Sachtouris
791 c308d73f Stavros Sachtouris
    action = ''
792 c308d73f Stavros Sachtouris
793 c308d73f Stavros Sachtouris
    @errors.generic.all
794 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
795 c308d73f Stavros Sachtouris
    def _run(self, app_id, quote_a_reason):
796 c308d73f Stavros Sachtouris
        self.client.application_action(app_id, self.action, quote_a_reason)
797 c308d73f Stavros Sachtouris
798 c308d73f Stavros Sachtouris
    def main(self, application_id, quote_a_reason=''):
799 c308d73f Stavros Sachtouris
        super(_application_action, self)._run()
800 c308d73f Stavros Sachtouris
        self._run(application_id, quote_a_reason)
801 c308d73f Stavros Sachtouris
802 c308d73f Stavros Sachtouris
803 c308d73f Stavros Sachtouris
@command(project_commands)
804 c308d73f Stavros Sachtouris
class project_application_approve(_application_action):
805 c308d73f Stavros Sachtouris
    """Approve an application (special privileges needed)"""
806 c308d73f Stavros Sachtouris
    action = 'approve'
807 c308d73f Stavros Sachtouris
808 c308d73f Stavros Sachtouris
809 c308d73f Stavros Sachtouris
@command(project_commands)
810 c308d73f Stavros Sachtouris
class project_application_deny(_application_action):
811 c308d73f Stavros Sachtouris
    """Deny an application (special privileges needed)"""
812 c308d73f Stavros Sachtouris
    action = 'deny'
813 c308d73f Stavros Sachtouris
814 c308d73f Stavros Sachtouris
815 c308d73f Stavros Sachtouris
@command(project_commands)
816 c308d73f Stavros Sachtouris
class project_application_dismiss(_application_action):
817 c308d73f Stavros Sachtouris
    """Dismiss your denied application"""
818 c308d73f Stavros Sachtouris
    action = 'dismiss'
819 c308d73f Stavros Sachtouris
820 c308d73f Stavros Sachtouris
821 c308d73f Stavros Sachtouris
@command(project_commands)
822 c308d73f Stavros Sachtouris
class project_application_cancel(_application_action):
823 c308d73f Stavros Sachtouris
    """Cancel your application"""
824 c308d73f Stavros Sachtouris
    action = 'cancel'
825 c308d73f Stavros Sachtouris
826 c308d73f Stavros Sachtouris
827 9d84caa4 Stavros Sachtouris
@command(membership_commands)
828 9d84caa4 Stavros Sachtouris
class membership(_init_synnefo_astakosclient):
829 c308d73f Stavros Sachtouris
    """Project membership management commands"""
830 c308d73f Stavros Sachtouris
831 c308d73f Stavros Sachtouris
832 9d84caa4 Stavros Sachtouris
@command(membership_commands)
833 9d84caa4 Stavros Sachtouris
class membership_list(_init_synnefo_astakosclient, _optional_json):
834 c308d73f Stavros Sachtouris
    """List all memberships"""
835 c308d73f Stavros Sachtouris
836 c308d73f Stavros Sachtouris
    arguments = dict(
837 c308d73f Stavros Sachtouris
        project=IntArgument('Filter by project id', '--with-project-id')
838 c308d73f Stavros Sachtouris
    )
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):
843 c308d73f Stavros Sachtouris
        self._print(self.client.get_memberships(self['project']))
844 c308d73f Stavros Sachtouris
845 c308d73f Stavros Sachtouris
    def main(self):
846 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
847 c308d73f Stavros Sachtouris
        self._run()
848 c308d73f Stavros Sachtouris
849 c308d73f Stavros Sachtouris
850 9d84caa4 Stavros Sachtouris
@command(membership_commands)
851 9d84caa4 Stavros Sachtouris
class membership_info(_init_synnefo_astakosclient, _optional_json):
852 c308d73f Stavros Sachtouris
    """Details on a membership"""
853 c308d73f Stavros Sachtouris
854 c308d73f Stavros Sachtouris
    @errors.generic.all
855 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
856 c308d73f Stavros Sachtouris
    def _run(self, memb_id):
857 c308d73f Stavros Sachtouris
        self._print(
858 c308d73f Stavros Sachtouris
            self.client.get_membership(memb_id), self.print_dict)
859 c308d73f Stavros Sachtouris
860 c308d73f Stavros Sachtouris
    def main(self, membership_id):
861 c308d73f Stavros Sachtouris
        super(self.__class__, self)._run()
862 c308d73f Stavros Sachtouris
        self._run(membership_id)
863 c308d73f Stavros Sachtouris
864 c308d73f Stavros Sachtouris
865 c308d73f Stavros Sachtouris
class _membership_action(_init_synnefo_astakosclient, _optional_json):
866 c308d73f Stavros Sachtouris
867 c308d73f Stavros Sachtouris
    action = ''
868 c308d73f Stavros Sachtouris
869 c308d73f Stavros Sachtouris
    @errors.generic.all
870 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
871 c308d73f Stavros Sachtouris
    def _run(self, memb_id, quote_a_reason):
872 c308d73f Stavros Sachtouris
        self._print(self.client.membership_action(
873 c308d73f Stavros Sachtouris
            memb_id, self.action, quote_a_reason))
874 c308d73f Stavros Sachtouris
875 c308d73f Stavros Sachtouris
    def main(self, membership_id, quote_a_reason=''):
876 c308d73f Stavros Sachtouris
        super(_membership_action, self)._run()
877 c308d73f Stavros Sachtouris
        self._run(membership_id, quote_a_reason)
878 c308d73f Stavros Sachtouris
879 c308d73f Stavros Sachtouris
880 9d84caa4 Stavros Sachtouris
@command(membership_commands)
881 9d84caa4 Stavros Sachtouris
class membership_leave(_membership_action):
882 c308d73f Stavros Sachtouris
    """Leave a project you have membership to"""
883 c308d73f Stavros Sachtouris
    action = 'leave'
884 c308d73f Stavros Sachtouris
885 c308d73f Stavros Sachtouris
886 9d84caa4 Stavros Sachtouris
@command(membership_commands)
887 9d84caa4 Stavros Sachtouris
class membership_cancel(_membership_action):
888 c308d73f Stavros Sachtouris
    """Cancel your (probably pending) membership to a project"""
889 c308d73f Stavros Sachtouris
    action = 'cancel'
890 c308d73f Stavros Sachtouris
891 c308d73f Stavros Sachtouris
892 9d84caa4 Stavros Sachtouris
@command(membership_commands)
893 9d84caa4 Stavros Sachtouris
class membership_accept(_membership_action):
894 c308d73f Stavros Sachtouris
    """Accept a membership for a project you manage"""
895 c308d73f Stavros Sachtouris
    action = 'accept'
896 c308d73f Stavros Sachtouris
897 c308d73f Stavros Sachtouris
898 9d84caa4 Stavros Sachtouris
@command(membership_commands)
899 9d84caa4 Stavros Sachtouris
class membership_reject(_membership_action):
900 c308d73f Stavros Sachtouris
    """Reject a membership for a project you manage"""
901 c308d73f Stavros Sachtouris
    action = 'reject'
902 c308d73f Stavros Sachtouris
903 c308d73f Stavros Sachtouris
904 9d84caa4 Stavros Sachtouris
@command(membership_commands)
905 9d84caa4 Stavros Sachtouris
class membership_remove(_membership_action):
906 c308d73f Stavros Sachtouris
    """Remove a membership for a project you manage"""
907 c308d73f Stavros Sachtouris
    action = 'remove'
908 c308d73f Stavros Sachtouris
909 c308d73f Stavros Sachtouris
910 9d84caa4 Stavros Sachtouris
@command(membership_commands)
911 9d84caa4 Stavros Sachtouris
class membership_join(_init_synnefo_astakosclient):
912 c308d73f Stavros Sachtouris
    """Join a project"""
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):
917 c308d73f Stavros Sachtouris
        self.writeln(self.client.join_project(project_id))
918 c308d73f Stavros Sachtouris
919 c308d73f Stavros Sachtouris
    def main(self, project_id):
920 9d84caa4 Stavros Sachtouris
        super(membership_join, self)._run()
921 c308d73f Stavros Sachtouris
        self._run(project_id)
922 c308d73f Stavros Sachtouris
923 c308d73f Stavros Sachtouris
924 9d84caa4 Stavros Sachtouris
@command(membership_commands)
925 9d84caa4 Stavros Sachtouris
class membership_enroll(_init_synnefo_astakosclient):
926 c308d73f Stavros Sachtouris
    """Enroll somebody to a project you manage"""
927 c308d73f Stavros Sachtouris
928 c308d73f Stavros Sachtouris
    @errors.generic.all
929 c308d73f Stavros Sachtouris
    @errors.user.astakosclient
930 c308d73f Stavros Sachtouris
    def _run(self, project_id, email):
931 c308d73f Stavros Sachtouris
        self.writeln(self.client.enroll_member(project_id, email))
932 c308d73f Stavros Sachtouris
933 c308d73f Stavros Sachtouris
    def main(self, project_id, email):
934 9d84caa4 Stavros Sachtouris
        super(membership_join, self)._run()
935 c308d73f Stavros Sachtouris
        self._run(project_id, email)