Merge "Adds ability to power off nodes in clean"
[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     netsets = 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(netsets.enabled_network_list)
110     net_list.remove(ADMIN_NETWORK)
111     vlans_vals = map(lambda x: netsets[x]['vlan'], net_list)
112     vlans = dict(zip(net_list, vlans_vals))
113     nics = netsets.nics
114
115     print(template.render(enabled_networks=netsets.enabled_network_list,
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('-e', '--ext-net-type', default='interface',
183                               dest='ext_net_type',
184                               choices=['interface', 'br-ex'],
185                               help='External network type')
186     nic_template.add_argument('-af', '--address-family', type=int, default=4,
187                               dest='address_family', help='IP address family')
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
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
200     clean = subparsers.add_parser('clean',
201                                   help='Parse deploy settings file')
202     clean.add_argument('-f', '--file',
203                        help='path to inventory file')
204     clean.set_defaults(func=run_clean)
205
206     return parser
207
208
209 def main():
210     parser = get_parser()
211     args = parser.parse_args(sys.argv[1:])
212     if args.debug:
213         logging.basicConfig(level=logging.DEBUG)
214     else:
215         apex_log_filename = args.log_file
216         os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
217         logging.basicConfig(filename=apex_log_filename,
218                             format='%(asctime)s %(levelname)s: %(message)s',
219                             datefmt='%m/%d/%Y %I:%M:%S %p',
220                             level=logging.DEBUG)
221     if hasattr(args, 'func'):
222         args.func(args)
223     else:
224         parser.print_help()
225         exit(1)
226
227 if __name__ == "__main__":
228     main()