Source code for fabtools.openvz.operations

"""
OpenVZ containers
=================
"""

from fabric.api import cd, hide, settings

from fabtools.utils import run_as_root


[docs]def create(ctid, ostemplate=None, config=None, private=None, root=None, ipadd=None, hostname=None, **kwargs): """ Create an OpenVZ container. """ return _vzctl('create', ctid, ostemplate=ostemplate, config=config, private=private, root=root, ipadd=ipadd, hostname=hostname, **kwargs)
[docs]def destroy(ctid_or_name): """ Destroy the container. """ return _vzctl('destroy', ctid_or_name)
[docs]def set(ctid_or_name, save=True, **kwargs): """ Set container parameters. """ return _vzctl('set', ctid_or_name, save=save, **kwargs)
[docs]def start(ctid_or_name, wait=False, force=False, **kwargs): """ Start the container. If *wait* is ``True``, wait until the container is up and running. .. warning:: ``wait=True`` is broken with vzctl 3.0.24 on Debian 6.0 (*squeeze*) """ return _vzctl('start', ctid_or_name, wait=wait, force=force, **kwargs)
[docs]def stop(ctid_or_name, fast=False, **kwargs): """ Stop the container. """ return _vzctl('stop', ctid_or_name, fast=fast, **kwargs)
[docs]def restart(ctid_or_name, wait=True, force=False, fast=False, **kwargs): """ Restart the container. """ return _vzctl('restart', ctid_or_name, wait=wait, force=force, fast=fast, **kwargs)
[docs]def status(ctid_or_name): """ Get the status of the container. """ with settings(warn_only=True): return _vzctl('status', ctid_or_name)
def running(ctid_or_name): """ Check if the container is running. """ return status(ctid_or_name).split(' ')[4] == 'running'
[docs]def exists(ctid_or_name): """ Check if the container exists. """ with settings(hide('running', 'stdout', 'warnings'), warn_only=True): return status(ctid_or_name).succeeded
[docs]def exec2(ctid_or_name, command): """ Run a command inside the container. :: import fabtools res = fabtools.openvz.exec2('foo', 'hostname') .. warning:: the command will be run as **root**. """ return run_as_root("vzctl exec2 %s '%s'" % (ctid_or_name, command))
def _vzctl(command, ctid_or_name, **kwargs): args = _expand_args(**kwargs) return run_as_root('vzctl %s %s %s' % (command, ctid_or_name, args)) def _expand_args(**kwargs): args = [] for k, v in kwargs.items(): if isinstance(v, bool): if v is True: args.append('--%s' % k) elif isinstance(v, (list, tuple)): for elem in v: args.append('--%s %s' % (k, elem)) elif v is not None: args.append('--%s %s' % (k, v)) return ' '.join(args)
[docs]def download_template(name=None, url=None): """ Download an OpenVZ template. Example:: from fabtools.openvz import download_template # Use custom OS template download_template(url='http://example.com/templates/mybox.tar.gz') If no *url* is provided, the OS template will be downloaded from the `download.openvz.org <http://download.openvz.org/template/precreated/>`_ repository:: from fabtools.openvz import download_template # Use OS template from http://download.openvz.org/template/precreated/ download_template('debian-6.0-x86_64') """ if url is None: url = 'http://download.openvz.org/template/precreated/%s.tar.gz' % name with cd('/var/lib/vz/template/cache'): run_as_root('wget --progress=dot:mega "%s"' % url)
def list_ctids(): """ Get the list of currently used CTIDs. """ with settings(hide('running', 'stdout')): res = run_as_root('vzlist -a -1') return map(int, res.splitlines()) def get_available_ctid(): """ Get an available CTID. """ current_ctids = list_ctids() if current_ctids: return max(current_ctids) + 1 else: return 1000