summaryrefslogtreecommitdiffstats
path: root/lib/python
diff options
context:
space:
mode:
authorDan Radez <dradez@redhat.com>2016-08-25 09:45:01 -0400
committerDan Radez <dradez@redhat.com>2016-09-07 15:55:44 -0400
commit51510a96718c909cbcbf02256c440dbdceab7227 (patch)
tree549dfa3ecd6e222a6a92e535f8bf8c97b7243b21 /lib/python
parentc5904a139026826c3dea1a63e5ff21953aa4869a (diff)
moving inventory file parsing to python
Change-Id: Ib03728e8ffe9c65044b32b4348e9c1c88862c6e3 Signed-off-by: Dan Radez <dradez@redhat.com>
Diffstat (limited to 'lib/python')
-rw-r--r--lib/python/apex/__init__.py1
-rw-r--r--lib/python/apex/inventory.py76
-rwxr-xr-xlib/python/apex_python_utils.py29
3 files changed, 102 insertions, 4 deletions
diff --git a/lib/python/apex/__init__.py b/lib/python/apex/__init__.py
index 9993dc97..b2a45f7d 100644
--- a/lib/python/apex/__init__.py
+++ b/lib/python/apex/__init__.py
@@ -12,3 +12,4 @@ from .network_settings import NetworkSettings
from .deploy_settings import DeploySettings
from .network_environment import NetworkEnvironment
from .clean import clean_nodes
+from .inventory import Inventory
diff --git a/lib/python/apex/inventory.py b/lib/python/apex/inventory.py
new file mode 100644
index 00000000..f4a33b28
--- /dev/null
+++ b/lib/python/apex/inventory.py
@@ -0,0 +1,76 @@
+##############################################################################
+# Copyright (c) 2016 Dan Radez (dradez@redhat.com) and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import yaml
+import json
+
+
+class Inventory(dict):
+ """
+ This class parses an APEX inventory yaml file into an object. It
+ generates or detects all missing fields for deployment.
+
+ It then collapses one level of identifcation from the object to
+ convert it to a structure that can be dumped into a json file formatted
+ such that Triple-O can read the resulting json as an instackenv.json file.
+ """
+ def __init__(self, source, ha=True, virtual=False):
+ init_dict = {}
+ if type(source) is str:
+ with open(source, 'r') as network_settings_file:
+ yaml_dict = yaml.load(network_settings_file)
+ # collapse node identifiers from the structure
+ init_dict['nodes'] = list(map(lambda n: n[1],
+ yaml_dict['nodes'].items()))
+ else:
+ # assume input is a dict to build from
+ init_dict = source
+
+ # move ipmi_* to pm_*
+ # make mac a list
+ def munge_nodes(node):
+ node['pm_addr'] = node['ipmi_ip']
+ node['pm_password'] = node['ipmi_pass']
+ node['pm_user'] = node['ipmi_user']
+ node['mac'] = [node['mac_address']]
+
+ for i in ('ipmi_ip', 'ipmi_pass', 'ipmi_user', 'mac_address'):
+ del i
+
+ return node
+
+ super().__init__({'nodes': list(map(munge_nodes, init_dict['nodes']))})
+
+ # verify number of nodes
+ if ha and len(self['nodes']) < 5:
+ raise InventoryException('You must provide at least 5 '
+ 'nodes for HA baremetal deployment')
+ elif len(self['nodes']) < 2:
+ raise InventoryException('You must provide at least 2 nodes '
+ 'for non-HA baremetal deployment${reset}')
+
+ if virtual:
+ self['arch'] = 'x86_64'
+ self['host-ip'] = '192.168.122.1'
+ self['power_manager'] = \
+ 'nova.virt.baremetal.virtual_power_driver.VirtualPowerManager'
+ self['seed-ip'] = ''
+ self['ssh-key'] = 'INSERT_STACK_USER_PRIV_KEY'
+ self['ssh-user'] = 'root'
+
+ def dump_instackenv_json(self):
+ print(json.dumps(dict(self), sort_keys=True, indent=4))
+
+
+class InventoryException(Exception):
+ def __init__(self, value):
+ self.value = value
+
+ def __str__(self):
+ return self.value
diff --git a/lib/python/apex_python_utils.py b/lib/python/apex_python_utils.py
index 1f5e407c..ebc49dc5 100755
--- a/lib/python/apex_python_utils.py
+++ b/lib/python/apex_python_utils.py
@@ -22,6 +22,7 @@ from jinja2 import FileSystemLoader
from apex import NetworkSettings
from apex import NetworkEnvironment
from apex import DeploySettings
+from apex import Inventory
from apex import ip_utils
from apex.common.constants import ADMIN_NETWORK
@@ -66,6 +67,11 @@ def run_clean(args):
apex.clean_nodes(args.file)
+def parse_inventory(args):
+ inventory = Inventory(args.file, ha=args.ha, virtual=args.virtual)
+ inventory.dump_instackenv_json()
+
+
def find_ip(args):
"""
Get and print the IP from a specific interface
@@ -128,7 +134,7 @@ def get_parser():
parser.add_argument('-l', '--log-file', default='/var/log/apex/apex.log',
dest='log_file', help="Log file to log to")
subparsers = parser.add_subparsers()
-
+ # parse-net-settings
net_settings = subparsers.add_parser('parse-net-settings',
help='Parse network settings file')
net_settings.add_argument('-s', '--net-settings-file',
@@ -154,7 +160,7 @@ def get_parser():
help='Boolean to enable Controller Pre Config')
net_settings.set_defaults(func=parse_net_settings)
-
+ # find-ip
get_int_ip = subparsers.add_parser('find-ip',
help='Find interface ip')
get_int_ip.add_argument('-i', '--interface', required=True,
@@ -163,7 +169,7 @@ def get_parser():
choices=[4, 6], dest='address_family',
help='IP Address family')
get_int_ip.set_defaults(func=find_ip)
-
+ # nic-template
nic_template = subparsers.add_parser('nic-template',
help='Build NIC templates')
nic_template.add_argument('-r', '--role', required=True,
@@ -189,13 +195,28 @@ def get_parser():
default=None, dest='ovs_dpdk_bridge',
help='OVS DPDK Bridge Name')
nic_template.set_defaults(func=build_nic_template)
-
+ # parse-deploy-settings
deploy_settings = subparsers.add_parser('parse-deploy-settings',
help='Parse deploy settings file')
deploy_settings.add_argument('-f', '--file',
default='deploy_settings.yaml',
help='path to deploy settings file')
deploy_settings.set_defaults(func=parse_deploy_settings)
+ # parse-inventory
+ inventory = subparsers.add_parser('parse-inventory',
+ help='Parse inventory file')
+ inventory.add_argument('-f', '--file',
+ default='deploy_settings.yaml',
+ help='path to deploy settings file')
+ inventory.add_argument('--ha',
+ default=False,
+ action='store_true',
+ help='Indicate if deployment is HA or not')
+ inventory.add_argument('--virtual',
+ default=False,
+ action='store_true',
+ help='Indicate if deployment inventory is virtual')
+ inventory.set_defaults(func=parse_inventory)
clean = subparsers.add_parser('clean',
help='Parse deploy settings file')