Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / errors.py @ 81c60832

History | View | Annotate | Download (22.1 kB)

1 e3f01d64 Stavros Sachtouris
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 a00de254 Stavros Sachtouris
#
3 a00de254 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 a00de254 Stavros Sachtouris
# without modification, are permitted provided that the following
5 a00de254 Stavros Sachtouris
# conditions are met:
6 a00de254 Stavros Sachtouris
#
7 a00de254 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 a00de254 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 a00de254 Stavros Sachtouris
#      disclaimer.
10 a00de254 Stavros Sachtouris
#
11 a00de254 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 a00de254 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 a00de254 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 a00de254 Stavros Sachtouris
#      provided with the distribution.
15 a00de254 Stavros Sachtouris
#
16 a00de254 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a00de254 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a00de254 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a00de254 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a00de254 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a00de254 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a00de254 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a00de254 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a00de254 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a00de254 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a00de254 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a00de254 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 a00de254 Stavros Sachtouris
#
29 a00de254 Stavros Sachtouris
# The views and conclusions contained in the software and
30 a00de254 Stavros Sachtouris
# documentation are those of the authors and should not be
31 a00de254 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 a00de254 Stavros Sachtouris
# or implied, of GRNET S.A.command
33 a00de254 Stavros Sachtouris
34 a00de254 Stavros Sachtouris
from traceback import print_stack, print_exc
35 a00de254 Stavros Sachtouris
36 a00de254 Stavros Sachtouris
from kamaki.clients import ClientError
37 dc6fc88e Stavros Sachtouris
from kamaki.cli.errors import CLIError, raiseCLIError, CLISyntaxError
38 a00de254 Stavros Sachtouris
from kamaki.cli import _debug, kloger
39 ca092af4 Stavros Sachtouris
from kamaki.cli.utils import format_size
40 a00de254 Stavros Sachtouris
41 c626151a Stavros Sachtouris
CLOUDNAME = [
42 144b3551 Stavros Sachtouris
    'Note: If you use a named cloud, use its name instead of "default"']
43 c626151a Stavros Sachtouris
44 a00de254 Stavros Sachtouris
45 a00de254 Stavros Sachtouris
class generic(object):
46 a00de254 Stavros Sachtouris
47 a00de254 Stavros Sachtouris
    @classmethod
48 a00de254 Stavros Sachtouris
    def all(this, foo):
49 a00de254 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
50 a00de254 Stavros Sachtouris
            try:
51 a00de254 Stavros Sachtouris
                return foo(self, *args, **kwargs)
52 a00de254 Stavros Sachtouris
            except Exception as e:
53 a00de254 Stavros Sachtouris
                if _debug:
54 a00de254 Stavros Sachtouris
                    print_stack()
55 a00de254 Stavros Sachtouris
                    print_exc(e)
56 99085b30 Stavros Sachtouris
                if isinstance(e, CLIError) or isinstance(e, ClientError):
57 844a6bdb Stavros Sachtouris
                    raiseCLIError(e)
58 844a6bdb Stavros Sachtouris
                raiseCLIError(e, details=['%s, -d for debug info' % type(e)])
59 a00de254 Stavros Sachtouris
        return _raise
60 a00de254 Stavros Sachtouris
61 a03ade9e Stavros Sachtouris
    @classmethod
62 f724cd35 Stavros Sachtouris
    def _connection(this, foo):
63 a03ade9e Stavros Sachtouris
        def _raise(self, *args, **kwargs):
64 a03ade9e Stavros Sachtouris
            try:
65 a03ade9e Stavros Sachtouris
                foo(self, *args, **kwargs)
66 a03ade9e Stavros Sachtouris
            except ClientError as ce:
67 24ff0a35 Stavros Sachtouris
                ce_msg = ('%s' % ce).lower()
68 a03ade9e Stavros Sachtouris
                if ce.status == 401:
69 a03ade9e Stavros Sachtouris
                    raiseCLIError(ce, 'Authorization failed', details=[
70 a03ade9e Stavros Sachtouris
                        'Make sure a valid token is provided:',
71 4018326d Stavros Sachtouris
                        '  to check if token is valid: /user authenticate',
72 c626151a Stavros Sachtouris
                        '  to set token:',
73 144b3551 Stavros Sachtouris
                        '    /config set cloud.default.token <token>',
74 c626151a Stavros Sachtouris
                        '  to get current token:',
75 144b3551 Stavros Sachtouris
                        '    /config get cloud.default.token'] + CLOUDNAME)
76 1395c40e Stavros Sachtouris
                elif ce.status in range(-12, 200) + [302, 401, 403, 500]:
77 a03ade9e Stavros Sachtouris
                    raiseCLIError(ce, importance=3, details=[
78 819311d3 Stavros Sachtouris
                        'Check if service is up'])
79 24ff0a35 Stavros Sachtouris
                elif ce.status == 404 and 'kamakihttpresponse' in ce_msg:
80 5a673575 Stavros Sachtouris
                    client = getattr(self, 'client', None)
81 5a673575 Stavros Sachtouris
                    if not client:
82 5a673575 Stavros Sachtouris
                        raise
83 5a673575 Stavros Sachtouris
                    url = getattr(client, 'base_url', '<empty>')
84 031ca67d Stavros Sachtouris
                    msg = 'Invalid service URL %s' % url
85 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=[
86 031ca67d Stavros Sachtouris
                        'Check if authentication URL is correct',
87 031ca67d Stavros Sachtouris
                        '  check current URL:',
88 144b3551 Stavros Sachtouris
                        '    /config get cloud.default.url',
89 031ca67d Stavros Sachtouris
                        '  set new authentication URL:',
90 144b3551 Stavros Sachtouris
                        '    /config set cloud.default.url'] + CLOUDNAME)
91 a03ade9e Stavros Sachtouris
                raise
92 a03ade9e Stavros Sachtouris
        return _raise
93 a03ade9e Stavros Sachtouris
94 a00de254 Stavros Sachtouris
95 4018326d Stavros Sachtouris
class user(object):
96 a00de254 Stavros Sachtouris
97 a00de254 Stavros Sachtouris
    _token_details = [
98 144b3551 Stavros Sachtouris
        'To check default token: /config get cloud.default.token',
99 a03ade9e Stavros Sachtouris
        'If set/update a token:',
100 144b3551 Stavros Sachtouris
        '*  (permanent):  /config set cloud.default.token <token>',
101 c626151a Stavros Sachtouris
        '*  (temporary):  re-run with <token> parameter'] + CLOUDNAME
102 a00de254 Stavros Sachtouris
103 a00de254 Stavros Sachtouris
    @classmethod
104 a03ade9e Stavros Sachtouris
    def load(this, foo):
105 a00de254 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
106 a00de254 Stavros Sachtouris
            r = foo(self, *args, **kwargs)
107 a00de254 Stavros Sachtouris
            try:
108 a00de254 Stavros Sachtouris
                client = getattr(self, 'client')
109 a00de254 Stavros Sachtouris
            except AttributeError as ae:
110 a00de254 Stavros Sachtouris
                raiseCLIError(ae, 'Client setup failure', importance=3)
111 a00de254 Stavros Sachtouris
            if not getattr(client, 'token', False):
112 a00de254 Stavros Sachtouris
                kloger.warning(
113 c626151a Stavros Sachtouris
                    'No permanent token (try:'
114 144b3551 Stavros Sachtouris
                    ' kamaki config set cloud.default.token <tkn>)')
115 a00de254 Stavros Sachtouris
            if not getattr(client, 'base_url', False):
116 c626151a Stavros Sachtouris
                msg = 'Missing synnefo authentication URL'
117 de73876b Stavros Sachtouris
                raise CLIError(msg, importance=3, details=[
118 031ca67d Stavros Sachtouris
                    'Check if authentication URL is correct',
119 031ca67d Stavros Sachtouris
                        '  check current URL:',
120 144b3551 Stavros Sachtouris
                        '    /config get cloud.default.url',
121 031ca67d Stavros Sachtouris
                        '  set new auth. URL:',
122 144b3551 Stavros Sachtouris
                        '    /config set cloud.default.url'] + CLOUDNAME)
123 a00de254 Stavros Sachtouris
            return r
124 a00de254 Stavros Sachtouris
        return _raise
125 a00de254 Stavros Sachtouris
126 a00de254 Stavros Sachtouris
    @classmethod
127 a00de254 Stavros Sachtouris
    def authenticate(this, foo):
128 a00de254 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
129 a00de254 Stavros Sachtouris
            try:
130 9bc8317f Stavros Sachtouris
                return foo(self, *args, **kwargs)
131 a00de254 Stavros Sachtouris
            except ClientError as ce:
132 a00de254 Stavros Sachtouris
                if ce.status == 401:
133 a00de254 Stavros Sachtouris
                    token = kwargs.get('custom_token', 0) or self.client.token
134 de73876b Stavros Sachtouris
                    msg = (
135 de73876b Stavros Sachtouris
                        'Authorization failed for token %s' % token
136 de73876b Stavros Sachtouris
                    ) if token else 'No token provided',
137 de73876b Stavros Sachtouris
                    details = [] if token else this._token_details
138 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=details)
139 82e32e50 Stavros Sachtouris
                raise ce
140 436bd910 Stavros Sachtouris
            self._raise = foo
141 a00de254 Stavros Sachtouris
        return _raise
142 dc6fc88e Stavros Sachtouris
143 dc6fc88e Stavros Sachtouris
144 dc6fc88e Stavros Sachtouris
class history(object):
145 dc6fc88e Stavros Sachtouris
    @classmethod
146 dc6fc88e Stavros Sachtouris
    def init(this, foo):
147 dc6fc88e Stavros Sachtouris
        def _raise(self, *args, **kwargs):
148 dc6fc88e Stavros Sachtouris
            r = foo(self, *args, **kwargs)
149 dc6fc88e Stavros Sachtouris
            if not hasattr(self, 'history'):
150 dc6fc88e Stavros Sachtouris
                raise CLIError('Failed to load history', importance=2)
151 dc6fc88e Stavros Sachtouris
            return r
152 dc6fc88e Stavros Sachtouris
        return _raise
153 dc6fc88e Stavros Sachtouris
154 dc6fc88e Stavros Sachtouris
    @classmethod
155 dc6fc88e Stavros Sachtouris
    def _get_cmd_ids(this, foo):
156 dc6fc88e Stavros Sachtouris
        def _raise(self, cmd_ids, *args, **kwargs):
157 dc6fc88e Stavros Sachtouris
            if not cmd_ids:
158 de73876b Stavros Sachtouris
                raise CLISyntaxError(
159 de73876b Stavros Sachtouris
                    'Usage: <id1|id1-id2> [id3|id3-id4] ...',
160 dc6fc88e Stavros Sachtouris
                    details=self.__doc__.split('\n'))
161 dc6fc88e Stavros Sachtouris
            return foo(self, cmd_ids, *args, **kwargs)
162 dc6fc88e Stavros Sachtouris
        return _raise
163 dc6fc88e Stavros Sachtouris
164 a03ade9e Stavros Sachtouris
165 a03ade9e Stavros Sachtouris
class cyclades(object):
166 b04288f7 Stavros Sachtouris
    about_flavor_id = [
167 b04288f7 Stavros Sachtouris
        'How to pick a valid flavor id:',
168 b04288f7 Stavros Sachtouris
        '* get a list of flavor ids: /flavor list',
169 b04288f7 Stavros Sachtouris
        '* details of flavor: /flavor info <flavor id>']
170 b04288f7 Stavros Sachtouris
171 5a673575 Stavros Sachtouris
    about_network_id = [
172 5a673575 Stavros Sachtouris
        'How to pick a valid network id:',
173 5a673575 Stavros Sachtouris
        '* get a list of network ids: /network list',
174 5a673575 Stavros Sachtouris
        '* details of network: /network info <network id>']
175 5a673575 Stavros Sachtouris
176 a03ade9e Stavros Sachtouris
    @classmethod
177 a03ade9e Stavros Sachtouris
    def connection(this, foo):
178 f724cd35 Stavros Sachtouris
        return generic._connection(foo)
179 a03ade9e Stavros Sachtouris
180 b04288f7 Stavros Sachtouris
    @classmethod
181 b04288f7 Stavros Sachtouris
    def date(this, foo):
182 b04288f7 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
183 b04288f7 Stavros Sachtouris
            try:
184 b04288f7 Stavros Sachtouris
                return foo(self, *args, **kwargs)
185 b04288f7 Stavros Sachtouris
            except ClientError as ce:
186 b04288f7 Stavros Sachtouris
                if ce.status == 400 and 'changes-since' in ('%s' % ce):
187 b04288f7 Stavros Sachtouris
                    raise CLIError(
188 b04288f7 Stavros Sachtouris
                        'Incorrect date format for --since',
189 b04288f7 Stavros Sachtouris
                        details=['Accepted date format: d/m/y'])
190 b04288f7 Stavros Sachtouris
                raise
191 b04288f7 Stavros Sachtouris
        return _raise
192 b04288f7 Stavros Sachtouris
193 b04288f7 Stavros Sachtouris
    @classmethod
194 b8352ce4 Stavros Sachtouris
    def cluster_size(this, foo):
195 b8352ce4 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
196 b8352ce4 Stavros Sachtouris
            size = kwargs.get('size', None)
197 b8352ce4 Stavros Sachtouris
            try:
198 b8352ce4 Stavros Sachtouris
                size = int(size)
199 b8352ce4 Stavros Sachtouris
                assert size > 0, 'Cluster size must be a positive integer'
200 b8352ce4 Stavros Sachtouris
                return foo(self, *args, **kwargs)
201 b8352ce4 Stavros Sachtouris
            except ValueError as ve:
202 b8352ce4 Stavros Sachtouris
                msg = 'Invalid cluster size value %s' % size
203 b8352ce4 Stavros Sachtouris
                raiseCLIError(ve, msg, importance=1, details=[
204 b8352ce4 Stavros Sachtouris
                    'Cluster size must be a positive integer'])
205 b8352ce4 Stavros Sachtouris
            except AssertionError as ae:
206 b8352ce4 Stavros Sachtouris
                raiseCLIError(
207 b8352ce4 Stavros Sachtouris
                    ae, 'Invalid cluster size %s' % size, importance=1)
208 b8352ce4 Stavros Sachtouris
            except ClientError:
209 b8352ce4 Stavros Sachtouris
                raise
210 b8352ce4 Stavros Sachtouris
        return _raise
211 b8352ce4 Stavros Sachtouris
212 b8352ce4 Stavros Sachtouris
    @classmethod
213 5a673575 Stavros Sachtouris
    def network_id(this, foo):
214 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
215 5a673575 Stavros Sachtouris
            network_id = kwargs.get('network_id', None)
216 5a673575 Stavros Sachtouris
            try:
217 5a673575 Stavros Sachtouris
                network_id = int(network_id)
218 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
219 5a673575 Stavros Sachtouris
            except ValueError as ve:
220 de73876b Stavros Sachtouris
                msg = 'Invalid network id %s ' % network_id
221 81c60832 Stavros Sachtouris
                details = 'network id must be a positive integer'
222 de73876b Stavros Sachtouris
                raiseCLIError(ve, msg, details=details, importance=1)
223 5a673575 Stavros Sachtouris
            except ClientError as ce:
224 de73876b Stavros Sachtouris
                if network_id and ce.status == 404 and (
225 de73876b Stavros Sachtouris
                    'network' in ('%s' % ce).lower()
226 de73876b Stavros Sachtouris
                ):
227 de73876b Stavros Sachtouris
                    msg = 'No network with id %s found' % network_id,
228 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=this.about_network_id)
229 5a673575 Stavros Sachtouris
                raise
230 5a673575 Stavros Sachtouris
        return _raise
231 5a673575 Stavros Sachtouris
232 5a673575 Stavros Sachtouris
    @classmethod
233 5a673575 Stavros Sachtouris
    def network_max(this, foo):
234 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
235 5a673575 Stavros Sachtouris
            try:
236 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
237 5a673575 Stavros Sachtouris
            except ClientError as ce:
238 5a673575 Stavros Sachtouris
                if ce.status == 413:
239 de73876b Stavros Sachtouris
                    msg = 'Cannot create another network',
240 24ff0a35 Stavros Sachtouris
                    details = [
241 24ff0a35 Stavros Sachtouris
                        'Maximum number of networks reached',
242 de73876b Stavros Sachtouris
                        '* to get a list of networks: /network list',
243 de73876b Stavros Sachtouris
                        '* to delete a network: /network delete <net id>']
244 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=details)
245 5a673575 Stavros Sachtouris
                raise
246 5a673575 Stavros Sachtouris
        return _raise
247 5a673575 Stavros Sachtouris
248 5a673575 Stavros Sachtouris
    @classmethod
249 5a673575 Stavros Sachtouris
    def network_in_use(this, foo):
250 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
251 5a673575 Stavros Sachtouris
            network_id = kwargs.get('network_id', None)
252 5a673575 Stavros Sachtouris
            try:
253 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
254 5a673575 Stavros Sachtouris
            except ClientError as ce:
255 ef3488a7 Stavros Sachtouris
                if network_id and ce.status in (400, ):
256 de73876b Stavros Sachtouris
                    msg = 'Network with id %s does not exist' % network_id,
257 08aad6db Stavros Sachtouris
                    raiseCLIError(ce, msg, details=this.about_network_id)
258 ef3488a7 Stavros Sachtouris
                elif network_id or ce.status in (421, ):
259 de73876b Stavros Sachtouris
                    msg = 'Network with id %s is in use' % network_id,
260 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=[
261 2bd23362 Stavros Sachtouris
                        'Disconnect all nics/servers of this network first',
262 de73876b Stavros Sachtouris
                        '* to get nics: /network info %s' % network_id,
263 de73876b Stavros Sachtouris
                        '.  (under "attachments" section)',
264 de73876b Stavros Sachtouris
                        '* to disconnect: /network disconnect <nic id>'])
265 5a673575 Stavros Sachtouris
                raise
266 5a673575 Stavros Sachtouris
        return _raise
267 5a673575 Stavros Sachtouris
268 5a673575 Stavros Sachtouris
    @classmethod
269 b04288f7 Stavros Sachtouris
    def flavor_id(this, foo):
270 b04288f7 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
271 b04288f7 Stavros Sachtouris
            flavor_id = kwargs.get('flavor_id', None)
272 b04288f7 Stavros Sachtouris
            try:
273 b04288f7 Stavros Sachtouris
                flavor_id = int(flavor_id)
274 b04288f7 Stavros Sachtouris
                return foo(self, *args, **kwargs)
275 b04288f7 Stavros Sachtouris
            except ValueError as ve:
276 de73876b Stavros Sachtouris
                msg = 'Invalid flavor id %s ' % flavor_id,
277 81c60832 Stavros Sachtouris
                details = 'Flavor id must be a positive integer'
278 de73876b Stavros Sachtouris
                raiseCLIError(ve, msg, details=details, importance=1)
279 b04288f7 Stavros Sachtouris
            except ClientError as ce:
280 de73876b Stavros Sachtouris
                if flavor_id and ce.status == 404 and (
281 de73876b Stavros Sachtouris
                    'flavor' in ('%s' % ce).lower()
282 de73876b Stavros Sachtouris
                ):
283 de73876b Stavros Sachtouris
                        msg = 'No flavor with id %s found' % flavor_id,
284 de73876b Stavros Sachtouris
                        raiseCLIError(ce, msg, details=this.about_flavor_id)
285 b04288f7 Stavros Sachtouris
                raise
286 b04288f7 Stavros Sachtouris
        return _raise
287 b04288f7 Stavros Sachtouris
288 b04288f7 Stavros Sachtouris
    @classmethod
289 5a673575 Stavros Sachtouris
    def server_id(this, foo):
290 b04288f7 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
291 b04288f7 Stavros Sachtouris
            server_id = kwargs.get('server_id', None)
292 b04288f7 Stavros Sachtouris
            try:
293 b04288f7 Stavros Sachtouris
                server_id = int(server_id)
294 b04288f7 Stavros Sachtouris
                return foo(self, *args, **kwargs)
295 b04288f7 Stavros Sachtouris
            except ValueError as ve:
296 2bd23362 Stavros Sachtouris
                msg = 'Invalid virtual server id %s' % server_id,
297 81c60832 Stavros Sachtouris
                details = 'Server id must be a positive integer'
298 de73876b Stavros Sachtouris
                raiseCLIError(ve, msg, details=details, importance=1)
299 b04288f7 Stavros Sachtouris
            except ClientError as ce:
300 5a673575 Stavros Sachtouris
                err_msg = ('%s' % ce).lower()
301 de73876b Stavros Sachtouris
                if (
302 de73876b Stavros Sachtouris
                    ce.status == 404 and 'server' in err_msg
303 de73876b Stavros Sachtouris
                ) or (
304 de73876b Stavros Sachtouris
                    ce.status == 400 and 'not found' in err_msg
305 de73876b Stavros Sachtouris
                ):
306 2bd23362 Stavros Sachtouris
                    msg = 'virtual server with id %s not found' % server_id,
307 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=[
308 2bd23362 Stavros Sachtouris
                        '* to get ids of all servers: /server list',
309 2bd23362 Stavros Sachtouris
                        '* to get server details: /server info <server id>'])
310 5a673575 Stavros Sachtouris
                raise
311 5a673575 Stavros Sachtouris
        return _raise
312 5a673575 Stavros Sachtouris
313 5a673575 Stavros Sachtouris
    @classmethod
314 5a673575 Stavros Sachtouris
    def firewall(this, foo):
315 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
316 5a673575 Stavros Sachtouris
            profile = kwargs.get('profile', None)
317 5a673575 Stavros Sachtouris
            try:
318 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
319 5a673575 Stavros Sachtouris
            except ClientError as ce:
320 de73876b Stavros Sachtouris
                if ce.status == 400 and profile and (
321 de73876b Stavros Sachtouris
                    'firewall' in ('%s' % ce).lower()
322 de73876b Stavros Sachtouris
                ):
323 de73876b Stavros Sachtouris
                    msg = '%s is an invalid firewall profile term' % profile
324 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=[
325 de73876b Stavros Sachtouris
                        'Try one of the following:',
326 de73876b Stavros Sachtouris
                        '* DISABLED: Shutdown firewall',
327 de73876b Stavros Sachtouris
                        '* ENABLED: Firewall in normal mode',
328 de73876b Stavros Sachtouris
                        '* PROTECTED: Firewall in secure mode'])
329 5a673575 Stavros Sachtouris
                raise
330 5a673575 Stavros Sachtouris
        return _raise
331 5a673575 Stavros Sachtouris
332 5a673575 Stavros Sachtouris
    @classmethod
333 5a673575 Stavros Sachtouris
    def nic_id(this, foo):
334 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
335 5a673575 Stavros Sachtouris
            try:
336 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
337 5a673575 Stavros Sachtouris
            except ClientError as ce:
338 5a673575 Stavros Sachtouris
                nic_id = kwargs.get('nic_id', None)
339 de73876b Stavros Sachtouris
                if nic_id and ce.status == 404 and (
340 de73876b Stavros Sachtouris
                    'network interface' in ('%s' % ce).lower()
341 de73876b Stavros Sachtouris
                ):
342 5a673575 Stavros Sachtouris
                    server_id = kwargs.get('server_id', '<no server>')
343 2bd23362 Stavros Sachtouris
                    err_msg = 'No nic %s on virtual server with id %s' % (
344 5a673575 Stavros Sachtouris
                        nic_id,
345 5a673575 Stavros Sachtouris
                        server_id)
346 5a673575 Stavros Sachtouris
                    raiseCLIError(ce, err_msg, details=[
347 2bd23362 Stavros Sachtouris
                        '* check v. server with id %s: /server info %s' % (
348 5a673575 Stavros Sachtouris
                            server_id,
349 5a673575 Stavros Sachtouris
                            server_id),
350 2bd23362 Stavros Sachtouris
                        '* list nics for v. server with id %s:' % server_id,
351 5a673575 Stavros Sachtouris
                        '      /server addr %s' % server_id])
352 5a673575 Stavros Sachtouris
                raise
353 5a673575 Stavros Sachtouris
        return _raise
354 5a673575 Stavros Sachtouris
355 5a673575 Stavros Sachtouris
    @classmethod
356 5a673575 Stavros Sachtouris
    def nic_format(this, foo):
357 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
358 5a673575 Stavros Sachtouris
            try:
359 5a673575 Stavros Sachtouris
                return foo(self, *args, **kwargs)
360 5a673575 Stavros Sachtouris
            except IndexError as ie:
361 5a673575 Stavros Sachtouris
                nic_id = kwargs.get('nic_id', None)
362 de73876b Stavros Sachtouris
                msg = 'Invalid format for network interface (nic) %s' % nic_id
363 de73876b Stavros Sachtouris
                raiseCLIError(ie, msg, importance=1, details=[
364 de73876b Stavros Sachtouris
                    'nid_id format: nic-<server id>-<nic id>',
365 de73876b Stavros Sachtouris
                    '* get nics of a network: /network info <net id>',
366 de73876b Stavros Sachtouris
                    '    (listed the "attachments" section)'])
367 5a673575 Stavros Sachtouris
        return _raise
368 5a673575 Stavros Sachtouris
369 5a673575 Stavros Sachtouris
    @classmethod
370 5a673575 Stavros Sachtouris
    def metadata(this, foo):
371 5a673575 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
372 5a673575 Stavros Sachtouris
            key = kwargs.get('key', None)
373 5a673575 Stavros Sachtouris
            try:
374 5a673575 Stavros Sachtouris
                foo(self, *args, **kwargs)
375 5a673575 Stavros Sachtouris
            except ClientError as ce:
376 de73876b Stavros Sachtouris
                if key and ce.status == 404 and (
377 de73876b Stavros Sachtouris
                    'metadata' in ('%s' % ce).lower()
378 de73876b Stavros Sachtouris
                ):
379 2bd23362 Stavros Sachtouris
                        raiseCLIError(
380 2bd23362 Stavros Sachtouris
                            ce, 'No v. server metadata with key %s' % key)
381 b04288f7 Stavros Sachtouris
                raise
382 b04288f7 Stavros Sachtouris
        return _raise
383 b04288f7 Stavros Sachtouris
384 a03ade9e Stavros Sachtouris
385 a03ade9e Stavros Sachtouris
class plankton(object):
386 a03ade9e Stavros Sachtouris
387 de73876b Stavros Sachtouris
    about_image_id = [
388 de73876b Stavros Sachtouris
        'How to pick a suitable image:',
389 b04288f7 Stavros Sachtouris
        '* get a list of image ids: /image list',
390 67083ca0 Stavros Sachtouris
        '* details of image: /image meta <image id>']
391 a03ade9e Stavros Sachtouris
392 a03ade9e Stavros Sachtouris
    @classmethod
393 a03ade9e Stavros Sachtouris
    def connection(this, foo):
394 f724cd35 Stavros Sachtouris
        return generic._connection(foo)
395 a03ade9e Stavros Sachtouris
396 a03ade9e Stavros Sachtouris
    @classmethod
397 a03ade9e Stavros Sachtouris
    def id(this, foo):
398 b04288f7 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
399 b04288f7 Stavros Sachtouris
            image_id = kwargs.get('image_id', None)
400 a03ade9e Stavros Sachtouris
            try:
401 b04288f7 Stavros Sachtouris
                foo(self, *args, **kwargs)
402 a03ade9e Stavros Sachtouris
            except ClientError as ce:
403 de73876b Stavros Sachtouris
                if image_id and (
404 de73876b Stavros Sachtouris
                    ce.status == 404
405 de73876b Stavros Sachtouris
                    or (
406 de73876b Stavros Sachtouris
                        ce.status == 400
407 de73876b Stavros Sachtouris
                        and 'image not found' in ('%s' % ce).lower())
408 de73876b Stavros Sachtouris
                    or ce.status == 411
409 de73876b Stavros Sachtouris
                ):
410 de73876b Stavros Sachtouris
                        msg = 'No image with id %s found' % image_id
411 de73876b Stavros Sachtouris
                        raiseCLIError(ce, msg, details=this.about_image_id)
412 236e7d08 Stavros Sachtouris
                raise
413 236e7d08 Stavros Sachtouris
        return _raise
414 236e7d08 Stavros Sachtouris
415 236e7d08 Stavros Sachtouris
    @classmethod
416 236e7d08 Stavros Sachtouris
    def metadata(this, foo):
417 b04288f7 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
418 b04288f7 Stavros Sachtouris
            key = kwargs.get('key', None)
419 236e7d08 Stavros Sachtouris
            try:
420 c4aefeaf Stavros Sachtouris
                return foo(self, *args, **kwargs)
421 236e7d08 Stavros Sachtouris
            except ClientError as ce:
422 24ff0a35 Stavros Sachtouris
                ce_msg = ('%s' % ce).lower()
423 de73876b Stavros Sachtouris
                if ce.status == 404 or (
424 2005b18e Stavros Sachtouris
                        ce.status == 400 and 'metadata' in ce_msg):
425 2005b18e Stavros Sachtouris
                    msg = 'No properties with key %s in this image' % key
426 2005b18e Stavros Sachtouris
                    raiseCLIError(ce, msg)
427 a03ade9e Stavros Sachtouris
                raise
428 a03ade9e Stavros Sachtouris
        return _raise
429 1395c40e Stavros Sachtouris
430 1395c40e Stavros Sachtouris
431 1395c40e Stavros Sachtouris
class pithos(object):
432 de73876b Stavros Sachtouris
    container_howto = [
433 24ff0a35 Stavros Sachtouris
        'To specify a container:',
434 c626151a Stavros Sachtouris
        '  1. --container=<container> (temporary, overrides all)',
435 c626151a Stavros Sachtouris
        '  2. Use the container:path format (temporary, overrides 3)',
436 c626151a Stavros Sachtouris
        '  3. Set pithos_container variable (permanent)',
437 c626151a Stavros Sachtouris
        '     /config set pithos_container <container>',
438 3ae60112 Stavros Sachtouris
        'For a list of containers: /file list']
439 1395c40e Stavros Sachtouris
440 1395c40e Stavros Sachtouris
    @classmethod
441 1395c40e Stavros Sachtouris
    def connection(this, foo):
442 f724cd35 Stavros Sachtouris
        return generic._connection(foo)
443 1395c40e Stavros Sachtouris
444 1395c40e Stavros Sachtouris
    @classmethod
445 300da0fb Stavros Sachtouris
    def account(this, foo):
446 300da0fb Stavros Sachtouris
        def _raise(self, *args, **kwargs):
447 300da0fb Stavros Sachtouris
            try:
448 300da0fb Stavros Sachtouris
                return foo(self, *args, **kwargs)
449 300da0fb Stavros Sachtouris
            except ClientError as ce:
450 300da0fb Stavros Sachtouris
                if ce.status == 403:
451 300da0fb Stavros Sachtouris
                    raiseCLIError(
452 300da0fb Stavros Sachtouris
                        ce,
453 300da0fb Stavros Sachtouris
                        'Invalid account credentials for this operation',
454 300da0fb Stavros Sachtouris
                        details=['Check user account settings'])
455 300da0fb Stavros Sachtouris
                raise
456 300da0fb Stavros Sachtouris
        return _raise
457 300da0fb Stavros Sachtouris
458 300da0fb Stavros Sachtouris
    @classmethod
459 1395c40e Stavros Sachtouris
    def quota(this, foo):
460 1395c40e Stavros Sachtouris
        def _raise(self, *args, **kwargs):
461 1395c40e Stavros Sachtouris
            try:
462 1395c40e Stavros Sachtouris
                return foo(self, *args, **kwargs)
463 1395c40e Stavros Sachtouris
            except ClientError as ce:
464 1395c40e Stavros Sachtouris
                if ce.status == 413:
465 1395c40e Stavros Sachtouris
                    raiseCLIError(ce, 'User quota exceeded', details=[
466 1395c40e Stavros Sachtouris
                        '* get quotas:',
467 3ae60112 Stavros Sachtouris
                        '  * upper total limit:      /file quota',
468 c626151a Stavros Sachtouris
                        '  * container limit:',
469 c626151a Stavros Sachtouris
                        '    /file containerlimit get <container>',
470 c626151a Stavros Sachtouris
                        '* set a higher container limit:',
471 c626151a Stavros Sachtouris
                        '    /file containerlimit set <limit> <container>'])
472 1395c40e Stavros Sachtouris
                raise
473 1395c40e Stavros Sachtouris
        return _raise
474 1395c40e Stavros Sachtouris
475 1395c40e Stavros Sachtouris
    @classmethod
476 1395c40e Stavros Sachtouris
    def container(this, foo):
477 1395c40e Stavros Sachtouris
        def _raise(self, *args, **kwargs):
478 1395c40e Stavros Sachtouris
            dst_cont = kwargs.get('dst_cont', None)
479 1395c40e Stavros Sachtouris
            try:
480 1395c40e Stavros Sachtouris
                return foo(self, *args, **kwargs)
481 1395c40e Stavros Sachtouris
            except ClientError as ce:
482 1395c40e Stavros Sachtouris
                if ce.status == 404 and 'container' in ('%s' % ce).lower():
483 de73876b Stavros Sachtouris
                        cont = ('%s or %s' % (
484 de73876b Stavros Sachtouris
                            self.container,
485 de73876b Stavros Sachtouris
                            dst_cont)) if dst_cont else self.container
486 de73876b Stavros Sachtouris
                        msg = 'Is container %s in current account?' % (cont),
487 de73876b Stavros Sachtouris
                        raiseCLIError(ce, msg, details=this.container_howto)
488 1395c40e Stavros Sachtouris
                raise
489 1395c40e Stavros Sachtouris
        return _raise
490 1395c40e Stavros Sachtouris
491 1395c40e Stavros Sachtouris
    @classmethod
492 68858765 Stavros Sachtouris
    def local_path(this, foo):
493 68858765 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
494 68858765 Stavros Sachtouris
            local_path = kwargs.get('local_path', '<None>')
495 68858765 Stavros Sachtouris
            try:
496 68858765 Stavros Sachtouris
                return foo(self, *args, **kwargs)
497 68858765 Stavros Sachtouris
            except IOError as ioe:
498 de73876b Stavros Sachtouris
                msg = 'Failed to access file %s' % local_path,
499 de73876b Stavros Sachtouris
                raiseCLIError(ioe, msg, importance=2)
500 68858765 Stavros Sachtouris
        return _raise
501 68858765 Stavros Sachtouris
502 68858765 Stavros Sachtouris
    @classmethod
503 1395c40e Stavros Sachtouris
    def object_path(this, foo):
504 1395c40e Stavros Sachtouris
        def _raise(self, *args, **kwargs):
505 1395c40e Stavros Sachtouris
            try:
506 1395c40e Stavros Sachtouris
                return foo(self, *args, **kwargs)
507 1395c40e Stavros Sachtouris
            except ClientError as ce:
508 1395c40e Stavros Sachtouris
                err_msg = ('%s' % ce).lower()
509 de73876b Stavros Sachtouris
                if (
510 de73876b Stavros Sachtouris
                    ce.status == 404 or ce.status == 500
511 de73876b Stavros Sachtouris
                ) and 'object' in err_msg and 'not' in err_msg:
512 de73876b Stavros Sachtouris
                    msg = 'No object %s in container %s' % (
513 de73876b Stavros Sachtouris
                        self.path,
514 de73876b Stavros Sachtouris
                        self.container)
515 de73876b Stavros Sachtouris
                    raiseCLIError(ce, msg, details=this.container_howto)
516 1395c40e Stavros Sachtouris
                raise
517 1395c40e Stavros Sachtouris
        return _raise
518 ca092af4 Stavros Sachtouris
519 ca092af4 Stavros Sachtouris
    @classmethod
520 ca092af4 Stavros Sachtouris
    def object_size(this, foo):
521 ca092af4 Stavros Sachtouris
        def _raise(self, *args, **kwargs):
522 ca092af4 Stavros Sachtouris
            size = kwargs.get('size', None)
523 ca092af4 Stavros Sachtouris
            start = kwargs.get('start', 0)
524 ca092af4 Stavros Sachtouris
            end = kwargs.get('end', 0)
525 ca092af4 Stavros Sachtouris
            if size:
526 ca092af4 Stavros Sachtouris
                try:
527 ca092af4 Stavros Sachtouris
                    size = int(size)
528 ca092af4 Stavros Sachtouris
                except ValueError as ve:
529 de73876b Stavros Sachtouris
                    msg = 'Invalid file size %s ' % size
530 de73876b Stavros Sachtouris
                    details = ['size must be a positive integer']
531 de73876b Stavros Sachtouris
                    raiseCLIError(ve, msg, details=details, importance=1)
532 ca092af4 Stavros Sachtouris
            else:
533 ca092af4 Stavros Sachtouris
                try:
534 ca092af4 Stavros Sachtouris
                    start = int(start)
535 ca092af4 Stavros Sachtouris
                except ValueError as e:
536 de73876b Stavros Sachtouris
                    msg = 'Invalid start value %s in range' % start,
537 de73876b Stavros Sachtouris
                    details = ['size must be a positive integer'],
538 de73876b Stavros Sachtouris
                    raiseCLIError(e, msg, details=details, importance=1)
539 ca092af4 Stavros Sachtouris
                try:
540 ca092af4 Stavros Sachtouris
                    end = int(end)
541 ca092af4 Stavros Sachtouris
                except ValueError as e:
542 de73876b Stavros Sachtouris
                    msg = 'Invalid end value %s in range' % end
543 de73876b Stavros Sachtouris
                    details = ['size must be a positive integer']
544 de73876b Stavros Sachtouris
                    raiseCLIError(e, msg, details=details, importance=1)
545 ca092af4 Stavros Sachtouris
                if start > end:
546 ca092af4 Stavros Sachtouris
                    raiseCLIError(
547 ca092af4 Stavros Sachtouris
                        'Invalid range %s-%s' % (start, end),
548 ca092af4 Stavros Sachtouris
                        details=['size must be a positive integer'],
549 ca092af4 Stavros Sachtouris
                        importance=1)
550 ca092af4 Stavros Sachtouris
                size = end - start
551 ca092af4 Stavros Sachtouris
            try:
552 ca092af4 Stavros Sachtouris
                return foo(self, *args, **kwargs)
553 ca092af4 Stavros Sachtouris
            except ClientError as ce:
554 ca092af4 Stavros Sachtouris
                err_msg = ('%s' % ce).lower()
555 24ff0a35 Stavros Sachtouris
                expected = 'object length is smaller than range length'
556 24ff0a35 Stavros Sachtouris
                if size and (
557 24ff0a35 Stavros Sachtouris
                    ce.status == 416 or (
558 24ff0a35 Stavros Sachtouris
                        ce.status == 400 and expected in err_msg)):
559 de73876b Stavros Sachtouris
                    raiseCLIError(ce, 'Remote object %s:%s <= %s %s' % (
560 24ff0a35 Stavros Sachtouris
                        self.container, self.path, format_size(size),
561 24ff0a35 Stavros Sachtouris
                        ('(%sB)' % size) if size >= 1024 else ''))
562 ca092af4 Stavros Sachtouris
                raise
563 ca092af4 Stavros Sachtouris
        return _raise