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