Add support for odl_l3-fdio
[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_l3']:
117             nets['external'][0]['nic_mapping'][args.role]['phys_type'] =\
118                 'vpp_interface'
119     if ds.get('performance', {}).get(args.role.title(), {}).get('vpp', {})\
120             .get('uio-driver'):
121         nets['tenant']['nic_mapping'][args.role]['uio-driver'] =\
122             ds['performance'][args.role.title()]['vpp']['uio-driver']
123         if ds['sdn_l3']:
124             nets['external'][0]['nic_mapping'][args.role]['uio-driver'] =\
125                 ds['performance'][args.role.title()]['vpp']['uio-driver']
126
127     print(template.render(nets=nets,
128                           role=args.role,
129                           external_net_af=netsets.get_ip_addr_family(),
130                           external_net_type=args.ext_net_type,
131                           ovs_dpdk_bridge=args.ovs_dpdk_bridge))
132
133
134 def get_parser():
135     parser = argparse.ArgumentParser()
136     parser.add_argument('--debug', action='store_true', default=False,
137                         help="Turn on debug messages")
138     parser.add_argument('-l', '--log-file', default='/var/log/apex/apex.log',
139                         dest='log_file', help="Log file to log to")
140     subparsers = parser.add_subparsers()
141     # parse-net-settings
142     net_settings = subparsers.add_parser('parse-net-settings',
143                                          help='Parse network settings file')
144     net_settings.add_argument('-s', '--net-settings-file',
145                               default='network-settings.yaml',
146                               dest='net_settings_file',
147                               help='path to network settings file')
148     net_settings.add_argument('-e', '--net-env-file',
149                               default="network-environment.yaml",
150                               dest='net_env_file',
151                               help='path to network environment file')
152     net_settings.add_argument('-td', '--target-dir',
153                               default="/tmp",
154                               dest='target_dir',
155                               help='directory to write the'
156                                    'network-environment.yaml file')
157     net_settings.add_argument('--compute-pre-config',
158                               default=False,
159                               action='store_true',
160                               dest='compute_pre_config',
161                               help='Boolean to enable Compute Pre Config')
162     net_settings.add_argument('--controller-pre-config',
163                               action='store_true',
164                               default=False,
165                               dest='controller_pre_config',
166                               help='Boolean to enable Controller Pre Config')
167
168     net_settings.set_defaults(func=parse_net_settings)
169     # find-ip
170     get_int_ip = subparsers.add_parser('find-ip',
171                                        help='Find interface ip')
172     get_int_ip.add_argument('-i', '--interface', required=True,
173                             help='Interface name')
174     get_int_ip.add_argument('-af', '--address-family', default=4, type=int,
175                             choices=[4, 6], dest='address_family',
176                             help='IP Address family')
177     get_int_ip.set_defaults(func=find_ip)
178     # nic-template
179     nic_template = subparsers.add_parser('nic-template',
180                                          help='Build NIC templates')
181     nic_template.add_argument('-r', '--role', required=True,
182                               choices=['controller', 'compute'],
183                               help='Role template generated for')
184     nic_template.add_argument('-t', '--template', required=True,
185                               dest='template',
186                               help='Template file to process')
187     nic_template.add_argument('-s', '--net-settings-file',
188                               default='network-settings.yaml',
189                               dest='net_settings_file',
190                               help='path to network settings file')
191     nic_template.add_argument('-e', '--ext-net-type', default='interface',
192                               dest='ext_net_type',
193                               choices=['interface', 'vpp_interface', 'br-ex'],
194                               help='External network type')
195     nic_template.add_argument('-d', '--ovs-dpdk-bridge',
196                               default=None, dest='ovs_dpdk_bridge',
197                               help='OVS DPDK Bridge Name')
198     nic_template.add_argument('--deploy-settings-file',
199                               help='path to deploy settings file')
200
201     nic_template.set_defaults(func=build_nic_template)
202     # parse-deploy-settings
203     deploy_settings = subparsers.add_parser('parse-deploy-settings',
204                                             help='Parse deploy settings file')
205     deploy_settings.add_argument('-f', '--file',
206                                  default='deploy_settings.yaml',
207                                  help='path to deploy settings file')
208     deploy_settings.set_defaults(func=parse_deploy_settings)
209     # parse-inventory
210     inventory = subparsers.add_parser('parse-inventory',
211                                       help='Parse inventory file')
212     inventory.add_argument('-f', '--file',
213                            default='deploy_settings.yaml',
214                            help='path to deploy settings file')
215     inventory.add_argument('--ha',
216                            default=False,
217                            action='store_true',
218                            help='Indicate if deployment is HA or not')
219     inventory.add_argument('--virtual',
220                            default=False,
221                            action='store_true',
222                            help='Indicate if deployment inventory is virtual')
223     inventory.add_argument('--export-bash',
224                            default=False,
225                            dest='export_bash',
226                            action='store_true',
227                            help='Export bash variables from inventory')
228     inventory.set_defaults(func=parse_inventory)
229
230     clean = subparsers.add_parser('clean',
231                                   help='Parse deploy settings file')
232     clean.add_argument('-f', '--file',
233                        help='path to inventory file')
234     clean.set_defaults(func=run_clean)
235
236     return parser
237
238
239 def main():
240     parser = get_parser()
241     args = parser.parse_args(sys.argv[1:])
242     if args.debug:
243         logging.basicConfig(level=logging.DEBUG)
244     else:
245         apex_log_filename = args.log_file
246         os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
247         logging.basicConfig(filename=apex_log_filename,
248                             format='%(asctime)s %(levelname)s: %(message)s',
249                             datefmt='%m/%d/%Y %I:%M:%S %p',
250                             level=logging.DEBUG)
251     if hasattr(args, 'func'):
252         args.func(args)
253     else:
254         parser.print_help()
255         exit(1)
256
257 if __name__ == "__main__":
258     main()