From 4fa77a658c12b8caef72059ec645d04d80a8b639 Mon Sep 17 00:00:00 2001 From: Tomas Sedovic Date: Fri, 27 Apr 2012 18:40:49 +0200 Subject: [PATCH] Add skeleton structure for the metadata server --- bin/heat-metadata | 56 ++++++++++++++++++++++++++++++++ etc/heat-metadata-paste.ini | 16 +++++++++ etc/heat-metadata.conf | 25 ++++++++++++++ heat/common/config.py | 11 +++++++ heat/metadata/__init__.py | 0 heat/metadata/api/__init__.py | 0 heat/metadata/api/v1/__init__.py | 36 ++++++++++++++++++++ heat/metadata/api/v1/metadata.py | 36 ++++++++++++++++++++ setup.py | 4 +++ 9 files changed, 184 insertions(+) create mode 100755 bin/heat-metadata create mode 100644 etc/heat-metadata-paste.ini create mode 100644 etc/heat-metadata.conf create mode 100644 heat/metadata/__init__.py create mode 100644 heat/metadata/api/__init__.py create mode 100644 heat/metadata/api/v1/__init__.py create mode 100644 heat/metadata/api/v1/metadata.py diff --git a/bin/heat-metadata b/bin/heat-metadata new file mode 100755 index 0000000000..f95334e22b --- /dev/null +++ b/bin/heat-metadata @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# 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. + +""" +Heat Metadata Server. + +This makes the instance metadata accessible both to the instance and Heat Engine. +""" + +import gettext +import os +import sys + +# If ../heat/__init__.py exists, add ../ to Python search path, so that +# it will override what happens to be installed in /usr/(local/)lib/python... +possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), + os.pardir, + os.pardir)) +if os.path.exists(os.path.join(possible_topdir, 'heat', '__init__.py')): + sys.path.insert(0, possible_topdir) + +gettext.install('heat', unicode=1) + +import logging +from heat.common import config +from heat.common import wsgi +from paste import httpserver + +LOG = logging.getLogger('heat.metadata') + +if __name__ == '__main__': + try: + conf = config.HeatMetadataConfigOpts() + conf() + config.FLAGS = conf + config.setup_logging(conf) + + app = config.load_paste_app(conf) + + port = conf.bind_port + LOG.info(('Starting Heat Metadata on port %s') % port) + httpserver.serve(app, port=port) + except RuntimeError, e: + sys.exit("ERROR: %s" % e) diff --git a/etc/heat-metadata-paste.ini b/etc/heat-metadata-paste.ini new file mode 100644 index 0000000000..f35c0d4713 --- /dev/null +++ b/etc/heat-metadata-paste.ini @@ -0,0 +1,16 @@ +# Default minimal pipeline +[pipeline:heat-metadata] +pipeline = context metadatav1app + +# Use the following pipeline for keystone auth +# i.e. in heat-metadata.conf: +# [paste_deploy] +# flavor = keystone +# +[app:metadatav1app] +paste.app_factory = heat.common.wsgi:app_factory +heat.app_factory = heat.metadata.api.v1:API + +[filter:context] +paste.filter_factory = heat.common.wsgi:filter_factory +heat.filter_factory = heat.common.context:ContextMiddleware diff --git a/etc/heat-metadata.conf b/etc/heat-metadata.conf new file mode 100644 index 0000000000..d3e25f6175 --- /dev/null +++ b/etc/heat-metadata.conf @@ -0,0 +1,25 @@ +[DEFAULT] +# Show more verbose log output (sets INFO log level output) +verbose = True + +# Show debugging output in logs (sets DEBUG log level output) +debug = True + +# Address to bind the server to +bind_host = 0.0.0.0 + +# Port the bind the server to +bind_port = 8002 + +# Log to this file. Make sure the user running heat-metadata has +# permissions to write to this file! +log_file = /var/log/heat/metadata.log + +# ================= Syslog Options ============================ + +# Send logs to syslog (/dev/log) instead of to file specified +# by `log_file` +use_syslog = False + +# Facility to use. If unset defaults to LOG_USER. +# syslog_log_facility = LOG_LOCAL0 diff --git a/heat/common/config.py b/heat/common/config.py index dea2b45272..3021736151 100644 --- a/heat/common/config.py +++ b/heat/common/config.py @@ -139,6 +139,17 @@ class HeatConfigOpts(cfg.CommonConfigOpts): **kwargs) self.register_cli_opts(rpc_opts) +class HeatMetadataConfigOpts(cfg.CommonConfigOpts): + def __init__(self, default_config_files=None, **kwargs): + config_files = cfg.find_config_files(project='heat', + prog='heat-metadata') + super(HeatMetadataConfigOpts, self).__init__( + project='heat', + version='%%prog %s' % version.version_string(), + default_config_files=default_config_files, + **kwargs) + self.register_cli_opts([cfg.IntOpt('bind_port', default=8000)]) + class HeatEngineConfigOpts(cfg.CommonConfigOpts): diff --git a/heat/metadata/__init__.py b/heat/metadata/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/heat/metadata/api/__init__.py b/heat/metadata/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/heat/metadata/api/v1/__init__.py b/heat/metadata/api/v1/__init__.py new file mode 100644 index 0000000000..7c1631d4e7 --- /dev/null +++ b/heat/metadata/api/v1/__init__.py @@ -0,0 +1,36 @@ +# 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 routes + +from heat.common import wsgi +from heat.metadata.api.v1 import metadata + + +class API(wsgi.Router): + """ + WSGI router for Heat Metadata Server API v1 requests. + """ + + def __init__(self, conf, **local_conf): + self.cong = conf + mapper = routes.Mapper() + metadata_controller = metadata.create_resource(conf) + + mapper.connect('/', controller=metadata_controller, action='index', + conditions=dict(method=['GET'])) + + super(API, self).__init__(mapper) diff --git a/heat/metadata/api/v1/metadata.py b/heat/metadata/api/v1/metadata.py new file mode 100644 index 0000000000..25b4728424 --- /dev/null +++ b/heat/metadata/api/v1/metadata.py @@ -0,0 +1,36 @@ +# 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 + +from heat.common import wsgi + + +class MetadataController: + def __init__(self, options): + self.options = options + + def index(self, req): + return [] + + +def create_resource(options): + """ + Stacks resource factory method. + """ + deserializer = wsgi.JSONRequestDeserializer() + serializer = wsgi.JSONResponseSerializer() + return wsgi.Resource(MetadataController(options), deserializer, serializer) + diff --git a/setup.py b/setup.py index a26c2cc071..bfcbce1dd8 100755 --- a/setup.py +++ b/setup.py @@ -89,14 +89,18 @@ setup( ], scripts=['bin/heat', 'bin/heat-api', + 'bin/heat-metadata', 'bin/heat-engine', 'bin/heat-db-setup'], data_files=[('/etc/heat', ['etc/heat-api.conf', 'etc/heat-api-paste.ini', + 'etc/heat-metadata.conf', + 'etc/heat-metadata-paste.ini', 'etc/heat-engine.conf', 'etc/heat-engine-paste.ini']), ('/etc/bash_completion.d', ['etc/bash_completion.d/heat']), ('/var/log/heat', ['var/log/heat/api.log', + 'var/log/heat/metadata.log', 'var/log/heat/engine.log']), ('/var/lib/heat', ['var/lib/heat/.dummy'])], py_modules=[])