summaryrefslogtreecommitdiffstats
path: root/openstack
diff options
context:
space:
mode:
authorJay Pipes <jaypipes@gmail.com>2011-07-26 12:51:10 -0400
committerJay Pipes <jaypipes@gmail.com>2011-07-26 12:51:10 -0400
commit02fb917da8a42b38720ebe31c4d40b180b00d632 (patch)
tree6d33008ac411591ae1d72b31107bc075268512d5 /openstack
parent17df9cafa7479a56aba31c2377d1b5126e0b6b8b (diff)
downloadoslo-02fb917da8a42b38720ebe31c4d40b180b00d632.tar.gz
oslo-02fb917da8a42b38720ebe31c4d40b180b00d632.tar.xz
oslo-02fb917da8a42b38720ebe31c4d40b180b00d632.zip
Add some more generic middleware, request context, utils, and versioning. Add basic template for server binary
Diffstat (limited to 'openstack')
-rw-r--r--openstack/common/context.py40
-rw-r--r--openstack/common/middleware/__init__.py0
-rw-r--r--openstack/common/middleware/context.py64
-rw-r--r--openstack/common/utils.py96
4 files changed, 200 insertions, 0 deletions
diff --git a/openstack/common/context.py b/openstack/common/context.py
new file mode 100644
index 0000000..a9a16f8
--- /dev/null
+++ b/openstack/common/context.py
@@ -0,0 +1,40 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2011 OpenStack LLC.
+# All Rights Reserved.
+#
+# 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.
+
+"""
+Simple class that stores security context information in the web request.
+
+Projects should subclass this class if they wish to enhance the request
+context or provide additional information in their specific WSGI pipeline.
+"""
+
+
+class RequestContext(object):
+
+ """
+ Stores information about the security context under which the user
+ accesses the system, as well as additional request information.
+ """
+
+ def __init__(self, auth_tok=None, user=None, tenant=None, is_admin=False,
+ read_only=False, show_deleted=False):
+ self.auth_tok = auth_tok
+ self.user = user
+ self.tenant = tenant
+ self.is_admin = is_admin
+ self.read_only = read_only
+ self.show_deleted = show_deleted
diff --git a/openstack/common/middleware/__init__.py b/openstack/common/middleware/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openstack/common/middleware/__init__.py
diff --git a/openstack/common/middleware/context.py b/openstack/common/middleware/context.py
new file mode 100644
index 0000000..be7dafe
--- /dev/null
+++ b/openstack/common/middleware/context.py
@@ -0,0 +1,64 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2011 OpenStack LLC.
+# All Rights Reserved.
+#
+# 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.
+
+"""
+Middleware that attaches a context to the WSGI request
+"""
+
+from openstack.common import utils
+from openstack.common import wsgi
+from openstack.common import context
+
+
+class ContextMiddleware(wsgi.Middleware):
+ def __init__(self, app, options):
+ self.options = options
+ super(ContextMiddleware, self).__init__(app)
+
+ def make_context(self, *args, **kwargs):
+ """
+ Create a context with the given arguments.
+ """
+
+ # Determine the context class to use
+ ctxcls = context.RequestContext
+ if 'context_class' in self.options:
+ ctxcls = utils.import_class(self.options['context_class'])
+
+ return ctxcls(*args, **kwargs)
+
+ def process_request(self, req):
+ """
+ Extract any authentication information in the request and
+ construct an appropriate context from it.
+ """
+ # Use the default empty context, with admin turned on for
+ # backwards compatibility
+ req.context = self.make_context(is_admin=True)
+
+
+def filter_factory(global_conf, **local_conf):
+ """
+ Factory method for paste.deploy
+ """
+ conf = global_conf.copy()
+ conf.update(local_conf)
+
+ def filter(app):
+ return ContextMiddleware(app, conf)
+
+ return filter
diff --git a/openstack/common/utils.py b/openstack/common/utils.py
new file mode 100644
index 0000000..45c622e
--- /dev/null
+++ b/openstack/common/utils.py
@@ -0,0 +1,96 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2011 OpenStack LLC.
+# All Rights Reserved.
+#
+# 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.
+
+"""
+System-level utilities and helper functions.
+"""
+
+import datetime
+import inspect
+import logging
+import os
+import random
+import subprocess
+import socket
+import sys
+
+from glance.common import exception
+from glance.common.exception import ProcessExecutionError
+
+
+TIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
+
+
+def int_from_bool_as_string(subject):
+ """
+ Interpret a string as a boolean and return either 1 or 0.
+
+ Any string value in:
+ ('True', 'true', 'On', 'on', '1')
+ is interpreted as a boolean True.
+
+ Useful for JSON-decoded stuff and config file parsing
+ """
+ return bool_from_string(subject) and 1 or 0
+
+
+def bool_from_string(subject):
+ """
+ Interpret a string as a boolean.
+
+ Any string value in:
+ ('True', 'true', 'On', 'on', '1')
+ is interpreted as a boolean True.
+
+ Useful for JSON-decoded stuff and config file parsing
+ """
+ if type(subject) == type(bool):
+ return subject
+ if hasattr(subject, 'startswith'): # str or unicode...
+ if subject.strip().lower() in ('true', 'on', '1'):
+ return True
+ return False
+
+
+def import_class(import_str):
+ """Returns a class from a string including module and class"""
+ mod_str, _sep, class_str = import_str.rpartition('.')
+ try:
+ __import__(mod_str)
+ return getattr(sys.modules[mod_str], class_str)
+ except (ImportError, ValueError, AttributeError):
+ raise exception.NotFound('Class %s cannot be found' % class_str)
+
+
+def import_object(import_str):
+ """Returns an object including a module or module and class"""
+ try:
+ __import__(import_str)
+ return sys.modules[import_str]
+ except ImportError:
+ cls = import_class(import_str)
+ return cls()
+
+
+def isotime(at=None):
+ if not at:
+ at = datetime.datetime.utcnow()
+ return at.strftime(TIME_FORMAT)
+
+
+def parse_isotime(timestr):
+ return datetime.datetime.strptime(timestr, TIME_FORMAT)