Merge "Adding vsperf support"
[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 argparse
11 import sys
12 import logging
13 import os
14 import yaml
15
16 from copy import copy
17
18 from jinja2 import Environment
19 from jinja2 import FileSystemLoader
20
21 from apex import NetworkSettings
22 from apex import NetworkEnvironment
23 from apex import DeploySettings
24 from apex import ip_utils
25 from apex.common.constants import OPNFV_NETWORK_TYPES
26 from apex.common.constants import ADMIN_NETWORK
27
28
29 def parse_net_settings(args):
30     """
31     Parse OPNFV Apex network_settings.yaml config file
32     and dump bash syntax to set environment variables
33
34     Args:
35     - file: string
36       file to network_settings.yaml file
37     - network_isolation: bool
38       enable or disable network_isolation
39     """
40     settings = NetworkSettings(args.net_settings_file,
41                                args.network_isolation)
42     net_env = NetworkEnvironment(settings, args.net_env_file)
43     dump_yaml(net_env.get_netenv_settings(), '/tmp/network-environment.yaml')
44     settings.dump_bash()
45
46
47 def dump_yaml(data, file):
48     """
49     Dumps data to a file as yaml
50     :param data: yaml to be written to file
51     :param file: filename to write to
52     :return:
53     """
54     with open(file, "w") as fh:
55         yaml.dump(data, fh, default_flow_style=False)
56
57
58 def parse_deploy_settings(args):
59     settings = DeploySettings(args.file)
60     settings.dump_bash()
61
62
63 def find_ip(args):
64     """
65     Get and print the IP from a specific interface
66
67     Args:
68     - interface: string
69       network interface name
70     - address_family: int
71       4 or 6, respective to ipv4 or ipv6
72     """
73     interface = ip_utils.get_interface(args.interface,
74                                        args.address_family)
75     if interface:
76         print(interface.ip)
77
78
79 def build_nic_template(args):
80     """
81     Build and print a Triple-O nic template from jinja template
82
83     Args:
84     - template: string
85       path to jinja template to load
86     - enabled_networks: comma delimited list
87       list of networks defined in net_env.py
88     - ext_net_type: string
89       interface or br-ex, defines the external network configuration
90     - address_family: string
91       4 or 6, respective to ipv4 or ipv6
92     - ovs_dpdk_bridge: string
93       bridge name to use as ovs_dpdk
94     """
95     template_dir, template = args.template.rsplit('/', 1)
96
97     settings = NetworkSettings(args.net_settings_file,
98                                args.network_isolation).settings_obj
99     env = Environment(loader=FileSystemLoader(template_dir))
100     template = env.get_template(template)
101
102     # gather vlan values into a dict
103     net_list = copy(args.enabled_networks).split(' ')
104     net_list.remove(ADMIN_NETWORK)
105     vlans_vals = map(lambda x: settings[x]['vlan'], net_list)
106     vlans = dict(zip(net_list, vlans_vals))
107
108     print(template.render(enabled_networks=args.enabled_networks,
109                           role=args.role,
110                           vlans=vlans,
111                           external_net_type=args.ext_net_type,
112                           external_net_af=args.address_family,
113                           ovs_dpdk_bridge=args.ovs_dpdk_bridge))
114
115
116 def get_parser():
117     parser = argparse.ArgumentParser()
118     parser.add_argument('--debug', action='store_true', default=False,
119                         help="Turn on debug messages")
120     parser.add_argument('-l', '--log-file', default='/var/log/apex/apex.log',
121                         dest='log_file', help="Log file to log to")
122     subparsers = parser.add_subparsers()
123
124     net_settings = subparsers.add_parser('parse-net-settings',
125                                          help='Parse network settings file')
126     net_settings.add_argument('-s', '--net-settings-file',
127                               default='network-settings.yaml',
128                               dest='net_settings_file',
129                               help='path to network settings file')
130     net_settings.add_argument('-i', '--network-isolation', type=bool,
131                               default=True, dest='network_isolation',
132                               help='network isolation')
133     net_settings.add_argument('-e', '--net-env-file',
134                               default="network-environment.yaml",
135                               dest='net_env_file',
136                               help='path to network environment file')
137     net_settings.set_defaults(func=parse_net_settings)
138
139     get_int_ip = subparsers.add_parser('find-ip',
140                                        help='Find interface ip')
141     get_int_ip.add_argument('-i', '--interface', required=True,
142                             help='Interface name')
143     get_int_ip.add_argument('-af', '--address-family', default=4, type=int,
144                             choices=[4, 6], dest='address_family',
145                             help='IP Address family')
146     get_int_ip.set_defaults(func=find_ip)
147
148     nic_template = subparsers.add_parser('nic-template',
149                                          help='Build NIC templates')
150     nic_template.add_argument('-r', '--role', required=True,
151                               choices=['controller', 'compute'],
152                               help='Role template generated for')
153     nic_template.add_argument('-t', '--template', required=True,
154                               dest='template',
155                               help='Template file to process')
156     nic_template.add_argument('-s', '--net-settings-file',
157                               default='network-settings.yaml',
158                               dest='net_settings_file',
159                               help='path to network settings file')
160     nic_template.add_argument('-i', '--network-isolation', type=bool,
161                               default=True, dest='network_isolation',
162                               help='network isolation')
163     nic_template.add_argument('-n', '--enabled-networks', required=True,
164                               dest='enabled_networks',
165                               help='enabled network list')
166     nic_template.add_argument('-e', '--ext-net-type', default='interface',
167                               dest='ext_net_type',
168                               choices=['interface', 'br-ex'],
169                               help='External network type')
170     nic_template.add_argument('-af', '--address-family', type=int, default=4,
171                               dest='address_family', help='IP address family')
172     nic_template.add_argument('-d', '--ovs-dpdk-bridge',
173                               default=None, dest='ovs_dpdk_bridge',
174                               help='OVS DPDK Bridge Name')
175     nic_template.set_defaults(func=build_nic_template)
176
177     deploy_settings = subparsers.add_parser('parse-deploy-settings',
178                                             help='Parse deploy settings file')
179     deploy_settings.add_argument('-f', '--file',
180                                  default='deploy_settings.yaml',
181                                  help='path to deploy settings file')
182     deploy_settings.set_defaults(func=parse_deploy_settings)
183
184     return parser
185
186
187 def main():
188     parser = get_parser()
189     args = parser.parse_args(sys.argv[1:])
190     if args.debug:
191         logging.basicConfig(level=logging.DEBUG)
192     else:
193         apex_log_filename = args.log_file
194         os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
195         logging.basicConfig(filename=apex_log_filename,
196                             format='%(asctime)s %(levelname)s: %(message)s',
197                             datefmt='%m/%d/%Y %I:%M:%S %p',
198                             level=logging.DEBUG)
199     if hasattr(args, 'func'):
200         args.func(args)
201     else:
202         parser.print_help()
203         exit(1)
204
205 if __name__ == "__main__":
206     main()