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