Introduce basic Pecan/WSME framework for KDS
So far there is simply a CLI application called kds-api that launches the server using the reference wsgi server and a test just to make sure things are wired in correctly. blueprint: key-distribution-server Change-Id: I17f1943eb6cd71f6059606a1a099f5761896b131
This commit is contained in:
parent
576f5d99ea
commit
bdaddf8c5e
|
@ -0,0 +1,238 @@
|
||||||
|
[DEFAULT]
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.contrib.kds.common.service
|
||||||
|
#
|
||||||
|
|
||||||
|
# IP for the server to bind to (string value)
|
||||||
|
#bind_ip=0.0.0.0
|
||||||
|
|
||||||
|
# The port for the server (integer value)
|
||||||
|
#port=9109
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.db.sqlalchemy.session
|
||||||
|
#
|
||||||
|
|
||||||
|
# the filename to use with sqlite (string value)
|
||||||
|
#sqlite_db=keystone.sqlite
|
||||||
|
|
||||||
|
# If true, use synchronous mode for sqlite (boolean value)
|
||||||
|
#sqlite_synchronous=true
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.eventlet_backdoor
|
||||||
|
#
|
||||||
|
|
||||||
|
# Enable eventlet backdoor. Acceptable values are 0, <port>,
|
||||||
|
# and <start>:<end>, where 0 results in listening on a random
|
||||||
|
# tcp port number; <port> results in listening on the
|
||||||
|
# specified port number (and not enabling backdoor if that
|
||||||
|
# port is in use); and <start>:<end> results in listening on
|
||||||
|
# the smallest unused port number within the specified range
|
||||||
|
# of port numbers. The chosen port is displayed in the
|
||||||
|
# service's log file. (string value)
|
||||||
|
#backdoor_port=<None>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.lockutils
|
||||||
|
#
|
||||||
|
|
||||||
|
# Whether to disable inter-process locks (boolean value)
|
||||||
|
#disable_process_locking=false
|
||||||
|
|
||||||
|
# Directory to use for lock files. (string value)
|
||||||
|
#lock_path=<None>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.log
|
||||||
|
#
|
||||||
|
|
||||||
|
# Print debugging output (set logging level to DEBUG instead
|
||||||
|
# of default WARNING level). (boolean value)
|
||||||
|
#debug=false
|
||||||
|
|
||||||
|
# Print more verbose output (set logging level to INFO instead
|
||||||
|
# of default WARNING level). (boolean value)
|
||||||
|
#verbose=false
|
||||||
|
|
||||||
|
# Log output to standard error (boolean value)
|
||||||
|
#use_stderr=true
|
||||||
|
|
||||||
|
# format string to use for log messages with context (string
|
||||||
|
# value)
|
||||||
|
#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)s
|
||||||
|
|
||||||
|
# format string to use for log messages without context
|
||||||
|
# (string value)
|
||||||
|
#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
|
||||||
|
|
||||||
|
# data to append to log format when level is DEBUG (string
|
||||||
|
# value)
|
||||||
|
#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d
|
||||||
|
|
||||||
|
# prefix each line of exception output with this format
|
||||||
|
# (string value)
|
||||||
|
#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s
|
||||||
|
|
||||||
|
# list of logger=LEVEL pairs (list value)
|
||||||
|
#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,keystone=INFO,qpid=WARN,sqlalchemy=WARN,suds=INFO,iso8601=WARN
|
||||||
|
|
||||||
|
# publish error events (boolean value)
|
||||||
|
#publish_errors=false
|
||||||
|
|
||||||
|
# make deprecations fatal (boolean value)
|
||||||
|
#fatal_deprecations=false
|
||||||
|
|
||||||
|
# If an instance is passed with the log message, format it
|
||||||
|
# like this (string value)
|
||||||
|
#instance_format="[instance: %(uuid)s] "
|
||||||
|
|
||||||
|
# If an instance UUID is passed with the log message, format
|
||||||
|
# it like this (string value)
|
||||||
|
#instance_uuid_format="[instance: %(uuid)s] "
|
||||||
|
|
||||||
|
# The name of logging configuration file. It does not disable
|
||||||
|
# existing loggers, but just appends specified logging
|
||||||
|
# configuration to any other existing logging options. Please
|
||||||
|
# see the Python logging module documentation for details on
|
||||||
|
# logging configuration files. (string value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/log_config
|
||||||
|
#log_config_append=<None>
|
||||||
|
|
||||||
|
# DEPRECATED. A logging.Formatter log message format string
|
||||||
|
# which may use any of the available logging.LogRecord
|
||||||
|
# attributes. This option is deprecated. Please use
|
||||||
|
# logging_context_format_string and
|
||||||
|
# logging_default_format_string instead. (string value)
|
||||||
|
#log_format=<None>
|
||||||
|
|
||||||
|
# Format string for %%(asctime)s in log records. Default:
|
||||||
|
# %(default)s (string value)
|
||||||
|
#log_date_format=%Y-%m-%d %H:%M:%S
|
||||||
|
|
||||||
|
# (Optional) Name of log file to output to. If no default is
|
||||||
|
# set, logging will go to stdout. (string value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/logfile
|
||||||
|
#log_file=<None>
|
||||||
|
|
||||||
|
# (Optional) The base directory used for relative --log-file
|
||||||
|
# paths (string value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/logdir
|
||||||
|
#log_dir=<None>
|
||||||
|
|
||||||
|
# Use syslog for logging. (boolean value)
|
||||||
|
#use_syslog=false
|
||||||
|
|
||||||
|
# syslog facility to receive log lines (string value)
|
||||||
|
#syslog_log_facility=LOG_USER
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.policy
|
||||||
|
#
|
||||||
|
|
||||||
|
# JSON file containing policy (string value)
|
||||||
|
#policy_file=policy.json
|
||||||
|
|
||||||
|
# Rule enforced when requested rule is not found (string
|
||||||
|
# value)
|
||||||
|
#policy_default_rule=default
|
||||||
|
|
||||||
|
[ssl]
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.sslutils
|
||||||
|
#
|
||||||
|
|
||||||
|
# CA certificate file to use to verify connecting clients
|
||||||
|
# (string value)
|
||||||
|
#ca_file=<None>
|
||||||
|
|
||||||
|
# Certificate file to use when starting the server securely
|
||||||
|
# (string value)
|
||||||
|
#cert_file=<None>
|
||||||
|
|
||||||
|
# Private key file to use when starting the server securely
|
||||||
|
# (string value)
|
||||||
|
#key_file=<None>
|
||||||
|
|
||||||
|
[database]
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.db.api
|
||||||
|
#
|
||||||
|
|
||||||
|
# The backend to use for db (string value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/db_backend
|
||||||
|
#backend=sqlalchemy
|
||||||
|
|
||||||
|
# Enable the experimental use of thread pooling for all DB API
|
||||||
|
# calls (boolean value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/dbapi_use_tpool
|
||||||
|
#use_tpool=false
|
||||||
|
|
||||||
|
#
|
||||||
|
# Options defined in keystone.openstack.common.db.sqlalchemy.session
|
||||||
|
#
|
||||||
|
|
||||||
|
# The SQLAlchemy connection string used to connect to the
|
||||||
|
# database (string value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_connection
|
||||||
|
# Deprecated group/name - [DATABASE]/sql_connection
|
||||||
|
# Deprecated group/name - [sql]/connection
|
||||||
|
#connection=sqlite:////keystone/openstack/common/db/$sqlite_db
|
||||||
|
|
||||||
|
# The SQLAlchemy connection string used to connect to the
|
||||||
|
# slave database (string value)
|
||||||
|
#slave_connection=
|
||||||
|
|
||||||
|
# timeout before idle sql connections are reaped (integer
|
||||||
|
# value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_idle_timeout
|
||||||
|
# Deprecated group/name - [DATABASE]/sql_idle_timeout
|
||||||
|
#idle_timeout=3600
|
||||||
|
|
||||||
|
# Minimum number of SQL connections to keep open in a pool
|
||||||
|
# (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_min_pool_size
|
||||||
|
# Deprecated group/name - [DATABASE]/sql_min_pool_size
|
||||||
|
#min_pool_size=1
|
||||||
|
|
||||||
|
# Maximum number of SQL connections to keep open in a pool
|
||||||
|
# (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_max_pool_size
|
||||||
|
# Deprecated group/name - [DATABASE]/sql_max_pool_size
|
||||||
|
#max_pool_size=<None>
|
||||||
|
|
||||||
|
# maximum db connection retries during startup. (setting -1
|
||||||
|
# implies an infinite retry count) (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_max_retries
|
||||||
|
# Deprecated group/name - [DATABASE]/sql_max_retries
|
||||||
|
#max_retries=10
|
||||||
|
|
||||||
|
# interval between retries of opening a sql connection
|
||||||
|
# (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_retry_interval
|
||||||
|
# Deprecated group/name - [DATABASE]/reconnect_interval
|
||||||
|
#retry_interval=10
|
||||||
|
|
||||||
|
# If set, use this value for max_overflow with sqlalchemy
|
||||||
|
# (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_max_overflow
|
||||||
|
# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow
|
||||||
|
#max_overflow=<None>
|
||||||
|
|
||||||
|
# Verbosity of SQL debugging information. 0=None,
|
||||||
|
# 100=Everything (integer value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_connection_debug
|
||||||
|
#connection_debug=0
|
||||||
|
|
||||||
|
# Add python stack traces to SQL as comment strings (boolean
|
||||||
|
# value)
|
||||||
|
# Deprecated group/name - [DEFAULT]/sql_connection_trace
|
||||||
|
#connection_trace=false
|
||||||
|
|
||||||
|
# If set, use this value for pool_timeout with sqlalchemy
|
||||||
|
# (integer value)
|
||||||
|
# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout
|
||||||
|
#pool_timeout=<None>
|
|
@ -0,0 +1,11 @@
|
||||||
|
# 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.
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,45 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from oslo.config import cfg
|
||||||
|
import pecan
|
||||||
|
|
||||||
|
from keystone.contrib.kds.api import config as pecan_config
|
||||||
|
from keystone.contrib.kds.api import hooks
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
|
def get_pecan_config():
|
||||||
|
# Set up the pecan configuration
|
||||||
|
filename = pecan_config.__file__.replace('.pyc', '.py')
|
||||||
|
return pecan.configuration.conf_from_file(filename)
|
||||||
|
|
||||||
|
|
||||||
|
def setup_app(config=None, extra_hooks=None):
|
||||||
|
app_hooks = [hooks.ConfigHook()]
|
||||||
|
|
||||||
|
if extra_hooks:
|
||||||
|
app_hooks.extend(extra_hooks)
|
||||||
|
|
||||||
|
if not config:
|
||||||
|
config = get_pecan_config()
|
||||||
|
|
||||||
|
pecan.configuration.set_config(dict(config), overwrite=True)
|
||||||
|
|
||||||
|
app = pecan.make_app('keystone.contrib.kds.api.root.RootController',
|
||||||
|
debug=CONF.debug,
|
||||||
|
hooks=app_hooks)
|
||||||
|
|
||||||
|
return app
|
|
@ -0,0 +1,32 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Server Specific Configurations
|
||||||
|
server = {
|
||||||
|
'port': 9109,
|
||||||
|
'host': '0.0.0.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Pecan Application Configurations
|
||||||
|
app = {
|
||||||
|
'root': 'keystone.contrib.kds.api.root.RootController',
|
||||||
|
'modules': ['keystone.contrib.kds.api'],
|
||||||
|
'static_root': '%(confdir)s/public',
|
||||||
|
'template_path': '%(confdir)s/templates',
|
||||||
|
'debug': False,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Custom Configurations must be in Python dictionary format::
|
||||||
|
#
|
||||||
|
# foo = {'bar': 'baz'}
|
|
@ -0,0 +1,21 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from oslo.config import cfg
|
||||||
|
from pecan import hooks
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigHook(hooks.PecanHook):
|
||||||
|
def before(self, state):
|
||||||
|
state.request.cfg = cfg.CONF
|
|
@ -0,0 +1,22 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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 pecan
|
||||||
|
|
||||||
|
|
||||||
|
class RootController(object):
|
||||||
|
|
||||||
|
@pecan.expose('json')
|
||||||
|
def index(self):
|
||||||
|
return {'hello': 'world'}
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,57 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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 logging
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from oslo.config import cfg
|
||||||
|
from wsgiref import simple_server
|
||||||
|
|
||||||
|
from keystone.openstack.common import gettextutils
|
||||||
|
|
||||||
|
PROJECT = 'kds'
|
||||||
|
gettextutils.install(PROJECT)
|
||||||
|
|
||||||
|
from keystone.contrib.kds.api import app
|
||||||
|
from keystone.contrib.kds.common import service
|
||||||
|
from keystone.openstack.common import log
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
|
class Application(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.app = app.setup_app()
|
||||||
|
|
||||||
|
def __call__(self, environ, start_response):
|
||||||
|
return self.app(environ, start_response)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
service.prepare_service(sys.argv)
|
||||||
|
|
||||||
|
# Build and start the WSGI app
|
||||||
|
host = CONF.bind_ip
|
||||||
|
port = CONF.port
|
||||||
|
wsgi = simple_server.make_server(host, port, Application())
|
||||||
|
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
LOG.info(_("Serving on http://%(host)s:%(port)d"), {'host': host,
|
||||||
|
'port': port})
|
||||||
|
CONF.log_opt_values(LOG, logging.INFO)
|
||||||
|
|
||||||
|
try:
|
||||||
|
wsgi.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,17 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
|
||||||
|
class KdsException(Exception):
|
||||||
|
pass
|
|
@ -0,0 +1,27 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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 os
|
||||||
|
|
||||||
|
COMMON_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__)))
|
||||||
|
ROOT_DIR = os.path.join(COMMON_DIR, '..')
|
||||||
|
TEST_DIR = os.path.join(ROOT_DIR, 'tests')
|
||||||
|
|
||||||
|
|
||||||
|
def root_path(*args):
|
||||||
|
return os.path.join(TEST_DIR, *args)
|
||||||
|
|
||||||
|
|
||||||
|
def test_path(*args):
|
||||||
|
return os.path.join(TEST_DIR, *args)
|
|
@ -0,0 +1,45 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from oslo.config import cfg
|
||||||
|
|
||||||
|
from keystone.openstack.common import log
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
API_SERVICE_OPTS = [
|
||||||
|
cfg.StrOpt('bind_ip',
|
||||||
|
default='0.0.0.0',
|
||||||
|
help='IP for the server to bind to'),
|
||||||
|
cfg.IntOpt('port',
|
||||||
|
default=9109,
|
||||||
|
help='The port for the server'),
|
||||||
|
]
|
||||||
|
|
||||||
|
CONF.register_opts(API_SERVICE_OPTS)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_args(args, default_config_files=None):
|
||||||
|
CONF(args=args[1:],
|
||||||
|
project='kds',
|
||||||
|
default_config_files=default_config_files)
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_service(argv=[]):
|
||||||
|
cfg.set_defaults(log.log_opts,
|
||||||
|
default_log_levels=['sqlalchemy=WARN',
|
||||||
|
'eventlet.wsgi.server=WARN'
|
||||||
|
])
|
||||||
|
parse_args(argv)
|
||||||
|
log.setup('kds')
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -0,0 +1,83 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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 webtest
|
||||||
|
|
||||||
|
import pecan.testing
|
||||||
|
|
||||||
|
from keystone.contrib.kds.common import paths
|
||||||
|
from keystone.openstack.common import jsonutils
|
||||||
|
from keystone.tests.contrib.kds import base
|
||||||
|
|
||||||
|
|
||||||
|
def urljoin(*args):
|
||||||
|
return "/%s/" % "/".join([a.strip("/") for a in args])
|
||||||
|
|
||||||
|
|
||||||
|
def method_func(method):
|
||||||
|
def func(self, url, **kwargs):
|
||||||
|
kwargs['method'] = method
|
||||||
|
return self.request(url, **kwargs)
|
||||||
|
|
||||||
|
return func
|
||||||
|
|
||||||
|
|
||||||
|
class BaseTestCase(base.BaseTestCase):
|
||||||
|
|
||||||
|
METHODS = {'get': webtest.TestApp.get,
|
||||||
|
'post': webtest.TestApp.post,
|
||||||
|
'put': webtest.TestApp.put,
|
||||||
|
'patch': webtest.TestApp.patch,
|
||||||
|
'delete': webtest.TestApp.delete,
|
||||||
|
'options': webtest.TestApp.options,
|
||||||
|
'head': webtest.TestApp.head}
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(BaseTestCase, self).setUp()
|
||||||
|
root = 'keystone.contrib.kds.api.root.RootController'
|
||||||
|
|
||||||
|
self.app_config = {
|
||||||
|
'app': {
|
||||||
|
'root': root,
|
||||||
|
'modules': ['keystone.contrib.kds.api'],
|
||||||
|
'static_root': paths.root_path('public'),
|
||||||
|
'template_path': paths.root_path('kds', 'api', 'templates'),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
self.app = pecan.testing.load_test_app(self.app_config)
|
||||||
|
self.addCleanup(pecan.set_config, {}, overwrite=True)
|
||||||
|
|
||||||
|
def request(self, url, method, **kwargs):
|
||||||
|
try:
|
||||||
|
json = kwargs.pop('json')
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
kwargs['content_type'] = 'application/json'
|
||||||
|
kwargs['params'] = jsonutils.dumps(json)
|
||||||
|
|
||||||
|
try:
|
||||||
|
func = self.METHODS[method.lower()]
|
||||||
|
except KeyError:
|
||||||
|
self.fail("Unsupported HTTP Method: %s" % method)
|
||||||
|
else:
|
||||||
|
return func(self.app, url, **kwargs)
|
||||||
|
|
||||||
|
get = method_func('get')
|
||||||
|
post = method_func('post')
|
||||||
|
put = method_func('put')
|
||||||
|
delete = method_func('delete')
|
||||||
|
options = method_func('options')
|
||||||
|
head = method_func('head')
|
|
@ -0,0 +1,22 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from keystone.tests.contrib.kds.api import base
|
||||||
|
|
||||||
|
|
||||||
|
class SimpleTest(base.BaseTestCase):
|
||||||
|
|
||||||
|
def test_simple(self):
|
||||||
|
resp = self.get("/")
|
||||||
|
self.assertEqual(resp.json['hello'], 'world')
|
|
@ -0,0 +1,26 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from keystone.contrib.kds.common import service
|
||||||
|
from keystone.openstack.common.fixture import config
|
||||||
|
from keystone.openstack.common import test
|
||||||
|
|
||||||
|
|
||||||
|
class BaseTestCase(test.BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(BaseTestCase, self).setUp()
|
||||||
|
self.config_fixture = self.useFixture(config.Config())
|
||||||
|
self.CONF = self.config_fixture.conf
|
||||||
|
service.parse_args(args=[])
|
|
@ -0,0 +1,13 @@
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
|
||||||
|
# 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.
|
|
@ -19,3 +19,9 @@ oslo.config>=1.2.0
|
||||||
Babel>=1.3
|
Babel>=1.3
|
||||||
oauth2
|
oauth2
|
||||||
dogpile.cache>=0.5.0
|
dogpile.cache>=0.5.0
|
||||||
|
|
||||||
|
# KDS exclusive dependencies
|
||||||
|
|
||||||
|
pecan>=0.2.0
|
||||||
|
pycrypto>=2.6
|
||||||
|
WSME>=0.5b6
|
||||||
|
|
|
@ -61,3 +61,7 @@ msgid_bugs_address = https://bugs.launchpad.net/keystone
|
||||||
#[pbr]
|
#[pbr]
|
||||||
#autodoc_tree_index_modules = True
|
#autodoc_tree_index_modules = True
|
||||||
#autodoc_tree_root = ./keystone
|
#autodoc_tree_root = ./keystone
|
||||||
|
|
||||||
|
[entry_points]
|
||||||
|
console_scripts =
|
||||||
|
kds-api = keystone.contrib.kds.cli.api:main
|
||||||
|
|
|
@ -18,8 +18,6 @@ fixtures>=0.3.14
|
||||||
# mock object framework
|
# mock object framework
|
||||||
mock>=1.0
|
mock>=1.0
|
||||||
mox>=0.5.3
|
mox>=0.5.3
|
||||||
# Optional KVS feature encryption testing
|
|
||||||
pycrypto>=2.6
|
|
||||||
# required to build documentation
|
# required to build documentation
|
||||||
sphinx>=1.1.2,<1.2
|
sphinx>=1.1.2,<1.2
|
||||||
# test wsgi apps without starting an http server
|
# test wsgi apps without starting an http server
|
||||||
|
|
Loading…
Reference in New Issue