Add JSON/YAML inventory consumption tests

Bifrost's inventory parsing code supports parsing json and yaml
data input.

As such, we need to test that we are producing the expected
output from passing data into the general data parser,
including re-parsing the output of a previous conversion
to ensure that it is unchanged so logic parity remains
across conversion methods for any new items added.
Closes-Bug: #1527380
Change-Id: I95b3941f898b14bffa3a4a6fc6972184889cfedc
This commit is contained in:
Julia Kreger 2015-12-18 04:25:49 -05:00
parent 690e4252e5
commit 4cc7e4eec9
3 changed files with 100 additions and 0 deletions

View File

@ -16,6 +16,7 @@
# limitations under the License.
import json
import yaml
from bifrost.tests import base
from bifrost.tests import utils
@ -120,3 +121,82 @@ unused,,00000000-0000-0000-0000-000000000002,hostname1
(groups, hostvars) = utils.bifrost_csv_conversion(CSV)
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)
def test_csv_json_reconsumability_dhcp(self):
# Note(TheJulia) This intentionally takes CSV data, converts it
# and then attempts reconsumption of the same data through the
# JSON/YAML code path of Bifrost to ensure that the output
# is identical.
CSV = """00:01:02:03:04:06,root,undefined,192.0.2.3,2,8192,1024,
unused,,00000000-0000-0000-0000-000000000002,hostname1
,,,,,,agent_ipmitool""".replace('\n', '')
expected_hostvars = """{"hostname1":
{"uuid": "00000000-0000-0000-0000-000000000002", "driver": "agent_ipmitool",
"name": "hostname1", "addressing_mode": "dhcp", "ipv4_address": null,
"driver_info": {"power": {"ipmi_address": "192.0.2.3", "ipmi_password":
"undefined", "ipmi_username": "root", "ipmi_target_address": null,
"ipmi_target_channel": null, "ipmi_transit_address": null,
"ipmi_transit_channel": null}}, "nics":
[{"mac": "00:01:02:03:04:06"}], "properties": {"ram": "8192", "cpu_arch":
"x86_64", "disk_size": "1024", "cpus": "2"}}}""".replace('\n', '')
(groups, hostvars) = utils.bifrost_csv_conversion(CSV)
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)
(groups, hostvars) = utils.bifrost_data_conversion(
json.dumps(hostvars))
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)
def test_csv_json_reconsumability_general(self):
CSV = """00:01:02:03:04:05,root,undefined,192.0.2.2,1,8192,512,
unused,,00000000-0000-0000-0000-000000000001,hostname0,
192.168.1.2,,,,|
00:01:02:03:04:06,root,undefined,192.0.2.3,2,8192,1024,
unused,,00000000-0000-0000-0000-000000000002,hostname1,
192.168.1.3,,,,,agent_ipmitool""".replace('\n', '').replace('|', '\n')
expected_hostvars = """{"hostname1":
{"uuid": "00000000-0000-0000-0000-000000000002", "driver": "agent_ipmitool",
"name": "hostname1", "ipv4_address": "192.168.1.3", "ansible_ssh_host":
"192.168.1.3", "driver_info": {"power": {"ipmi_address": "192.0.2.3",
"ipmi_password": "undefined", "ipmi_username": "root",
"ipmi_target_address": null, "ipmi_target_channel": null,
"ipmi_transit_address": null, "ipmi_transit_channel": null}}, "nics":
[{"mac": "00:01:02:03:04:06"}], "properties": {"ram": "8192", "cpu_arch":
"x86_64", "disk_size": "1024", "cpus": "2"}}, "hostname0":
{"uuid": "00000000-0000-0000-0000-000000000001", "driver": "agent_ssh",
"name": "hostname0", "ipv4_address": "192.168.1.2", "ansible_ssh_host":
"192.168.1.2", "driver_info": {"power": {"ssh_virt_type": "virsh",
"ssh_key_filename": "/home/ironic/.ssh/id_rsa", "ssh_username":
"ironic", "ssh_port": 22, "ssh_address": "192.0.2.2"}}, "nics":
[{"mac": "00:01:02:03:04:05"}], "properties": {"ram": "8192",
"cpu_arch": "x86_64", "disk_size": "512", "cpus": "1"}}}""".replace('\n', '')
(groups, hostvars) = utils.bifrost_csv_conversion(CSV)
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)
(groups, hostvars) = utils.bifrost_data_conversion(
json.dumps(hostvars))
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)
def test_yaml_to_json_conversion(self):
# Note(TheJulia) Ultimately this is just ensuring
# that we get the same output when we pass something
# in as YAML
expected_hostvars = """{"hostname1":
{"uuid": "00000000-0000-0000-0000-000000000002", "driver": "agent_ipmitool",
"name": "hostname1", "ipv4_address": "192.168.1.3", "ansible_ssh_host":
"192.168.1.3", "driver_info": {"power": {"ipmi_address": "192.0.2.3",
"ipmi_password": "undefined", "ipmi_username": "root",
"ipmi_target_address": null, "ipmi_target_channel": null,
"ipmi_transit_address": null, "ipmi_transit_channel": null}}, "nics":
[{"mac": "00:01:02:03:04:06"}], "properties": {"ram": "8192", "cpu_arch":
"x86_64", "disk_size": "1024", "cpus": "2"}}, "hostname0":
{"uuid": "00000000-0000-0000-0000-000000000001", "driver": "agent_ssh",
"name": "hostname0", "ipv4_address": "192.168.1.2", "ansible_ssh_host":
"192.168.1.2", "driver_info": {"power": {"ssh_virt_type": "virsh",
"ssh_key_filename": "/home/ironic/.ssh/id_rsa", "ssh_username":
"ironic", "ssh_port": 22, "ssh_address": "192.0.2.2"}}, "nics":
[{"mac": "00:01:02:03:04:05"}], "properties": {"ram": "8192",
"cpu_arch": "x86_64", "disk_size": "512", "cpus": "1"}}}""".replace('\n', '')
(groups, hostvars) = utils.bifrost_data_conversion(
yaml.dump(json.loads(str(expected_hostvars))))
self.assertDictEqual(json.loads(str(expected_hostvars)), hostvars)

View File

@ -43,3 +43,13 @@ def bifrost_csv_conversion(csv_data):
hostvars)
# NOTE(TheJulia): Returning separately so the file is closed first
return (groups, hostvars)
def bifrost_data_conversion(data):
(groups, hostvars) = inventory._prepare_inventory()
with temporary_file(data) as file:
(groups, hostvars) = inventory._process_baremetal_data(
file,
groups,
hostvars)
return (groups, hostvars)

View File

@ -0,0 +1,10 @@
---
fixes:
- Functional tests were added for the inventory module
that leverage JSON and YAML parsing to ensure that the
input is same as the expected output of the conversion
being leveraged.
- A functional test was added that reconsumes JSON data
generated by the CSV file format to help identify any
logic parity breaks between the logic present in each
data parsing method.