ISO missing ipxe roms package
[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 argparse
11 import sys
12 import logging
13 import os
14 import yaml
15
16 from copy import copy
17
18 from jinja2 import Environment
19 from jinja2 import FileSystemLoader
20
21 from apex import NetworkSettings
22 from apex import NetworkEnvironment
23 from apex import DeploySettings
24 from apex import ip_utils
25 from apex.common.constants import OPNFV_NETWORK_TYPES
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     dump_yaml(net_env.get_netenv_settings(), '/tmp/network-environment.yaml')
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 find_ip(args):
64     """
65     Get and print the IP from a specific interface
66
67     Args:
68     - interface: string
69       network interface name
70     - address_family: int
71       4 or 6, respective to ipv4 or ipv6
72     """
73     interface = ip_utils.get_interface(args.interface,
74                                        args.address_family)
75     if interface:
76         print(interface.ip)
77
78
79 def build_nic_template(args):
80     """
81     Build and print a Triple-O nic template from jinja template
82
83     Args:
84     - template: string
85       path to jinja template to load
86     - enabled_networks: comma delimited list
87       list of networks defined in net_env.py
88     - ext_net_type: string
89       interface or br-ex, defines the external network configuration
90     - address_family: string
91       4 or 6, respective to ipv4 or ipv6
92     - ovs_dpdk_bridge: string
93       bridge name to use as ovs_dpdk
94     """
95     template_dir, template = args.template.rsplit('/', 1)
96
97     settings = NetworkSettings(args.net_settings_file,
98                                args.network_isolation).settings_obj
99     env = Environment(loader=FileSystemLoader(template_dir))
100     template = env.get_template(template)
101
102     # gather vlan values into a dict
103     net_list = copy(args.enabled_networks).split(' ')
104     net_list.remove(ADMIN_NETWORK)
105     vlans_vals = map(lambda x: settings[x]['vlan'], net_list)
106     vlans = dict(zip(net_list, vlans_vals))
107
108     print(template.render(
109               enabled_networks=args.enabled_networks,
110               role=args.role,
111               vlans=vlans,
112               external_net_type=args.ext_net_type,
113               external_net_af=args.address_family,
114               ovs_dpdk_bridge=args.ovs_dpdk_bridge))
115
116
117 def parse_args():
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
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('-i', '--network-isolation', type=bool,
132                               default=True, dest='network_isolation',
133                               help='network isolation')
134     net_settings.add_argument('-e', '--net-env-file',
135                               default="network-environment.yaml",
136                               dest='net_env_file',
137                               help='path to network environment file')
138     net_settings.set_defaults(func=parse_net_settings)
139
140     get_int_ip = subparsers.add_parser('find-ip',
141                                        help='Find interface ip')
142     get_int_ip.add_argument('-i', '--interface', required=True,
143                             help='Interface name')
144     get_int_ip.add_argument('-af', '--address-family', default=4, type=int,
145                             choices=[4, 6], dest='address_family',
146                             help='IP Address family')
147     get_int_ip.set_defaults(func=find_ip)
148
149     nic_template = subparsers.add_parser('nic-template',
150                                          help='Build NIC templates')
151     nic_template.add_argument('-r', '--role', required=True,
152                               choices=['controller', 'compute'],
153                               help='Role template generated for')
154     nic_template.add_argument('-t', '--template', required=True,
155                               dest='template',
156                               help='Template file to process')
157     nic_template.add_argument('-s', '--net-settings-file',
158                               default='network-settings.yaml',
159                               dest='net_settings_file',
160                               help='path to network settings file')
161     nic_template.add_argument('-i', '--network-isolation', type=bool,
162                               default=True, dest='network_isolation',
163                               help='network isolation')
164     nic_template.add_argument('-n', '--enabled-networks', required=True,
165                               dest='enabled_networks',
166                               help='enabled network list')
167     nic_template.add_argument('-e', '--ext-net-type', default='interface',
168                               dest='ext_net_type',
169                               choices=['interface', 'br-ex'],
170                               help='External network type')
171     nic_template.add_argument('-af', '--address-family', type=int, default=4,
172                               dest='address_family', help='IP address family')
173     nic_template.add_argument('-d', '--ovs-dpdk-bridge',
174                               default=None, dest='ovs_dpdk_bridge',
175                               help='OVS DPDK Bridge Name')
176     nic_template.set_defaults(func=build_nic_template)
177
178     deploy_settings = subparsers.add_parser('parse-deploy-settings',
179                               help='Parse deploy settings file')
180     deploy_settings.add_argument('-f', '--file', default='deploy_settings.yaml',
181                               help='path to deploy settings file')
182     deploy_settings.set_defaults(func=parse_deploy_settings)
183
184     args = parser.parse_args(sys.argv[1:])
185     if args.debug:
186         logging.basicConfig(level=logging.DEBUG)
187     else:
188         apex_log_filename = args.log_file
189         os.makedirs(os.path.dirname(apex_log_filename), exist_ok=True)
190         logging.basicConfig(filename=apex_log_filename,
191                             format='%(asctime)s %(levelname)s: %(message)s',
192                             datefmt='%m/%d/%Y %I:%M:%S %p',
193                             level=logging.DEBUG)
194     return parser, args
195
196
197 def main(parser, args):
198     if hasattr(args, 'func'):
199         args.func(args)
200     else:
201         parser.print_help()
202         exit(1)
203
204 if __name__ == "__main__":
205     parser, args = parse_args()
206     main(parser, args)