Blame cloudinit/config/cc_migrator.py

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