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