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 |