Blame cloudinit/cmd/devel/net_convert.py

Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""Debug network config format conversions."""
Packit Service a04d08
import argparse
Packit Service a04d08
import json
Packit Service a04d08
import os
Packit Service a04d08
import sys
Packit Service a04d08
Packit Service a04d08
from cloudinit.sources.helpers import openstack
Packit Service a04d08
from cloudinit.sources import DataSourceAzure as azure
Packit Service a04d08
from cloudinit.sources import DataSourceOVF as ovf
Packit Service a04d08
Packit Service a04d08
from cloudinit import distros, safeyaml
Packit Service a04d08
from cloudinit.net import eni, netplan, network_state, sysconfig
Packit Service a04d08
from cloudinit import log
Packit Service a04d08
Packit Service a04d08
NAME = 'net-convert'
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def get_parser(parser=None):
Packit Service a04d08
    """Build or extend and arg parser for net-convert utility.
Packit Service a04d08
Packit Service a04d08
    @param parser: Optional existing ArgumentParser instance representing the
Packit Service a04d08
        subcommand which will be extended to support the args of this utility.
Packit Service a04d08
Packit Service a04d08
    @returns: ArgumentParser with proper argument configuration.
Packit Service a04d08
    """
Packit Service a04d08
    if not parser:
Packit Service a04d08
        parser = argparse.ArgumentParser(prog=NAME, description=__doc__)
Packit Service a04d08
    parser.add_argument("-p", "--network-data", type=open,
Packit Service a04d08
                        metavar="PATH", required=True)
Packit Service a04d08
    parser.add_argument("-k", "--kind",
Packit Service a04d08
                        choices=['eni', 'network_data.json', 'yaml',
Packit Service a04d08
                                 'azure-imds', 'vmware-imc'],
Packit Service a04d08
                        required=True)
Packit Service a04d08
    parser.add_argument("-d", "--directory",
Packit Service a04d08
                        metavar="PATH",
Packit Service a04d08
                        help="directory to place output in",
Packit Service a04d08
                        required=True)
Packit Service a04d08
    parser.add_argument("-D", "--distro",
Packit Service a04d08
                        choices=[item for sublist in
Packit Service a04d08
                                 distros.OSFAMILIES.values()
Packit Service a04d08
                                 for item in sublist],
Packit Service a04d08
                        required=True)
Packit Service a04d08
    parser.add_argument("-m", "--mac",
Packit Service a04d08
                        metavar="name,mac",
Packit Service a04d08
                        action='append',
Packit Service a04d08
                        help="interface name to mac mapping")
Packit Service a04d08
    parser.add_argument("--debug", action='store_true',
Packit Service a04d08
                        help='enable debug logging to stderr.')
Packit Service a04d08
    parser.add_argument("-O", "--output-kind",
Packit Service a04d08
                        choices=['eni', 'netplan', 'sysconfig'],
Packit Service a04d08
                        required=True)
Packit Service a04d08
    return parser
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def handle_args(name, args):
Packit Service a04d08
    if not args.directory.endswith("/"):
Packit Service a04d08
        args.directory += "/"
Packit Service a04d08
Packit Service a04d08
    if not os.path.isdir(args.directory):
Packit Service a04d08
        os.makedirs(args.directory)
Packit Service a04d08
Packit Service a04d08
    if args.debug:
Packit Service a04d08
        log.setupBasicLogging(level=log.DEBUG)
Packit Service a04d08
    else:
Packit Service a04d08
        log.setupBasicLogging(level=log.WARN)
Packit Service a04d08
    if args.mac:
Packit Service a04d08
        known_macs = {}
Packit Service a04d08
        for item in args.mac:
Packit Service a04d08
            iface_name, iface_mac = item.split(",", 1)
Packit Service a04d08
            known_macs[iface_mac] = iface_name
Packit Service a04d08
    else:
Packit Service a04d08
        known_macs = None
Packit Service a04d08
Packit Service a04d08
    net_data = args.network_data.read()
Packit Service a04d08
    if args.kind == "eni":
Packit Service a04d08
        pre_ns = eni.convert_eni_data(net_data)
Packit Service a04d08
    elif args.kind == "yaml":
Packit Service a04d08
        pre_ns = safeyaml.load(net_data)
Packit Service a04d08
        if 'network' in pre_ns:
Packit Service a04d08
            pre_ns = pre_ns.get('network')
Packit Service a04d08
        if args.debug:
Packit Service a04d08
            sys.stderr.write('\n'.join(
Packit Service a04d08
                ["Input YAML", safeyaml.dumps(pre_ns), ""]))
Packit Service a04d08
    elif args.kind == 'network_data.json':
Packit Service a04d08
        pre_ns = openstack.convert_net_json(
Packit Service a04d08
            json.loads(net_data), known_macs=known_macs)
Packit Service a04d08
    elif args.kind == 'azure-imds':
Packit Service a04d08
        pre_ns = azure.parse_network_config(json.loads(net_data))
Packit Service a04d08
    elif args.kind == 'vmware-imc':
Packit Service a04d08
        config = ovf.Config(ovf.ConfigFile(args.network_data.name))
Packit Service a04d08
        pre_ns = ovf.get_network_config_from_conf(config, False)
Packit Service a04d08
Packit Service a04d08
    ns = network_state.parse_net_config_data(pre_ns)
Packit Service a04d08
    if not ns:
Packit Service a04d08
        raise RuntimeError("No valid network_state object created from"
Packit Service 751c4a
                           " input data")
Packit Service a04d08
Packit Service a04d08
    if args.debug:
Packit Service a04d08
        sys.stderr.write('\n'.join(
Packit Service a04d08
            ["", "Internal State", safeyaml.dumps(ns), ""]))
Packit Service a04d08
    distro_cls = distros.fetch(args.distro)
Packit Service a04d08
    distro = distro_cls(args.distro, {}, None)
Packit Service a04d08
    config = {}
Packit Service a04d08
    if args.output_kind == "eni":
Packit Service a04d08
        r_cls = eni.Renderer
Packit Service a04d08
        config = distro.renderer_configs.get('eni')
Packit Service a04d08
    elif args.output_kind == "netplan":
Packit Service a04d08
        r_cls = netplan.Renderer
Packit Service a04d08
        config = distro.renderer_configs.get('netplan')
Packit Service a04d08
        # don't run netplan generate/apply
Packit Service a04d08
        config['postcmds'] = False
Packit Service a04d08
        # trim leading slash
Packit Service a04d08
        config['netplan_path'] = config['netplan_path'][1:]
Packit Service a04d08
        # enable some netplan features
Packit Service a04d08
        config['features'] = ['dhcp-use-domains', 'ipv6-mtu']
Packit Service a04d08
    else:
Packit Service a04d08
        r_cls = sysconfig.Renderer
Packit Service a04d08
        config = distro.renderer_configs.get('sysconfig')
Packit Service a04d08
Packit Service a04d08
    r = r_cls(config=config)
Packit Service a04d08
    sys.stderr.write(''.join([
Packit Service a04d08
        "Read input format '%s' from '%s'.\n" % (
Packit Service a04d08
            args.kind, args.network_data.name),
Packit Service a04d08
        "Wrote output format '%s' to '%s'\n" % (
Packit Service a04d08
            args.output_kind, args.directory)]) + "\n")
Packit Service a04d08
    r.render_network_state(network_state=ns, target=args.directory)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
if __name__ == '__main__':
Packit Service a04d08
    args = get_parser().parse_args()
Packit Service a04d08
    handle_args(NAME, args)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab