diff --git a/lib/cdist/config_install.py b/lib/cdist/config_install.py index 2a1c828d..152d6c4a 100644 --- a/lib/cdist/config_install.py +++ b/lib/cdist/config_install.py @@ -40,23 +40,24 @@ class ConfigInstall(object): def __init__(self, context): self.context = context - + self.log = logging.getLogger(self.context.target_host) self.exec_wrapper = cdist.exec.Wrapper( target_host = self.context.target_host, remote_exec=self.context.remote_exec, remote_copy=self.context.remote_copy) + # Create directories other may depend on + self.__init_local_paths() + self.__init_remote_paths() + self.explorer = cdist.explorer.Explorer(self.context) - self.manifest = cdist.manifest.Mamifest() + #self.manifest = cdist.manifest.Mamifest() self.log = logging.getLogger(self.context.target_host) # Setup env to be used by others - FIXME self.__init_env() - # Create directories - self.__init_local_paths() - self.__init_remote_paths() def __init_remote_paths(self): """Initialise remote directory structure""" @@ -72,34 +73,33 @@ class ConfigInstall(object): os.mkdir(self.context.base_path) # FIXME: raise more beautiful exception / Steven: handle exception - os.mkdir(self.out_path) - os.mkdir(self.global_explorer_out_path) - os.mkdir(self.bin_path) + os.mkdir(self.context.out_path) + os.mkdir(self.context.bin_path) # FIXME: remove this function, only expose ENV # explicitly! def __init_env(self): """Environment usable for other stuff""" os.environ['__target_host'] = self.context.target_host - if self.debug: + if self.context.debug: os.environ['__debug'] = "yes" def cleanup(self): - log.debug("Saving " + self.out_path + " to " + self.cache_path) + self.log.debug("Saving " + self.context.out_path + " to " + self.context.cache_path) if os.path.exists(self.context.cache_path): shutil.rmtree(self.context.cache_path) shutil.move(self.context.out_path, self.context.cache_path) def object_prepare(self, cdist_object): """Prepare object: Run type explorer + manifest""" - log.debug("Preparing object: " + cdist_object.name) - self.run_type_explorer(cdist_object) - self.run_type_manifest(cdist_object) + self.log.debug("Preparing object: " + cdist_object.name) + cdist_object.explorers = self.explorer.run_type_explorer(cdist_object) + self.manifest.run_type_manifest(cdist_object) cdist_object.prepared = True def object_run(self, cdist_object): """Run gencode and code for an object""" - log.debug("Running object %s", cdist_object) + self.log.debug("Running object %s", cdist_object) # Catch requirements, which re-call us if cdist_object.ran: @@ -108,7 +108,7 @@ class ConfigInstall(object): cdist_type = cdist_object.type for requirement in cdist_object.requirements: - log.debug("Object %s requires %s", cdist_object, requirement) + self.log.debug("Object %s requires %s", cdist_object, requirement) self.object_run(requirement) # @@ -116,7 +116,7 @@ class ConfigInstall(object): # env = os.environ.copy() env['__target_host'] = self.context.target_host - env['__global'] = self.out_path + env['__global'] = self.context.out_path env["__object"] = os.path.join(self.object_base_path, cdist_object.path) env["__object_id"] = cdist_object.object_id env["__object_fq"] = cdist_object.name @@ -124,7 +124,7 @@ class ConfigInstall(object): # gencode for cmd in ["local", "remote"]: - bin = os.path.join(self.type_base_path, + bin = os.path.join(self.context.type_base_path, getattr(cdist_type, "gencode_" + cmd + "_path")) if os.path.isfile(bin): @@ -162,24 +162,24 @@ class ConfigInstall(object): remote_remote_code = os.path.join(self.remote_object_path, cdist_object.code_remote_path) if os.path.isfile(local_remote_code): - self.transfer_path(local_remote_code, remote_remote_code) + self.context.transfer_path(local_remote_code, remote_remote_code) cdist.exec.run_or_fail([remote_remote_code], remote_prefix=True) cdist_object.ran = True def link_emulator(self): """Link emulator to types""" - src = os.path.abspath(self.exec_path) - for cdist_type in cdist.core.Type.list_types(self.type_base_path): - dst = os.path.join(self.bin_path, cdist_type.name) - log.debug("Linking emulator: %s to %s", src, dst) + src = os.path.abspath(self.context.exec_path) + for cdist_type in cdist.core.Type.list_types(self.context.type_base_path): + dst = os.path.join(self.context.bin_path, cdist_type.name) + self.log.debug("Linking emulator: %s to %s", src, dst) # FIXME: handle exception / make it more beautiful / Steven: raise except :-) os.symlink(src, dst) def deploy_to(self): """Mimic the old deploy to: Deploy to one host""" - log.info("Deploying to " + self.context.target_host) + self.log.info("Deploying to " + self.context.target_host) self.stage_prepare() self.stage_run() @@ -188,25 +188,25 @@ class ConfigInstall(object): start_time = time.time() self.deploy_to() self.cleanup() - log.info("Finished run of %s in %s seconds", + self.log.info("Finished run of %s in %s seconds", self.context.target_host, time.time() - start_time) def stage_prepare(self): """Do everything for a deploy, minus the actual code stage""" self.link_emulator() - self.run_global_explorers() + self.explorer.run_global_explorers() self.run_initial_manifest() - log.info("Running object manifests and type explorers") + self.log.info("Running object manifests and type explorers") # Continue process until no new objects are created anymore new_objects_created = True while new_objects_created: new_objects_created = False for cdist_object in cdist.core.Object.list_objects(self.object_base_path, - self.type_base_path): + self.context.type_base_path): if cdist_object.prepared: - log.debug("Skipping rerun of object %s", cdist_object) + self.log.debug("Skipping rerun of object %s", cdist_object) continue else: self.object_prepare(cdist_object) @@ -214,8 +214,8 @@ class ConfigInstall(object): def stage_run(self): """The final (and real) step of deployment""" - log.info("Generating and executing code") + self.log.info("Generating and executing code") for cdist_object in cdist.core.Object.list_objects(self.object_base_path, - self.type_base_path): - log.debug("Run object: %s", cdist_object) + self.context.type_base_path): + self.log.debug("Run object: %s", cdist_object) self.object_run(cdist_object) diff --git a/lib/cdist/context.py b/lib/cdist/context.py index 7bb700e8..f70e9752 100644 --- a/lib/cdist/context.py +++ b/lib/cdist/context.py @@ -41,6 +41,8 @@ class Context(object): exec_path=sys.argv[0], debug=False): + self.debug = debug + self.target_host = target_host # Only required for testing diff --git a/lib/cdist/explorer.py b/lib/cdist/explorer.py index b0db60bc..9030e506 100644 --- a/lib/cdist/explorer.py +++ b/lib/cdist/explorer.py @@ -22,16 +22,17 @@ import io import logging -#import os +import os #import stat #import shutil #import sys #import tempfile #import time # -#import cdist.core #import cdist.exec +import cdist + log = logging.getLogger(__name__) class Explorer: @@ -39,6 +40,10 @@ class Explorer: def __init__(self, context): self.context = context + try: + os.mkdir(self.context.global_explorer_out_path) + except OSError as e: + raise cdist.Error("Failed to create explorer out path: %s" % e) def run_type_explorer(self, cdist_object): """Run type specific explorers for objects"""