Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / __init__.py @ 8f984bae

History | View | Annotate | Download (9.3 kB)

1 e3f01d64 Stavros Sachtouris
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 5eae854d Stavros Sachtouris
#
3 5eae854d Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 5eae854d Stavros Sachtouris
# without modification, are permitted provided that the following
5 5eae854d Stavros Sachtouris
# conditions are met:
6 5eae854d Stavros Sachtouris
#
7 5eae854d Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 5eae854d Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 5eae854d Stavros Sachtouris
#      disclaimer.
10 5eae854d Stavros Sachtouris
#
11 5eae854d Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 5eae854d Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 5eae854d Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 5eae854d Stavros Sachtouris
#      provided with the distribution.
15 5eae854d Stavros Sachtouris
#
16 5eae854d Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 5eae854d Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 5eae854d Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 5eae854d Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 5eae854d Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 5eae854d Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 5eae854d Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 5eae854d Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 5eae854d Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 5eae854d Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 5eae854d Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 5eae854d Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 5eae854d Stavros Sachtouris
#
29 5eae854d Stavros Sachtouris
# The views and conclusions contained in the software and
30 5eae854d Stavros Sachtouris
# documentation are those of the authors and should not be
31 5eae854d Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 5eae854d Stavros Sachtouris
# or implied, of GRNET S.A.command
33 5eae854d Stavros Sachtouris
34 137c51f5 Stavros Sachtouris
from kamaki.cli.logger import get_logger
35 6d190dd1 Stavros Sachtouris
from kamaki.cli.utils import print_json, print_items, filter_dicts_by_dict
36 6d190dd1 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument
37 6069b53b Stavros Sachtouris
38 0d4a6d0a Stavros Sachtouris
log = get_logger(__name__)
39 6069b53b Stavros Sachtouris
40 234954d1 Stavros Sachtouris
41 b4f69041 Stavros Sachtouris
def DontRaiseKeyError(foo):
42 b4f69041 Stavros Sachtouris
    def wrap(*args, **kwargs):
43 b4f69041 Stavros Sachtouris
        try:
44 b4f69041 Stavros Sachtouris
            return foo(*args, **kwargs)
45 b4f69041 Stavros Sachtouris
        except KeyError:
46 b4f69041 Stavros Sachtouris
            return None
47 b4f69041 Stavros Sachtouris
    return wrap
48 b4f69041 Stavros Sachtouris
49 b4f69041 Stavros Sachtouris
50 b4f69041 Stavros Sachtouris
def addLogSettings(foo):
51 b4f69041 Stavros Sachtouris
    def wrap(self, *args, **kwargs):
52 b4f69041 Stavros Sachtouris
        try:
53 b4f69041 Stavros Sachtouris
            return foo(self, *args, **kwargs)
54 b4f69041 Stavros Sachtouris
        finally:
55 b4f69041 Stavros Sachtouris
            self._set_log_params()
56 b4f69041 Stavros Sachtouris
            self._update_max_threads
57 b4f69041 Stavros Sachtouris
    return wrap
58 b4f69041 Stavros Sachtouris
59 b4f69041 Stavros Sachtouris
60 5eae854d Stavros Sachtouris
class _command_init(object):
61 36526b3c Stavros Sachtouris
62 844a6bdb Stavros Sachtouris
    def __init__(self, arguments={}, auth_base=None, cloud=None):
63 e15d78e2 Stavros Sachtouris
        if hasattr(self, 'arguments'):
64 e15d78e2 Stavros Sachtouris
            arguments.update(self.arguments)
65 915b99b5 Stavros Sachtouris
        if isinstance(self, _optional_output_cmd):
66 915b99b5 Stavros Sachtouris
            arguments.update(self.oo_arguments)
67 545c6c29 Stavros Sachtouris
        if isinstance(self, _optional_json):
68 545c6c29 Stavros Sachtouris
            arguments.update(self.oj_arguments)
69 6d190dd1 Stavros Sachtouris
        if isinstance(self, _name_filter):
70 6d190dd1 Stavros Sachtouris
            arguments.update(self.nf_arguments)
71 6d190dd1 Stavros Sachtouris
        if isinstance(self, _id_filter):
72 6d190dd1 Stavros Sachtouris
            arguments.update(self.if_arguments)
73 60c42f9f Stavros Sachtouris
        try:
74 60c42f9f Stavros Sachtouris
            arguments.update(self.wait_arguments)
75 60c42f9f Stavros Sachtouris
        except AttributeError:
76 60c42f9f Stavros Sachtouris
            pass
77 e15d78e2 Stavros Sachtouris
        self.arguments = dict(arguments)
78 5eae854d Stavros Sachtouris
        try:
79 e15d78e2 Stavros Sachtouris
            self.config = self['config']
80 5eae854d Stavros Sachtouris
        except KeyError:
81 5eae854d Stavros Sachtouris
            pass
82 844a6bdb Stavros Sachtouris
        self.auth_base = auth_base or getattr(self, 'auth_base', None)
83 844a6bdb Stavros Sachtouris
        self.cloud = cloud or getattr(self, 'cloud', None)
84 5eae854d Stavros Sachtouris
85 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
86 b4f69041 Stavros Sachtouris
    def _custom_url(self, service):
87 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_url' % service)
88 b4f69041 Stavros Sachtouris
89 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
90 b4f69041 Stavros Sachtouris
    def _custom_token(self, service):
91 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_token' % service)
92 b4f69041 Stavros Sachtouris
93 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
94 b4f69041 Stavros Sachtouris
    def _custom_type(self, service):
95 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_type' % service)
96 b4f69041 Stavros Sachtouris
97 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
98 b4f69041 Stavros Sachtouris
    def _custom_version(self, service):
99 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_version' % service)
100 b4f69041 Stavros Sachtouris
101 f1e5b343 Stavros Sachtouris
    def _uuids2usernames(self, uuids):
102 f1e5b343 Stavros Sachtouris
        return self.auth_base.post_user_catalogs(uuids).json['uuid_catalog']
103 f1e5b343 Stavros Sachtouris
104 f1e5b343 Stavros Sachtouris
    def _usernames2uuids(self, username):
105 f1e5b343 Stavros Sachtouris
        return self.auth_base.post_user_catalogs(
106 f1e5b343 Stavros Sachtouris
            displaynames=username).json['displayname_catalog']
107 f1e5b343 Stavros Sachtouris
108 95641ecc Stavros Sachtouris
    def _uuid2username(self, uuid):
109 f1e5b343 Stavros Sachtouris
        return self._uuids2usernames([uuid]).get(uuid, None)
110 95641ecc Stavros Sachtouris
111 95641ecc Stavros Sachtouris
    def _username2uuid(self, username):
112 f1e5b343 Stavros Sachtouris
        return self._usernames2uuids([username]).get(username, None)
113 95641ecc Stavros Sachtouris
114 f47417e7 Stavros Sachtouris
    def _set_log_params(self):
115 b3bb083f Stavros Sachtouris
        try:
116 5fdccdec Stavros Sachtouris
            self.client.LOG_TOKEN, self.client.LOG_DATA = (
117 362adf50 Stavros Sachtouris
                self['config'].get_global('log_token').lower() == 'on',
118 362adf50 Stavros Sachtouris
                self['config'].get_global('log_data').lower() == 'on')
119 c5b9380c Stavros Sachtouris
        except Exception as e:
120 47f37f7c Stavros Sachtouris
            log.debug('Failed to read custom log settings:'
121 0d4a6d0a Stavros Sachtouris
                '%s\n defaults for token and data logging are off' % e)
122 c5b9380c Stavros Sachtouris
123 c5b9380c Stavros Sachtouris
    def _update_max_threads(self):
124 b4f69041 Stavros Sachtouris
        if getattr(self, 'client', None):
125 362adf50 Stavros Sachtouris
            max_threads = int(self['config'].get_global('max_threads'))
126 c5b9380c Stavros Sachtouris
            assert max_threads > 0
127 c5b9380c Stavros Sachtouris
            self.client.MAX_THREADS = max_threads
128 5fdccdec Stavros Sachtouris
129 5a673575 Stavros Sachtouris
    def _safe_progress_bar(self, msg, arg='progress_bar'):
130 5a673575 Stavros Sachtouris
        """Try to get a progress bar, but do not raise errors"""
131 5a673575 Stavros Sachtouris
        try:
132 5a673575 Stavros Sachtouris
            progress_bar = self.arguments[arg]
133 5a673575 Stavros Sachtouris
            gen = progress_bar.get_generator(msg)
134 5a673575 Stavros Sachtouris
        except Exception:
135 5a673575 Stavros Sachtouris
            return (None, None)
136 5a673575 Stavros Sachtouris
        return (progress_bar, gen)
137 5a673575 Stavros Sachtouris
138 5a673575 Stavros Sachtouris
    def _safe_progress_bar_finish(self, progress_bar):
139 5a673575 Stavros Sachtouris
        try:
140 5a673575 Stavros Sachtouris
            progress_bar.finish()
141 5a673575 Stavros Sachtouris
        except Exception:
142 5a673575 Stavros Sachtouris
            pass
143 5a673575 Stavros Sachtouris
144 5a37a189 Stavros Sachtouris
    def __getitem__(self, argterm):
145 5a37a189 Stavros Sachtouris
        """
146 5a37a189 Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
147 5a37a189 Stavros Sachtouris

148 b113e74b Stavros Sachtouris
        :returns: the value of the corresponding Argument (not the argument
149 b113e74b Stavros Sachtouris
            object)
150 5a37a189 Stavros Sachtouris

151 5a37a189 Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
152 5a37a189 Stavros Sachtouris
        """
153 b113e74b Stavros Sachtouris
        return self.arguments[argterm].value
154 5a37a189 Stavros Sachtouris
155 5a37a189 Stavros Sachtouris
    def __setitem__(self, argterm, arg):
156 5a37a189 Stavros Sachtouris
        """Install an argument as argterm
157 5a37a189 Stavros Sachtouris
        If argterm points to another argument, the other argument is lost
158 5a37a189 Stavros Sachtouris

159 5a37a189 Stavros Sachtouris
        :param argterm: (str)
160 5a37a189 Stavros Sachtouris

161 5a37a189 Stavros Sachtouris
        :param arg: (Argument)
162 5a37a189 Stavros Sachtouris
        """
163 5a37a189 Stavros Sachtouris
        if not hasattr(self, 'arguments'):
164 5a37a189 Stavros Sachtouris
            self.arguments = {}
165 5a37a189 Stavros Sachtouris
        self.arguments[argterm] = arg
166 5a37a189 Stavros Sachtouris
167 b113e74b Stavros Sachtouris
    def get_argument_object(self, argterm):
168 b113e74b Stavros Sachtouris
        """
169 b113e74b Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
170 b113e74b Stavros Sachtouris

171 b113e74b Stavros Sachtouris
        :returns: the arument object
172 b113e74b Stavros Sachtouris

173 b113e74b Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
174 b113e74b Stavros Sachtouris
        """
175 b113e74b Stavros Sachtouris
        return self.arguments[argterm]
176 b113e74b Stavros Sachtouris
177 5eae854d Stavros Sachtouris
    def get_argument(self, argterm):
178 5a37a189 Stavros Sachtouris
        """
179 5a37a189 Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
180 5a37a189 Stavros Sachtouris

181 5a37a189 Stavros Sachtouris
        :returns: the value of the arument object
182 5a37a189 Stavros Sachtouris

183 5a37a189 Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
184 5a37a189 Stavros Sachtouris
        """
185 e15d78e2 Stavros Sachtouris
        return self[argterm]
186 915b99b5 Stavros Sachtouris
187 915b99b5 Stavros Sachtouris
188 545c6c29 Stavros Sachtouris
#  feature classes - inherit them to get special features for your commands
189 545c6c29 Stavros Sachtouris
190 545c6c29 Stavros Sachtouris
191 915b99b5 Stavros Sachtouris
class _optional_output_cmd(object):
192 915b99b5 Stavros Sachtouris
193 915b99b5 Stavros Sachtouris
    oo_arguments = dict(
194 915b99b5 Stavros Sachtouris
        with_output=FlagArgument('show response headers', ('--with-output')),
195 915b99b5 Stavros Sachtouris
        json_output=FlagArgument('show headers in json', ('-j', '--json'))
196 915b99b5 Stavros Sachtouris
    )
197 915b99b5 Stavros Sachtouris
198 915b99b5 Stavros Sachtouris
    def _optional_output(self, r):
199 915b99b5 Stavros Sachtouris
        if self['json_output']:
200 915b99b5 Stavros Sachtouris
            print_json(r)
201 915b99b5 Stavros Sachtouris
        elif self['with_output']:
202 915b99b5 Stavros Sachtouris
            print_items([r] if isinstance(r, dict) else r)
203 545c6c29 Stavros Sachtouris
204 545c6c29 Stavros Sachtouris
205 545c6c29 Stavros Sachtouris
class _optional_json(object):
206 545c6c29 Stavros Sachtouris
207 545c6c29 Stavros Sachtouris
    oj_arguments = dict(
208 545c6c29 Stavros Sachtouris
        json_output=FlagArgument('show headers in json', ('-j', '--json'))
209 545c6c29 Stavros Sachtouris
    )
210 545c6c29 Stavros Sachtouris
211 545c6c29 Stavros Sachtouris
    def _print(self, output, print_method=print_items, **print_method_kwargs):
212 545c6c29 Stavros Sachtouris
        if self['json_output']:
213 545c6c29 Stavros Sachtouris
            print_json(output)
214 545c6c29 Stavros Sachtouris
        else:
215 545c6c29 Stavros Sachtouris
            print_method(output, **print_method_kwargs)
216 6d190dd1 Stavros Sachtouris
217 6d190dd1 Stavros Sachtouris
218 6d190dd1 Stavros Sachtouris
class _name_filter(object):
219 6d190dd1 Stavros Sachtouris
220 6d190dd1 Stavros Sachtouris
    nf_arguments = dict(
221 6d190dd1 Stavros Sachtouris
        name=ValueArgument('filter by name', '--name'),
222 6d190dd1 Stavros Sachtouris
        name_pref=ValueArgument(
223 6d190dd1 Stavros Sachtouris
            'filter by name prefix (case insensitive)', '--name-prefix'),
224 6d190dd1 Stavros Sachtouris
        name_suff=ValueArgument(
225 6d190dd1 Stavros Sachtouris
            'filter by name suffix (case insensitive)', '--name-suffix'),
226 6d190dd1 Stavros Sachtouris
        name_like=ValueArgument(
227 6d190dd1 Stavros Sachtouris
            'print only if name contains this (case insensitive)',
228 6d190dd1 Stavros Sachtouris
            '--name-like')
229 6d190dd1 Stavros Sachtouris
    )
230 6d190dd1 Stavros Sachtouris
231 6d190dd1 Stavros Sachtouris
    def _non_exact_name_filter(self, items):
232 6d190dd1 Stavros Sachtouris
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
233 6d190dd1 Stavros Sachtouris
        return [item for item in items if (
234 6d190dd1 Stavros Sachtouris
            (not np) or item['name'].lower().startswith(np.lower())) and (
235 6d190dd1 Stavros Sachtouris
            (not ns) or item['name'].lower().endswith(ns.lower())) and (
236 6d190dd1 Stavros Sachtouris
            (not nl) or nl.lower() in item['name'].lower())]
237 6d190dd1 Stavros Sachtouris
238 6d190dd1 Stavros Sachtouris
    def _exact_name_filter(self, items):
239 6d190dd1 Stavros Sachtouris
        return filter_dicts_by_dict(items, dict(name=self['name'])) if (
240 6d190dd1 Stavros Sachtouris
            self['name']) else items
241 6d190dd1 Stavros Sachtouris
242 6d190dd1 Stavros Sachtouris
    def _filter_by_name(self, items):
243 6d190dd1 Stavros Sachtouris
        return self._non_exact_name_filter(self._exact_name_filter(items))
244 6d190dd1 Stavros Sachtouris
245 6d190dd1 Stavros Sachtouris
246 6d190dd1 Stavros Sachtouris
class _id_filter(object):
247 6d190dd1 Stavros Sachtouris
248 6d190dd1 Stavros Sachtouris
    if_arguments = dict(
249 6d190dd1 Stavros Sachtouris
        id=ValueArgument('filter by id', '--id'),
250 6d190dd1 Stavros Sachtouris
        id_pref=ValueArgument(
251 6d190dd1 Stavros Sachtouris
            'filter by id prefix (case insensitive)', '--id-prefix'),
252 6d190dd1 Stavros Sachtouris
        id_suff=ValueArgument(
253 6d190dd1 Stavros Sachtouris
            'filter by id suffix (case insensitive)', '--id-suffix'),
254 6d190dd1 Stavros Sachtouris
        id_like=ValueArgument(
255 6d190dd1 Stavros Sachtouris
            'print only if id contains this (case insensitive)',
256 6d190dd1 Stavros Sachtouris
            '--id-like')
257 6d190dd1 Stavros Sachtouris
    )
258 6d190dd1 Stavros Sachtouris
259 6d190dd1 Stavros Sachtouris
    def _non_exact_id_filter(self, items):
260 6d190dd1 Stavros Sachtouris
        np, ns, nl = self['id_pref'], self['id_suff'], self['id_like']
261 6d190dd1 Stavros Sachtouris
        return [item for item in items if (
262 6d190dd1 Stavros Sachtouris
            (not np) or (
263 6d190dd1 Stavros Sachtouris
                '%s' % item['id']).lower().startswith(np.lower())) and (
264 6d190dd1 Stavros Sachtouris
            (not ns) or ('%s' % item['id']).lower().endswith(ns.lower())) and (
265 6d190dd1 Stavros Sachtouris
            (not nl) or nl.lower() in ('%s' % item['id']).lower())]
266 6d190dd1 Stavros Sachtouris
267 6d190dd1 Stavros Sachtouris
    def _exact_id_filter(self, items):
268 6d190dd1 Stavros Sachtouris
        return filter_dicts_by_dict(items, dict(id=self['id'])) if (
269 6d190dd1 Stavros Sachtouris
            self['id']) else items
270 6d190dd1 Stavros Sachtouris
271 6d190dd1 Stavros Sachtouris
    def _filter_by_id(self, items):
272 6d190dd1 Stavros Sachtouris
        return self._non_exact_id_filter(self._exact_id_filter(items))