Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / __init__.py @ 3042fac1

History | View | Annotate | Download (13 kB)

1 27d3b17d Stavros Sachtouris
# Copyright 2011-2014 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 ddcb2e09 Stavros Sachtouris
from kamaki.cli.utils import (
36 ddcb2e09 Stavros Sachtouris
    print_list, print_dict, print_json, print_items, ask_user,
37 2f302751 Stavros Sachtouris
    filter_dicts_by_dict, DontRaiseUnicodeError, pref_enc)
38 6d190dd1 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument
39 f76c6bbc Stavros Sachtouris
from kamaki.cli.errors import CLIInvalidArgument
40 ff1c0296 Stavros Sachtouris
from sys import stdin, stdout, stderr
41 fd9457bd Stavros Sachtouris
import codecs
42 fd9457bd Stavros Sachtouris
43 6069b53b Stavros Sachtouris
44 0d4a6d0a Stavros Sachtouris
log = get_logger(__name__)
45 6069b53b Stavros Sachtouris
46 234954d1 Stavros Sachtouris
47 392d902d Stavros Sachtouris
def DontRaiseKeyError(func):
48 b4f69041 Stavros Sachtouris
    def wrap(*args, **kwargs):
49 b4f69041 Stavros Sachtouris
        try:
50 392d902d Stavros Sachtouris
            return func(*args, **kwargs)
51 b4f69041 Stavros Sachtouris
        except KeyError:
52 b4f69041 Stavros Sachtouris
            return None
53 b4f69041 Stavros Sachtouris
    return wrap
54 b4f69041 Stavros Sachtouris
55 b4f69041 Stavros Sachtouris
56 392d902d Stavros Sachtouris
def addLogSettings(func):
57 b4f69041 Stavros Sachtouris
    def wrap(self, *args, **kwargs):
58 b4f69041 Stavros Sachtouris
        try:
59 392d902d Stavros Sachtouris
            return func(self, *args, **kwargs)
60 b4f69041 Stavros Sachtouris
        finally:
61 b4f69041 Stavros Sachtouris
            self._set_log_params()
62 b4f69041 Stavros Sachtouris
    return wrap
63 b4f69041 Stavros Sachtouris
64 b4f69041 Stavros Sachtouris
65 c75be81a Stavros Sachtouris
def dataModification(func):
66 c75be81a Stavros Sachtouris
    def wrap(self, inp):
67 c75be81a Stavros Sachtouris
        try:
68 c75be81a Stavros Sachtouris
            inp = func(self, inp)
69 c75be81a Stavros Sachtouris
        except Exception as e:
70 c75be81a Stavros Sachtouris
            log.warning('WARNING: Error while running %s: %s' % (func, e))
71 c75be81a Stavros Sachtouris
            log.warning('\tWARNING: Kamaki will use original data to go on')
72 c75be81a Stavros Sachtouris
        finally:
73 c75be81a Stavros Sachtouris
            return inp
74 c75be81a Stavros Sachtouris
    return wrap
75 c75be81a Stavros Sachtouris
76 c75be81a Stavros Sachtouris
77 5eae854d Stavros Sachtouris
class _command_init(object):
78 36526b3c Stavros Sachtouris
79 56d84a4e Stavros Sachtouris
    # self.arguments (dict) contains all non-positional arguments
80 56d84a4e Stavros Sachtouris
    # self.required (list or tuple) contains required argument keys
81 56d84a4e Stavros Sachtouris
    #     if it is a list, at least one of these arguments is required
82 56d84a4e Stavros Sachtouris
    #     if it is a tuple, all arguments are required
83 56d84a4e Stavros Sachtouris
    #     Lists and tuples can nest other lists and/or tuples
84 56d84a4e Stavros Sachtouris
85 1757c616 Stavros Sachtouris
    def __init__(
86 1757c616 Stavros Sachtouris
            self,
87 ff1c0296 Stavros Sachtouris
            arguments={}, auth_base=None, cloud=None,
88 ff1c0296 Stavros Sachtouris
            _in=None, _out=None, _err=None):
89 ff1c0296 Stavros Sachtouris
        self._in, self._out, self._err = (
90 ff1c0296 Stavros Sachtouris
            _in or stdin, _out or stdout, _err or stderr)
91 3042fac1 Stavros Sachtouris
        self._in = codecs.getreader(pref_enc)(_in or stdin)
92 c2332605 Stavros Sachtouris
        self._out = codecs.getwriter(pref_enc)(_out or stdout)
93 c2332605 Stavros Sachtouris
        self._err = codecs.getwriter(pref_enc)(_err or stderr)
94 20206179 Stavros Sachtouris
        self.required = getattr(self, 'required', None)
95 e15d78e2 Stavros Sachtouris
        if hasattr(self, 'arguments'):
96 e15d78e2 Stavros Sachtouris
            arguments.update(self.arguments)
97 915b99b5 Stavros Sachtouris
        if isinstance(self, _optional_output_cmd):
98 915b99b5 Stavros Sachtouris
            arguments.update(self.oo_arguments)
99 545c6c29 Stavros Sachtouris
        if isinstance(self, _optional_json):
100 545c6c29 Stavros Sachtouris
            arguments.update(self.oj_arguments)
101 6d190dd1 Stavros Sachtouris
        if isinstance(self, _name_filter):
102 6d190dd1 Stavros Sachtouris
            arguments.update(self.nf_arguments)
103 6d190dd1 Stavros Sachtouris
        if isinstance(self, _id_filter):
104 6d190dd1 Stavros Sachtouris
            arguments.update(self.if_arguments)
105 60c42f9f Stavros Sachtouris
        try:
106 60c42f9f Stavros Sachtouris
            arguments.update(self.wait_arguments)
107 60c42f9f Stavros Sachtouris
        except AttributeError:
108 60c42f9f Stavros Sachtouris
            pass
109 e15d78e2 Stavros Sachtouris
        self.arguments = dict(arguments)
110 5eae854d Stavros Sachtouris
        try:
111 e15d78e2 Stavros Sachtouris
            self.config = self['config']
112 5eae854d Stavros Sachtouris
        except KeyError:
113 5eae854d Stavros Sachtouris
            pass
114 844a6bdb Stavros Sachtouris
        self.auth_base = auth_base or getattr(self, 'auth_base', None)
115 844a6bdb Stavros Sachtouris
        self.cloud = cloud or getattr(self, 'cloud', None)
116 5eae854d Stavros Sachtouris
117 2f302751 Stavros Sachtouris
    @DontRaiseUnicodeError
118 ff1c0296 Stavros Sachtouris
    def write(self, s):
119 90c22848 Stavros Sachtouris
        self._out.write(s)
120 ff1c0296 Stavros Sachtouris
        self._out.flush()
121 ff1c0296 Stavros Sachtouris
122 2f302751 Stavros Sachtouris
    @DontRaiseUnicodeError
123 ff1c0296 Stavros Sachtouris
    def writeln(self, s=''):
124 a5b748c2 Stavros Sachtouris
        self.write('%s\n' % s)
125 ff1c0296 Stavros Sachtouris
126 2f302751 Stavros Sachtouris
    @DontRaiseUnicodeError
127 ff1c0296 Stavros Sachtouris
    def error(self, s=''):
128 a5b748c2 Stavros Sachtouris
        self._err.write('%s\n' % s)
129 ff1c0296 Stavros Sachtouris
        self._err.flush()
130 ff1c0296 Stavros Sachtouris
131 ddcb2e09 Stavros Sachtouris
    def print_list(self, *args, **kwargs):
132 ddcb2e09 Stavros Sachtouris
        kwargs.setdefault('out', self._out)
133 76f58e2e Stavros Sachtouris
        return print_list(*args, **kwargs)
134 ddcb2e09 Stavros Sachtouris
135 ddcb2e09 Stavros Sachtouris
    def print_dict(self, *args, **kwargs):
136 90c22848 Stavros Sachtouris
        kwargs.setdefault('out', self)
137 76f58e2e Stavros Sachtouris
        return print_dict(*args, **kwargs)
138 ddcb2e09 Stavros Sachtouris
139 ddcb2e09 Stavros Sachtouris
    def print_json(self, *args, **kwargs):
140 90c22848 Stavros Sachtouris
        kwargs.setdefault('out', self)
141 76f58e2e Stavros Sachtouris
        return print_json(*args, **kwargs)
142 ddcb2e09 Stavros Sachtouris
143 ddcb2e09 Stavros Sachtouris
    def print_items(self, *args, **kwargs):
144 90c22848 Stavros Sachtouris
        kwargs.setdefault('out', self)
145 76f58e2e Stavros Sachtouris
        return print_items(*args, **kwargs)
146 ddcb2e09 Stavros Sachtouris
147 ddcb2e09 Stavros Sachtouris
    def ask_user(self, *args, **kwargs):
148 ddcb2e09 Stavros Sachtouris
        kwargs.setdefault('user_in', self._in)
149 90c22848 Stavros Sachtouris
        kwargs.setdefault('out', self)
150 76f58e2e Stavros Sachtouris
        return ask_user(*args, **kwargs)
151 ddcb2e09 Stavros Sachtouris
152 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
153 b4f69041 Stavros Sachtouris
    def _custom_url(self, service):
154 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_url' % service)
155 b4f69041 Stavros Sachtouris
156 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
157 b4f69041 Stavros Sachtouris
    def _custom_token(self, service):
158 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_token' % service)
159 b4f69041 Stavros Sachtouris
160 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
161 b4f69041 Stavros Sachtouris
    def _custom_type(self, service):
162 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_type' % service)
163 b4f69041 Stavros Sachtouris
164 b4f69041 Stavros Sachtouris
    @DontRaiseKeyError
165 b4f69041 Stavros Sachtouris
    def _custom_version(self, service):
166 144b3551 Stavros Sachtouris
        return self.config.get_cloud(self.cloud, '%s_version' % service)
167 b4f69041 Stavros Sachtouris
168 f1e5b343 Stavros Sachtouris
    def _uuids2usernames(self, uuids):
169 db93db3e Stavros Sachtouris
        return self.auth_base.post_user_catalogs(uuids)
170 f1e5b343 Stavros Sachtouris
171 f1e5b343 Stavros Sachtouris
    def _usernames2uuids(self, username):
172 db93db3e Stavros Sachtouris
        return self.auth_base.post_user_catalogs(displaynames=username)
173 f1e5b343 Stavros Sachtouris
174 95641ecc Stavros Sachtouris
    def _uuid2username(self, uuid):
175 f1e5b343 Stavros Sachtouris
        return self._uuids2usernames([uuid]).get(uuid, None)
176 95641ecc Stavros Sachtouris
177 95641ecc Stavros Sachtouris
    def _username2uuid(self, username):
178 f1e5b343 Stavros Sachtouris
        return self._usernames2uuids([username]).get(username, None)
179 95641ecc Stavros Sachtouris
180 f47417e7 Stavros Sachtouris
    def _set_log_params(self):
181 b3bb083f Stavros Sachtouris
        try:
182 64a3c0de Stavros Sachtouris
            self.client.LOG_TOKEN = (
183 534e7bbb Stavros Sachtouris
                self['config'].get('global', 'log_token').lower() == 'on')
184 64a3c0de Stavros Sachtouris
        except Exception as e:
185 64a3c0de Stavros Sachtouris
            log.debug('Failed to read custom log_token setting:'
186 64a3c0de Stavros Sachtouris
                '%s\n default for log_token is off' % e)
187 64a3c0de Stavros Sachtouris
        try:
188 64a3c0de Stavros Sachtouris
            self.client.LOG_DATA = (
189 534e7bbb Stavros Sachtouris
                self['config'].get('global', 'log_data').lower() == 'on')
190 c5b9380c Stavros Sachtouris
        except Exception as e:
191 64a3c0de Stavros Sachtouris
            log.debug('Failed to read custom log_data setting:'
192 64a3c0de Stavros Sachtouris
                '%s\n default for log_data is off' % e)
193 64a3c0de Stavros Sachtouris
        try:
194 64a3c0de Stavros Sachtouris
            self.client.LOG_PID = (
195 534e7bbb Stavros Sachtouris
                self['config'].get('global', 'log_pid').lower() == 'on')
196 64a3c0de Stavros Sachtouris
        except Exception as e:
197 64a3c0de Stavros Sachtouris
            log.debug('Failed to read custom log_pid setting:'
198 64a3c0de Stavros Sachtouris
                '%s\n default for log_pid is off' % e)
199 c5b9380c Stavros Sachtouris
200 8547cd19 Stavros Sachtouris
    def _safe_progress_bar(
201 8547cd19 Stavros Sachtouris
            self, msg, arg='progress_bar', countdown=False, timeout=100):
202 5a673575 Stavros Sachtouris
        """Try to get a progress bar, but do not raise errors"""
203 5a673575 Stavros Sachtouris
        try:
204 5a673575 Stavros Sachtouris
            progress_bar = self.arguments[arg]
205 ff1c0296 Stavros Sachtouris
            progress_bar.file = self._err
206 8547cd19 Stavros Sachtouris
            gen = progress_bar.get_generator(
207 8547cd19 Stavros Sachtouris
                msg, countdown=countdown, timeout=timeout)
208 5a673575 Stavros Sachtouris
        except Exception:
209 5a673575 Stavros Sachtouris
            return (None, None)
210 5a673575 Stavros Sachtouris
        return (progress_bar, gen)
211 5a673575 Stavros Sachtouris
212 5a673575 Stavros Sachtouris
    def _safe_progress_bar_finish(self, progress_bar):
213 5a673575 Stavros Sachtouris
        try:
214 5a673575 Stavros Sachtouris
            progress_bar.finish()
215 5a673575 Stavros Sachtouris
        except Exception:
216 5a673575 Stavros Sachtouris
            pass
217 5a673575 Stavros Sachtouris
218 5a37a189 Stavros Sachtouris
    def __getitem__(self, argterm):
219 5a37a189 Stavros Sachtouris
        """
220 5a37a189 Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
221 5a37a189 Stavros Sachtouris

222 b113e74b Stavros Sachtouris
        :returns: the value of the corresponding Argument (not the argument
223 b113e74b Stavros Sachtouris
            object)
224 5a37a189 Stavros Sachtouris

225 5a37a189 Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
226 5a37a189 Stavros Sachtouris
        """
227 b113e74b Stavros Sachtouris
        return self.arguments[argterm].value
228 5a37a189 Stavros Sachtouris
229 5a37a189 Stavros Sachtouris
    def __setitem__(self, argterm, arg):
230 5a37a189 Stavros Sachtouris
        """Install an argument as argterm
231 5a37a189 Stavros Sachtouris
        If argterm points to another argument, the other argument is lost
232 5a37a189 Stavros Sachtouris

233 5a37a189 Stavros Sachtouris
        :param argterm: (str)
234 5a37a189 Stavros Sachtouris

235 5a37a189 Stavros Sachtouris
        :param arg: (Argument)
236 5a37a189 Stavros Sachtouris
        """
237 5a37a189 Stavros Sachtouris
        if not hasattr(self, 'arguments'):
238 5a37a189 Stavros Sachtouris
            self.arguments = {}
239 5a37a189 Stavros Sachtouris
        self.arguments[argterm] = arg
240 5a37a189 Stavros Sachtouris
241 b113e74b Stavros Sachtouris
    def get_argument_object(self, argterm):
242 b113e74b Stavros Sachtouris
        """
243 b113e74b Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
244 b113e74b Stavros Sachtouris

245 b113e74b Stavros Sachtouris
        :returns: the arument object
246 b113e74b Stavros Sachtouris

247 b113e74b Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
248 b113e74b Stavros Sachtouris
        """
249 b113e74b Stavros Sachtouris
        return self.arguments[argterm]
250 b113e74b Stavros Sachtouris
251 5eae854d Stavros Sachtouris
    def get_argument(self, argterm):
252 5a37a189 Stavros Sachtouris
        """
253 5a37a189 Stavros Sachtouris
        :param argterm: (str) the name/label of an argument in self.arguments
254 5a37a189 Stavros Sachtouris

255 5a37a189 Stavros Sachtouris
        :returns: the value of the arument object
256 5a37a189 Stavros Sachtouris

257 5a37a189 Stavros Sachtouris
        :raises KeyError: if argterm not in self.arguments of this object
258 5a37a189 Stavros Sachtouris
        """
259 e15d78e2 Stavros Sachtouris
        return self[argterm]
260 915b99b5 Stavros Sachtouris
261 915b99b5 Stavros Sachtouris
262 545c6c29 Stavros Sachtouris
#  feature classes - inherit them to get special features for your commands
263 545c6c29 Stavros Sachtouris
264 545c6c29 Stavros Sachtouris
265 f76c6bbc Stavros Sachtouris
class OutputFormatArgument(ValueArgument):
266 f76c6bbc Stavros Sachtouris
    """Accepted output formats: json (default)"""
267 f76c6bbc Stavros Sachtouris
268 f76c6bbc Stavros Sachtouris
    formats = ('json', )
269 f76c6bbc Stavros Sachtouris
270 f76c6bbc Stavros Sachtouris
    def ___init__(self, *args, **kwargs):
271 f76c6bbc Stavros Sachtouris
        super(OutputFormatArgument, self).___init__(*args, **kwargs)
272 f76c6bbc Stavros Sachtouris
273 f76c6bbc Stavros Sachtouris
    @property
274 f76c6bbc Stavros Sachtouris
    def value(self):
275 9b3c8fd9 Stavros Sachtouris
        return getattr(self, '_value', None)
276 f76c6bbc Stavros Sachtouris
277 f76c6bbc Stavros Sachtouris
    @value.setter
278 f76c6bbc Stavros Sachtouris
    def value(self, newvalue):
279 f76c6bbc Stavros Sachtouris
        if not newvalue:
280 f76c6bbc Stavros Sachtouris
            self._value = self.default
281 f76c6bbc Stavros Sachtouris
        elif newvalue.lower() in self.formats:
282 f76c6bbc Stavros Sachtouris
            self._value = newvalue.lower
283 f76c6bbc Stavros Sachtouris
        else:
284 f76c6bbc Stavros Sachtouris
            raise CLIInvalidArgument(
285 f76c6bbc Stavros Sachtouris
                'Invalid value %s for argument %s' % (
286 eb647cfe Stavros Sachtouris
                    newvalue, self.lvalue),
287 f76c6bbc Stavros Sachtouris
                details=['Valid output formats: %s' % ', '.join(self.formats)])
288 f76c6bbc Stavros Sachtouris
289 f76c6bbc Stavros Sachtouris
290 915b99b5 Stavros Sachtouris
class _optional_output_cmd(object):
291 915b99b5 Stavros Sachtouris
292 915b99b5 Stavros Sachtouris
    oo_arguments = dict(
293 915b99b5 Stavros Sachtouris
        with_output=FlagArgument('show response headers', ('--with-output')),
294 f76c6bbc Stavros Sachtouris
        json_output=FlagArgument(
295 f76c6bbc Stavros Sachtouris
            'show headers in json (DEPRECATED from v0.12,'
296 de329b4c Stavros Sachtouris
            '  please use --output-format=json instead)', ('-j', '--json'))
297 915b99b5 Stavros Sachtouris
    )
298 915b99b5 Stavros Sachtouris
299 915b99b5 Stavros Sachtouris
    def _optional_output(self, r):
300 915b99b5 Stavros Sachtouris
        if self['json_output']:
301 90c22848 Stavros Sachtouris
            print_json(r, out=self)
302 915b99b5 Stavros Sachtouris
        elif self['with_output']:
303 90c22848 Stavros Sachtouris
            print_items([r] if isinstance(r, dict) else r, out=self)
304 545c6c29 Stavros Sachtouris
305 545c6c29 Stavros Sachtouris
306 545c6c29 Stavros Sachtouris
class _optional_json(object):
307 545c6c29 Stavros Sachtouris
308 545c6c29 Stavros Sachtouris
    oj_arguments = dict(
309 f76c6bbc Stavros Sachtouris
        output_format=OutputFormatArgument(
310 f76c6bbc Stavros Sachtouris
            'Show output in chosen output format (%s)' % ', '.join(
311 f76c6bbc Stavros Sachtouris
                OutputFormatArgument.formats),
312 f76c6bbc Stavros Sachtouris
            '--output-format'),
313 f76c6bbc Stavros Sachtouris
        json_output=FlagArgument(
314 f76c6bbc Stavros Sachtouris
            'show output in json (DEPRECATED from v0.12,'
315 f76c6bbc Stavros Sachtouris
            ' please use --output-format instead)', ('-j', '--json'))
316 545c6c29 Stavros Sachtouris
    )
317 545c6c29 Stavros Sachtouris
318 1757c616 Stavros Sachtouris
    def _print(self, output, print_method=print_items, **print_method_kwargs):
319 f76c6bbc Stavros Sachtouris
        if self['json_output'] or self['output_format']:
320 90c22848 Stavros Sachtouris
            print_json(output, out=self)
321 545c6c29 Stavros Sachtouris
        else:
322 90c22848 Stavros Sachtouris
            print_method_kwargs.setdefault('out', self)
323 eddaace7 Stavros Sachtouris
            print_method(output, **print_method_kwargs)
324 6d190dd1 Stavros Sachtouris
325 6d190dd1 Stavros Sachtouris
326 6d190dd1 Stavros Sachtouris
class _name_filter(object):
327 6d190dd1 Stavros Sachtouris
328 6d190dd1 Stavros Sachtouris
    nf_arguments = dict(
329 6d190dd1 Stavros Sachtouris
        name=ValueArgument('filter by name', '--name'),
330 6d190dd1 Stavros Sachtouris
        name_pref=ValueArgument(
331 6d190dd1 Stavros Sachtouris
            'filter by name prefix (case insensitive)', '--name-prefix'),
332 6d190dd1 Stavros Sachtouris
        name_suff=ValueArgument(
333 6d190dd1 Stavros Sachtouris
            'filter by name suffix (case insensitive)', '--name-suffix'),
334 6d190dd1 Stavros Sachtouris
        name_like=ValueArgument(
335 6d190dd1 Stavros Sachtouris
            'print only if name contains this (case insensitive)',
336 6d190dd1 Stavros Sachtouris
            '--name-like')
337 6d190dd1 Stavros Sachtouris
    )
338 6d190dd1 Stavros Sachtouris
339 6d190dd1 Stavros Sachtouris
    def _non_exact_name_filter(self, items):
340 6d190dd1 Stavros Sachtouris
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
341 6d190dd1 Stavros Sachtouris
        return [item for item in items if (
342 f3740b99 Stavros Sachtouris
            (not np) or (item['name'] or '').lower().startswith(
343 f3740b99 Stavros Sachtouris
                np.lower())) and (
344 f3740b99 Stavros Sachtouris
            (not ns) or (item['name'] or '').lower().endswith(
345 f3740b99 Stavros Sachtouris
                ns.lower())) and (
346 f3740b99 Stavros Sachtouris
            (not nl) or nl.lower() in (item['name'] or '').lower())]
347 6d190dd1 Stavros Sachtouris
348 6d190dd1 Stavros Sachtouris
    def _exact_name_filter(self, items):
349 f3740b99 Stavros Sachtouris
        return filter_dicts_by_dict(items, dict(name=self['name'] or '')) if (
350 6d190dd1 Stavros Sachtouris
            self['name']) else items
351 6d190dd1 Stavros Sachtouris
352 6d190dd1 Stavros Sachtouris
    def _filter_by_name(self, items):
353 6d190dd1 Stavros Sachtouris
        return self._non_exact_name_filter(self._exact_name_filter(items))
354 6d190dd1 Stavros Sachtouris
355 6d190dd1 Stavros Sachtouris
356 6d190dd1 Stavros Sachtouris
class _id_filter(object):
357 6d190dd1 Stavros Sachtouris
358 6d190dd1 Stavros Sachtouris
    if_arguments = dict(
359 6d190dd1 Stavros Sachtouris
        id=ValueArgument('filter by id', '--id'),
360 6d190dd1 Stavros Sachtouris
        id_pref=ValueArgument(
361 6d190dd1 Stavros Sachtouris
            'filter by id prefix (case insensitive)', '--id-prefix'),
362 6d190dd1 Stavros Sachtouris
        id_suff=ValueArgument(
363 6d190dd1 Stavros Sachtouris
            'filter by id suffix (case insensitive)', '--id-suffix'),
364 6d190dd1 Stavros Sachtouris
        id_like=ValueArgument(
365 aef3fa1f Stavros Sachtouris
            'print only if id contains this (case insensitive)', '--id-like')
366 6d190dd1 Stavros Sachtouris
    )
367 6d190dd1 Stavros Sachtouris
368 6d190dd1 Stavros Sachtouris
    def _non_exact_id_filter(self, items):
369 6d190dd1 Stavros Sachtouris
        np, ns, nl = self['id_pref'], self['id_suff'], self['id_like']
370 6d190dd1 Stavros Sachtouris
        return [item for item in items if (
371 6d190dd1 Stavros Sachtouris
            (not np) or (
372 6d190dd1 Stavros Sachtouris
                '%s' % item['id']).lower().startswith(np.lower())) and (
373 6d190dd1 Stavros Sachtouris
            (not ns) or ('%s' % item['id']).lower().endswith(ns.lower())) and (
374 6d190dd1 Stavros Sachtouris
            (not nl) or nl.lower() in ('%s' % item['id']).lower())]
375 6d190dd1 Stavros Sachtouris
376 6d190dd1 Stavros Sachtouris
    def _exact_id_filter(self, items):
377 6d190dd1 Stavros Sachtouris
        return filter_dicts_by_dict(items, dict(id=self['id'])) if (
378 6d190dd1 Stavros Sachtouris
            self['id']) else items
379 6d190dd1 Stavros Sachtouris
380 6d190dd1 Stavros Sachtouris
    def _filter_by_id(self, items):
381 6d190dd1 Stavros Sachtouris
        return self._non_exact_id_filter(self._exact_id_filter(items))