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 network_state
from cloudinit.net import netplan
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(ns, target=args.directory)
if __name__ == '__main__':
main()
# vi: ts=4 expandtab
|