summaryrefslogtreecommitdiff
path: root/tools/net-convert.py
blob: 68559cbfee2530a8bd33bb5553e731e3f9f37e2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/python3
# This file is part of cloud-init. See LICENSE file for license information.

import argparse
import json
import os
import yaml

from cloudinit.sources.helpers import openstack

from cloudinit.net import eni
from cloudinit.net import netplan
from cloudinit.net import network_state
from cloudinit.net import sysconfig


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--network-data", "-p", type=open,
                        metavar="PATH", required=True)
    parser.add_argument("--kind", "-k",
                        choices=['eni', 'network_data.json', 'yaml'],
                        required=True)
    parser.add_argument("-d", "--directory",
                        metavar="PATH",
                        help="directory to place output in",
                        required=True)
    parser.add_argument("-m", "--mac",
                        metavar="name,mac",
                        action='append',
                        help="interface name to mac mapping")
    parser.add_argument("--output-kind", "-ok",
                        choices=['eni', 'netplan', 'sysconfig'],
                        required=True)
    args = parser.parse_args()

    if not os.path.isdir(args.directory):
        os.makedirs(args.directory)

    if args.mac:
        known_macs = {}
        for item in args.mac:
            iface_name, iface_mac = item.split(",", 1)
            known_macs[iface_mac] = iface_name
    else:
        known_macs = None

    net_data = args.network_data.read()
    if args.kind == "eni":
        pre_ns = eni.convert_eni_data(net_data)
        ns = network_state.parse_net_config_data(pre_ns)
    elif args.kind == "yaml":
        pre_ns = yaml.load(net_data)
        if 'network' in pre_ns:
            pre_ns = pre_ns.get('network')
        print("Input YAML")
        print(yaml.dump(pre_ns, default_flow_style=False, indent=4))
        ns = network_state.parse_net_config_data(pre_ns)
    else:
        pre_ns = openstack.convert_net_json(
            json.loads(net_data), known_macs=known_macs)
        ns = network_state.parse_net_config_data(pre_ns)

    if not ns:
        raise RuntimeError("No valid network_state object created from"
                           "input data")

    print("\nInternal State")
    print(yaml.dump(ns, default_flow_style=False, indent=4))
    if args.output_kind == "eni":
        r_cls = eni.Renderer
    elif args.output_kind == "netplan":
        r_cls = netplan.Renderer
    else:
        r_cls = sysconfig.Renderer

    r = r_cls()
    r.render_network_state(network_state=ns, target=args.directory)


if __name__ == '__main__':
    main()

# vi: ts=4 expandtab