Added it so that components can describe what they do and what options they have.
This commit is contained in:
14
README.md
14
README.md
@@ -27,6 +27,10 @@ This will typically produce:
|
|||||||
Options:
|
Options:
|
||||||
--version show program's version number and exit
|
--version show program's version number and exit
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
|
-c COMPONENT, --component=COMPONENT
|
||||||
|
openstack component, ie (db, glance, horizon, keystone,
|
||||||
|
keystone-client, nova, nova-client, novnc, openstack-x,
|
||||||
|
quantum, rabbit, swift)
|
||||||
|
|
||||||
Install/uninstall/start/stop options:
|
Install/uninstall/start/stop options:
|
||||||
-a ACTION, --action=ACTION
|
-a ACTION, --action=ACTION
|
||||||
@@ -34,10 +38,6 @@ This will typically produce:
|
|||||||
-d DIR, --directory=DIR
|
-d DIR, --directory=DIR
|
||||||
empty root DIR for install or DIR with existing
|
empty root DIR for install or DIR with existing
|
||||||
components for start/stop/uninstall
|
components for start/stop/uninstall
|
||||||
-c COMPONENT, --component=COMPONENT
|
|
||||||
openstack component, ie (db, glance, horizon, keystone,
|
|
||||||
keystone-client, nova, nova-client, openstack-x,
|
|
||||||
quantum, rabbit, swift)
|
|
||||||
-i, --ignore-deps ignore dependencies when performing ACTION
|
-i, --ignore-deps ignore dependencies when performing ACTION
|
||||||
-e, --ensure-deps ensure dependencies when performing ACTION (default:
|
-e, --ensure-deps ensure dependencies when performing ACTION (default:
|
||||||
True)
|
True)
|
||||||
@@ -48,8 +48,10 @@ This will typically produce:
|
|||||||
Uninstall/stop options:
|
Uninstall/stop options:
|
||||||
-f, --force force ACTION even if no trace file found
|
-f, --force force ACTION even if no trace file found
|
||||||
|
|
||||||
Dependency options:
|
Miscellaneous options:
|
||||||
-s, --list-deps show dependencies of COMPONENT (default: False)
|
--list-deps show dependencies of COMPONENT (default: False)
|
||||||
|
--describe-components
|
||||||
|
describe COMPONENT (default: False)
|
||||||
|
|
||||||
# Stack prerequisites
|
# Stack prerequisites
|
||||||
|
|
||||||
|
|||||||
@@ -194,3 +194,22 @@ def create_db(cfg, dbname):
|
|||||||
else:
|
else:
|
||||||
msg = BASE_ERROR % ('create', dbtype)
|
msg = BASE_ERROR % ('create', dbtype)
|
||||||
raise NotImplementedError(msg)
|
raise NotImplementedError(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the database component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "N/A"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [DBRuntime.__name__,
|
||||||
|
DBInstaller.__name__,
|
||||||
|
DBUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -171,3 +171,22 @@ class GlanceInstaller(comp.PythonInstallComponent):
|
|||||||
mp['HOST_IP'] = self.cfg.get('host', 'ip')
|
mp['HOST_IP'] = self.cfg.get('host', 'ip')
|
||||||
mp.update(keystone.get_shared_params(self.cfg))
|
mp.update(keystone.get_shared_params(self.cfg))
|
||||||
return mp
|
return mp
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the glance component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [GlanceRuntime.__name__,
|
||||||
|
GlanceInstaller.__name__,
|
||||||
|
GlanceUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -206,3 +206,22 @@ class HorizonRuntime(comp.EmptyRuntime):
|
|||||||
return comp.STATUS_STOPPED
|
return comp.STATUS_STOPPED
|
||||||
else:
|
else:
|
||||||
return comp.STATUS_UNKNOWN
|
return comp.STATUS_UNKNOWN
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the horizon component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "N/A"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [HorizonRuntime.__name__,
|
||||||
|
HorizonInstaller.__name__,
|
||||||
|
HorizonUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -187,3 +187,22 @@ def get_shared_params(cfg):
|
|||||||
mp['KEYSTONE_SERVICE_PROTOCOL'] = cfg.get('keystone', 'keystone_service_protocol')
|
mp['KEYSTONE_SERVICE_PROTOCOL'] = cfg.get('keystone', 'keystone_service_protocol')
|
||||||
mp['SERVICE_TOKEN'] = cfg.get("passwords", "service_token")
|
mp['SERVICE_TOKEN'] = cfg.get("passwords", "service_token")
|
||||||
return mp
|
return mp
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the keystone component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [KeystoneRuntime.__name__,
|
||||||
|
KeystoneInstaller.__name__,
|
||||||
|
KeystoneUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -47,3 +47,22 @@ class KeyStoneClientInstaller(comp.PythonInstallComponent):
|
|||||||
class KeyStoneClientRuntime(comp.EmptyRuntime):
|
class KeyStoneClientRuntime(comp.EmptyRuntime):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the keystone client component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [KeyStoneClientRuntime.__name__,
|
||||||
|
KeyStoneClientInstaller.__name__,
|
||||||
|
KeyStoneClientUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -441,3 +441,22 @@ class NovaConf(object):
|
|||||||
full_line = key_str + ",".join(filled_opts)
|
full_line = key_str + ",".join(filled_opts)
|
||||||
gen_lines.append(full_line)
|
gen_lines.append(full_line)
|
||||||
return gen_lines
|
return gen_lines
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the nova component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [NovaRuntime.__name__,
|
||||||
|
NovaInstaller.__name__,
|
||||||
|
NovaUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -54,3 +54,22 @@ class NovaClientInstaller(comp.PythonInstallComponent):
|
|||||||
class NovaClientRuntime(comp.EmptyRuntime):
|
class NovaClientRuntime(comp.EmptyRuntime):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the nova client component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [NovaClientRuntime.__name__,
|
||||||
|
NovaClientUninstaller.__name__,
|
||||||
|
NovaClientInstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -77,3 +77,22 @@ class NoVNCRuntime(comp.ProgramRuntime):
|
|||||||
|
|
||||||
def _get_app_options(self, app):
|
def _get_app_options(self, app):
|
||||||
return APP_OPTIONS.get(app)
|
return APP_OPTIONS.get(app)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the nova no-vnc component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [NoVNCRuntime.__name__,
|
||||||
|
NoVNCUninstaller.__name__,
|
||||||
|
NoVNCInstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -46,3 +46,22 @@ class OpenstackXInstaller(comp.PythonInstallComponent):
|
|||||||
class OpenstackXRuntime(comp.EmptyRuntime):
|
class OpenstackXRuntime(comp.EmptyRuntime):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the openstack x component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [OpenstackXRuntime.__name__,
|
||||||
|
OpenstackXInstaller.__name__,
|
||||||
|
OpenstackXUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -198,3 +198,22 @@ class QuantumInstaller(comp.PkgInstallComponent):
|
|||||||
class QuantumRuntime(comp.EmptyRuntime):
|
class QuantumRuntime(comp.EmptyRuntime):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the quantum component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [QuantumRuntime.__name__,
|
||||||
|
QuantumInstaller.__name__,
|
||||||
|
QuantumUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -109,3 +109,22 @@ class RabbitRuntime(comp.EmptyRuntime):
|
|||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the rabbit-mq component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [RabbitRuntime.__name__,
|
||||||
|
RabbitUninstaller.__name__,
|
||||||
|
RabbitInstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -60,3 +60,22 @@ class SwiftInstaller(object):
|
|||||||
class SwiftRuntime(comp.EmptyRuntime):
|
class SwiftRuntime(comp.EmptyRuntime):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
comp.EmptyRuntime.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|
||||||
|
|
||||||
|
def describe(opts=None):
|
||||||
|
description = """ Module: {module_name}
|
||||||
|
Description:
|
||||||
|
Handles actions for the swift component.
|
||||||
|
Component options:
|
||||||
|
{component_opts}
|
||||||
|
Provides:
|
||||||
|
{provides_what}
|
||||||
|
"""
|
||||||
|
params = dict()
|
||||||
|
params['component_opts'] = "TBD"
|
||||||
|
params['module_name'] = __name__
|
||||||
|
provides = [SwiftRuntime.__name__,
|
||||||
|
SwiftInstaller.__name__,
|
||||||
|
SwiftUninstaller.__name__]
|
||||||
|
params['provides_what'] = ", ".join(sorted(provides))
|
||||||
|
return description.format(**params)
|
||||||
|
|||||||
@@ -31,6 +31,13 @@ def parse():
|
|||||||
help_formatter = IndentedHelpFormatter(width=HELP_WIDTH)
|
help_formatter = IndentedHelpFormatter(width=HELP_WIDTH)
|
||||||
parser = OptionParser(version=version_str, formatter=help_formatter)
|
parser = OptionParser(version=version_str, formatter=help_formatter)
|
||||||
|
|
||||||
|
known_components = sorted(settings.COMPONENT_NAMES)
|
||||||
|
components = "(" + ", ".join(known_components) + ")"
|
||||||
|
parser.add_option("-c", "--component",
|
||||||
|
action="append",
|
||||||
|
dest="component",
|
||||||
|
help="openstack component, ie %s" % (components))
|
||||||
|
|
||||||
base_group = OptionGroup(parser, "Install/uninstall/start/stop options")
|
base_group = OptionGroup(parser, "Install/uninstall/start/stop options")
|
||||||
known_actions = sorted(settings.ACTIONS)
|
known_actions = sorted(settings.ACTIONS)
|
||||||
actions = "(" + ", ".join(known_actions) + ")"
|
actions = "(" + ", ".join(known_actions) + ")"
|
||||||
@@ -47,12 +54,6 @@ def parse():
|
|||||||
metavar="DIR",
|
metavar="DIR",
|
||||||
help="empty root DIR for install or "\
|
help="empty root DIR for install or "\
|
||||||
"DIR with existing components for start/stop/uninstall")
|
"DIR with existing components for start/stop/uninstall")
|
||||||
known_components = sorted(settings.COMPONENT_NAMES)
|
|
||||||
components = "(" + ", ".join(known_components) + ")"
|
|
||||||
base_group.add_option("-c", "--component",
|
|
||||||
action="append",
|
|
||||||
dest="component",
|
|
||||||
help="openstack component, ie %s" % (components))
|
|
||||||
base_group.add_option("-i", "--ignore-deps",
|
base_group.add_option("-i", "--ignore-deps",
|
||||||
action="store_false",
|
action="store_false",
|
||||||
dest="ensure_deps",
|
dest="ensure_deps",
|
||||||
@@ -77,13 +78,18 @@ def parse():
|
|||||||
default=False)
|
default=False)
|
||||||
parser.add_option_group(stop_un_group)
|
parser.add_option_group(stop_un_group)
|
||||||
|
|
||||||
dep_group = OptionGroup(parser, "Dependency options")
|
misc_group = OptionGroup(parser, "Miscellaneous options")
|
||||||
dep_group.add_option("-s", "--list-deps",
|
misc_group.add_option("--list-deps",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
dest="list_deps",
|
dest="list_deps",
|
||||||
help="show dependencies of COMPONENT (default: %default)",
|
help="show dependencies of COMPONENT (default: %default)",
|
||||||
default=False)
|
default=False)
|
||||||
parser.add_option_group(dep_group)
|
misc_group.add_option("--describe-components",
|
||||||
|
action="store_true",
|
||||||
|
dest="describe_comp",
|
||||||
|
help="describe COMPONENT (default: %default)",
|
||||||
|
default=False)
|
||||||
|
parser.add_option_group(misc_group)
|
||||||
|
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
@@ -94,6 +100,7 @@ def parse():
|
|||||||
output['ref_components'] = options.r_component
|
output['ref_components'] = options.r_component
|
||||||
output['action'] = options.action
|
output['action'] = options.action
|
||||||
output['list_deps'] = options.list_deps
|
output['list_deps'] = options.list_deps
|
||||||
|
output['describe_comp'] = options.describe_comp
|
||||||
output['force'] = options.force
|
output['force'] = options.force
|
||||||
if options.ensure_deps:
|
if options.ensure_deps:
|
||||||
output['ignore_deps'] = False
|
output['ignore_deps'] = False
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
# 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 devstack import log as logging
|
|
||||||
from devstack import settings
|
|
||||||
from devstack import utils
|
|
||||||
|
|
||||||
LOG = logging.getLogger("devstack.progs.deps")
|
|
||||||
PROG_NAME = "DEPENDENCY LIST"
|
|
||||||
|
|
||||||
|
|
||||||
def log_deps(components):
|
|
||||||
shown = set()
|
|
||||||
left_show = list(components)
|
|
||||||
while left_show:
|
|
||||||
c = left_show.pop()
|
|
||||||
deps = settings.get_dependencies(c)
|
|
||||||
dep_str = ""
|
|
||||||
dep_len = len(deps)
|
|
||||||
if dep_len >= 1:
|
|
||||||
dep_str = "component"
|
|
||||||
if dep_len > 1:
|
|
||||||
dep_str += "s"
|
|
||||||
dep_str += ":"
|
|
||||||
elif dep_len == 0:
|
|
||||||
dep_str = "no components."
|
|
||||||
LOG.info("%s depends on %s" % (c, dep_str))
|
|
||||||
for d in deps:
|
|
||||||
LOG.info("\t%s" % (d))
|
|
||||||
shown.add(c)
|
|
||||||
for d in deps:
|
|
||||||
if d not in shown and d not in left_show:
|
|
||||||
left_show.append(d)
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def _run_list_deps(args):
|
|
||||||
components = settings.parse_components(args.pop("components"), True).keys()
|
|
||||||
components = sorted(components)
|
|
||||||
components.reverse()
|
|
||||||
utils.welcome(PROG_NAME)
|
|
||||||
LOG.info("Showing dependencies of [%s]" % (", ".join(sorted(components))))
|
|
||||||
return log_deps(components)
|
|
||||||
|
|
||||||
|
|
||||||
def run(args):
|
|
||||||
return _run_list_deps(args)
|
|
||||||
118
devstack/progs/misc.py
Normal file
118
devstack/progs/misc.py
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
# 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 re
|
||||||
|
|
||||||
|
from devstack import log as logging
|
||||||
|
from devstack import settings
|
||||||
|
from devstack import utils
|
||||||
|
|
||||||
|
from devstack.components import db
|
||||||
|
from devstack.components import glance
|
||||||
|
from devstack.components import horizon
|
||||||
|
from devstack.components import keystone
|
||||||
|
from devstack.components import keystone_client
|
||||||
|
from devstack.components import nova
|
||||||
|
from devstack.components import nova_client
|
||||||
|
from devstack.components import novnc
|
||||||
|
from devstack.components import openstack_x
|
||||||
|
from devstack.components import quantum
|
||||||
|
from devstack.components import rabbit
|
||||||
|
from devstack.components import swift
|
||||||
|
|
||||||
|
LOG = logging.getLogger("devstack.progs.misc")
|
||||||
|
PROG_NAME = "MISC"
|
||||||
|
|
||||||
|
_DESCR_MAP = {
|
||||||
|
settings.DB: db.describe,
|
||||||
|
settings.GLANCE: glance.describe,
|
||||||
|
settings.HORIZON: horizon.describe,
|
||||||
|
settings.KEYSTONE: keystone.describe,
|
||||||
|
settings.KEYSTONE_CLIENT: keystone_client.describe,
|
||||||
|
settings.NOVA: nova.describe,
|
||||||
|
settings.NOVA_CLIENT: nova_client.describe,
|
||||||
|
settings.OPENSTACK_X: openstack_x.describe,
|
||||||
|
settings.QUANTUM: quantum.describe,
|
||||||
|
settings.RABBIT: rabbit.describe,
|
||||||
|
settings.SWIFT: swift.describe,
|
||||||
|
settings.NOVNC: novnc.describe,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def log_deps(components):
|
||||||
|
shown = set()
|
||||||
|
left_show = list(components)
|
||||||
|
while left_show:
|
||||||
|
c = left_show.pop()
|
||||||
|
deps = settings.get_dependencies(c)
|
||||||
|
dep_str = ""
|
||||||
|
dep_len = len(deps)
|
||||||
|
if dep_len >= 1:
|
||||||
|
dep_str = "component"
|
||||||
|
if dep_len > 1:
|
||||||
|
dep_str += "s"
|
||||||
|
dep_str += ":"
|
||||||
|
elif dep_len == 0:
|
||||||
|
dep_str = "no components."
|
||||||
|
LOG.info("%s depends on %s" % (c, dep_str))
|
||||||
|
for d in deps:
|
||||||
|
LOG.info("\t%s" % (d))
|
||||||
|
shown.add(c)
|
||||||
|
for d in deps:
|
||||||
|
if d not in shown and d not in left_show:
|
||||||
|
left_show.append(d)
|
||||||
|
|
||||||
|
|
||||||
|
def _run_list_deps(args):
|
||||||
|
components = settings.parse_components(args.get("components"), True).keys()
|
||||||
|
components = sorted(components)
|
||||||
|
components.reverse()
|
||||||
|
return log_deps(components)
|
||||||
|
|
||||||
|
|
||||||
|
def _run_describe_comps(args):
|
||||||
|
components = settings.parse_components(args.get("components"), True)
|
||||||
|
c_keys = sorted(components.keys())
|
||||||
|
for c in c_keys:
|
||||||
|
LOG.info("Component %s {", c)
|
||||||
|
describer = _DESCR_MAP.get(c)
|
||||||
|
info = describer(components.get(c))
|
||||||
|
if info:
|
||||||
|
lines = info.splitlines()
|
||||||
|
for line in lines:
|
||||||
|
if len(line) == 0:
|
||||||
|
continue
|
||||||
|
#do some basic formatting
|
||||||
|
mtch = re.match(r"^(\s*)(.*)$", line)
|
||||||
|
new_line = line
|
||||||
|
if mtch:
|
||||||
|
space_am = len(mtch.group(1)) * 2
|
||||||
|
new_line = " " * space_am + mtch.group(2)
|
||||||
|
LOG.info(new_line)
|
||||||
|
LOG.info("}")
|
||||||
|
|
||||||
|
|
||||||
|
def run(args):
|
||||||
|
prog_name = PROG_NAME
|
||||||
|
if args.get('list_deps'):
|
||||||
|
prog_name += " [DEPS]"
|
||||||
|
if args.get('describe_comp'):
|
||||||
|
prog_name += " [DESCRIBE]"
|
||||||
|
utils.welcome(prog_name)
|
||||||
|
if args.get('list_deps'):
|
||||||
|
_run_list_deps(args)
|
||||||
|
if args.get('describe_comp'):
|
||||||
|
_run_describe_comps(args)
|
||||||
|
return True
|
||||||
41
stack
41
stack
@@ -20,14 +20,10 @@ import logging.config
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
#this needs to happen immediately (or thats what it seems)
|
#this needs to happen immediately (or thats what it seems)
|
||||||
LOG_FN_ENV = 'LOG_FILE'
|
|
||||||
LOG_FILE_DEF = os.path.join("conf", 'logging.ini')
|
|
||||||
|
|
||||||
|
|
||||||
def setupLogging():
|
def setupLogging():
|
||||||
logfn = os.getenv(LOG_FN_ENV)
|
logfn = os.getenv('LOG_FILE')
|
||||||
if(logfn == None):
|
if(logfn == None):
|
||||||
logfn = LOG_FILE_DEF
|
logfn = os.path.join("conf", 'logging.ini')
|
||||||
logging.config.fileConfig(logfn)
|
logging.config.fileConfig(logfn)
|
||||||
setupLogging()
|
setupLogging()
|
||||||
|
|
||||||
@@ -36,45 +32,28 @@ from devstack import opts
|
|||||||
|
|
||||||
#these are the program runtimes that actually do the running
|
#these are the program runtimes that actually do the running
|
||||||
from devstack.progs import actions
|
from devstack.progs import actions
|
||||||
from devstack.progs import deps
|
from devstack.progs import misc
|
||||||
|
|
||||||
LOG = logging.getLogger("devstack")
|
LOG = logging.getLogger("devstack")
|
||||||
|
|
||||||
|
|
||||||
def check_python(prog):
|
|
||||||
py_version = sys.version_info
|
|
||||||
major = py_version[0]
|
|
||||||
minor = py_version[1]
|
|
||||||
if(major < 2 or (major == 2 and minor < 6)):
|
|
||||||
LOG.error("Your python version is to old, please upgrade to >= 2.6!")
|
|
||||||
return False
|
|
||||||
if(major >= 3):
|
|
||||||
LOG.warn("%s has not been tested in python %s, use at your own risk!" % (prog, major))
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
me = os.path.basename(sys.argv[0])
|
|
||||||
|
|
||||||
if(not check_python(me)):
|
|
||||||
return 1
|
|
||||||
|
|
||||||
#parse and get it done!
|
#parse and get it done!
|
||||||
args = opts.parse()
|
args = opts.parse()
|
||||||
|
run_ok = False
|
||||||
|
|
||||||
#figure out what to do
|
#figure out what to do
|
||||||
only_list_deps = args.pop('list_deps', False)
|
if args.get('list_deps') or args.get('describe_comp'):
|
||||||
|
run_ok = misc.run(args)
|
||||||
|
else:
|
||||||
|
run_ok = actions.run(args)
|
||||||
|
|
||||||
#now do it
|
#now do it
|
||||||
rc_ok = False
|
if run_ok:
|
||||||
if(only_list_deps):
|
|
||||||
rc_ok = deps.run(args)
|
|
||||||
else:
|
|
||||||
rc_ok = actions.run(args)
|
|
||||||
if(rc_ok):
|
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
LOG.info("Perhaps you should try %s --help" % (me))
|
LOG.info("Perhaps you should try %s --help" % (os.path.basename(sys.argv[0])))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user