|
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
|