Allows specifying nic order for overcloud nodes in network settings
[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 ADMIN_NETWORK
26
27
28 def parse_net_settings(args):
29     """
30     Parse OPNFV Apex network_settings.yaml config file
31     and dump bash syntax to set environment variables
32
33     Args:
34     - file: string
35       file to network_settings.yaml file
36     - network_isolation: bool
37       enable or disable network_isolation
38     """
39     settings = NetworkSettings(args.net_settings_file,
40                                args.network_isolation)
41     net_env = NetworkEnvironment(settings, args.net_env_file)
42     dump_yaml(net_env.get_netenv_settings(), '/tmp/network-environment.yaml')
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 find_ip(args):
63     """
64     Get and print the IP from a specific interface
65
66     Args:
67     - interface: string
68       network interface name
69     - address_family: int
70       4 or 6, respective to ipv4 or ipv6
71     """
72     interface = ip_utils.get_interface(args.interface,
73                                        args.address_family)
74     if interface:
75         print(interface.ip)
76
77
78 def build_nic_template(args):
79     """
80     Build and print a Triple-O nic template from jinja template
81
82     Args:
83     - template: string
84       path to jinja template to load
85     - enabled_networks: comma delimited list
86       list of networks defined in net_env.py
87     - ext_net_type: string
88       interface or br-ex, defines the external network configuration
89     - address_family: string
90       4 or 6, respective to ipv4 or ipv6
91     - ovs_dpdk_bridge: string
92       bridge name to use as ovs_dpdk
93     """
94     template_dir, template = args.template.rsplit('/', 1)
95
96     network_settings = NetworkSettings(args.net_settings_file,
97                                        args.network_isolation)
98     settings = network_settings.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     nics = network_settings.nics
108
109     print(template.render(enabled_networks=args.enabled_networks,
110                           role=args.role,
111                           vlans=vlans,
112                           external_net_type=args.ext_net_type,
113                           external_net_af=args.address_family,
114                           ovs_dpdk_bridge=args.ovs_dpdk_bridge,
115                           nics=nics))
116
117
118 def get_parser():
119     parser = argparse.ArgumentParser()
120     parser.add_argument('--debug', action='store_true', default=False,
121                         help="Turn on debug messages")
122     parser.add_argument('-l', '--log-file', default='/var/log/apex/apex.log',
123                         dest='log_file', help="Log file to log to")
124     subparsers = parser.add_subparsers()
125
126     net_settings = subparsers.add_parser('parse-net-settings',
127                                          help='Parse network settings file')
128     net_settings.add_argument('-s', '--net-settings-file',
129                               default='network-settings.yaml',
130                               dest='net_settings_file',
131                               help='path to network settings file')
132     net_settings.add_argument('-i', '--network-isolation', type=bool,
133                               default=True, dest='network_isolation',
134                               help='network isolation')
135     net_settings.add_argument('-e', '--net-env-file',
136                               default="network-environment.yaml",
137                               dest='net_env_file',
138                               help='path to network environment file')
139     net_settings.set_defaults(func=parse_net_settings)
140
141     get_int_ip = subparsers.add_parser('find-ip',
142                                        help='Find interface ip')
143     get_int_ip.add_argument('-i', '--interface', required=True,
144                             help='Interface name')
145     get_int_ip.add_argument('-af', '--address-family', default=4, type=int,
146                             choices=[4, 6], dest='address_family',
147                             help='IP Address family')
148     get_int_ip.set_defaults(func=find_ip)
149
150     nic_template = subparsers.add_parser('nic-template',
151                                          help='Build NIC templates')
152     nic_template.add_argument('-r', '--role', required=True,
153                               choices=['controller', 'compute'],
154                               help='Role template generated for')
155     nic_template.add_argument('-t', '--template', required=True,
156                               dest='template',
157                               help='Template file to process')
158     nic_template.add_argument('-s', '--net-settings-file',
159                               default='network-settings.yaml',
160                               dest='net_settings_file',
161                               help='path to network settings file')
162     nic_template.add_argument('-i', '--network-isolation', type=bool,
163                               default=True, dest='network_isolation',
164                               help='network isolation')
165     nic_template.add_argument('-n', '--enabled-networks', required=True,
166                               dest='enabled_networks',
167                               help='enabled network list')
168     nic_template.add_argument('-e', '--ext-net-type', default='interface',
169                               dest='ext_net_type',
170                               choices=['interface', 'br-ex'],
171                               help='External network type')
172     nic_template.add_argument('-af', '--address-family', type=int, default=4,
173                               dest='address_family', help='IP address family')
174     nic_template.add_argument('-d', '--ovs-dpdk-bridge',
175                               default=None, dest='ovs_dpdk_bridge',
176                               help='OVS DPDK Bridge Name')
177     nic_template.set_defaults(func=build_nic_template)
178
179     deploy_settings = subparsers.add_parser('parse-deploy-settings',
180                                             help='Parse deploy settings file')
181     deploy_settings.add_argument('-f', '--file',
182                                  default='deploy_settings.yaml',
183                                  help='path to deploy settings file')
184     deploy_settings.set_defaults(func=parse_deploy_settings)
185
186     return parser
187
188
189 def main():
190     parser = get_parser()
191     args = parser.parse_args(sys.argv[1:])
192     if args.debug:
193         logging.basicConfig(level=logging.DEBUG)
194     else:
195         apex_log_filename = args.log_file
196         os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
197         logging.basicConfig(filename=apex_log_filename,
198                             format='%(asctime)s %(levelname)s: %(message)s',
199                             datefmt='%m/%d/%Y %I:%M:%S %p',
200                             level=logging.DEBUG)
201     if hasattr(args, 'func'):
202         args.func(args)
203     else:
204         parser.print_help()
205         exit(1)
206
207 if __name__ == "__main__":
208     main()