Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / management / cli_options.py @ 2be50766

History | View | Annotate | Download (3.8 kB)

1 2be50766 Christos Stavrakakis
# Copyright 2014 GRNET S.A. All rights reserved.
2 2be50766 Christos Stavrakakis
#
3 2be50766 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
4 2be50766 Christos Stavrakakis
# modification, are permitted provided that the following conditions
5 2be50766 Christos Stavrakakis
# are met:
6 2be50766 Christos Stavrakakis
#
7 2be50766 Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
8 2be50766 Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
9 2be50766 Christos Stavrakakis
#
10 2be50766 Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
11 2be50766 Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
12 2be50766 Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
13 2be50766 Christos Stavrakakis
#
14 2be50766 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 2be50766 Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 2be50766 Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 2be50766 Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 2be50766 Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 2be50766 Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 2be50766 Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 2be50766 Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 2be50766 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 2be50766 Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 2be50766 Christos Stavrakakis
# SUCH DAMAGE.
25 2be50766 Christos Stavrakakis
#
26 2be50766 Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
27 2be50766 Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
28 2be50766 Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
29 2be50766 Christos Stavrakakis
#
30 2be50766 Christos Stavrakakis
31 2be50766 Christos Stavrakakis
import astakosclient
32 2be50766 Christos Stavrakakis
from django.conf import settings
33 2be50766 Christos Stavrakakis
from optparse import make_option, OptionValueError
34 2be50766 Christos Stavrakakis
from snf_django.management.utils import parse_bool
35 2be50766 Christos Stavrakakis
36 2be50766 Christos Stavrakakis
37 2be50766 Christos Stavrakakis
class WrappedOptions(object):
38 2be50766 Christos Stavrakakis
    """Wrapper class to provide access to options as object attributes"""
39 2be50766 Christos Stavrakakis
    def __init__(self, options_dict):
40 2be50766 Christos Stavrakakis
        self.__dict__.update(options_dict)
41 2be50766 Christos Stavrakakis
42 2be50766 Christos Stavrakakis
43 2be50766 Christos Stavrakakis
def make_boolean_option(*args, **kwargs):
44 2be50766 Christos Stavrakakis
    """Helper function to create a boolean option."""
45 2be50766 Christos Stavrakakis
    def parse_boolean_option(option, option_str, value, parser):
46 2be50766 Christos Stavrakakis
        if value is not None:
47 2be50766 Christos Stavrakakis
            try:
48 2be50766 Christos Stavrakakis
                value = parse_bool(value)
49 2be50766 Christos Stavrakakis
            except ValueError:
50 2be50766 Christos Stavrakakis
                choices = "True, False"
51 2be50766 Christos Stavrakakis
                raise OptionValueError(
52 2be50766 Christos Stavrakakis
                    "option %s: invalid choice: %r (choose from %s)"
53 2be50766 Christos Stavrakakis
                    % (option, value, choices))
54 2be50766 Christos Stavrakakis
        setattr(parser.values, option.dest, value)
55 2be50766 Christos Stavrakakis
56 2be50766 Christos Stavrakakis
    return make_option(*args,
57 2be50766 Christos Stavrakakis
                       metavar="True|False",
58 2be50766 Christos Stavrakakis
                       type=str,
59 2be50766 Christos Stavrakakis
                       action="callback",
60 2be50766 Christos Stavrakakis
                       callback=parse_boolean_option,
61 2be50766 Christos Stavrakakis
                       **kwargs)
62 2be50766 Christos Stavrakakis
63 2be50766 Christos Stavrakakis
64 2be50766 Christos Stavrakakis
def parse_user_option(option, option_str, value, parser):
65 2be50766 Christos Stavrakakis
    """Callback to parser -u/--user option
66 2be50766 Christos Stavrakakis

67 2be50766 Christos Stavrakakis
    Translate uuid <-> email and add 'user_id' and 'user_email' to command
68 2be50766 Christos Stavrakakis
    options.
69 2be50766 Christos Stavrakakis

70 2be50766 Christos Stavrakakis
    """
71 2be50766 Christos Stavrakakis
    astakos = astakosclient.AstakosClient(settings.CYCLADES_SERVICE_TOKEN,
72 2be50766 Christos Stavrakakis
                                          settings.ASTAKOS_AUTH_URL,
73 2be50766 Christos Stavrakakis
                                          retry=2)
74 2be50766 Christos Stavrakakis
    try:
75 2be50766 Christos Stavrakakis
        if "@" in value:
76 2be50766 Christos Stavrakakis
            email = value
77 2be50766 Christos Stavrakakis
            uuid = astakos.service_get_uuid(email)
78 2be50766 Christos Stavrakakis
        else:
79 2be50766 Christos Stavrakakis
            uuid = value
80 2be50766 Christos Stavrakakis
            email = astakos.service_get_username(uuid)
81 2be50766 Christos Stavrakakis
    except astakosclient.errors.NoUUID:
82 2be50766 Christos Stavrakakis
        raise OptionValueError("User with email %r does not exist" % email)
83 2be50766 Christos Stavrakakis
    except astakosclient.errors.NoUserName:
84 2be50766 Christos Stavrakakis
        raise OptionValueError("User with uuid %r does not exist" % uuid)
85 2be50766 Christos Stavrakakis
    except astakosclient.errors.AstakosClientException as e:
86 2be50766 Christos Stavrakakis
        raise OptionValueError("Failed to get user info:\n%r" % e)
87 2be50766 Christos Stavrakakis
88 2be50766 Christos Stavrakakis
    setattr(parser.values, 'user_id', uuid)
89 2be50766 Christos Stavrakakis
    setattr(parser.values, 'user_email', email)
90 2be50766 Christos Stavrakakis
91 2be50766 Christos Stavrakakis
92 2be50766 Christos Stavrakakis
USER_OPT = make_option("-u", "--user",
93 2be50766 Christos Stavrakakis
                       default=None, type=str,
94 2be50766 Christos Stavrakakis
                       action="callback", callback=parse_user_option,
95 2be50766 Christos Stavrakakis
                       help="Specify the UUID or email of the user")