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