1 ##############################################################################
2 # Copyright (c) 2016 Feng Pan (fpan@redhat.com), Dan Radez (dradez@redhat.com)
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
17 from jinja2 import Environment
18 from jinja2 import FileSystemLoader
20 from apex import NetworkSettings
21 from apex import NetworkEnvironment
22 from apex import DeploySettings
23 from apex import Inventory
24 from apex import ip_utils
27 def parse_net_settings(args):
29 Parse OPNFV Apex network_settings.yaml config file
30 and dump bash syntax to set environment variables
34 file to network_settings.yaml file
36 settings = NetworkSettings(args.net_settings_file)
37 net_env = NetworkEnvironment(settings, args.net_env_file,
38 args.compute_pre_config,
39 args.controller_pre_config)
40 target = args.target_dir.split('/')
41 target.append('network-environment.yaml')
42 dump_yaml(dict(net_env), '/'.join(target))
46 def dump_yaml(data, file):
48 Dumps data to a file as yaml
49 :param data: yaml to be written to file
50 :param file: filename to write to
53 with open(file, "w") as fh:
54 yaml.dump(data, fh, default_flow_style=False)
57 def parse_deploy_settings(args):
58 settings = DeploySettings(args.file)
63 apex.clean_nodes(args.file)
66 def parse_inventory(args):
67 inventory = Inventory(args.file, ha=args.ha, virtual=args.virtual)
68 if args.export_bash is True:
71 inventory.dump_instackenv_json()
76 Get and print the IP from a specific interface
80 network interface name
82 4 or 6, respective to ipv4 or ipv6
84 interface = ip_utils.get_interface(args.interface,
90 def build_nic_template(args):
92 Build and print a Triple-O nic template from jinja template
96 path to jinja template to load
97 - enabled_networks: comma delimited list
98 list of networks defined in net_env.py
99 - ext_net_type: string
100 interface or br-ex, defines the external network configuration
101 - address_family: string
102 4 or 6, respective to ipv4 or ipv6
103 - ovs_dpdk_bridge: string
104 bridge name to use as ovs_dpdk
106 template_dir, template = args.template.rsplit('/', 1)
108 netsets = NetworkSettings(args.net_settings_file)
109 nets = netsets.get('networks')
110 ds = DeploySettings(args.deploy_settings_file).get('deploy_options')
111 env = Environment(loader=FileSystemLoader(template_dir), autoescape=True)
112 template = env.get_template(template)
114 if ds['dataplane'] == 'fdio':
115 nets['tenant']['nic_mapping'][args.role]['phys_type'] = 'vpp_interface'
116 if ds['sdn_controller'] == 'opendaylight':
117 nets['external'][0]['nic_mapping'][args.role]['phys_type'] =\
119 if ds.get('odl_vpp_routing_node') == 'dvr':
120 nets['admin']['nic_mapping'][args.role]['phys_type'] =\
122 if ds.get('performance', {}).get(args.role.title(), {}).get('vpp', {})\
124 nets['tenant']['nic_mapping'][args.role]['uio-driver'] =\
125 ds['performance'][args.role.title()]['vpp']['uio-driver']
126 if ds['sdn_controller'] == 'opendaylight':
127 nets['external'][0]['nic_mapping'][args.role]['uio-driver'] =\
128 ds['performance'][args.role.title()]['vpp']['uio-driver']
129 if ds.get('performance', {}).get(args.role.title(), {}).get('vpp', {})\
130 .get('interface-options'):
131 nets['tenant']['nic_mapping'][args.role]['interface-options'] =\
132 ds['performance'][args.role.title()]['vpp']['interface-options']
134 print(template.render(nets=nets,
136 external_net_af=netsets.get_ip_addr_family(),
137 external_net_type=args.ext_net_type,
138 ovs_dpdk_bridge=args.ovs_dpdk_bridge))
142 parser = argparse.ArgumentParser()
143 parser.add_argument('--debug', action='store_true', default=False,
144 help="Turn on debug messages")
145 parser.add_argument('-l', '--log-file', default='/var/log/apex/apex.log',
146 dest='log_file', help="Log file to log to")
147 subparsers = parser.add_subparsers()
149 net_settings = subparsers.add_parser('parse-net-settings',
150 help='Parse network settings file')
151 net_settings.add_argument('-s', '--net-settings-file',
152 default='network-settings.yaml',
153 dest='net_settings_file',
154 help='path to network settings file')
155 net_settings.add_argument('-e', '--net-env-file',
156 default="network-environment.yaml",
158 help='path to network environment file')
159 net_settings.add_argument('-td', '--target-dir',
162 help='directory to write the'
163 'network-environment.yaml file')
164 net_settings.add_argument('--compute-pre-config',
167 dest='compute_pre_config',
168 help='Boolean to enable Compute Pre Config')
169 net_settings.add_argument('--controller-pre-config',
172 dest='controller_pre_config',
173 help='Boolean to enable Controller Pre Config')
175 net_settings.set_defaults(func=parse_net_settings)
177 get_int_ip = subparsers.add_parser('find-ip',
178 help='Find interface ip')
179 get_int_ip.add_argument('-i', '--interface', required=True,
180 help='Interface name')
181 get_int_ip.add_argument('-af', '--address-family', default=4, type=int,
182 choices=[4, 6], dest='address_family',
183 help='IP Address family')
184 get_int_ip.set_defaults(func=find_ip)
186 nic_template = subparsers.add_parser('nic-template',
187 help='Build NIC templates')
188 nic_template.add_argument('-r', '--role', required=True,
189 choices=['controller', 'compute'],
190 help='Role template generated for')
191 nic_template.add_argument('-t', '--template', required=True,
193 help='Template file to process')
194 nic_template.add_argument('-s', '--net-settings-file',
195 default='network-settings.yaml',
196 dest='net_settings_file',
197 help='path to network settings file')
198 nic_template.add_argument('-e', '--ext-net-type', default='interface',
200 choices=['interface', 'vpp_interface', 'br-ex'],
201 help='External network type')
202 nic_template.add_argument('-d', '--ovs-dpdk-bridge',
203 default=None, dest='ovs_dpdk_bridge',
204 help='OVS DPDK Bridge Name')
205 nic_template.add_argument('--deploy-settings-file',
206 help='path to deploy settings file')
208 nic_template.set_defaults(func=build_nic_template)
209 # parse-deploy-settings
210 deploy_settings = subparsers.add_parser('parse-deploy-settings',
211 help='Parse deploy settings file')
212 deploy_settings.add_argument('-f', '--file',
213 default='deploy_settings.yaml',
214 help='path to deploy settings file')
215 deploy_settings.set_defaults(func=parse_deploy_settings)
217 inventory = subparsers.add_parser('parse-inventory',
218 help='Parse inventory file')
219 inventory.add_argument('-f', '--file',
220 default='deploy_settings.yaml',
221 help='path to deploy settings file')
222 inventory.add_argument('--ha',
225 help='Indicate if deployment is HA or not')
226 inventory.add_argument('--virtual',
229 help='Indicate if deployment inventory is virtual')
230 inventory.add_argument('--export-bash',
234 help='Export bash variables from inventory')
235 inventory.set_defaults(func=parse_inventory)
237 clean = subparsers.add_parser('clean',
238 help='Parse deploy settings file')
239 clean.add_argument('-f', '--file',
240 help='path to inventory file')
241 clean.set_defaults(func=run_clean)
247 parser = get_parser()
248 args = parser.parse_args(sys.argv[1:])
250 logging.basicConfig(level=logging.DEBUG)
252 apex_log_filename = args.log_file
253 os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
254 logging.basicConfig(filename=apex_log_filename,
255 format='%(asctime)s %(levelname)s: %(message)s',
256 datefmt='%m/%d/%Y %I:%M:%S %p',
258 if hasattr(args, 'func'):
264 if __name__ == "__main__":