Split up the main stack into 2 different running modules (which is cleaner) and fixed various pep8 warnings.
This commit is contained in:
@@ -14,6 +14,11 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from devstack import constants as c
|
from devstack import constants as c
|
||||||
|
from devstack import utils
|
||||||
|
from devstack import shell as sh
|
||||||
|
from devstack import log as logging
|
||||||
|
from devstack import exceptions as excp
|
||||||
|
from devstack import date
|
||||||
|
|
||||||
from devstack.components import db
|
from devstack.components import db
|
||||||
from devstack.components import glance
|
from devstack.components import glance
|
||||||
@@ -27,9 +32,10 @@ from devstack.components import quantum
|
|||||||
from devstack.components import rabbit
|
from devstack.components import rabbit
|
||||||
from devstack.components import swift
|
from devstack.components import swift
|
||||||
|
|
||||||
|
LOG = logging.getLogger("devstack.actions")
|
||||||
|
|
||||||
# This determines what classes to use to install/uninstall/...
|
# This determines what classes to use to install/uninstall/...
|
||||||
ACTION_CLASSES = {
|
_ACTION_CLASSES = {
|
||||||
c.INSTALL: {
|
c.INSTALL: {
|
||||||
c.NOVA: nova.NovaInstaller,
|
c.NOVA: nova.NovaInstaller,
|
||||||
c.GLANCE: glance.GlanceInstaller,
|
c.GLANCE: glance.GlanceInstaller,
|
||||||
@@ -85,9 +91,226 @@ ACTION_CLASSES = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_action_cls(action_name, component_name):
|
def _clean_action(action):
|
||||||
action_cls_map = ACTION_CLASSES.get(action_name)
|
if(action == None):
|
||||||
|
return None
|
||||||
|
action = action.strip().lower()
|
||||||
|
if(not (action in c.ACTIONS)):
|
||||||
|
return None
|
||||||
|
return action
|
||||||
|
|
||||||
|
|
||||||
|
def _get_action_cls(action_name, component_name):
|
||||||
|
action_cls_map = _ACTION_CLASSES.get(action_name)
|
||||||
if(not action_cls_map):
|
if(not action_cls_map):
|
||||||
return None
|
return None
|
||||||
cls = action_cls_map.get(component_name)
|
return action_cls_map.get(component_name)
|
||||||
return cls
|
|
||||||
|
|
||||||
|
def _check_root(action, rootdir):
|
||||||
|
if(rootdir == None or len(rootdir) == 0):
|
||||||
|
return False
|
||||||
|
if(action == c.INSTALL):
|
||||||
|
if(sh.isdir(rootdir) and len(sh.listdir(rootdir)) != 0):
|
||||||
|
LOG.error("Root directory [%s] already exists (and it's not empty)! "\
|
||||||
|
"Please remove it or uninstall components!" % (rootdir))
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _pre_run(action_name, **kargs):
|
||||||
|
if(action_name == c.INSTALL):
|
||||||
|
root_dir = kargs.get("root_dir")
|
||||||
|
if(root_dir):
|
||||||
|
sh.mkdir(root_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def _post_run(action_name, **kargs):
|
||||||
|
if(action_name == c.UNINSTALL):
|
||||||
|
root_dir = kargs.get("root_dir")
|
||||||
|
if(root_dir):
|
||||||
|
sh.rmdir(root_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def _print_cfgs(cfg, action):
|
||||||
|
|
||||||
|
#this will make the items nice and pretty
|
||||||
|
def item_format(k, v):
|
||||||
|
return "\t%s=%s" % (str(k), str(v))
|
||||||
|
|
||||||
|
def map_print(mp):
|
||||||
|
for key in sorted(mp.keys()):
|
||||||
|
value = mp.get(key)
|
||||||
|
LOG.info(item_format(key, value))
|
||||||
|
|
||||||
|
#now make it pretty
|
||||||
|
passwords_gotten = cfg.pws
|
||||||
|
full_cfgs = cfg.configs_fetched
|
||||||
|
db_dsns = cfg.db_dsns
|
||||||
|
if(len(passwords_gotten) or len(full_cfgs) or len(db_dsns)):
|
||||||
|
LOG.info("After action (%s) your settings are:" % (action))
|
||||||
|
if(len(passwords_gotten)):
|
||||||
|
LOG.info("Passwords:")
|
||||||
|
map_print(passwords_gotten)
|
||||||
|
if(len(full_cfgs)):
|
||||||
|
#TODO
|
||||||
|
#better way to do this?? (ie a list difference?)
|
||||||
|
filtered_mp = dict()
|
||||||
|
for key in full_cfgs.keys():
|
||||||
|
if(key in passwords_gotten):
|
||||||
|
continue
|
||||||
|
filtered_mp[key] = full_cfgs.get(key)
|
||||||
|
if(len(filtered_mp)):
|
||||||
|
LOG.info("Configs:")
|
||||||
|
map_print(filtered_mp)
|
||||||
|
if(len(db_dsns)):
|
||||||
|
LOG.info("Data source names:")
|
||||||
|
map_print(db_dsns)
|
||||||
|
|
||||||
|
|
||||||
|
def _install(component_name, instance):
|
||||||
|
LOG.info("Downloading %s." % (component_name))
|
||||||
|
am_downloaded = instance.download()
|
||||||
|
LOG.info("Performed %s downloads." % (am_downloaded))
|
||||||
|
LOG.info("Configuring %s." % (component_name))
|
||||||
|
am_configured = instance.configure()
|
||||||
|
LOG.info("Configured %s items." % (am_configured))
|
||||||
|
LOG.info("Pre-installing %s." % (component_name))
|
||||||
|
instance.pre_install()
|
||||||
|
LOG.info("Installing %s." % (component_name))
|
||||||
|
instance.install()
|
||||||
|
LOG.info("Post-installing %s." % (component_name))
|
||||||
|
trace = instance.post_install()
|
||||||
|
if(trace):
|
||||||
|
LOG.info("Finished install of %s - check %s for traces of what happened." % (component_name, trace))
|
||||||
|
else:
|
||||||
|
LOG.info("Finished install of %s" % (component_name))
|
||||||
|
return trace
|
||||||
|
|
||||||
|
|
||||||
|
def _stop(component_name, instance, skip_notrace):
|
||||||
|
try:
|
||||||
|
LOG.info("Stopping %s." % (component_name))
|
||||||
|
stop_amount = instance.stop()
|
||||||
|
LOG.info("Stopped %s items." % (stop_amount))
|
||||||
|
LOG.info("Finished stop of %s" % (component_name))
|
||||||
|
except excp.NoTraceException, e:
|
||||||
|
if(skip_notrace):
|
||||||
|
LOG.info("Passing on stopping %s since no trace file was found." % (component_name))
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def _start(component_name, instance):
|
||||||
|
LOG.info("Pre-starting %s." % (component_name))
|
||||||
|
instance.pre_start()
|
||||||
|
LOG.info("Starting %s." % (component_name))
|
||||||
|
start_info = instance.start()
|
||||||
|
LOG.info("Post-starting %s." % (component_name))
|
||||||
|
instance.post_start()
|
||||||
|
if(type(start_info) == list):
|
||||||
|
LOG.info("Check [%s] for traces of what happened." % (", ".join(start_info)))
|
||||||
|
elif(type(start_info) == int):
|
||||||
|
LOG.info("Started %s applications." % (start_info))
|
||||||
|
start_info = None
|
||||||
|
LOG.info("Finished start of %s." % (component_name))
|
||||||
|
return start_info
|
||||||
|
|
||||||
|
|
||||||
|
def _uninstall(component_name, instance, skip_notrace):
|
||||||
|
try:
|
||||||
|
LOG.info("Unconfiguring %s." % (component_name))
|
||||||
|
instance.unconfigure()
|
||||||
|
LOG.info("Uninstalling %s." % (component_name))
|
||||||
|
instance.uninstall()
|
||||||
|
except excp.NoTraceException, e:
|
||||||
|
if(skip_notrace):
|
||||||
|
LOG.info("Passing on uninstalling %s since no trace file was found." % (component_name))
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def _run_components(action_name, component_order, components_info, distro, root_dir, program_args):
|
||||||
|
LOG.info("Will %s [%s] (in that order) using root directory \"%s\"" % (action_name, ", ".join(component_order), root_dir))
|
||||||
|
pkg_manager = utils.get_pkg_manager(distro)
|
||||||
|
config = utils.get_config()
|
||||||
|
results = list()
|
||||||
|
#this key list may be different than the order due to reference components
|
||||||
|
active_components = components_info.keys()
|
||||||
|
#run anything before it gets going...
|
||||||
|
_pre_run(action_name, root_dir=root_dir, pkg=pkg_manager, cfg=config)
|
||||||
|
for component in component_order:
|
||||||
|
action_cls = _get_action_cls(action_name, component)
|
||||||
|
instance = action_cls(components=set(active_components),
|
||||||
|
distro=distro,
|
||||||
|
pkg=pkg_manager,
|
||||||
|
cfg=config,
|
||||||
|
root=root_dir,
|
||||||
|
component_opts=components_info.get(component, list()))
|
||||||
|
if(action_name == c.INSTALL):
|
||||||
|
install_result = _install(component, instance)
|
||||||
|
if(install_result):
|
||||||
|
results.append(install_result)
|
||||||
|
elif(action_name == c.STOP):
|
||||||
|
_stop(component, instance, program_args.get('force', False))
|
||||||
|
elif(action_name == c.START):
|
||||||
|
start_result = _start(component, instance)
|
||||||
|
if(start_result):
|
||||||
|
results.append(start_result)
|
||||||
|
elif(action_name == c.UNINSTALL):
|
||||||
|
_uninstall(component, instance, program_args.get('force', False))
|
||||||
|
#display any configs touched...
|
||||||
|
_print_cfgs(config, action_name)
|
||||||
|
#any post run actions go now
|
||||||
|
_post_run(action_name, root_dir=root_dir, pkg=pkg_manager, cfg=config)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def _run_action(args):
|
||||||
|
components = utils.parse_components(args.pop("components"))
|
||||||
|
if(len(components) == 0):
|
||||||
|
LOG.error("No components specified!")
|
||||||
|
return False
|
||||||
|
action = _clean_action(args.pop("action"))
|
||||||
|
if(not action):
|
||||||
|
LOG.error("No valid action specified!")
|
||||||
|
return False
|
||||||
|
rootdir = args.pop("dir")
|
||||||
|
if(not _check_root(action, rootdir)):
|
||||||
|
LOG.error("No valid root directory specified!")
|
||||||
|
return False
|
||||||
|
#ensure os/distro is known
|
||||||
|
(distro, platform) = utils.determine_distro()
|
||||||
|
if(distro == None):
|
||||||
|
LOG.error("Unsupported platform: %s" % (platform))
|
||||||
|
return False
|
||||||
|
#start it
|
||||||
|
utils.welcome(action)
|
||||||
|
#need to figure out dependencies for components (if any)
|
||||||
|
ignore_deps = args.pop('ignore_deps', False)
|
||||||
|
if(not ignore_deps):
|
||||||
|
new_components = utils.resolve_dependencies(components.keys())
|
||||||
|
component_diff = new_components.difference(components.keys())
|
||||||
|
if(len(component_diff)):
|
||||||
|
LOG.info("Having to activate dependent components: [%s]" % (", ".join(component_diff)))
|
||||||
|
for new_component in component_diff:
|
||||||
|
components[new_component] = list()
|
||||||
|
#get the right component order (by priority)
|
||||||
|
component_order = utils.prioritize_components(components.keys())
|
||||||
|
#now do it!
|
||||||
|
LOG.info("Starting action [%s] on %s for distro [%s]" % (action, date.rcf8222date(), distro))
|
||||||
|
#add in any that will just be referenced but which will not actually do anything
|
||||||
|
ref_components = utils.parse_components(args.pop("ref_components"))
|
||||||
|
for c in ref_components.keys():
|
||||||
|
if(c not in components):
|
||||||
|
components[c] = ref_components.get(c)
|
||||||
|
resultList = _run_components(action, component_order, components, distro, rootdir, args)
|
||||||
|
LOG.info("Finished action [%s] on %s" % (action, date.rcf8222date()))
|
||||||
|
if(resultList and len(resultList)):
|
||||||
|
msg = "Check [%s] for traces of what happened." % (", ".join(resultList))
|
||||||
|
LOG.info(msg)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def run(args):
|
||||||
|
return _run_action(args)
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ APP_OPTIONS = {
|
|||||||
#how we invoke the manage command
|
#how we invoke the manage command
|
||||||
KEYSTONE_MNG_CMD = ["%BIN_DIR%/keystone-manage", '--config-file=%CONFIG_FILE%']
|
KEYSTONE_MNG_CMD = ["%BIN_DIR%/keystone-manage", '--config-file=%CONFIG_FILE%']
|
||||||
|
|
||||||
|
|
||||||
class KeystoneUninstaller(comp.PythonUninstallComponent):
|
class KeystoneUninstaller(comp.PythonUninstallComponent):
|
||||||
def __init__(self, *args, **kargs):
|
def __init__(self, *args, **kargs):
|
||||||
comp.PythonUninstallComponent.__init__(self, TYPE, *args, **kargs)
|
comp.PythonUninstallComponent.__init__(self, TYPE, *args, **kargs)
|
||||||
|
|||||||
55
devstack/deps.py
Normal file
55
devstack/deps.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# 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 utils
|
||||||
|
from devstack import log as logging
|
||||||
|
|
||||||
|
LOG = logging.getLogger("devstack.deps")
|
||||||
|
|
||||||
|
|
||||||
|
def log_deps(components):
|
||||||
|
shown = set()
|
||||||
|
left_show = list(components)
|
||||||
|
while(len(left_show) != 0):
|
||||||
|
c = left_show.pop()
|
||||||
|
deps = utils.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 = utils.parse_components(args.pop("components"), True).keys()
|
||||||
|
components = sorted(components)
|
||||||
|
components.reverse()
|
||||||
|
return log_deps(components)
|
||||||
|
|
||||||
|
|
||||||
|
def run(args):
|
||||||
|
return _run_list_deps(args)
|
||||||
@@ -64,7 +64,7 @@ class TermHandler(logging.Handler):
|
|||||||
TermHandler.STREAM.flush()
|
TermHandler.STREAM.flush()
|
||||||
|
|
||||||
|
|
||||||
def setupLogging():
|
def setup():
|
||||||
logfn = os.getenv(LOG_FN_ENV)
|
logfn = os.getenv(LOG_FN_ENV)
|
||||||
if(logfn == None):
|
if(logfn == None):
|
||||||
logfn = 'conf/logging.ini'
|
logfn = 'conf/logging.ini'
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ def get_config():
|
|||||||
config_instance.read(cfg_fn)
|
config_instance.read(cfg_fn)
|
||||||
return config_instance
|
return config_instance
|
||||||
|
|
||||||
|
|
||||||
def get_dependencies(component):
|
def get_dependencies(component):
|
||||||
deps = constants.COMPONENT_DEPENDENCIES.get(component, list())
|
deps = constants.COMPONENT_DEPENDENCIES.get(component, list())
|
||||||
return sorted(deps)
|
return sorted(deps)
|
||||||
@@ -115,6 +116,42 @@ def fetch_dependencies(component, add=False):
|
|||||||
return deps
|
return deps
|
||||||
|
|
||||||
|
|
||||||
|
def parse_components(components, assume_all=False):
|
||||||
|
#none provided, init it
|
||||||
|
if(components == None):
|
||||||
|
components = list()
|
||||||
|
#this regex is used to extract a components options (if any) and its name
|
||||||
|
EXT_COMPONENT = re.compile(r"^\s*([\w-]+)(?:\((.*)\))?\s*$")
|
||||||
|
adjusted_components = dict()
|
||||||
|
for c in components:
|
||||||
|
mtch = EXT_COMPONENT.match(c)
|
||||||
|
if(mtch):
|
||||||
|
component_name = mtch.group(1).lower().strip()
|
||||||
|
if(component_name not in constants.COMPONENT_NAMES):
|
||||||
|
LOG.warn("Unknown component named %s" % (component_name))
|
||||||
|
else:
|
||||||
|
component_opts = mtch.group(2)
|
||||||
|
components_opts_cleaned = list()
|
||||||
|
if(component_opts == None or len(component_opts) == 0):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
sp_component_opts = component_opts.split(",")
|
||||||
|
for co in sp_component_opts:
|
||||||
|
cleaned_opt = co.strip()
|
||||||
|
if(len(cleaned_opt)):
|
||||||
|
components_opts_cleaned.append(cleaned_opt)
|
||||||
|
adjusted_components[component_name] = components_opts_cleaned
|
||||||
|
else:
|
||||||
|
LOG.warn("Unparseable component %s" % (c))
|
||||||
|
#should we adjust them to be all the components?
|
||||||
|
if(len(adjusted_components) == 0 and assume_all):
|
||||||
|
all_components = dict()
|
||||||
|
for c in constants.COMPONENT_NAMES:
|
||||||
|
all_components[c] = list()
|
||||||
|
adjusted_components = all_components
|
||||||
|
return adjusted_components
|
||||||
|
|
||||||
|
|
||||||
def prioritize_components(components):
|
def prioritize_components(components):
|
||||||
#get the right component order (by priority)
|
#get the right component order (by priority)
|
||||||
mporder = dict()
|
mporder = dict()
|
||||||
|
|||||||
303
stack
303
stack
@@ -15,232 +15,19 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# This needs to happen immediately
|
# This needs to happen immediately
|
||||||
from devstack import log as logging
|
from devstack import log as logging
|
||||||
logging.setupLogging()
|
logging.setup()
|
||||||
|
|
||||||
from devstack import actions
|
from devstack import actions
|
||||||
from devstack import cfg
|
|
||||||
from devstack import constants
|
|
||||||
from devstack import date
|
|
||||||
from devstack import exceptions as excp
|
|
||||||
from devstack import opts
|
from devstack import opts
|
||||||
from devstack import shell as sh
|
from devstack import deps
|
||||||
from devstack import utils
|
|
||||||
|
|
||||||
LOG = logging.getLogger("devstack")
|
LOG = logging.getLogger("devstack")
|
||||||
|
|
||||||
|
|
||||||
def print_cfgs(cfg, action):
|
|
||||||
|
|
||||||
#this will make the items nice and pretty
|
|
||||||
def item_format(k, v):
|
|
||||||
return "\t%s=%s" % (str(k), str(v))
|
|
||||||
|
|
||||||
def map_print(mp):
|
|
||||||
for key in sorted(mp.keys()):
|
|
||||||
value = mp.get(key)
|
|
||||||
LOG.info(item_format(key, value))
|
|
||||||
|
|
||||||
#now make it pretty
|
|
||||||
passwords_gotten = cfg.pws
|
|
||||||
full_cfgs = cfg.configs_fetched
|
|
||||||
db_dsns = cfg.db_dsns
|
|
||||||
if(len(passwords_gotten) or len(full_cfgs) or len(db_dsns)):
|
|
||||||
LOG.info("After action (%s) your settings are:" % (action))
|
|
||||||
if(len(passwords_gotten)):
|
|
||||||
LOG.info("Passwords:")
|
|
||||||
map_print(passwords_gotten)
|
|
||||||
if(len(full_cfgs)):
|
|
||||||
#TODO
|
|
||||||
#better way to do this?? (ie a list difference?)
|
|
||||||
filtered_mp = dict()
|
|
||||||
for key in full_cfgs.keys():
|
|
||||||
if(key in passwords_gotten):
|
|
||||||
continue
|
|
||||||
filtered_mp[key] = full_cfgs.get(key)
|
|
||||||
if(len(filtered_mp)):
|
|
||||||
LOG.info("Configs:")
|
|
||||||
map_print(filtered_mp)
|
|
||||||
if(len(db_dsns)):
|
|
||||||
LOG.info("Data source names:")
|
|
||||||
map_print(db_dsns)
|
|
||||||
|
|
||||||
|
|
||||||
def pre_run_components(action_name, **kargs):
|
|
||||||
if(action_name == constants.INSTALL):
|
|
||||||
root_dir = kargs.get("root_dir")
|
|
||||||
if(root_dir):
|
|
||||||
sh.mkdir(root_dir)
|
|
||||||
|
|
||||||
|
|
||||||
def post_run_components(action_name, **kargs):
|
|
||||||
if(action_name == constants.UNINSTALL):
|
|
||||||
root_dir = kargs.get("root_dir")
|
|
||||||
if(root_dir):
|
|
||||||
sh.rmdir(root_dir)
|
|
||||||
|
|
||||||
|
|
||||||
def run_install(component_name, instance):
|
|
||||||
LOG.info("Downloading %s." % (component_name))
|
|
||||||
am_downloaded = instance.download()
|
|
||||||
LOG.info("Performed %s downloads." % (am_downloaded))
|
|
||||||
LOG.info("Configuring %s." % (component_name))
|
|
||||||
am_configured = instance.configure()
|
|
||||||
LOG.info("Configured %s items." % (am_configured))
|
|
||||||
LOG.info("Pre-installing %s." % (component_name))
|
|
||||||
instance.pre_install()
|
|
||||||
LOG.info("Installing %s." % (component_name))
|
|
||||||
instance.install()
|
|
||||||
LOG.info("Post-installing %s." % (component_name))
|
|
||||||
trace = instance.post_install()
|
|
||||||
if(trace):
|
|
||||||
LOG.info("Finished install of %s - check %s for traces of what happened." % (component_name, trace))
|
|
||||||
else:
|
|
||||||
LOG.info("Finished install of %s" % (component_name))
|
|
||||||
return trace
|
|
||||||
|
|
||||||
|
|
||||||
def run_stop(component_name, instance, skip_notrace):
|
|
||||||
try:
|
|
||||||
LOG.info("Stopping %s." % (component_name))
|
|
||||||
stop_amount = instance.stop()
|
|
||||||
LOG.info("Stopped %s items." % (stop_amount))
|
|
||||||
LOG.info("Finished stop of %s" % (component_name))
|
|
||||||
except excp.NoTraceException, e:
|
|
||||||
if(skip_notrace):
|
|
||||||
LOG.info("Passing on stopping %s since no trace file was found." % (component_name))
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
def run_start(component_name, instance):
|
|
||||||
LOG.info("Pre-starting %s." % (component_name))
|
|
||||||
instance.pre_start()
|
|
||||||
LOG.info("Starting %s." % (component_name))
|
|
||||||
start_info = instance.start()
|
|
||||||
LOG.info("Post-starting %s." % (component_name))
|
|
||||||
instance.post_start()
|
|
||||||
if(type(start_info) == list):
|
|
||||||
LOG.info("Check [%s] for traces of what happened." % (", ".join(start_info)))
|
|
||||||
elif(type(start_info) == int):
|
|
||||||
LOG.info("Started %s applications." % (start_info))
|
|
||||||
start_info = None
|
|
||||||
LOG.info("Finished start of %s." % (component_name))
|
|
||||||
return start_info
|
|
||||||
|
|
||||||
|
|
||||||
def run_uninstall(component_name, instance, skip_notrace):
|
|
||||||
try:
|
|
||||||
LOG.info("Unconfiguring %s." % (component_name))
|
|
||||||
instance.unconfigure()
|
|
||||||
LOG.info("Uninstalling %s." % (component_name))
|
|
||||||
instance.uninstall()
|
|
||||||
except excp.NoTraceException, e:
|
|
||||||
if(skip_notrace):
|
|
||||||
LOG.info("Passing on uninstalling %s since no trace file was found." % (component_name))
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
def run_components(action_name, component_order, components_info, distro, root_dir, program_args):
|
|
||||||
LOG.info("Will %s [%s] (in that order) using root directory \"%s\"" % (action_name, ", ".join(component_order), root_dir))
|
|
||||||
pkg_manager = utils.get_pkg_manager(distro)
|
|
||||||
config = utils.get_config()
|
|
||||||
results = list()
|
|
||||||
#this key list may be different than the order due to reference components
|
|
||||||
active_components = components_info.keys()
|
|
||||||
#run anything before it gets going...
|
|
||||||
pre_run_components(action_name, root_dir=root_dir, pkg=pkg_manager, cfg=config)
|
|
||||||
for c in component_order:
|
|
||||||
klass = actions.get_action_cls(action_name, c)
|
|
||||||
component_opts = components_info.get(c, list())
|
|
||||||
instance = klass(components=set(active_components),
|
|
||||||
distro=distro,
|
|
||||||
pkg=pkg_manager,
|
|
||||||
cfg=config,
|
|
||||||
root=root_dir,
|
|
||||||
component_opts=component_opts)
|
|
||||||
if(action_name == constants.INSTALL):
|
|
||||||
install_result = run_install(c, instance)
|
|
||||||
if(install_result):
|
|
||||||
results.append(install_result)
|
|
||||||
elif(action_name == constants.STOP):
|
|
||||||
run_stop(c, instance, program_args.get('force', False))
|
|
||||||
elif(action_name == constants.START):
|
|
||||||
start_result = run_start(c, instance)
|
|
||||||
if(start_result):
|
|
||||||
results.append(start_result)
|
|
||||||
elif(action_name == constants.UNINSTALL):
|
|
||||||
run_uninstall(c, instance, program_args.get('force', False))
|
|
||||||
#display any configs touched...
|
|
||||||
print_cfgs(config, action_name)
|
|
||||||
#any post run actions go now
|
|
||||||
post_run_components(action_name, root_dir=root_dir, pkg=pkg_manager, cfg=config)
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
def check_root(action, rootdir):
|
|
||||||
if(rootdir == None or len(rootdir) == 0):
|
|
||||||
return False
|
|
||||||
if(action == constants.INSTALL):
|
|
||||||
if(sh.isdir(rootdir)):
|
|
||||||
sublisting = sh.listdir(rootdir)
|
|
||||||
if(len(sublisting) != 0):
|
|
||||||
LOG.error("Root directory [%s] already exists (and it's not empty)! "\
|
|
||||||
"Please remove it or uninstall components!" % (rootdir))
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def clean_action(action):
|
|
||||||
if(action == None):
|
|
||||||
return None
|
|
||||||
action = action.strip().lower()
|
|
||||||
if(not (action in constants.ACTIONS)):
|
|
||||||
return None
|
|
||||||
return action
|
|
||||||
|
|
||||||
|
|
||||||
def parse_components(components, assume_all=False):
|
|
||||||
#none provided, init it
|
|
||||||
if(components == None):
|
|
||||||
components = list()
|
|
||||||
#this regex is used to extract a components options (if any) and its name
|
|
||||||
EXT_COMPONENT = re.compile(r"^\s*([\w-]+)(?:\((.*)\))?\s*$")
|
|
||||||
adjusted_components = dict()
|
|
||||||
for c in components:
|
|
||||||
mtch = EXT_COMPONENT.match(c)
|
|
||||||
if(mtch):
|
|
||||||
component_name = mtch.group(1).lower().strip()
|
|
||||||
if(component_name not in constants.COMPONENT_NAMES):
|
|
||||||
LOG.warn("Unknown component named %s" % (component_name))
|
|
||||||
else:
|
|
||||||
component_opts = mtch.group(2)
|
|
||||||
components_opts_cleaned = list()
|
|
||||||
if(component_opts == None or len(component_opts) == 0):
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
sp_component_opts = component_opts.split(",")
|
|
||||||
for co in sp_component_opts:
|
|
||||||
cleaned_opt = co.strip()
|
|
||||||
if(len(cleaned_opt)):
|
|
||||||
components_opts_cleaned.append(cleaned_opt)
|
|
||||||
adjusted_components[component_name] = components_opts_cleaned
|
|
||||||
else:
|
|
||||||
LOG.warn("Unparseable component %s" % (c))
|
|
||||||
#should we adjust them to be all the components?
|
|
||||||
if(len(adjusted_components) == 0 and assume_all):
|
|
||||||
all_components = dict()
|
|
||||||
for c in constants.COMPONENT_NAMES:
|
|
||||||
all_components[c] = list()
|
|
||||||
adjusted_components = all_components
|
|
||||||
return adjusted_components
|
|
||||||
|
|
||||||
|
|
||||||
def check_python():
|
def check_python():
|
||||||
py_version = sys.version_info
|
py_version = sys.version_info
|
||||||
major = py_version[0]
|
major = py_version[0]
|
||||||
@@ -253,84 +40,6 @@ def check_python():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def run_list_deps(prog, args):
|
|
||||||
components = parse_components(args.pop("components"), True).keys()
|
|
||||||
components = sorted(components)
|
|
||||||
components.reverse()
|
|
||||||
shown = set()
|
|
||||||
left_show = list(components)
|
|
||||||
while(len(left_show) != 0):
|
|
||||||
c = left_show.pop()
|
|
||||||
deps = utils.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_actions(prog, args):
|
|
||||||
components = parse_components(args.pop("components"))
|
|
||||||
if(len(components) == 0):
|
|
||||||
LOG.error("No components specified!")
|
|
||||||
LOG.info("Perhaps you should try %s --help" % (prog))
|
|
||||||
return False
|
|
||||||
#extract + clean the action
|
|
||||||
action = clean_action(args.pop("action"))
|
|
||||||
if(not action):
|
|
||||||
LOG.error("No valid action specified!")
|
|
||||||
LOG.info("Perhaps you should try %s --help" % (prog))
|
|
||||||
return False
|
|
||||||
rootdir = args.pop("dir")
|
|
||||||
if(not check_root(action, rootdir)):
|
|
||||||
LOG.error("No valid root directory specified!")
|
|
||||||
LOG.info("Perhaps you should try %s --help" % (prog))
|
|
||||||
return False
|
|
||||||
#ensure os/distro is known
|
|
||||||
(distro, platform) = utils.determine_distro()
|
|
||||||
if(distro == None):
|
|
||||||
LOG.error("Unsupported platform: %s" % (platform))
|
|
||||||
return False
|
|
||||||
#start it
|
|
||||||
utils.welcome(action)
|
|
||||||
#need to figure out dependencies for components (if any)
|
|
||||||
ignore_deps = args.pop('ignore_deps', False)
|
|
||||||
if(not ignore_deps):
|
|
||||||
new_components = utils.resolve_dependencies(components.keys())
|
|
||||||
component_diff = new_components.difference(components.keys())
|
|
||||||
if(len(component_diff)):
|
|
||||||
LOG.info("Having to activate dependent components: [%s]" % (", ".join(component_diff)))
|
|
||||||
for new_component in component_diff:
|
|
||||||
components[new_component] = list()
|
|
||||||
#get the right component order (by priority)
|
|
||||||
component_order = utils.prioritize_components(components.keys())
|
|
||||||
#now do it!
|
|
||||||
LOG.info("Starting action [%s] on %s for distro [%s]" % (action, date.rcf8222date(), distro))
|
|
||||||
#add in any that will just be referenced but which will not actually do anything
|
|
||||||
ref_components = parse_components(args.pop("ref_components"))
|
|
||||||
for c in ref_components.keys():
|
|
||||||
if(c not in components):
|
|
||||||
components[c] = ref_components.get(c)
|
|
||||||
resultList = run_components(action, component_order, components, distro, rootdir, args)
|
|
||||||
LOG.info("Finished action [%s] on %s" % (action, date.rcf8222date()))
|
|
||||||
if(resultList and len(resultList)):
|
|
||||||
msg = "Check [%s] for traces of what happened." % (", ".join(resultList))
|
|
||||||
LOG.info(msg)
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if(not check_python()):
|
if(not check_python()):
|
||||||
return 1
|
return 1
|
||||||
@@ -342,15 +51,15 @@ def main():
|
|||||||
#now do it
|
#now do it
|
||||||
rc_ok = False
|
rc_ok = False
|
||||||
if(only_list_deps):
|
if(only_list_deps):
|
||||||
rc_ok = run_list_deps(me, args)
|
rc_ok = deps.run(args)
|
||||||
else:
|
else:
|
||||||
rc_ok = run_actions(me, args)
|
rc_ok = actions.run(args)
|
||||||
if(rc_ok):
|
if(rc_ok):
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
|
LOG.info("Perhaps you should try %s --help" % (me))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
rc = main()
|
sys.exit(main())
|
||||||
sys.exit(rc)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user