diff --git a/snf-deploy/snfdeploy/__init__.py b/snf-deploy/snfdeploy/__init__.py index 824e18702611dfde68da8d1275597a9e2f139d8e..fe0ca8b4b3a65f5be28cc955c7584d46a1c14b36 100644 --- a/snf-deploy/snfdeploy/__init__.py +++ b/snf-deploy/snfdeploy/__init__.py @@ -13,6 +13,8 @@ import subprocess import imp import ast from snfdeploy.lib import * +from snfdeploy import fabfile +from fabric.api import hide, env, settings, local, roles, execute, show def print_available_actions(command): @@ -243,51 +245,38 @@ def fabcommand(args, env, actions, nodes=[]): "everything": ["warnings", "running", "user", "output"] } - hide = ",".join(level_aliases["everything"]) - show = None + lhide = level_aliases["everything"] + lshow = [] if args.verbose == 1: - show = ",".join(levels[:3]) - hide = ",".join(levels[3:]) + lshow = levels[:3] + lhide = levels[3:] elif args.verbose == 2: - show = ",".join(levels[:4]) - hide = ",".join(levels[4:]) + lshow = levels[:4] + lhide = levels[4:] elif args.verbose >= 3 or args.debug: - show = ",".join(levels) - hide = None + lshow = levels + lhide = [] - if args.ssh_key: - fabcmd = "fab -i %s " % args.ssh_key - else: - fabcmd = "fab " - - fabcmd += " --fabfile /usr/share/pyshared/snfdeploy/fabfile.py \ -setup_env:confdir={0},packages={1},templates={2},cluster_name={3},\ -autoconf={4},disable_colors={5},key_inject={6} \ -".format(args.confdir, env.packages, env.templates, args.cluster_name, - args.autoconf, args.disable_colors, args.key_inject) +# fabcmd += " --fabfile {4}/fabfile.py \ +# setup_env:confdir={0},packages={1},templates={2},cluster_name={3},\ +# autoconf={5},disable_colors={6},key_inject={7} \ +# ".format(args.confdir, env.packages, env.templates, args.cluster_name, +# env.lib, args.autoconf, args.disable_colors, args.key_inject) if nodes: - hosts = [env.nodes_info[n].hostname for n in nodes] - actions = [a + ':hosts="%s"' % ";".join(hosts) for a in actions] - - extra = " ".join(actions) - - fabcmd += extra - - if show: - fabcmd += " --show %s " % show - if hide: - fabcmd += " --hide %s " % hide - - # print("snf-deploy run " + " ".join(actions) + " -vvv") - print(fabcmd) + ips = [env.nodes_info[n].ip for n in nodes] - if not args.dry_run: - ret = os.system(fabcmd) - if ret != 0: - status = "exit with status %s" % ret - sys.exit(status) + fabfile.setup_env(args) + with settings(hide(*lhide), show(*lshow)): + print " ".join(actions) + for a in actions: + fn = getattr(fabfile, a) + if not args.dry_run: + if nodes: + execute(fn, hosts=ips) + else: + execute(fn) def cluster(args, env): @@ -572,7 +561,7 @@ def add_node(args, env): def main(): args = parse_options() - conf = Conf.configure(args.confdir, args.cluster_name, args, args.autoconf) + conf = Conf(args) env = Env(conf) create_dir(env.run, False) diff --git a/snf-deploy/snfdeploy/fabfile.py b/snf-deploy/snfdeploy/fabfile.py index c2fbacefa7e237da6ee2caba7f86abaedd16fff8..d3849314fcab1fb1bf1e64f7a61e7df649ade18b 100644 --- a/snf-deploy/snfdeploy/fabfile.py +++ b/snf-deploy/snfdeploy/fabfile.py @@ -18,28 +18,21 @@ from snfdeploy.lib import debug, Conf, Env, disable_color from snfdeploy import massedit -def setup_env(confdir="conf", packages="packages", templates="files", - cluster_name="ganeti1", autoconf=False, disable_colors=False, - key_inject=False): +def setup_env(args): """Setup environment""" print("Loading configuration for synnefo...") - print(" * Using config files under %s..." % confdir) - print(" * Using %s and %s for packages and templates accordingly..." - % (packages, templates)) - - autoconf = ast.literal_eval(autoconf) - disable_colors = ast.literal_eval(disable_colors) - env.key_inject = ast.literal_eval(key_inject) - conf = Conf.configure(confdir=confdir, cluster_name=cluster_name, - autoconf=autoconf) + + conf = Conf(args) env.env = Env(conf) - env.local = autoconf + env.local = args.autoconf + env.key_inject = args.key_inject env.password = env.env.password env.user = env.env.user env.shell = "/bin/bash -c" + env.key_filename = args.ssh_key - if disable_colors: + if args.disable_colors: disable_color() if env.env.cms.hostname in \ diff --git a/snf-deploy/snfdeploy/lib.py b/snf-deploy/snfdeploy/lib.py index e182945692870802b0ba28c234789be71b492b51..7472de6fe5cc766d600175bfd09d433871251bf9 100644 --- a/snf-deploy/snfdeploy/lib.py +++ b/snf-deploy/snfdeploy/lib.py @@ -146,14 +146,36 @@ class Conf(object): "synnefo": ["cred", "synnefo", "roles"], "squeeze": ["debian", "ganeti", "synnefo", "other"], "wheezy": ["debian", "ganeti", "synnefo", "other"], - "ganeti": [], } + confdir = "/etc/snf-deploy" - def __init__(self, confdir, cluster_name): - self.confdir = confdir + def get_ganeti(self, cluster_name): self.files["ganeti"] = [cluster_name] + + + def __init__(self, args): + self.confdir = args.confdir + self.get_ganeti(args.cluster_name) for f in self.files.keys(): setattr(self, f, self.read_config(f)) + for f, sections in self.files.iteritems(): + for s in sections: + for k, v in self.get_section(f, s): + if getattr(args, k, None): + self.set(f, s, k, getattr(args, k)) + if args.autoconf: + self.autoconf() + + def autoconf(self): + #domain = get_domain() + #if domain: + # self.nodes.set("network", "domain", get_domain()) + # self.nodes.set("network", "subnet", "/".join(get_netinfo())) + # self.nodes.set("network", "gateway", get_default_route()[0]) + self.nodes.set("hostnames", "node1", get_hostname()) + self.nodes.set("ips", "node1", get_netinfo()[0]) + self.nodes.set("info", "nodes", "node1") + self.nodes.set("info", "public_iface", get_default_route()[1]) def read_config(self, f): config = ConfigParser.ConfigParser() @@ -178,37 +200,6 @@ class Conf(object): for f in self.files.keys(): getattr(self, f).write(sys.stdout) - def _configure(self, args): - for f, sections in self.files.iteritems(): - for s in sections: - for k, v in self.get_section(f, s): - if getattr(args, k, None): - self.set(f, s, k, getattr(args, k)) - - @classmethod - def configure(cls, confdir="/etc/snf-deploy", - cluster_name="ganeti1", args=None, autoconf=False): - - conf = cls(confdir, cluster_name) - if args: - conf._configure(args) - if autoconf: - conf.autoconf() - - return conf - - def autoconf(self): - #domain = get_domain() - #if domain: - # self.nodes.set("network", "domain", get_domain()) - # self.nodes.set("network", "subnet", "/".join(get_netinfo())) - # self.nodes.set("network", "gateway", get_default_route()[0]) - self.nodes.set("hostnames", "node1", get_hostname()) - self.nodes.set("ips", "node1", get_netinfo()[0]) - self.nodes.set("info", "nodes", "node1") - self.nodes.set("info", "public_iface", get_default_route()[1]) - - def debug(host, msg):