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