39 |
39 |
from kamaki.cli import _debug, kloger
|
40 |
40 |
from kamaki.cli.utils import format_size
|
41 |
41 |
|
42 |
|
CLOUDNAME = [
|
43 |
|
'Note: If you use a named cloud, use its name instead of "default"']
|
|
42 |
CLOUDNAME = ['Note: Set a cloud and use its name instead of "default"']
|
44 |
43 |
|
45 |
44 |
|
46 |
45 |
class generic(object):
|
... | ... | |
69 |
68 |
if ce.status == 401:
|
70 |
69 |
raiseCLIError(ce, 'Authorization failed', details=[
|
71 |
70 |
'Make sure a valid token is provided:',
|
72 |
|
' to check if token is valid: /user authenticate',
|
73 |
|
' to set token:',
|
74 |
|
' /config set cloud.default.token <token>',
|
75 |
|
' to get current token:',
|
76 |
|
' /config get cloud.default.token'] + CLOUDNAME)
|
|
71 |
' # to check if token is valid',
|
|
72 |
' $ kamaki user authenticate',
|
|
73 |
' # to set token:',
|
|
74 |
' $ kamaki config set cloud.default.token <token>',
|
|
75 |
' # to get current token:',
|
|
76 |
' $ kamaki config get cloud.default.token',
|
|
77 |
] + CLOUDNAME)
|
77 |
78 |
elif ce.status in range(-12, 200) + [302, 401, 500]:
|
78 |
79 |
raiseCLIError(ce, importance=3, details=[
|
79 |
80 |
'Check if service is up'])
|
... | ... | |
85 |
86 |
msg = 'Invalid service URL %s' % url
|
86 |
87 |
raiseCLIError(ce, msg, details=[
|
87 |
88 |
'Check if authentication URL is correct',
|
88 |
|
' check current URL:',
|
89 |
|
' /config get cloud.default.url',
|
90 |
|
' set new authentication URL:',
|
91 |
|
' /config set cloud.default.url'] + CLOUDNAME)
|
|
89 |
' # check current URL',
|
|
90 |
' $ kamaki config get cloud.default.url',
|
|
91 |
' # set new authentication URL',
|
|
92 |
' $ kamaki config set cloud.default.url'] + CLOUDNAME)
|
92 |
93 |
raise
|
93 |
94 |
return _raise
|
94 |
95 |
|
... | ... | |
98 |
99 |
_token_details = [
|
99 |
100 |
'To check default token: /config get cloud.default.token',
|
100 |
101 |
'If set/update a token:',
|
101 |
|
'* (permanent): /config set cloud.default.token <token>',
|
102 |
|
'* (temporary): re-run with <token> parameter'] + CLOUDNAME
|
|
102 |
' # (permanent)',
|
|
103 |
' $ kamaki config set cloud.default.token <token>'] + CLOUDNAME
|
103 |
104 |
|
104 |
105 |
@classmethod
|
105 |
106 |
def astakosclient(this, func):
|
... | ... | |
127 |
128 |
msg = 'Missing synnefo authentication URL'
|
128 |
129 |
raise CLIError(msg, importance=3, details=[
|
129 |
130 |
'Check if authentication URL is correct',
|
130 |
|
' check current URL:',
|
131 |
|
' /config get cloud.default.url',
|
132 |
|
' set new auth. URL:',
|
133 |
|
' /config set cloud.default.url'] + CLOUDNAME)
|
|
131 |
' # check current URL:',
|
|
132 |
' $ kamaki config get cloud.default.url',
|
|
133 |
' # set new auth. URL:',
|
|
134 |
' $ kamaki config set cloud.default.url'] + CLOUDNAME)
|
134 |
135 |
return r
|
135 |
136 |
return _raise
|
136 |
137 |
|
... | ... | |
175 |
176 |
class cyclades(object):
|
176 |
177 |
about_flavor_id = [
|
177 |
178 |
'How to pick a valid flavor id:',
|
178 |
|
'* get a list of flavor ids: /flavor list',
|
179 |
|
'* details of flavor: /flavor info <flavor id>']
|
|
179 |
' # get a list of flavor ids',
|
|
180 |
' $ kamaki flavor list',
|
|
181 |
' # details of flavor',
|
|
182 |
' $ kamaki flavor info <flavor id>',
|
|
183 |
'',
|
|
184 |
]
|
180 |
185 |
|
181 |
186 |
about_network_id = [
|
182 |
187 |
'How to pick a valid network id:',
|
183 |
|
'* get a list of network ids: /network list',
|
184 |
|
'* details of network: /network info <network id>']
|
|
188 |
' # get a list of network ids',
|
|
189 |
' $ kamaki network list',
|
|
190 |
' # details of network',
|
|
191 |
' $ kamaki network info <network id>',
|
|
192 |
'',
|
|
193 |
]
|
185 |
194 |
|
186 |
195 |
net_types = ('CUSTOM', 'MAC_FILTERED', 'IP_LESS_ROUTED', 'PHYSICAL_VLAN')
|
187 |
196 |
|
... | ... | |
252 |
261 |
return _raise
|
253 |
262 |
|
254 |
263 |
@classmethod
|
255 |
|
def network_max(this, func):
|
256 |
|
def _raise(self, *args, **kwargs):
|
257 |
|
try:
|
258 |
|
return func(self, *args, **kwargs)
|
259 |
|
except ClientError as ce:
|
260 |
|
if ce.status == 413:
|
261 |
|
msg = 'Cannot create another network',
|
262 |
|
details = [
|
263 |
|
'Maximum number of networks reached',
|
264 |
|
'* to get a list of networks: /network list',
|
265 |
|
'* to delete a network: /network delete <net id>']
|
266 |
|
raiseCLIError(ce, msg, details=details)
|
267 |
|
raise
|
268 |
|
return _raise
|
269 |
|
|
270 |
|
@classmethod
|
271 |
|
def network_in_use(this, func):
|
272 |
|
def _raise(self, *args, **kwargs):
|
273 |
|
network_id = kwargs.get('network_id', None)
|
274 |
|
try:
|
275 |
|
return func(self, *args, **kwargs)
|
276 |
|
except ClientError as ce:
|
277 |
|
if network_id and ce.status in (400, ):
|
278 |
|
msg = 'Network with id %s does not exist' % network_id,
|
279 |
|
raiseCLIError(ce, msg, details=this.about_network_id)
|
280 |
|
elif network_id or ce.status in (421, ):
|
281 |
|
msg = 'Network with id %s is in use' % network_id,
|
282 |
|
raiseCLIError(ce, msg, details=[
|
283 |
|
'Disconnect all nics/servers of this network first',
|
284 |
|
'* to get nics: /network info %s' % network_id,
|
285 |
|
'. (under "attachments" section)',
|
286 |
|
'* to disconnect: /network disconnect <nic id>'])
|
287 |
|
raise
|
288 |
|
return _raise
|
289 |
|
|
290 |
|
@classmethod
|
291 |
264 |
def flavor_id(this, func):
|
292 |
265 |
def _raise(self, *args, **kwargs):
|
293 |
266 |
flavor_id = kwargs.get('flavor_id', None)
|
... | ... | |
327 |
300 |
):
|
328 |
301 |
msg = 'virtual server with id %s not found' % server_id,
|
329 |
302 |
raiseCLIError(ce, msg, details=[
|
330 |
|
'* to get ids of all servers: /server list',
|
331 |
|
'* to get server details: /server info <server id>'])
|
|
303 |
'# to get ids of all servers',
|
|
304 |
'$ kamaki server list',
|
|
305 |
'# to get server details',
|
|
306 |
'$ kamaki server info <server id>'])
|
332 |
307 |
raise
|
333 |
308 |
return _raise
|
334 |
309 |
|
... | ... | |
375 |
350 |
return _raise
|
376 |
351 |
|
377 |
352 |
@classmethod
|
378 |
|
def nic_format(this, func):
|
379 |
|
def _raise(self, *args, **kwargs):
|
380 |
|
try:
|
381 |
|
return func(self, *args, **kwargs)
|
382 |
|
except IndexError as ie:
|
383 |
|
nic_id = kwargs.get('nic_id', None)
|
384 |
|
msg = 'Invalid format for network interface (nic) %s' % nic_id
|
385 |
|
raiseCLIError(ie, msg, importance=1, details=[
|
386 |
|
'nid_id format: nic-<server id>-<nic id>',
|
387 |
|
'* get nics of a network: /network info <net id>',
|
388 |
|
' (listed the "attachments" section)'])
|
389 |
|
return _raise
|
390 |
|
|
391 |
|
@classmethod
|
392 |
353 |
def metadata(this, func):
|
393 |
354 |
def _raise(self, *args, **kwargs):
|
394 |
355 |
key = kwargs.get('key', None)
|
... | ... | |
408 |
369 |
|
409 |
370 |
about_image_id = [
|
410 |
371 |
'How to pick a suitable image:',
|
411 |
|
'* get a list of image ids: /image list',
|
412 |
|
'* details of image: /image meta <image id>']
|
|
372 |
' # get a list of image ids',
|
|
373 |
' $ kamaki image list',
|
|
374 |
' # details of an image',
|
|
375 |
' $ kamaki image meta <image id>',
|
|
376 |
'',
|
|
377 |
]
|
413 |
378 |
|
414 |
379 |
@classmethod
|
415 |
380 |
def connection(this, func):
|
... | ... | |
452 |
417 |
|
453 |
418 |
class pithos(object):
|
454 |
419 |
container_howto = [
|
455 |
|
'To specify a container:',
|
456 |
|
' 1. --container=<container> (temporary, overrides all)',
|
457 |
|
' 2. Use the container:path format (temporary, overrides 3)',
|
458 |
|
' 3. Set pithos_container variable (permanent)',
|
459 |
|
' /config set pithos_container <container>',
|
460 |
|
'For a list of containers: /file list']
|
|
420 |
'Use a / to refer to a container (default: /pithos) e.g.,',
|
|
421 |
' # list the contents of container "images"',
|
|
422 |
' $ kamaki file list /images',
|
|
423 |
' # get information on file "my.img" in container "images"',
|
|
424 |
' $ kamaki file info /images/my.img',
|
|
425 |
'',
|
|
426 |
'To get a list of containers:',
|
|
427 |
' $ kamaki container list',
|
|
428 |
'',
|
|
429 |
]
|
461 |
430 |
|
462 |
431 |
@classmethod
|
463 |
432 |
def connection(this, func):
|
... | ... | |
505 |
474 |
cont = ('%s or %s' % (
|
506 |
475 |
self.container,
|
507 |
476 |
dst_cont)) if dst_cont else self.container
|
508 |
|
msg = 'Is container %s in current account?' % (cont),
|
|
477 |
msg = 'Container "%s" does not exist' % cont,
|
509 |
478 |
raiseCLIError(ce, msg, details=this.container_howto)
|
510 |
479 |
raise
|
511 |
480 |
return _raise
|