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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#!/usr/bin/python3
# This file is part of cloud-init. See LICENSE file for license information.
import argparse
import json
import os
import sys
import yaml
from cloudinit.sources.helpers import openstack
from cloudinit.net import eni
from cloudinit import log
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("--debug", action='store_true',
help='enable debug logging to stderr.')
parser.add_argument("--output-kind", "-ok",
choices=['eni', 'netplan', 'sysconfig'],
required=True)
args = parser.parse_args()
if not args.directory.endswith("/"):
args.directory += "/"
if not os.path.isdir(args.directory):
os.makedirs(args.directory)
if args.debug:
log.setupBasicLogging(level=log.DEBUG)
else:
log.setupBasicLogging(level=log.WARN)
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')
if args.debug:
sys.stderr.write('\n'.join(
["Input YAML",
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")
if args.debug:
sys.stderr.write('\n'.join([
"", "Internal State",
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()
sys.stderr.write(''.join([
"Read input format '%s' from '%s'.\n" % (
args.kind, args.network_data.name),
"Wrote output format '%s' to '%s'\n" % (
args.output_kind, args.directory)]) + "\n")
r.render_network_state(network_state=ns, target=args.directory)
if __name__ == '__main__':
main()
# vi: ts=4 expandtab
|