Bumps OVS version to 2.8 for OVN
[apex.git] / lib / python / apex_python_utils.py
1 ##############################################################################
2 # Copyright (c) 2016 Feng Pan (fpan@redhat.com), Dan Radez (dradez@redhat.com)
3 #
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 ##############################################################################
9
10 import apex
11 import argparse
12 import sys
13 import logging
14 import os
15 import yaml
16
17 from jinja2 import Environment
18 from jinja2 import FileSystemLoader
19
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
25
26
27 def parse_net_settings(args):
28     """
29     Parse OPNFV Apex network_settings.yaml config file
30     and dump bash syntax to set environment variables
31
32     Args:
33     - file: string
34       file to network_settings.yaml file
35     """
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))
43     settings.dump_bash()
44
45
46 def dump_yaml(data, file):
47     """
48     Dumps data to a file as yaml
49     :param data: yaml to be written to file
50     :param file: filename to write to
51     :return:
52     """
53     with open(file, "w") as fh:
54         yaml.dump(data, fh, default_flow_style=False)
55
56
57 def parse_deploy_settings(args):
58     settings = DeploySettings(args.file)
59     settings.dump_bash()
60
61
62 def run_clean(args):
63     apex.clean_nodes(args.file)
64
65
66 def parse_inventory(args):
67     inventory = Inventory(args.file, ha=args.ha, virtual=args.virtual)
68     if args.export_bash is True:
69         inventory.dump_bash()
70     else:
71         inventory.dump_instackenv_json()
72
73
74 def find_ip(args):
75     """
76     Get and print the IP from a specific interface
77
78     Args:
79     - interface: string
80       network interface name
81     - address_family: int
82       4 or 6, respective to ipv4 or ipv6
83     """
84     interface = ip_utils.get_interface(args.interface,
85                                        args.address_family)
86     if interface:
87         print(interface.ip)
88
89
90 def build_nic_template(args):
91     """
92     Build and print a Triple-O nic template from jinja template
93
94     Args:
95     - template: string
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
105     """
106     template_dir, template = args.template.rsplit('/', 1)
107
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)
113
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'] =\
118                 'vpp_interface'
119             if ds.get('odl_vpp_routing_node') == 'dvr':
120                 nets['admin']['nic_mapping'][args.role]['phys_type'] =\
121                     'linux_bridge'
122     if ds.get('performance', {}).get(args.role.title(), {}).get('vpp', {})\
123             .get('uio-driver'):
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']
133
134     print(template.render(nets=nets,
135                           role=args.role,
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))
139
140
141 def get_parser():
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()
148     # parse-net-settings
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",
157                               dest='net_env_file',
158                               help='path to network environment file')
159     net_settings.add_argument('-td', '--target-dir',
160                               default="/tmp",
161                               dest='target_dir',
162                               help='directory to write the'
163                                    'network-environment.yaml file')
164     net_settings.add_argument('--compute-pre-config',
165                               default=False,
166                               action='store_true',
167                               dest='compute_pre_config',
168                               help='Boolean to enable Compute Pre Config')
169     net_settings.add_argument('--controller-pre-config',
170                               action='store_true',
171                               default=False,
172                               dest='controller_pre_config',
173                               help='Boolean to enable Controller Pre Config')
174
175     net_settings.set_defaults(func=parse_net_settings)
176     # find-ip
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)
185     # nic-template
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,
192                               dest='template',
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',
199                               dest='ext_net_type',
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')
207
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)
216     # parse-inventory
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',
223                            default=False,
224                            action='store_true',
225                            help='Indicate if deployment is HA or not')
226     inventory.add_argument('--virtual',
227                            default=False,
228                            action='store_true',
229                            help='Indicate if deployment inventory is virtual')
230     inventory.add_argument('--export-bash',
231                            default=False,
232                            dest='export_bash',
233                            action='store_true',
234                            help='Export bash variables from inventory')
235     inventory.set_defaults(func=parse_inventory)
236
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)
242
243     return parser
244
245
246 def main():
247     parser = get_parser()
248     args = parser.parse_args(sys.argv[1:])
249     if args.debug:
250         logging.basicConfig(level=logging.DEBUG)
251     else:
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',
257                             level=logging.DEBUG)
258     if hasattr(args, 'func'):
259         args.func(args)
260     else:
261         parser.print_help()
262         exit(1)
263
264 if __name__ == "__main__":
265     main()