Start testing the example usage for CI: test_hook_mi_ipmiblob.py
test_hook_mi_ipmiblob.py is the provided sample for a CI team to use to allocate a MoltenIron instance before running tests. Change-Id: I217b8e3ba14cb3c4358d71be40ad9ca80aca32e1
This commit is contained in:
parent
06277f2de9
commit
57160823d4
22
README.rst
22
README.rst
@ -150,8 +150,6 @@ During the creation of a job, in the pre_test_hook.sh, add the following snippet
|
|||||||
REPO_DIR=/opt/stack/new/molteniron
|
REPO_DIR=/opt/stack/new/molteniron
|
||||||
MI_CONF_DIR=/usr/local/etc/molteniron
|
MI_CONF_DIR=/usr/local/etc/molteniron
|
||||||
MI_IP=10.1.2.3 # @TODO - Replace with your IP addr here!
|
MI_IP=10.1.2.3 # @TODO - Replace with your IP addr here!
|
||||||
MI_SQLUSER=user # @TODO - Replace with your mysql user here!
|
|
||||||
MI_SQLPASS=passwd # @TODO - Replace with your mysql password here!
|
|
||||||
|
|
||||||
# Grab molteniron and install it
|
# Grab molteniron and install it
|
||||||
git clone https://git.openstack.org/openstack/molteniron ${REPO_DIR} || exit 1
|
git clone https://git.openstack.org/openstack/molteniron ${REPO_DIR} || exit 1
|
||||||
@ -173,21 +171,11 @@ During the creation of a job, in the pre_test_hook.sh, add the following snippet
|
|||||||
sudo sed -i "s/127.0.0.1/${MI_IP}/g" ${MI_CONF_DIR}/conf.yaml
|
sudo sed -i "s/127.0.0.1/${MI_IP}/g" ${MI_CONF_DIR}/conf.yaml
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${MI_SQLUSER}" ]
|
sudo ${REPO_DIR}/utils/test_hook_mi_ipmiblob.py \
|
||||||
then
|
--hardware-info=/opt/stack/new/devstack/files/hardware_info \
|
||||||
# Set the molteniron database user in the conf file
|
--localrc=/opt/stack/new/devstack/localrc \
|
||||||
sudo sed -r -i -e 's,(^sqlUser: ")([a-zA-Z_]+)("$),\1'${MI_SQLUSER}'\3,' ${MI_CONF_DIR}/conf.yaml
|
${dsvm_uuid} \
|
||||||
fi
|
1
|
||||||
|
|
||||||
if [ -n "${MI_SQLPASS}" ]
|
|
||||||
then
|
|
||||||
# Set the molteniron database password in the conf file
|
|
||||||
sudo sed -r -i -e 's,(^sqlPass: ")([a-zA-Z_]+)("$),\1'${MI_SQLPASS}'\3,' ${MI_CONF_DIR}/conf.yaml
|
|
||||||
fi
|
|
||||||
|
|
||||||
export dsvm_uuid
|
|
||||||
# NOTE: dsvm_uuid used in the following script, hence the -E
|
|
||||||
sudo -E ${REPO_DIR}/utils/test_hook_configure_mi.sh
|
|
||||||
) || exit $?
|
) || exit $?
|
||||||
|
|
||||||
and change the MI_IP environment variable to be your MoltenIron server!
|
and change the MI_IP environment variable to be your MoltenIron server!
|
||||||
|
1
molteniron/tests/hardware_info.good
Normal file
1
molteniron/tests/hardware_info.good
Normal file
@ -0,0 +1 @@
|
|||||||
|
10.1.2.1 de:ad:be:ef:00:01 user password
|
5
molteniron/tests/localrc.good
Normal file
5
molteniron/tests/localrc.good
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
IRONIC_HW_ARCH=ppc64el
|
||||||
|
IRONIC_HW_NODE_CPU=8
|
||||||
|
IRONIC_HW_NODE_RAM=2048
|
||||||
|
IRONIC_HW_NODE_DISK=32
|
||||||
|
ALLOCATION_POOL="start=10.1.2.3,end=10.1.2.3 --allocation-pool start=10.1.2.4,end=10.1.2.4"
|
5
setup.py
5
setup.py
@ -30,7 +30,10 @@ setup(name="molteniron",
|
|||||||
description="Client/server database for Ironic Baremetal services",
|
description="Client/server database for Ironic Baremetal services",
|
||||||
url="https://github.com/openstack/molteniron",
|
url="https://github.com/openstack/molteniron",
|
||||||
py_modules=["molteniron/__init__", "molteniron/moltenirond"],
|
py_modules=["molteniron/__init__", "molteniron/moltenirond"],
|
||||||
scripts=["molteniron/moltenirond-helper", "molteniron/molteniron"],
|
scripts=["molteniron/moltenirond-helper",
|
||||||
|
"molteniron/molteniron",
|
||||||
|
"utils/test_hook_mi_ipmiblob.py",
|
||||||
|
"utils/test_hook_mi_ipmiblob.sh"],
|
||||||
data_files=[("etc/molteniron/", ["conf.yaml"])],
|
data_files=[("etc/molteniron/", ["conf.yaml"])],
|
||||||
setup_requires=['pbr'],
|
setup_requires=['pbr'],
|
||||||
pbr=True)
|
pbr=True)
|
||||||
|
6
tox.ini
6
tox.ini
@ -12,8 +12,10 @@ setenv =
|
|||||||
deps = -r{toxinidir}/test-requirements.txt
|
deps = -r{toxinidir}/test-requirements.txt
|
||||||
# Don't worry about installing bash commands in the virtual environment.
|
# Don't worry about installing bash commands in the virtual environment.
|
||||||
whitelist_externals = mkdir
|
whitelist_externals = mkdir
|
||||||
|
diff
|
||||||
#commands = python setup.py test --slowest --testr-args='{posargs}'
|
#commands = python setup.py test --slowest --testr-args='{posargs}'
|
||||||
commands = mkdir -p testenv/var/run/
|
commands = mkdir -p testenv/var/run/
|
||||||
|
mkdir -p testenv/tmp/
|
||||||
python setup.py \
|
python setup.py \
|
||||||
install \
|
install \
|
||||||
--install-data=testenv/ \
|
--install-data=testenv/ \
|
||||||
@ -63,6 +65,10 @@ commands = mkdir -p testenv/var/run/
|
|||||||
molteniron \
|
molteniron \
|
||||||
--conf-dir=testenv/etc/molteniron/ \
|
--conf-dir=testenv/etc/molteniron/ \
|
||||||
release hamzy
|
release hamzy
|
||||||
|
# Sadly needs a bash shell to run uuidgen
|
||||||
|
test_hook_mi_ipmiblob.sh
|
||||||
|
diff testenv/tmp/hardware_info molteniron/tests/hardware_info.good
|
||||||
|
diff testenv/tmp/localrc molteniron/tests/localrc.good
|
||||||
python \
|
python \
|
||||||
molteniron/tests/testAllocateBM.py \
|
molteniron/tests/testAllocateBM.py \
|
||||||
--conf-dir=testenv/etc/molteniron/
|
--conf-dir=testenv/etc/molteniron/
|
||||||
|
164
utils/test_hook_mi_ipmiblob.py
Executable file
164
utils/test_hook_mi_ipmiblob.py
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
#! /usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
This is the MoltenIron Command Line client that speaks to
|
||||||
|
a MoltenIron server.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Copyright (c) 2016 IBM Corporation.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
# implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
# pylint: disable-msg=C0103
|
||||||
|
# pylint: disable=redefined-outer-name
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
from molteniron import molteniron
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
mi = molteniron.MoltenIron()
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Molteniron test gate tool")
|
||||||
|
|
||||||
|
parser.add_argument("-c",
|
||||||
|
"--conf-dir",
|
||||||
|
action="store",
|
||||||
|
type=str,
|
||||||
|
dest="conf_dir",
|
||||||
|
help="The directory where configuration is stored")
|
||||||
|
parser.add_argument("-i", # Stoopid -h for help
|
||||||
|
"--hardware-info",
|
||||||
|
action="store",
|
||||||
|
type=str,
|
||||||
|
dest="hardware_info",
|
||||||
|
required=True,
|
||||||
|
help="The hardware_info file")
|
||||||
|
parser.add_argument("-l",
|
||||||
|
"--localrc",
|
||||||
|
action="store",
|
||||||
|
type=str,
|
||||||
|
dest="localrc",
|
||||||
|
required=True,
|
||||||
|
help="The localrc file")
|
||||||
|
parser.add_argument("owner_name",
|
||||||
|
help="Name of the requester")
|
||||||
|
parser.add_argument("number_of_nodes",
|
||||||
|
type=int,
|
||||||
|
help="How many nodes to reserve")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.conf_dir:
|
||||||
|
if not os.path.isdir(args.conf_dir):
|
||||||
|
msg = "Error: %s is not a valid directory" % (args.conf_dir, )
|
||||||
|
print(msg, file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
yaml_file = os.path.realpath("%s/conf.yaml" % (args.conf_dir, ))
|
||||||
|
else:
|
||||||
|
yaml_file = "/usr/local/etc/molteniron/conf.yaml"
|
||||||
|
|
||||||
|
with open(yaml_file, "r") as f_obj:
|
||||||
|
conf = yaml.load(f_obj)
|
||||||
|
|
||||||
|
mi.setup_conf(conf)
|
||||||
|
mi.setup_parser(parser)
|
||||||
|
|
||||||
|
# For example:
|
||||||
|
# args_map = {"output": "json",
|
||||||
|
# "type": "human",
|
||||||
|
# "func": getattr(mi, "status"),
|
||||||
|
# "conf_dir": "testenv/etc/molteniron/"}
|
||||||
|
args_map = {"output": "json",
|
||||||
|
"owner_name": args.owner_name,
|
||||||
|
"number_of_nodes": args.number_of_nodes,
|
||||||
|
"func": getattr(mi, "allocate"),
|
||||||
|
"conf_dir": "testenv/etc/molteniron/"}
|
||||||
|
|
||||||
|
# Call the function
|
||||||
|
mi.call_function(args_map)
|
||||||
|
|
||||||
|
# Get the result
|
||||||
|
response_map = mi.get_response_map()
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = response_map["status"]
|
||||||
|
except KeyError:
|
||||||
|
msg = ("Error: Server returned: %s and we expected a status " +
|
||||||
|
"somewhere") % (response_map, )
|
||||||
|
print(msg, file=sys.stderr)
|
||||||
|
exit(444)
|
||||||
|
|
||||||
|
if rc != 200:
|
||||||
|
msg = "Error: Status was not 200 %s" % (response_map["message"], )
|
||||||
|
print(msg, file=sys.stderr)
|
||||||
|
exit(rc)
|
||||||
|
|
||||||
|
assert response_map["status"] == 200
|
||||||
|
assert "nodes" in response_map
|
||||||
|
|
||||||
|
nodes = response_map["nodes"]
|
||||||
|
|
||||||
|
assert len(nodes) == 1
|
||||||
|
|
||||||
|
# There can only be one!
|
||||||
|
node_key = list(nodes.keys())[0]
|
||||||
|
|
||||||
|
# {u'status': u'dirty',
|
||||||
|
# u'provisioned': u'bb6141a2-3585-496a-bc02-1ef89c81e8fb',
|
||||||
|
# u'name': u'test2',
|
||||||
|
# u'timestamp': u'2016-11-30T15:50:03',
|
||||||
|
# u'ipmi_ip': u'10.1.2.2',
|
||||||
|
# u'blob': u'{"port_hwaddr": "\\"de:ad:be:ef:00:01\\"",
|
||||||
|
# "cpu_arch": "ppc64el",
|
||||||
|
# "ram_mb": "2048",
|
||||||
|
# "disk_gb": "32",
|
||||||
|
# "cpus": "8",
|
||||||
|
# "ipmi_user": "\\"user\\"",
|
||||||
|
# "ipmi_password": "\\"password\\""}',
|
||||||
|
# u'allocation_pool': u'10.1.2.5,10.1.2.6',
|
||||||
|
# u'id': 2}
|
||||||
|
node = nodes[node_key]
|
||||||
|
|
||||||
|
assert "blob" in node
|
||||||
|
|
||||||
|
json_blob = node["blob"]
|
||||||
|
blob = json.loads(json_blob)
|
||||||
|
|
||||||
|
with open(args.hardware_info, "w") as hi_obj:
|
||||||
|
# Write one line
|
||||||
|
hi_obj.write(("%(ipmi_ip)s" % node) +
|
||||||
|
(" %(port_hwaddr)s" +
|
||||||
|
" %(ipmi_user)s" +
|
||||||
|
" %(ipmi_password)s\n") % blob)
|
||||||
|
|
||||||
|
pool = node["allocation_pool"].split(",")
|
||||||
|
|
||||||
|
pairs = ["start=%s,end=%s" % (x, x) for x in pool]
|
||||||
|
allocation_pool = " --allocation-pool ".join(pairs)
|
||||||
|
|
||||||
|
with open(args.localrc, "a") as l_obj:
|
||||||
|
# Write multiple lines
|
||||||
|
l_obj.write(("IRONIC_HW_ARCH=%(cpu_arch)s\n" +
|
||||||
|
"IRONIC_HW_NODE_CPU=%(cpus)s\n" +
|
||||||
|
"IRONIC_HW_NODE_RAM=%(ram_mb)s\n" +
|
||||||
|
"IRONIC_HW_NODE_DISK=%(disk_gb)s\n") % blob +
|
||||||
|
"ALLOCATION_POOL=\"%s\"\n" % (allocation_pool, ))
|
23
utils/test_hook_mi_ipmiblob.sh
Executable file
23
utils/test_hook_mi_ipmiblob.sh
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright (c) 2016 IBM Corporation.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
# implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
test_hook_mi_ipmiblob.py \
|
||||||
|
--conf-dir=testenv/etc/molteniron/ \
|
||||||
|
--hardware-info=testenv/tmp/hardware_info \
|
||||||
|
--localrc=testenv/tmp/localrc \
|
||||||
|
$(uuidgen) \
|
||||||
|
1
|
Loading…
Reference in New Issue
Block a user