Merge remote-tracking branch 'cdist/install' into install

This commit is contained in:
Steven Armstrong 2011-09-17 08:55:49 +02:00
commit cbd073dfbd
5 changed files with 74 additions and 154 deletions

View file

@ -25,6 +25,7 @@ import datetime
import logging
import multiprocessing
import os
import re
import subprocess
import shutil
import stat
@ -55,12 +56,12 @@ REMOTE_GLOBAL_EXPLORER_DIR = os.path.join(REMOTE_CONF_DIR, "explorer")
CODE_HEADER = "#!/bin/sh -e\n"
DOT_CDIST = ".cdist"
TYPE_PREFIX = "__"
VERSION = "2.0.0"
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
log = logging.getLogger()
class TypeEmulator:
def __init__(self, name):
self.name = name
@ -252,7 +253,7 @@ class Cdist:
def list_type_explorers(self, type):
"""Return list of available explorers for a specific type"""
dir = self.type_explorer_dir(type)
dir = self.type_dir(type, "explorer")
if os.path.isdir(dir):
list = os.listdir(dir)
else:
@ -321,22 +322,9 @@ class Cdist:
return objects
def type_dir(self, type):
def type_dir(self, type, *args):
"""Return directory the type"""
return os.path.join(self.type_base_dir, type)
def type_explorer_dir(self, type):
"""Return directory that holds the explorers of a type"""
return os.path.join(self.type_dir(type), "explorer")
def type_gencode_paths(self, type):
"""Return paths to gencode scripts of type"""
return [os.path.join(self.type_base_dir, type, "gencode-local"),
os.path.join(self.type_base_dir, type, "gencode-remote")]
def type_manifest_path(self, type):
"""Return path to manifest of type"""
return os.path.join(self.type_base_dir, type, "manifest")
return os.path.join(self.type_base_dir, type, *args)
def remote_type_explorer_dir(self, type):
"""Return remote directory that holds the explorers of a type"""
@ -365,7 +353,7 @@ class Cdist:
# Do not retransfer
self.type_explorers_transferred[type] = 1
src = self.type_explorer_dir(type)
src = self.type_dir(type, "explorer")
remote_base = os.path.join(REMOTE_TYPE_DIR, type)
dst = self.remote_type_explorer_dir(type)
@ -445,7 +433,7 @@ class Cdist:
def run_type_manifest(self, cdist_object):
"""Run manifest for a specific object"""
type = self.get_type_from_object(cdist_object)
manifest = self.type_manifest_path(type)
manifest = self.type_dir(type, "manifest")
log.debug("%s: Running %s", cdist_object, manifest)
if os.path.exists(manifest):
@ -499,6 +487,7 @@ class Cdist:
"""Run gencode or code for an object"""
log.debug("Running %s from %s", mode, cdist_object)
requirements = self.list_object_requirements(cdist_object)
type = self.get_type_from_object(cdist_object)
for requirement in requirements:
log.debug("Object %s requires %s", cdist_object, requirement)
@ -513,9 +502,13 @@ class Cdist:
env["__object"] = self.object_dir(cdist_object)
env["__object_id"] = self.get_object_id_from_object(cdist_object)
env["__object_fq"] = cdist_object
env["__type"] = self.type_dir(type)
if mode == "gencode":
paths = self.type_gencode_paths(self.get_type_from_object(cdist_object))
paths = [
self.type_dir(type, "gencode-local"),
self.type_dir(type, "gencode-remote")
]
for bin in paths:
if os.path.isfile(bin):
# omit "gen" from gencode and
@ -555,10 +548,8 @@ class Cdist:
self.transfer_file(local_remote_code, remote_remote_code)
self.run_or_fail([remote_remote_code], remote=True)
def deploy_to(self):
"""Mimic the old deploy to: Deploy to one host"""
log.info("Deploying to " + self.target_host)
time_start = datetime.datetime.now()
def stage_prepare(self):
"""Do everything for a deploy, minus the actual code stage"""
self.init_deploy()
self.run_global_explores()
self.run_initial_manifest()
@ -581,13 +572,23 @@ class Cdist:
objects = self.list_objects()
def stage_run(self):
"""The final (and real) step of deployment"""
log.debug("Actual run objects")
# Now do the final steps over the existing objects
for cdist_object in objects:
for cdist_object in self.list_objects():
log.debug("Run object: %s", cdist_object)
self.object_run(cdist_object, mode="gencode")
self.object_run(cdist_object, mode="code")
def deploy_to(self):
"""Mimic the old deploy to: Deploy to one host"""
log.info("Deploying to " + self.target_host)
time_start = datetime.datetime.now()
self.stage_prepare()
self.stage_run()
time_end = datetime.datetime.now()
duration = time_end - time_start
log.info("Finished run of %s in %s seconds",
@ -628,7 +629,16 @@ def config(args):
log.info("Total processing time for %s host(s): %s", len(args.host),
(time_end - time_start).total_seconds())
if __name__ == "__main__":
def install(args):
"""Install remote system"""
process = {}
def emulator():
"""Emulate type commands (i.e. __file and co)"""
type = os.path.basename(sys.argv[0])
def commandline():
"""Parse command line"""
# Construct parser others can reuse
parser = {}
# Options _all_ parsers have in common
@ -648,25 +658,33 @@ if __name__ == "__main__":
add_help=False)
parser['banner'].set_defaults(func=banner)
# Config
parser['config'] = parser['sub'].add_parser('config',
parents=[parser['most']])
parser['config'].add_argument('host', nargs='+',
# Config and install (common stuff)
parser['configinstall'] = argparse.ArgumentParser(add_help=False)
parser['configinstall'].add_argument('host', nargs='+',
help='one or more hosts to operate on')
parser['config'].add_argument('-c', '--cdist-home',
parser['configinstall'].add_argument('-c', '--cdist-home',
help='Change cdist home (default: .. from bin directory)',
action='store')
parser['config'].add_argument('-i', '--initial-manifest',
parser['configinstall'].add_argument('-i', '--initial-manifest',
help='Path to a cdist manifest',
dest='manifest', required=False)
parser['config'].add_argument('-p', '--parallel',
parser['configinstall'].add_argument('-p', '--parallel',
help='Operate on multiple hosts in parallel',
action='store_true', dest='parallel')
parser['config'].add_argument('-s', '--sequential',
parser['configinstall'].add_argument('-s', '--sequential',
help='Operate on multiple hosts sequentially (default)',
action='store_false', dest='parallel')
# Config
parser['config'] = parser['sub'].add_parser('config',
parents=[parser['most'], parser['configinstall']])
parser['config'].set_defaults(func=config)
# Install
parser['install'] = parser['sub'].add_parser('install',
parents=[parser['most'], 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/"
@ -682,3 +700,9 @@ if __name__ == "__main__":
args.func(args)
except KeyboardInterrupt:
sys.exit(0)
if __name__ == "__main__":
if re.match(TYPE_PREFIX, os.path.basename(sys.argv[0])):
emulator()
else:
commandline()

View file

@ -1,83 +0,0 @@
#!/bin/sh
#
# 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 <http://www.gnu.org/licenses/>.
#
#
# Create a new type from scratch
#
. cdist-config
[ $# -eq 1 ] || __cdist_usage "<type>"
set -eu
__cdist_type="$1"; shift
__cdist_my_type_dir="$(__cdist_type_dir "$__cdist_type")"
if [ -d "$__cdist_my_type_dir" ]; then
__cdist_usage "Type $__cdist_type already exists"
fi
echo "Creating type $__cdist_type in $__cdist_my_type_dir ..."
# Base
mkdir -p "$__cdist_my_type_dir"
# Parameter
mkdir -p "$(__cdist_type_parameter_dir "$__cdist_type")"
touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_required}"
touch "$(__cdist_type_parameter_dir "$__cdist_type")/${__cdist_name_parameter_optional}"
# Manifest
cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$__cdist_my_type_dir/${__cdist_name_manifest}"
#
# This is the manifest, which can be used to create other objects like this:
# __file /path/to/destination --source /from/where/
#
# To tell cdist to make use of it, you need to make it executable (chmod +x)
#
#
eof
# Gencode remote
cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_remote}"
#
# This file should generate code on stdout, which will be collected by cdist
# and run on the target.
#
# To tell cdist to make use of it, you need to make it executable (chmod +x)
#
#
eof
cat "$__cdist_abs_mydir/../doc/dev/header" - << eof > "$(__cdist_type_dir "$__cdist_type")/${__cdist_name_gencode}-${__cdist_name_gencode_local}"
#
# This file should generate code on stdout, which will be collected by cdist
# and run on the same machine cdist-deploy-to is executed.
#
# To tell cdist to make use of it, you need to make it executable (chmod +x)
#
#
eof
# Explorer
mkdir -p "$__cdist_my_type_dir/${__cdist_name_explorer}"

View file

@ -1,9 +1,20 @@
- Initial install support
- setup $__install = "" for
manifest(s)
- run standard manifest (?)
- creates initial objects
- only those having the installer flag?
- requires changegs to cdist-type-emulator!
- Goto Rewrite cdist-type-emulator
- run all other manifests
- creates all objects
- what about type explorer?
- Support parallel execution
- and maximum number of parallel runs (-p X)
- error handling / report failed hosts
- Support different home instead of ../
- Bug: os.path.join() may be wrong for the remote side!
-> does not matter for now!
- Rewrite cdist-type-emulator
- Remove legacy code in cdist
@ -11,8 +22,6 @@
- Remove man1/cdist-type-emulator.text
- Remove the PATH=... part from the README
- Replace bin/cdist-type-template
- Allow manifest to be read from stdin
- Create new video for cdist 2.0.0
http://www.youtube.com/watch?v=PRMjzy48eTI

View file

@ -182,7 +182,7 @@ __target_user::
Currently static in core.
__type::
Path to the current type.
Available for: type manifest
Available for: type manifest, type gencode
__type_explorer::
Directory that contains the type explorers.
Available for: type explorer

View file

@ -1,30 +0,0 @@
cdist-type-template(1)
======================
Nico Schottelius <nico-cdist--@--schottelius.org>
NAME
----
cdist-type-template - Create a new type
SYNOPSIS
--------
cdist-type-template NAME
DESCRIPTION
-----------
cdist-type-template creates a new type and adds the usual files to it.
It is thought to be helpful when writing new types.
SEE ALSO
--------
cdist(7)
COPYING
-------
Copyright \(C) 2011 Nico Schottelius. Free use of this software is
granted under the terms of the GNU General Public License version 3 (GPLv3).