From 3de9b869ac0d66e232af3e50f6801bc33189f615 Mon Sep 17 00:00:00 2001 From: Steven Armstrong Date: Thu, 29 Aug 2013 21:56:53 +0200 Subject: [PATCH] there is no such thing as cdist install in master remove all traces of it to prevent the ongoing merge issues when using the real thing Signed-off-by: Steven Armstrong --- cdist/config.py | 251 +++++++++++++++- cdist/config_install.py | 271 ------------------ cdist/core/cdist_type.py | 5 - cdist/emulator.py | 5 - cdist/install.py | 33 --- cdist/shell.py | 3 - cdist/test/cdist_type/__init__.py | 10 - .../{config_install => config}/__init__.py | 2 +- .../fixtures/object/__first/.keep | 0 .../fixtures/object/__first/man/.cdist/.keep | 0 .../fixtures/object/__second/.keep | 0 .../object/__second/on-the/.cdist/.keep | 0 .../fixtures/object/__third/.keep | 0 .../fixtures/object/__third/moon/.cdist/.keep | 0 .../object/__third/moon/.cdist/parameter/name | 0 .../__third/moon/.cdist/parameter/planet | 0 .../fixtures/type/__first/.keep | 0 .../fixtures/type/__second/.keep | 0 .../fixtures/type/__singleton_test/singleton | 0 .../fixtures/type/__third/.keep | 0 scripts/cdist | 38 +-- 21 files changed, 261 insertions(+), 357 deletions(-) delete mode 100644 cdist/config_install.py delete mode 100644 cdist/install.py rename cdist/test/{config_install => config}/__init__.py (99%) rename cdist/test/{config_install => config}/fixtures/object/__first/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__first/man/.cdist/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__second/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__second/on-the/.cdist/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__third/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__third/moon/.cdist/.keep (100%) rename cdist/test/{config_install => config}/fixtures/object/__third/moon/.cdist/parameter/name (100%) rename cdist/test/{config_install => config}/fixtures/object/__third/moon/.cdist/parameter/planet (100%) rename cdist/test/{config_install => config}/fixtures/type/__first/.keep (100%) rename cdist/test/{config_install => config}/fixtures/type/__second/.keep (100%) rename cdist/test/{config_install => config}/fixtures/type/__singleton_test/singleton (100%) rename cdist/test/{config_install => config}/fixtures/type/__third/.keep (100%) diff --git a/cdist/config.py b/cdist/config.py index 2c6c2e6d..019f2cc7 100644 --- a/cdist/config.py +++ b/cdist/config.py @@ -20,7 +20,252 @@ # # -import cdist.config_install +import logging +import os +import shutil +import sys +import time +import pprint -class Config(cdist.config_install.ConfigInstall): - pass +import cdist + +import cdist.exec.local +import cdist.exec.remote + +from cdist import core + +class Config(object): + """Cdist main class to hold arbitrary data""" + + def __init__(self, local, remote, dry_run=False): + + self.local = local + self.remote = remote + self.log = logging.getLogger(self.local.target_host) + self.dry_run = dry_run + + self.explorer = core.Explorer(self.local.target_host, self.local, self.remote) + self.manifest = core.Manifest(self.local.target_host, self.local) + self.code = core.Code(self.local.target_host, self.local, self.remote) + + def _init_files_dirs(self): + """Prepare files and directories for the run""" + self.local.create_files_dirs() + self.remote.create_files_dirs() + + @classmethod + def commandline(cls, args): + """Configure remote system""" + import multiprocessing + + # FIXME: Refactor relict - remove later + log = logging.getLogger("cdist") + + initial_manifest_tempfile = None + if args.manifest == '-': + # read initial manifest from stdin + import tempfile + try: + handle, initial_manifest_temp_path = tempfile.mkstemp(prefix='cdist.stdin.') + with os.fdopen(handle, 'w') as fd: + fd.write(sys.stdin.read()) + except (IOError, OSError) as e: + raise cdist.Error("Creating tempfile for stdin data failed: %s" % e) + + args.manifest = initial_manifest_temp_path + import atexit + atexit.register(lambda: os.remove(initial_manifest_temp_path)) + + process = {} + failed_hosts = [] + time_start = time.time() + + for host in args.host: + if args.parallel: + log.debug("Creating child process for %s", host) + process[host] = multiprocessing.Process(target=cls.onehost, args=(host, args, True)) + process[host].start() + else: + try: + cls.onehost(host, args, parallel=False) + except cdist.Error as e: + failed_hosts.append(host) + + # Catch errors in parallel mode when joining + if args.parallel: + for host in process.keys(): + log.debug("Joining process %s", host) + process[host].join() + + if not process[host].exitcode == 0: + failed_hosts.append(host) + + time_end = time.time() + log.info("Total processing time for %s host(s): %s", len(args.host), + (time_end - time_start)) + + if len(failed_hosts) > 0: + raise cdist.Error("Failed to configure the following hosts: " + + " ".join(failed_hosts)) + + @classmethod + def onehost(cls, host, args, parallel): + """Configure ONE system""" + + log = logging.getLogger(host) + + try: + local = cdist.exec.local.Local( + target_host=host, + initial_manifest=args.manifest, + out_path=args.out_path, + add_conf_dirs=args.conf_dir) + + remote = cdist.exec.remote.Remote( + target_host=host, + remote_exec=args.remote_exec, + remote_copy=args.remote_copy) + + c = cls(local, remote) + c.run() + + except cdist.Error as e: + log.error(e) + if parallel: + # We are running in our own process here, need to sys.exit! + sys.exit(1) + else: + raise + + except KeyboardInterrupt: + # Ignore in parallel mode, we are existing anyway + if parallel: + sys.exit(0) + # Pass back to controlling code in sequential mode + else: + raise + + def run(self): + """Do what is most often done: deploy & cleanup""" + start_time = time.time() + + self._init_files_dirs() + + self.explorer.run_global_explorers(self.local.global_explorer_out_path) + self.manifest.run_initial_manifest(self.local.initial_manifest) + self.iterate_until_finished() + + self.local.save_cache() + self.log.info("Finished successful run in %s seconds", time.time() - start_time) + + + def object_list(self): + """Short name for object list retrieval""" + for cdist_object in core.CdistObject.list_objects(self.local.object_path, + self.local.type_path): + yield cdist_object + + def iterate_once(self): + """ + Iterate over the objects once - helper method for + iterate_until_finished + """ + objects_changed = False + + for cdist_object in self.object_list(): + if cdist_object.requirements_unfinished(cdist_object.requirements): + """We cannot do anything for this poor object""" + continue + + if cdist_object.state == core.CdistObject.STATE_UNDEF: + """Prepare the virgin object""" + + self.object_prepare(cdist_object) + objects_changed = True + + if cdist_object.requirements_unfinished(cdist_object.autorequire): + """The previous step created objects we depend on - wait for them""" + continue + + if cdist_object.state == core.CdistObject.STATE_PREPARED: + self.object_run(cdist_object) + objects_changed = True + + return objects_changed + + + def iterate_until_finished(self): + """ + Go through all objects and solve them + one after another + """ + + objects_changed = True + + while objects_changed: + objects_changed = self.iterate_once() + + # Check whether all objects have been finished + unfinished_objects = [] + for cdist_object in self.object_list(): + if not cdist_object.state == cdist_object.STATE_DONE: + unfinished_objects.append(cdist_object) + + if unfinished_objects: + info_string = [] + + for cdist_object in unfinished_objects: + + requirement_names = [] + autorequire_names = [] + + for requirement in cdist_object.requirements_unfinished(cdist_object.requirements): + requirement_names.append(requirement.name) + + for requirement in cdist_object.requirements_unfinished(cdist_object.autorequire): + autorequire_names.append(requirement.name) + + requirements = ", ".join(requirement_names) + autorequire = ", ".join(autorequire_names) + info_string.append("%s requires: %s autorequires: %s" % (cdist_object.name, requirements, autorequire)) + + raise cdist.UnresolvableRequirementsError("The requirements of the following objects could not be resolved: %s" % + ("; ".join(info_string))) + + def object_prepare(self, cdist_object): + """Prepare object: Run type explorer + manifest""" + self.log.info("Running manifest and explorers for " + cdist_object.name) + self.explorer.run_type_explorers(cdist_object) + self.manifest.run_type_manifest(cdist_object) + cdist_object.state = core.CdistObject.STATE_PREPARED + + def object_run(self, cdist_object): + """Run gencode and code for an object""" + + self.log.debug("Trying to run object %s" % (cdist_object.name)) + if cdist_object.state == core.CdistObject.STATE_DONE: + raise cdist.Error("Attempting to run an already finished object: %s", cdist_object) + + cdist_type = cdist_object.cdist_type + + # Generate + self.log.info("Generating and executing code for %s" % (cdist_object.name)) + cdist_object.code_local = self.code.run_gencode_local(cdist_object) + cdist_object.code_remote = self.code.run_gencode_remote(cdist_object) + if cdist_object.code_local or cdist_object.code_remote: + cdist_object.changed = True + + # Execute + if not self.dry_run: + if cdist_object.code_local: + self.code.run_code_local(cdist_object) + if cdist_object.code_remote: + self.code.transfer_code_remote(cdist_object) + self.code.run_code_remote(cdist_object) + else: + self.log.info("Skipping code execution due to DRY RUN") + + + # Mark this object as done + self.log.debug("Finishing run of " + cdist_object.name) + cdist_object.state = core.CdistObject.STATE_DONE diff --git a/cdist/config_install.py b/cdist/config_install.py deleted file mode 100644 index 2db4c4af..00000000 --- a/cdist/config_install.py +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# 2010-2013 Nico Schottelius (nico-cdist at schottelius.org) -# -# This file is part of cdist. -# -# cdist is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# cdist is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with cdist. If not, see . -# -# - -import logging -import os -import shutil -import sys -import time -import pprint - -import cdist - -import cdist.exec.local -import cdist.exec.remote - -from cdist import core - -class ConfigInstall(object): - """Cdist main class to hold arbitrary data""" - - def __init__(self, local, remote, dry_run=False): - - self.local = local - self.remote = remote - self.log = logging.getLogger(self.local.target_host) - self.dry_run = dry_run - - self.explorer = core.Explorer(self.local.target_host, self.local, self.remote) - self.manifest = core.Manifest(self.local.target_host, self.local) - self.code = core.Code(self.local.target_host, self.local, self.remote) - - def _init_files_dirs(self): - """Prepare files and directories for the run""" - self.local.create_files_dirs() - self.remote.create_files_dirs() - - @classmethod - def commandline(cls, args): - """Configure or install remote system""" - import multiprocessing - - # FIXME: Refactor relict - remove later - log = logging.getLogger("cdist") - - initial_manifest_tempfile = None - if args.manifest == '-': - # read initial manifest from stdin - import tempfile - try: - handle, initial_manifest_temp_path = tempfile.mkstemp(prefix='cdist.stdin.') - with os.fdopen(handle, 'w') as fd: - fd.write(sys.stdin.read()) - except (IOError, OSError) as e: - raise cdist.Error("Creating tempfile for stdin data failed: %s" % e) - - args.manifest = initial_manifest_temp_path - import atexit - atexit.register(lambda: os.remove(initial_manifest_temp_path)) - - process = {} - failed_hosts = [] - time_start = time.time() - - for host in args.host: - if args.parallel: - log.debug("Creating child process for %s", host) - process[host] = multiprocessing.Process(target=cls.onehost, args=(host, args, True)) - process[host].start() - else: - try: - cls.onehost(host, args, parallel=False) - except cdist.Error as e: - failed_hosts.append(host) - - # Catch errors in parallel mode when joining - if args.parallel: - for host in process.keys(): - log.debug("Joining process %s", host) - process[host].join() - - if not process[host].exitcode == 0: - failed_hosts.append(host) - - time_end = time.time() - log.info("Total processing time for %s host(s): %s", len(args.host), - (time_end - time_start)) - - if len(failed_hosts) > 0: - raise cdist.Error("Failed to configure the following hosts: " + - " ".join(failed_hosts)) - - @classmethod - def onehost(cls, host, args, parallel): - """Configure or install ONE system""" - - log = logging.getLogger(host) - - try: - local = cdist.exec.local.Local( - target_host=host, - initial_manifest=args.manifest, - out_path=args.out_path, - add_conf_dirs=args.conf_dir) - - remote = cdist.exec.remote.Remote( - target_host=host, - remote_exec=args.remote_exec, - remote_copy=args.remote_copy) - - c = cls(local, remote) - c.run() - - except cdist.Error as e: - log.error(e) - if parallel: - # We are running in our own process here, need to sys.exit! - sys.exit(1) - else: - raise - - except KeyboardInterrupt: - # Ignore in parallel mode, we are existing anyway - if parallel: - sys.exit(0) - # Pass back to controlling code in sequential mode - else: - raise - - def run(self): - """Do what is most often done: deploy & cleanup""" - start_time = time.time() - - self._init_files_dirs() - - self.explorer.run_global_explorers(self.local.global_explorer_out_path) - self.manifest.run_initial_manifest(self.local.initial_manifest) - self.iterate_until_finished() - - self.local.save_cache() - self.log.info("Finished successful run in %s seconds", time.time() - start_time) - - - def object_list(self): - """Short name for object list retrieval""" - for cdist_object in core.CdistObject.list_objects(self.local.object_path, - self.local.type_path): - yield cdist_object - - def iterate_once(self): - """ - Iterate over the objects once - helper method for - iterate_until_finished - """ - objects_changed = False - - for cdist_object in self.object_list(): - if cdist_object.requirements_unfinished(cdist_object.requirements): - """We cannot do anything for this poor object""" - continue - - if cdist_object.state == core.CdistObject.STATE_UNDEF: - """Prepare the virgin object""" - - self.object_prepare(cdist_object) - objects_changed = True - - if cdist_object.requirements_unfinished(cdist_object.autorequire): - """The previous step created objects we depend on - wait for them""" - continue - - if cdist_object.state == core.CdistObject.STATE_PREPARED: - self.object_run(cdist_object) - objects_changed = True - - return objects_changed - - - def iterate_until_finished(self): - """ - Go through all objects and solve them - one after another - """ - - objects_changed = True - - while objects_changed: - objects_changed = self.iterate_once() - - # Check whether all objects have been finished - unfinished_objects = [] - for cdist_object in self.object_list(): - if not cdist_object.state == cdist_object.STATE_DONE: - unfinished_objects.append(cdist_object) - - if unfinished_objects: - info_string = [] - - for cdist_object in unfinished_objects: - - requirement_names = [] - autorequire_names = [] - - for requirement in cdist_object.requirements_unfinished(cdist_object.requirements): - requirement_names.append(requirement.name) - - for requirement in cdist_object.requirements_unfinished(cdist_object.autorequire): - autorequire_names.append(requirement.name) - - requirements = ", ".join(requirement_names) - autorequire = ", ".join(autorequire_names) - info_string.append("%s requires: %s autorequires: %s" % (cdist_object.name, requirements, autorequire)) - - raise cdist.UnresolvableRequirementsError("The requirements of the following objects could not be resolved: %s" % - ("; ".join(info_string))) - - def object_prepare(self, cdist_object): - """Prepare object: Run type explorer + manifest""" - self.log.info("Running manifest and explorers for " + cdist_object.name) - self.explorer.run_type_explorers(cdist_object) - self.manifest.run_type_manifest(cdist_object) - cdist_object.state = core.CdistObject.STATE_PREPARED - - def object_run(self, cdist_object): - """Run gencode and code for an object""" - - self.log.debug("Trying to run object %s" % (cdist_object.name)) - if cdist_object.state == core.CdistObject.STATE_DONE: - raise cdist.Error("Attempting to run an already finished object: %s", cdist_object) - - cdist_type = cdist_object.cdist_type - - # Generate - self.log.info("Generating and executing code for %s" % (cdist_object.name)) - cdist_object.code_local = self.code.run_gencode_local(cdist_object) - cdist_object.code_remote = self.code.run_gencode_remote(cdist_object) - if cdist_object.code_local or cdist_object.code_remote: - cdist_object.changed = True - - # Execute - if not self.dry_run: - if cdist_object.code_local: - self.code.run_code_local(cdist_object) - if cdist_object.code_remote: - self.code.transfer_code_remote(cdist_object) - self.code.run_code_remote(cdist_object) - else: - self.log.info("Skipping code execution due to DRY RUN") - - - # Mark this object as done - self.log.debug("Finishing run of " + cdist_object.name) - cdist_object.state = core.CdistObject.STATE_DONE diff --git a/cdist/core/cdist_type.py b/cdist/core/cdist_type.py index 0efb10f4..864970a9 100644 --- a/cdist/core/cdist_type.py +++ b/cdist/core/cdist_type.py @@ -99,11 +99,6 @@ class CdistType(object): """Check whether a type is a singleton.""" return os.path.isfile(os.path.join(self.absolute_path, "singleton")) - @property - def is_install(self): - """Check whether a type is used for installation (if not: for configuration)""" - return os.path.isfile(os.path.join(self.absolute_path, "install")) - @property def explorers(self): """Return a list of available explorers""" diff --git a/cdist/emulator.py b/cdist/emulator.py index bbc246a6..5b0ff1f6 100644 --- a/cdist/emulator.py +++ b/cdist/emulator.py @@ -78,11 +78,6 @@ class Emulator(object): def run(self): """Emulate type commands (i.e. __file and co)""" - if '__install' in self.env: - if not self.cdist_type.is_install: - self.log.debug("Running in install mode, ignoring non install type") - return True - self.commandline() self.setup_object() self.save_stdin() diff --git a/cdist/install.py b/cdist/install.py deleted file mode 100644 index 0f06f5e7..00000000 --- a/cdist/install.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org) -# -# This file is part of cdist. -# -# cdist is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# cdist is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with cdist. If not, see . -# -# - -import os -import cdist.config_install - -class Install(cdist.config_install.ConfigInstall): - def __init__(self, *args, **kargs): - """Enhance config install with install support""" - - # Setup environ to be used in emulator - os.environ['__install'] = "yes" - - super().__init__(*args, **kargs) diff --git a/cdist/shell.py b/cdist/shell.py index 4b8edbe8..b88c3ccd 100644 --- a/cdist/shell.py +++ b/cdist/shell.py @@ -27,9 +27,6 @@ import subprocess import cdist.exec.local -# FIXME: only considering config here - enable -# command line switch for using install object -# when it is available import cdist.config log = logging.getLogger(__name__) diff --git a/cdist/test/cdist_type/__init__.py b/cdist/test/cdist_type/__init__.py index 5e774aa9..e97ce7e6 100644 --- a/cdist/test/cdist_type/__init__.py +++ b/cdist/test/cdist_type/__init__.py @@ -106,16 +106,6 @@ class TypeTestCase(test.CdistTestCase): cdist_type = core.CdistType(base_path, '__not_singleton') self.assertFalse(cdist_type.is_singleton) - def test_install_is_install(self): - base_path = fixtures - cdist_type = core.CdistType(base_path, '__install') - self.assertTrue(cdist_type.is_install) - - def test_not_install_is_install(self): - base_path = fixtures - cdist_type = core.CdistType(base_path, '__not_install') - self.assertFalse(cdist_type.is_install) - def test_with_explorers(self): base_path = fixtures cdist_type = core.CdistType(base_path, '__with_explorers') diff --git a/cdist/test/config_install/__init__.py b/cdist/test/config/__init__.py similarity index 99% rename from cdist/test/config_install/__init__.py rename to cdist/test/config/__init__.py index a66eaa13..80a45d9b 100644 --- a/cdist/test/config_install/__init__.py +++ b/cdist/test/config/__init__.py @@ -38,7 +38,7 @@ object_base_path = op.join(fixtures, 'object') type_base_path = op.join(fixtures, 'type') add_conf_dir = op.join(fixtures, 'conf') -class ConfigInstallRunTestCase(test.CdistTestCase): +class ConfigRunTestCase(test.CdistTestCase): def setUp(self): diff --git a/cdist/test/config_install/fixtures/object/__first/.keep b/cdist/test/config/fixtures/object/__first/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__first/.keep rename to cdist/test/config/fixtures/object/__first/.keep diff --git a/cdist/test/config_install/fixtures/object/__first/man/.cdist/.keep b/cdist/test/config/fixtures/object/__first/man/.cdist/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__first/man/.cdist/.keep rename to cdist/test/config/fixtures/object/__first/man/.cdist/.keep diff --git a/cdist/test/config_install/fixtures/object/__second/.keep b/cdist/test/config/fixtures/object/__second/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__second/.keep rename to cdist/test/config/fixtures/object/__second/.keep diff --git a/cdist/test/config_install/fixtures/object/__second/on-the/.cdist/.keep b/cdist/test/config/fixtures/object/__second/on-the/.cdist/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__second/on-the/.cdist/.keep rename to cdist/test/config/fixtures/object/__second/on-the/.cdist/.keep diff --git a/cdist/test/config_install/fixtures/object/__third/.keep b/cdist/test/config/fixtures/object/__third/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__third/.keep rename to cdist/test/config/fixtures/object/__third/.keep diff --git a/cdist/test/config_install/fixtures/object/__third/moon/.cdist/.keep b/cdist/test/config/fixtures/object/__third/moon/.cdist/.keep similarity index 100% rename from cdist/test/config_install/fixtures/object/__third/moon/.cdist/.keep rename to cdist/test/config/fixtures/object/__third/moon/.cdist/.keep diff --git a/cdist/test/config_install/fixtures/object/__third/moon/.cdist/parameter/name b/cdist/test/config/fixtures/object/__third/moon/.cdist/parameter/name similarity index 100% rename from cdist/test/config_install/fixtures/object/__third/moon/.cdist/parameter/name rename to cdist/test/config/fixtures/object/__third/moon/.cdist/parameter/name diff --git a/cdist/test/config_install/fixtures/object/__third/moon/.cdist/parameter/planet b/cdist/test/config/fixtures/object/__third/moon/.cdist/parameter/planet similarity index 100% rename from cdist/test/config_install/fixtures/object/__third/moon/.cdist/parameter/planet rename to cdist/test/config/fixtures/object/__third/moon/.cdist/parameter/planet diff --git a/cdist/test/config_install/fixtures/type/__first/.keep b/cdist/test/config/fixtures/type/__first/.keep similarity index 100% rename from cdist/test/config_install/fixtures/type/__first/.keep rename to cdist/test/config/fixtures/type/__first/.keep diff --git a/cdist/test/config_install/fixtures/type/__second/.keep b/cdist/test/config/fixtures/type/__second/.keep similarity index 100% rename from cdist/test/config_install/fixtures/type/__second/.keep rename to cdist/test/config/fixtures/type/__second/.keep diff --git a/cdist/test/config_install/fixtures/type/__singleton_test/singleton b/cdist/test/config/fixtures/type/__singleton_test/singleton similarity index 100% rename from cdist/test/config_install/fixtures/type/__singleton_test/singleton rename to cdist/test/config/fixtures/type/__singleton_test/singleton diff --git a/cdist/test/config_install/fixtures/type/__third/.keep b/cdist/test/config/fixtures/type/__third/.keep similarity index 100% rename from cdist/test/config_install/fixtures/type/__third/.keep rename to cdist/test/config/fixtures/type/__third/.keep diff --git a/scripts/cdist b/scripts/cdist index d138faba..6f6f13fe 100755 --- a/scripts/cdist +++ b/scripts/cdist @@ -26,7 +26,6 @@ def commandline(): import cdist.banner import cdist.config - # import cdist.install import cdist.shell # Construct parser others can reuse @@ -53,39 +52,35 @@ def commandline(): parents=[parser['loglevel']]) parser['banner'].set_defaults(func=cdist.banner.banner) - # Config and install (common stuff) - parser['configinstall'] = argparse.ArgumentParser(add_help=False) - parser['configinstall'].add_argument('host', nargs='+', + # Config + parser['config'] = parser['sub'].add_parser('config', + parents=[parser['loglevel']]) + parser['config'].add_argument('host', nargs='+', help='one or more hosts to operate on') - parser['configinstall'].add_argument('-c', '--conf-dir', + parser['config'].add_argument('-c', '--conf-dir', help='Add configuration directory (can be repeated, last one wins)', action='append') - parser['configinstall'].add_argument('-i', '--initial-manifest', + parser['config'].add_argument('-i', '--initial-manifest', help='Path to a cdist manifest or \'-\' to read from stdin.', dest='manifest', required=False) - parser['configinstall'].add_argument('-n', '--dry-run', + parser['config'].add_argument('-n', '--dry-run', help='Do not execute code', action='store_true') - parser['configinstall'].add_argument('-o', '--out-dir', + parser['config'].add_argument('-o', '--out-dir', help='Directory to save cdist output in', dest="out_path") - parser['configinstall'].add_argument('-p', '--parallel', + parser['config'].add_argument('-p', '--parallel', help='Operate on multiple hosts in parallel', action='store_true', dest='parallel') - parser['configinstall'].add_argument('-s', '--sequential', + parser['config'].add_argument('-s', '--sequential', help='Operate on multiple hosts sequentially (default)', action='store_false', dest='parallel') - - parser['configinstall'].add_argument('--remote-copy', + parser['config'].add_argument('--remote-copy', help='Command to use for remote copy (should behave like scp)', action='store', dest='remote_copy', default=cdist.REMOTE_COPY) - parser['configinstall'].add_argument('--remote-exec', + parser['config'].add_argument('--remote-exec', help='Command to use for remote execution (should behave like ssh)', action='store', dest='remote_exec', default=cdist.REMOTE_EXEC) - - # Config - parser['config'] = parser['sub'].add_parser('config', - parents=[parser['loglevel'], parser['configinstall']]) parser['config'].set_defaults(func=cdist.config.Config.commandline) # Shell @@ -96,12 +91,6 @@ def commandline(): parser['shell'].set_defaults(func=cdist.shell.Shell.commandline) - # Install - # 20120525/sar: commented until it actually does something - #parser['install'] = parser['sub'].add_parser('install', - # parents=[parser['loglevel'], parser['configinstall']]) - #parser['install'].set_defaults(func=install) - for p in parser: parser[p].epilog = "Get cdist at http://www.nico.schottelius.org/software/cdist/" @@ -133,9 +122,6 @@ def commandline(): args.func(args) -#def install(args): -# configinstall(args, mode=cdist.install.Install) - def emulator(): """Prepare and run emulator""" import cdist.emulator