blob: 0e43b133990e2925983845741ada2bd8d889cbc3 [file] [log] [blame]
import os
import shutil
import tarfile
import tempfile
import lnt.server.config
from lnt.util import logger
class Instance(object):
"""
Wrapper object for representing an LNT instance.
"""
@staticmethod
def frompath(path):
"""
frompath(path) -> Insance
Load an LNT instance from the given instance specifier. The instance
path can be one of:
* The directory containing the instance.
* The instance config file.
* A tarball containing an instance.
"""
# Accept paths to config files, or to directories containing 'lnt.cfg'.
tmpdir = None
if os.path.isdir(path):
config_path = os.path.join(path, 'lnt.cfg')
elif tarfile.is_tarfile(path):
# Accept paths to tar/tgz etc. files, which we automatically unpack
# into a temporary directory.
tmpdir = tempfile.mkdtemp(suffix='lnt')
logger.info("extracting input tarfile %r to %r" % (path, tmpdir))
tf = tarfile.open(path)
tf.extractall(tmpdir)
# Find the LNT instance inside the tar file. Support tarballs that
# either contain the instance directly, or contain a single
# subdirectory which is the instance.
if os.path.exists(os.path.join(tmpdir, "lnt.cfg")):
config_path = os.path.join(tmpdir, "lnt.cfg")
else:
filenames = os.listdir(tmpdir)
if len(filenames) != 1:
raise Exception("Unable to find LNT instance "
"inside tarfile")
config_path = os.path.join(tmpdir, filenames[0], "lnt.cfg")
else:
config_path = path
if not config_path or not os.path.exists(config_path):
raise Exception("Invalid config: %r" % config_path)
config_data = {}
exec(open(config_path).read(), config_data)
config = lnt.server.config.Config.from_data(config_path, config_data)
return Instance(config_path, config, tmpdir)
def __init__(self, config_path, config, tmpdir=None):
self.config_path = config_path
self.config = config
self.tmpdir = tmpdir
self.databases = dict()
for name in self.config.get_database_names():
self.databases[name] = self.config.get_database(name)
def __del__(self):
# If we have a temporary dir, clean it up now.
if self.tmpdir is not None:
shutil.rmtree(self.tmpdir)
def get_database(self, name):
return self.databases.get(name, None)