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