Blame cloudinit/config/cc_migrator.py

Packit bc9a3a
# Copyright (C) 2012 Yahoo! Inc.
Packit bc9a3a
#
Packit bc9a3a
# Author: Joshua Harlow <harlowja@yahoo-inc.com>
Packit bc9a3a
#
Packit bc9a3a
# This file is part of cloud-init. See LICENSE file for license information.
Packit bc9a3a
Packit bc9a3a
"""
Packit bc9a3a
Migrator
Packit bc9a3a
--------
Packit bc9a3a
**Summary:** migrate old versions of cloud-init data to new
Packit bc9a3a
Packit bc9a3a
This module handles moving old versions of cloud-init data to newer ones.
Packit bc9a3a
Currently, it only handles renaming cloud-init's per-frequency semaphore files
Packit bc9a3a
to canonicalized name and renaming legacy semaphore names to newer ones. This
Packit bc9a3a
module is enabled by default, but can be disabled by specifying ``migrate:
Packit bc9a3a
false`` in config.
Packit bc9a3a
Packit bc9a3a
**Internal name:** ``cc_migrator``
Packit bc9a3a
Packit bc9a3a
**Module frequency:** per always
Packit bc9a3a
Packit bc9a3a
**Supported distros:** all
Packit bc9a3a
Packit bc9a3a
**Config keys**::
Packit bc9a3a
Packit bc9a3a
    migrate: <true/false>
Packit bc9a3a
"""
Packit bc9a3a
Packit bc9a3a
import os
Packit bc9a3a
import shutil
Packit bc9a3a
Packit bc9a3a
from cloudinit import helpers
Packit bc9a3a
from cloudinit import util
Packit bc9a3a
Packit bc9a3a
from cloudinit.settings import PER_ALWAYS
Packit bc9a3a
Packit bc9a3a
frequency = PER_ALWAYS
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
def _migrate_canon_sems(cloud):
Packit bc9a3a
    paths = (cloud.paths.get_ipath('sem'), cloud.paths.get_cpath('sem'))
Packit bc9a3a
    am_adjusted = 0
Packit bc9a3a
    for sem_path in paths:
Packit bc9a3a
        if not sem_path or not os.path.exists(sem_path):
Packit bc9a3a
            continue
Packit bc9a3a
        for p in os.listdir(sem_path):
Packit bc9a3a
            full_path = os.path.join(sem_path, p)
Packit bc9a3a
            if os.path.isfile(full_path):
Packit bc9a3a
                (name, ext) = os.path.splitext(p)
Packit bc9a3a
                canon_name = helpers.canon_sem_name(name)
Packit bc9a3a
                if canon_name != name:
Packit bc9a3a
                    new_path = os.path.join(sem_path, canon_name + ext)
Packit bc9a3a
                    shutil.move(full_path, new_path)
Packit bc9a3a
                    am_adjusted += 1
Packit bc9a3a
    return am_adjusted
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
def _migrate_legacy_sems(cloud, log):
Packit bc9a3a
    legacy_adjust = {
Packit bc9a3a
        'apt-update-upgrade': [
Packit bc9a3a
            'apt-configure',
Packit bc9a3a
            'package-update-upgrade-install',
Packit bc9a3a
        ],
Packit bc9a3a
    }
Packit bc9a3a
    paths = (cloud.paths.get_ipath('sem'), cloud.paths.get_cpath('sem'))
Packit bc9a3a
    for sem_path in paths:
Packit bc9a3a
        if not sem_path or not os.path.exists(sem_path):
Packit bc9a3a
            continue
Packit bc9a3a
        sem_helper = helpers.FileSemaphores(sem_path)
Packit bc9a3a
        for (mod_name, migrate_to) in legacy_adjust.items():
Packit bc9a3a
            possibles = [mod_name, helpers.canon_sem_name(mod_name)]
Packit bc9a3a
            old_exists = []
Packit bc9a3a
            for p in os.listdir(sem_path):
Packit bc9a3a
                (name, _ext) = os.path.splitext(p)
Packit bc9a3a
                if name in possibles and os.path.isfile(p):
Packit bc9a3a
                    old_exists.append(p)
Packit bc9a3a
            for p in old_exists:
Packit bc9a3a
                util.del_file(os.path.join(sem_path, p))
Packit bc9a3a
                (_name, freq) = os.path.splitext(p)
Packit bc9a3a
                for m in migrate_to:
Packit bc9a3a
                    log.debug("Migrating %s => %s with the same frequency",
Packit bc9a3a
                              p, m)
Packit bc9a3a
                    with sem_helper.lock(m, freq):
Packit bc9a3a
                        pass
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
def handle(name, cfg, cloud, log, _args):
Packit bc9a3a
    do_migrate = util.get_cfg_option_str(cfg, "migrate", True)
Packit bc9a3a
    if not util.translate_bool(do_migrate):
Packit bc9a3a
        log.debug("Skipping module named %s, migration disabled", name)
Packit bc9a3a
        return
Packit bc9a3a
    sems_moved = _migrate_canon_sems(cloud)
Packit bc9a3a
    log.debug("Migrated %s semaphore files to there canonicalized names",
Packit bc9a3a
              sems_moved)
Packit bc9a3a
    _migrate_legacy_sems(cloud, log)
Packit bc9a3a
Packit bc9a3a
# vi: ts=4 expandtab