diff --git a/bin/heat-api b/bin/heat-api index cb6c5d7666..c1ce491a42 100755 --- a/bin/heat-api +++ b/bin/heat-api @@ -1,73 +1,39 @@ #!/usr/bin/env python # -# 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 +# 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 +# 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. +# 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 warnings +warnings.warn("DEPRECATED: This script is deprecated. Please use the " + "system level heat binaries installed to start " + "any of the heat services.", DeprecationWarning) """ Heat API Server. An OpenStack REST API to Heat. """ -import eventlet -eventlet.monkey_patch(os=False) - 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]), +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) -from oslo_config import cfg -import oslo_i18n as i18n -from oslo_log import log as logging -from oslo_reports import guru_meditation_report as gmr -from oslo_service import systemd -import six +if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'heat', '__init__.py')): + sys.path.insert(0, POSSIBLE_TOPDIR) -from heat.common import config -from heat.common.i18n import _LI -from heat.common import messaging -from heat.common import profiler -from heat.common import wsgi -from heat import version +from heat.cmd import api -i18n.enable_lazy() - -LOG = logging.getLogger('heat.api') - -if __name__ == '__main__': - try: - logging.register_options(cfg.CONF) - cfg.CONF(project='heat', prog='heat-api', - version=version.version_info.version_string()) - logging.setup(cfg.CONF, 'heat-api') - messaging.setup() - - app = config.load_paste_app() - - port = cfg.CONF.heat_api.bind_port - host = cfg.CONF.heat_api.bind_host - LOG.info(_LI('Starting Heat REST API on %(host)s:%(port)s'), - {'host': host, 'port': port}) - profiler.setup('heat-api', host) - gmr.TextGuruMeditation.setup_autorun(version) - server = wsgi.Server('heat-api', cfg.CONF.heat_api) - server.start(app, default_port=port) - systemd.notify_once() - server.wait() - except RuntimeError as e: - msg = six.text_type(e) - sys.exit("ERROR: %s" % msg) +api.main() diff --git a/bin/heat-api-cfn b/bin/heat-api-cfn index 9a6ddd2832..bcf2151125 100755 --- a/bin/heat-api-cfn +++ b/bin/heat-api-cfn @@ -1,16 +1,22 @@ #!/usr/bin/env python # -# 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 +# 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 +# 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. +# 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 warnings +warnings.warn("DEPRECATED: This script is deprecated. Please use the " + "system level heat binaries installed to start " + "any of the heat services.", DeprecationWarning) """ Heat API Server. This implements an approximation of the Amazon @@ -18,60 +24,18 @@ CloudFormation API and translates it into a native representation. It then calls the heat-engine via AMQP RPC to implement them. """ -import eventlet -eventlet.monkey_patch(os=False) - 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]), +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) -from oslo_config import cfg -import oslo_i18n as i18n -from oslo_log import log as logging -from oslo_reports import guru_meditation_report as gmr -from oslo_service import systemd -import six +if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'heat', '__init__.py')): + sys.path.insert(0, POSSIBLE_TOPDIR) -from heat.common import config -from heat.common.i18n import _LI -from heat.common import messaging -from heat.common import profiler -from heat.common import wsgi -from heat import version +from heat.cmd import api_cfn -i18n.enable_lazy() - -LOG = logging.getLogger('heat.api.cfn') - -if __name__ == '__main__': - try: - logging.register_options(cfg.CONF) - cfg.CONF(project='heat', - prog='heat-api-cfn', - version=version.version_info.version_string()) - logging.setup(cfg.CONF, 'heat-api-cfn') - logging.set_defaults() - messaging.setup() - - app = config.load_paste_app() - - port = cfg.CONF.heat_api_cfn.bind_port - host = cfg.CONF.heat_api_cfn.bind_host - LOG.info(_LI('Starting Heat API on %(host)s:%(port)s'), - {'host': host, 'port': port}) - profiler.setup('heat-api-cfn', host) - gmr.TextGuruMeditation.setup_autorun(version) - server = wsgi.Server('heat-api-cfn', cfg.CONF.heat_api_cfn) - server.start(app, default_port=port) - systemd.notify_once() - server.wait() - except RuntimeError as e: - msg = six.text_type(e) - sys.exit("ERROR: %s" % msg) +api_cfn.main() diff --git a/bin/heat-api-cloudwatch b/bin/heat-api-cloudwatch index 1f50ca48d8..8f84d0ab0a 100755 --- a/bin/heat-api-cloudwatch +++ b/bin/heat-api-cloudwatch @@ -1,16 +1,22 @@ #!/usr/bin/env python # -# 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 +# 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 +# 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. +# 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 warnings +warnings.warn("DEPRECATED: This script is deprecated. Please use the " + "system level heat binaries installed to start " + "any of the heat services.", DeprecationWarning) """ Heat API Server. This implements an approximation of the Amazon @@ -18,61 +24,18 @@ CloudWatch API and translates it into a native representation. It then calls the heat-engine via AMQP RPC to implement them. """ -import eventlet -eventlet.monkey_patch(os=False) - 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]), +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) -from oslo_config import cfg -import oslo_i18n as i18n -from oslo_log import log as logging -from oslo_reports import guru_meditation_report as gmr -from oslo_service import systemd -import six +if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'heat', '__init__.py')): + sys.path.insert(0, POSSIBLE_TOPDIR) -from heat.common import config -from heat.common.i18n import _LI -from heat.common import messaging -from heat.common import profiler -from heat.common import wsgi -from heat import version +from heat.cmd import api_cloudwatch -i18n.enable_lazy() - -LOG = logging.getLogger('heat.api.cloudwatch') - -if __name__ == '__main__': - try: - logging.register_options(cfg.CONF) - cfg.CONF(project='heat', - prog='heat-api-cloudwatch', - version=version.version_info.version_string()) - logging.setup(cfg.CONF, 'heat-api-cloudwatch') - logging.set_defaults() - messaging.setup() - - app = config.load_paste_app() - - port = cfg.CONF.heat_api_cloudwatch.bind_port - host = cfg.CONF.heat_api_cloudwatch.bind_host - LOG.info(_LI('Starting Heat CloudWatch API on %(host)s:%(port)s'), - {'host': host, 'port': port}) - profiler.setup('heat-api-cloudwatch', host) - gmr.TextGuruMeditation.setup_autorun(version) - server = wsgi.Server('heat-api-cloudwatch', - cfg.CONF.heat_api_cloudwatch) - server.start(app, default_port=port) - systemd.notify_once() - server.wait() - except RuntimeError as e: - msg = six.text_type(e) - sys.exit("ERROR: %s" % msg) +api_cloudwatch.main() diff --git a/bin/heat-engine b/bin/heat-engine index 315df217cd..5ec8a0dbc4 100755 --- a/bin/heat-engine +++ b/bin/heat-engine @@ -1,16 +1,22 @@ #!/usr/bin/env python # -# 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 +# 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 +# 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. +# 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 warnings +warnings.warn("DEPRECATED: This script is deprecated. Please use the " + "system level heat binaries installed to start " + "any of the heat services.", DeprecationWarning) """ Heat Engine Server. This does the work of actually implementing the API @@ -18,9 +24,6 @@ calls made by the user. Normal communications is done via the heat API which then calls into this engine. """ -import eventlet -eventlet.monkey_patch() - import os import sys @@ -29,54 +32,10 @@ import sys 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) -from oslo_config import cfg -import oslo_i18n as i18n -from oslo_log import log as logging -from oslo_reports import guru_meditation_report as gmr -from oslo_service import service +from heat.cmd import engine -from heat.common import config -from heat.common.i18n import _LC -from heat.common import messaging -from heat.common import profiler -from heat.engine import template -from heat.rpc import api as rpc_api -from heat import version - -i18n.enable_lazy() - -LOG = logging.getLogger('heat.engine') - -if __name__ == '__main__': - logging.register_options(cfg.CONF) - cfg.CONF(project='heat', prog='heat-engine', - version=version.version_info.version_string()) - logging.setup(cfg.CONF, 'heat-engine') - logging.set_defaults() - messaging.setup() - - config.startup_sanity_check() - - mgr = None - try: - mgr = template._get_template_extension_manager() - except template.TemplatePluginNotRegistered as ex: - LOG.critical(_LC("%s"), ex) - if not mgr or not mgr.names(): - sys.exit("ERROR: No template format plugins registered") - - from heat.engine import service as engine # noqa - - profiler.setup('heat-engine', cfg.CONF.host) - gmr.TextGuruMeditation.setup_autorun(version) - srv = engine.EngineService(cfg.CONF.host, rpc_api.ENGINE_TOPIC) - launcher = service.launch(cfg.CONF, srv, - workers=cfg.CONF.num_engine_workers) - if cfg.CONF.enable_cloud_watch_lite: - # We create the periodic tasks here, which mean they are created - # only in the parent process when num_engine_workers>1 is specified - srv.create_periodic_tasks() - launcher.wait() +engine.main() diff --git a/heat/cmd/api.py b/heat/cmd/api.py new file mode 100755 index 0000000000..e79fe952ba --- /dev/null +++ b/heat/cmd/api.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# +# 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 API Server. An OpenStack ReST API to Heat. +""" + +import eventlet +eventlet.monkey_patch(os=False) + +import sys + +from oslo_config import cfg +import oslo_i18n as i18n +from oslo_log import log as logging +from oslo_reports import guru_meditation_report as gmr +from oslo_service import systemd +import six + +from heat.common import config +from heat.common.i18n import _LI +from heat.common import messaging +from heat.common import profiler +from heat.common import wsgi +from heat import version + +i18n.enable_lazy() + +LOG = logging.getLogger('heat.api') + + +def main(): + try: + logging.register_options(cfg.CONF) + cfg.CONF(project='heat', prog='heat-api', + version=version.version_info.version_string()) + logging.setup(cfg.CONF, 'heat-api') + messaging.setup() + + app = config.load_paste_app() + + port = cfg.CONF.heat_api.bind_port + host = cfg.CONF.heat_api.bind_host + LOG.info(_LI('Starting Heat REST API on %(host)s:%(port)s'), + {'host': host, 'port': port}) + profiler.setup('heat-api', host) + gmr.TextGuruMeditation.setup_autorun(version) + server = wsgi.Server('heat-api', cfg.CONF.heat_api) + server.start(app, default_port=port) + systemd.notify_once() + server.wait() + except RuntimeError as e: + msg = six.text_type(e) + sys.exit("ERROR: %s" % msg) diff --git a/heat/cmd/api_cfn.py b/heat/cmd/api_cfn.py new file mode 100755 index 0000000000..ec78df8fe2 --- /dev/null +++ b/heat/cmd/api_cfn.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# +# 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 API Server. This implements an approximation of the Amazon +CloudFormation API and translates it into a native representation. It then +calls the heat-engine via AMQP RPC to implement them. +""" + +import eventlet +eventlet.monkey_patch(os=False) + +import sys + +from oslo_config import cfg +import oslo_i18n as i18n +from oslo_log import log as logging +from oslo_reports import guru_meditation_report as gmr +from oslo_service import systemd +import six + +from heat.common import config +from heat.common.i18n import _LI +from heat.common import messaging +from heat.common import profiler +from heat.common import wsgi +from heat import version + +i18n.enable_lazy() + +LOG = logging.getLogger('heat.api.cfn') + + +def main(): + try: + logging.register_options(cfg.CONF) + cfg.CONF(project='heat', + prog='heat-api-cfn', + version=version.version_info.version_string()) + logging.setup(cfg.CONF, 'heat-api-cfn') + logging.set_defaults() + messaging.setup() + + app = config.load_paste_app() + + port = cfg.CONF.heat_api_cfn.bind_port + host = cfg.CONF.heat_api_cfn.bind_host + LOG.info(_LI('Starting Heat API on %(host)s:%(port)s'), + {'host': host, 'port': port}) + profiler.setup('heat-api-cfn', host) + gmr.TextGuruMeditation.setup_autorun(version) + server = wsgi.Server('heat-api-cfn', cfg.CONF.heat_api_cfn) + server.start(app, default_port=port) + systemd.notify_once() + server.wait() + except RuntimeError as e: + msg = six.text_type(e) + sys.exit("ERROR: %s" % msg) diff --git a/heat/cmd/api_cloudwatch.py b/heat/cmd/api_cloudwatch.py new file mode 100755 index 0000000000..a9d54b0819 --- /dev/null +++ b/heat/cmd/api_cloudwatch.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# +# 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 API Server. This implements an approximation of the Amazon +CloudWatch API and translates it into a native representation. It then +calls the heat-engine via AMQP RPC to implement them. +""" + +import eventlet +eventlet.monkey_patch(os=False) + +import sys + +from oslo_config import cfg +import oslo_i18n as i18n +from oslo_log import log as logging +from oslo_reports import guru_meditation_report as gmr +from oslo_service import systemd +import six + +from heat.common import config +from heat.common.i18n import _LI +from heat.common import messaging +from heat.common import profiler +from heat.common import wsgi +from heat import version + +i18n.enable_lazy() + +LOG = logging.getLogger('heat.api.cloudwatch') + + +def main(): + try: + logging.register_options(cfg.CONF) + cfg.CONF(project='heat', + prog='heat-api-cloudwatch', + version=version.version_info.version_string()) + logging.setup(cfg.CONF, 'heat-api-cloudwatch') + logging.set_defaults() + messaging.setup() + + app = config.load_paste_app() + + port = cfg.CONF.heat_api_cloudwatch.bind_port + host = cfg.CONF.heat_api_cloudwatch.bind_host + LOG.info(_LI('Starting Heat CloudWatch API on %(host)s:%(port)s'), + {'host': host, 'port': port}) + profiler.setup('heat-api-cloudwatch', host) + gmr.TextGuruMeditation.setup_autorun(version) + server = wsgi.Server('heat-api-cloudwatch', + cfg.CONF.heat_api_cloudwatch) + server.start(app, default_port=port) + systemd.notify_once() + server.wait() + except RuntimeError as e: + msg = six.text_type(e) + sys.exit("ERROR: %s" % msg) diff --git a/heat/cmd/engine.py b/heat/cmd/engine.py new file mode 100755 index 0000000000..1574a5a600 --- /dev/null +++ b/heat/cmd/engine.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# +# 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 Engine Server. This does the work of actually implementing the API +calls made by the user. Normal communications is done via the heat API +which then calls into this engine. +""" + +import eventlet +eventlet.monkey_patch() + +import sys + +from oslo_config import cfg +import oslo_i18n as i18n +from oslo_log import log as logging +from oslo_reports import guru_meditation_report as gmr +from oslo_service import service + +from heat.common import config +from heat.common.i18n import _LC +from heat.common import messaging +from heat.common import profiler +from heat.engine import template +from heat.rpc import api as rpc_api +from heat import version + +i18n.enable_lazy() + +LOG = logging.getLogger('heat.engine') + + +def main(): + logging.register_options(cfg.CONF) + cfg.CONF(project='heat', prog='heat-engine', + version=version.version_info.version_string()) + logging.setup(cfg.CONF, 'heat-engine') + logging.set_defaults() + messaging.setup() + + config.startup_sanity_check() + + mgr = None + try: + mgr = template._get_template_extension_manager() + except template.TemplatePluginNotRegistered as ex: + LOG.critical(_LC("%s"), ex) + if not mgr or not mgr.names(): + sys.exit("ERROR: No template format plugins registered") + + from heat.engine import service as engine # noqa + + profiler.setup('heat-engine', cfg.CONF.host) + gmr.TextGuruMeditation.setup_autorun(version) + srv = engine.EngineService(cfg.CONF.host, rpc_api.ENGINE_TOPIC) + launcher = service.launch(cfg.CONF, srv, + workers=cfg.CONF.num_engine_workers) + if cfg.CONF.enable_cloud_watch_lite: + # We create the periodic tasks here, which mean they are created + # only in the parent process when num_engine_workers>1 is specified + srv.create_periodic_tasks() + launcher.wait() diff --git a/setup.cfg b/setup.cfg index 088539734d..ef9f4fd23e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,16 +21,16 @@ classifier = packages = heat scripts = - bin/heat-api - bin/heat-api-cfn - bin/heat-api-cloudwatch bin/heat-db-setup - bin/heat-engine bin/heat-keystone-setup bin/heat-keystone-setup-domain [entry_points] console_scripts = + heat-api = heat.cmd.api:main + heat-api-cfn = heat.cmd.api_cfn:main + heat-api-cloudwatch = heat.cmd.api_cloudwatch:main + heat-engine = heat.cmd.engine:main heat-manage = heat.cmd.manage:main oslo.config.opts =