summaryrefslogtreecommitdiffstats
path: root/nova/openstack
diff options
context:
space:
mode:
authorJoe Gordon <jogo@cloudscaling.com>2012-12-06 11:41:26 +0200
committerJoe Gordon <jogo@cloudscaling.com>2012-12-06 11:41:26 +0200
commiteb39f01402117871f125023be0985ff90b277fb1 (patch)
treee82f613f32074c6a6b663fd45012b85cf8fd7878 /nova/openstack
parent4d648c4b3d480dc3cc2dbb4d77f561f0bd4de426 (diff)
downloadnova-eb39f01402117871f125023be0985ff90b277fb1.tar.gz
nova-eb39f01402117871f125023be0985ff90b277fb1.tar.xz
nova-eb39f01402117871f125023be0985ff90b277fb1.zip
Add new cliutils code from oslo-incubator.
Change-Id: I03d93c5024965d4252a18d8cb564a7512b728994
Diffstat (limited to 'nova/openstack')
-rw-r--r--nova/openstack/common/cliutils.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/nova/openstack/common/cliutils.py b/nova/openstack/common/cliutils.py
new file mode 100644
index 000000000..8f4dc44dd
--- /dev/null
+++ b/nova/openstack/common/cliutils.py
@@ -0,0 +1,66 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2012 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import inspect
+import string
+
+
+class MissingArgs(Exception):
+
+ def __init__(self, missing):
+ self.missing = missing
+
+ def __str__(self):
+ if len(self.missing) == 1:
+ return ("An argument is missing: %(missing)s" %
+ dict(missing=self.missing[0]))
+ else:
+ return ("%(num)d arguments are missing: %(missing)s" %
+ dict(num=len(self.missing),
+ missing=string.join(self.missing, ', ')))
+
+
+def validate_args(fn, *args, **kwargs):
+ """Check that the supplied args are sufficient for calling a function.
+
+ >>> validate_args(lambda a: None)
+ Traceback (most recent call last):
+ ...
+ MissingArgs: An argument is missing: a
+ >>> validate_args(lambda a, b, c, d: None, 0, c=1)
+ Traceback (most recent call last):
+ ...
+ MissingArgs: 2 arguments are missing: b, d
+
+ :param fn: the function to check
+ :param arg: the positional arguments supplied
+ :param kwargs: the keyword arguments supplied
+ """
+ argspec = inspect.getargspec(fn)
+
+ num_defaults = len(argspec.defaults or [])
+ required_args = argspec.args[:len(argspec.args) - num_defaults]
+
+ def isbound(method):
+ return getattr(method, 'im_self', None) is not None
+
+ if isbound(fn):
+ required_args.pop(0)
+
+ missing = [arg for arg in required_args if arg not in kwargs]
+ missing = missing[len(args):]
+ if missing:
+ raise MissingArgs(missing)