Commit 2ce89484 authored by Dimitris Aragiorgis's avatar Dimitris Aragiorgis
Browse files

deploy: Cleanup lib module

Remove unused Env, Status, Conf classes. Host and Alias classes have
been substituted by FQDN. The latter will be used for Node and
Cluster info.
Signed-off-by: default avatarDimitris Aragiorgis <>
parent d783fd6e
# Copyright (C) 2010-2014 GRNET S.A. # Copyright (C) 2010-2014 GRNET S.A.
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
...@@ -16,16 +14,14 @@ ...@@ -16,16 +14,14 @@
# along with this program. If not, see <>. # along with this program. If not, see <>.
import time import time
import ipaddr
import os import os
import signal import signal
import ConfigParser
import sys import sys
import re import re
import random import random
import subprocess import subprocess
import imp import imp
import ast
HEADER = '\033[95m' HEADER = '\033[95m'
OKBLUE = '\033[94m' OKBLUE = '\033[94m'
...@@ -55,235 +51,59 @@ if not sys.stdout.isatty(): ...@@ -55,235 +51,59 @@ if not sys.stdout.isatty():
disable_color() disable_color()
class Host(object): def evaluate(some_object, **kwargs):
def __init__(self, hostname, ip, mac, domain, os, passwd): for k, v in kwargs.items():
self.hostname = hostname setattr(some_object, k, v)
self.ip = ip
self.mac = mac
self.domain = domain
self.os = os
self.passwd = passwd
def fqdn(self):
return self.hostname + "." + self.domain
@property def getlist(value):
def arecord(self): return list(filter(None, (x.strip() for x in value.splitlines())))
return self.fqdn + " 300 A " + self.ip
def ptrrecord(self):
return ".".join(raddr(self.ip)) + " 300 PTR " + self.fqdn
@property def getbool(value):
def cnamerecord(self): return ast.literal_eval(value)
return ""
class Alias(Host): class FQDN(object):
def __init__(self, host, alias): def __init__(self, alias=None, **kwargs):
super(Alias, self).__init__(host.hostname, host.ip, host.mac,
host.domain, host.os, host.passwd)
self.alias = alias self.alias = alias
evaluate(self, **kwargs)
self.hostname =
@property @property
def cnamerecord(self): def fqdn(self):
return self.fqdn + " 300 CNAME " + self.hostname + "." + self.domain return + "." + self.domain
def ptrrecord(self):
return ""
@property @property
def arecord(self): def arecord(self):
return "" return self.fqdn + " 300 A " + self.ip
@property @property
def fqdn(self): def ptrrecord(self):
return self.alias + "." + self.domain return ".".join(raddr(self.ip)) + " 300 PTR " + self.fqdn
class Env(object):
def update_packages(self, os):
for section in self.conf.files[os]:
self.evaluate(os, section)
def evaluate(self, filename, section):
for k, v in self.conf.get_section(filename, section):
setattr(self, k, v)
def __init__(self, conf):
self.conf = conf
for f, sections in conf.files.iteritems():
for s in sections:
self.evaluate(f, s)
self.node2hostname = dict(conf.get_section("nodes", "hostnames"))
self.node2ip = dict(conf.get_section("nodes", "ips"))
self.node2mac = dict(conf.get_section("nodes", "macs"))
self.node2os = dict(conf.get_section("nodes", "os"))
self.node2passwd = dict(conf.get_section("nodes", "passwords"))
self.hostnames = [self.node2hostname[n]
for n in self.nodes.split(",")]
self.ips = [self.node2ip[n]
for n in self.nodes.split(",")] = ipaddr.IPNetwork(self.subnet)
self.nodes_info = {}
self.hosts_info = {}
self.ips_info = {}
for node in self.nodes.split(","):
host = Host(self.node2hostname[node],
self.node2mac[node], self.domain, self.node2os[node],
self.nodes_info[node] = host
self.hosts_info[host.hostname] = host
self.ips_info[host.ip] = host
self.cluster = Host(self.cluster_name, self.cluster_ip, None,
self.domain, None, None)
# This is needed because "".split(",") -> [''] @property
if self.cluster_nodes: def cnamerecord(self):
self.cluster_nodes = self.cluster_nodes.split(",") if self.cname:
return self.cname + " 300 CNAME " + self.fqdn
else: else:
self.cluster_nodes = [] return ""
self.cluster_hostnames = [self.node2hostname[n]
for n in self.cluster_nodes]
self.cluster_ips = [self.node2ip[n]
for n in self.cluster_nodes]
self.master = self.nodes_info[self.master_node]
self.roles_info = {}
for role, node in conf.get_section("synnefo", "roles"):
self.roles_info[role] = Alias(self.nodes_info[node], role)
setattr(self, role, self.roles_info[role])
self.astakos = self.accounts
# This is the nodes that get nfs mount points
self.mount = self.ips[:]
def cname(self):
if self.alias:
return self.alias + "." + self.domain
return ""
class Status(object):
def create_section(self, ip): def debug(*args):
section = self.config.items(ip, True)
except ConfigParser.NoSectionError:
def __init__(self, env): print " ".join([
self.config = ConfigParser.ConfigParser() HEADER, args[0],
self.config.optionxform = str OKBLUE, args[1],
self.statusfile = os.path.join(env.state, "snf_deploy_status") OKGREEN, args[2], ENDC])
def check_status(self, ip, component_class):
return self.config.get(ip, component_class.__name__, True)
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
return None
def update_status(self, ip, component_class, status):
self.config.set(ip, component_class.__name__, status)
def write_status(self):
with open(self.statusfile, 'wb') as configfile:
class Conf(object):
files = {
"nodes": ["network", "info"],
"deploy": ["dirs", "packages", "keys", "options"],
"vcluster": ["cluster", "image", "network"],
"synnefo": ["cred", "synnefo", "roles"],
"wheezy": ["debian", "ganeti", "synnefo", "other", "archip"],
confdir = "/etc/snf-deploy"
def get_ganeti(self, cluster_name):
self.files["ganeti"] = [cluster_name]
def __init__(self, args):
self.confdir = args.confdir
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))
# Override conf file settings if
# --templates-dir and --state-dir args are passed
if args.templatesdir:
self.deploy.set("dirs", "templates", args.templatesdir)
if args.statedir:
self.deploy.set("dirs", "state", args.statedir)
if args.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()
config.optionxform = str
filename = os.path.join(self.confdir, f) + ".conf"
return config
def set(self, conf, section, option, value):
c = getattr(self, conf)
c.set(section, option, value)
def get(self, conf, section, option):
c = getattr(self, conf)
return c.get(section, option, True)
def get_section(self, conf, section):
c = getattr(self, conf)
return c.items(section, True)
def print_config(self):
for f in self.files.keys():
getattr(self, f).write(sys.stdout)
def debug(host, msg, info=""):
print " ".join([HEADER, host, OKBLUE, msg, OKGREEN, info, ENDC])
def check_pidfile(pidfile): def check_pidfile(pidfile):
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment