test/unit_tests/parser/system_parser_test.py
croy 82d417b9e6 New StarlingX Automation Framework
Fresh start for the StarlingX automation framework.

Change-Id: Ie265e0791024f45f71faad6315c2b91b022934d1
2024-11-29 16:01:57 -05:00

493 lines
26 KiB
Python

from config.configuration_file_locations_manager import ConfigurationFileLocationsManager
from config.configuration_manager import ConfigurationManager
from framework.exceptions.keyword_exception import KeywordException
from keywords.cloud_platform.system.application.object.system_application_list_output import SystemApplicationListOutput
from keywords.cloud_platform.system.host.objects.system_host_label_assign_output import SystemHostLabelAssignOutput
from keywords.cloud_platform.system.host.objects.system_host_output import SystemHostOutput
from keywords.cloud_platform.system.system_table_parser import SystemTableParser
from keywords.cloud_platform.system.system_vertical_table_parser import SystemVerticalTableParser
system_output = [
'+----+--------------+-------------+----------------+-------------+--------------+\n',
'| id | hostname | personality | administrative | operational | availability |\n',
'+----+--------------+-------------+----------------+-------------+--------------+\n',
'| 1 | controller-0 | controller | unlocked | enabled | available |\n',
'+----+--------------+-------------+----------------+-------------+--------------+\n',
]
system_output_error = [
'+----+--------------+-------------+----------------+-------------+--------------+\n',
'| id | hostname | administrative | operational | availability |\n',
'+----+--------------+-------------+----------------+-------------+--------------+\n',
'| 1 | controller-0 | controller | unlocked | enabled | available |\n',
'+----+--------------+-------------+----------------+-------------+--------------+\n',
]
application_list_output = [
'+--------------------------+----------+-------------------------------------------+------------------+----------+-----------+\n', # noqa: E501
'| application | version | manifest name | manifest file | status | progress |\n', # noqa: E501
'+--------------------------+----------+-------------------------------------------+------------------+----------+-----------+\n', # noqa: E501
'| cert-manager | 22.12-9 | cert-manager-fluxcd-manifests | fluxcd-manifests | applied | completed |\n', # noqa: E501
'| nginx-ingress-controller | 22.12-2 | nginx-ingress-controller-fluxcd-manifests | fluxcd-manifests | applied | completed |\n', # noqa: E501
'| oidc-auth-apps | 22.12-8 | oidc-auth-apps-fluxcd-manifests | fluxcd-manifests | uploaded | completed |\n', # noqa: E501
'| platform-integ-apps | 22.12-72 | platform-integ-apps-fluxcd-manifests | fluxcd-manifests | applied | completed |\n', # noqa: E501
'+--------------------------+----------+-------------------------------------------+------------------+----------+-----------+\n ', # noqa: E501
]
system_host_show_output = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| action | none |\n",
"| administrative | unlocked |\n",
"| apparmor | disabled |\n",
"| availability | available |\n",
"| bm_ip | 0000:111:bbbb:000::000 |\n",
"| bm_type | dynamic |\n",
"| bm_username | sysadmin |\n",
"| boot_device | /dev/disk/by-path/pci-0000:cc:00.0-sas-0x0000000000000000-lun-0 |\n",
"| capabilities | {'is_max_cpu_configurable': 'configurable', 'mgmt_ipsec': 'enabled', |\n",
"| | 'Personality': 'Controller-Active'} |\n",
"| clock_synchronization | ntp |\n",
"| config_applied | 00000000-bbbb-4444-aaaa-666666666666 |\n",
"| config_status | None |\n",
"| config_target | 00000000-bbbb-4444-aaaa-666666666666 |\n",
"| console | ttyS0,115200n8 |\n",
"| created_at | 2024-08-23T09:21:51.460082+00:00 |\n",
"| cstates_available | C1,C1E,C6,POLL |\n",
"| device_image_update | None |\n",
"| hostname | controller-0 |\n",
"| hw_settle | 0 |\n",
"| id | 1 |\n",
"| install_output | text |\n",
"| install_state | None |\n",
"| install_state_info | None |\n",
"| inv_state | inventoried |\n",
"| invprovision | provisioned |\n",
"| iscsi_initiator_name | iqn.2000-01.io.sssssssss:3sssssssssss |\n",
"| location | {} |\n",
"| max_cpu_mhz_allowed | None |\n",
"| max_cpu_mhz_configured | None |\n",
"| mgmt_mac | dd:ff:ee:77:22:bb |\n",
"| min_cpu_mhz_allowed | None |\n",
"| nvme_host_id | 33333333-7777-4444-9999-888888888888 |\n",
"| nvme_host_nqn | nqn.2014-08.org.nvmexpress:uuid:9bbbbbbb-2222-4444-aaaa-888888888888 |\n",
"| operational | enabled |\n",
"| personality | controller |\n",
"| reboot_needed | False |\n",
"| reserved | False |\n",
"| rootfs_device | /dev/disk/by-path/pci-0000:5c:00.0-sas-0x0000000000000000-lun-0 |\n",
"| serialid | None |\n",
"| software_load | 24.09 |\n",
"| subfunction_avail | available |\n",
"| subfunction_oper | enabled |\n",
"| subfunctions | controller,worker |\n",
"| sw_version | 24.09 |\n",
"| task | |\n",
"| tboot | |\n",
"| ttys_dcd | False |\n",
"| updated_at | 2024-08-26T19:54:26.730136+00:00 |\n",
"| uptime | 295248 |\n",
"| uuid | bbbbbbbb-9999-4444-8888-aaaaaaaaaaaa |\n",
"| vim_progress_status | services-enabled |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_host_show_output_error_first_row = [
"+------------------------ ----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| action | none |\n",
"| administrative | unlocked |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_host_show_output_error_second_row = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| action | none |\n",
"| administrative | unlocked |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_host_show_output_error_third_row = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------ ----------------------------------------------------------------------+\n",
"| action | none |\n",
"| administrative | unlocked |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_host_show_output_error_some_row = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| action none |\n",
"| administrative | unlocked |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_host_show_output_error_last_row = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| action | none |\n",
"| administrative | unlocked |\n",
"+------------------------ ----------------------------------------------------------------------+\n",
]
system_host_show_output_error_first_property_name = [
"+------------------------+----------------------------------------------------------------------+\n",
"| Property | Value |\n",
"+------------------------+----------------------------------------------------------------------+\n",
"| | none |\n",
"| administrative | unlocked |\n",
"+------------------------+----------------------------------------------------------------------+\n",
]
system_application_upload = [
'+---------------+----------------------------------+\n',
'| Property | Value |\n',
'+---------------+----------------------------------+\n',
'| active | True |\n',
'| app_version | 0.1.0 |\n',
'| created_at | 2024-10-16T14:58:17.305376+00:00 |\n',
'| manifest_file | fluxcd-manifests |\n',
'| manifest_name | hello-kitty-fluxcd-manifests |\n',
'| name | hello-kitty |\n',
'| progress | None |\n',
'| status | removing |\n',
'| updated_at | 2024-10-16T15:50:59.902779+00:00 |\n',
'+---------------+----------------------------------+\n',
"Please use 'system application-list' or 'system application-show hello-kitty' to view the current progress.\n",
]
def test_system_parser():
"""
Tests the system parser
Returns:
"""
system_table_parser = SystemTableParser(system_output)
output_list = system_table_parser.get_output_values_list()
assert len(output_list) == 1
output = output_list[0]
assert output['id'] == '1'
assert output['hostname'] == 'controller-0'
assert output['personality'] == 'controller'
assert output['administrative'] == 'unlocked'
assert output['operational'] == 'enabled'
assert output['availability'] == 'available'
def test_system_parser_application_list_output():
"""
Tests that the system parser works with application list output
Returns:
"""
system_table_parser = SystemTableParser(application_list_output)
output_list = system_table_parser.get_output_values_list()
assert len(output_list) == 4
# validate first application only
output = output_list[0]
assert output['application'] == 'cert-manager'
assert output['version'] == '22.12-9'
assert output['manifest name'] == 'cert-manager-fluxcd-manifests'
assert output['manifest file'] == 'fluxcd-manifests'
assert output['status'] == 'applied'
assert output['progress'] == 'completed'
def test_system_parser_error():
"""
Tests the system parser with an error in the input
Returns:
"""
try:
configuration_locations_manager = ConfigurationFileLocationsManager()
ConfigurationManager.load_configs(configuration_locations_manager)
SystemTableParser(system_output_error).get_output_values_list()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == 'Number of headers and values do not match'
def test_system_host_output():
"""
Tests the system host output parser
Returns:
"""
system_host_output = SystemHostOutput(system_output)
hosts = system_host_output.get_hosts()
assert len(hosts) == 1
host = hosts[0]
assert host.get_id() == 1
assert host.get_host_name() == 'controller-0'
assert host.get_personality() == 'controller'
assert host.get_administrative() == 'unlocked'
assert host.get_operational() == 'enabled'
assert host.get_availability() == 'available'
def test_system_host_output_error():
"""
Tests the system host output parser with an error in the input
Returns:
"""
try:
configuration_locations_manager = ConfigurationFileLocationsManager()
ConfigurationManager.load_configs(configuration_locations_manager)
SystemHostOutput(system_output_error).get_hosts()
assert False, "There should be an exception when we parse the output."
except KeywordException as e:
assert e.args[0] == 'Number of headers and values do not match'
def test_system_application_output():
"""
Tests the system application output
Returns:
"""
system_application_output = SystemApplicationListOutput(application_list_output)
applications = system_application_output.get_applications()
assert len(applications) == 4
application = applications[0]
assert application.get_application() == 'cert-manager'
assert application.get_version() == '22.12-9'
assert application.get_manifest_name() == 'cert-manager-fluxcd-manifests'
assert application.get_manifest_file() == 'fluxcd-manifests'
assert application.get_status() == 'applied'
assert application.get_progress() == 'completed'
def test_system_host_label_assign_output():
"""
Tests the system_host_label_assign output.
Returns:
"""
system_host_label_assign_output = [
'+-------------+--------------------------------------+\n',
'| Property | Value |\n',
'+-------------+--------------------------------------+\n',
'| uuid | b800c011-2065-4912-b1fd-4b4717cd5620 |\n',
'| host_uuid | 4feff42d-bc8d-4006-9922-a7fa10a6ee19 |\n',
'| label_key | kube-cpu-mgr-policy |\n',
'| label_value | static |\n',
'+-------------+--------------------------------------+\n',
'+-------------+--------------------------------------+\n',
'| Property | Value |\n',
'+-------------+--------------------------------------+\n',
'| uuid | 0260240f-bcca-41f5-9f32-b3acc030dfb0 |\n',
'| host_uuid | 4feff42d-bc8d-4006-9922-a7fa10a6ee19 |\n',
'| label_key | kube-topology-mgr-policy |\n',
'| label_value | best-effort |\n',
'+-------------+--------------------------------------+\n',
]
system_host_label_assign_output = SystemHostLabelAssignOutput(system_host_label_assign_output)
host_labels = system_host_label_assign_output.get_all_host_labels()
assert len(host_labels) == 2
first_host_label = host_labels[0]
second_host_label = host_labels[1]
assert first_host_label.get_uuid() == 'b800c011-2065-4912-b1fd-4b4717cd5620'
assert first_host_label.get_host_uuid() == '4feff42d-bc8d-4006-9922-a7fa10a6ee19'
assert first_host_label.get_label_key() == 'kube-cpu-mgr-policy'
assert first_host_label.get_label_value() == 'static'
assert second_host_label.get_uuid() == '0260240f-bcca-41f5-9f32-b3acc030dfb0'
assert second_host_label.get_host_uuid() == '4feff42d-bc8d-4006-9922-a7fa10a6ee19'
assert second_host_label.get_label_key() == 'kube-topology-mgr-policy'
assert second_host_label.get_label_value() == 'best-effort'
def test_system_vertical_table_parser():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output)
output_dict = system_vertical_table_parser.get_output_values_dict()
assert len(output_dict.keys()) == 51
assert len(output_dict.values()) == 51
assert output_dict['action'] == 'none'
assert output_dict['administrative'] == 'unlocked'
assert output_dict['apparmor'] == 'disabled'
assert output_dict['availability'] == 'available'
assert output_dict['bm_ip'] == '0000:111:bbbb:000::000'
assert output_dict['bm_type'] == 'dynamic'
assert output_dict['bm_username'] == 'sysadmin'
assert output_dict['boot_device'] == '/dev/disk/by-path/pci-0000:cc:00.0-sas-0x0000000000000000-lun-0'
assert output_dict['capabilities'] == "{'is_max_cpu_configurable': 'configurable', 'mgmt_ipsec': 'enabled', 'Personality': 'Controller-Active'}"
assert output_dict['clock_synchronization'] == 'ntp'
assert output_dict['config_applied'] == '00000000-bbbb-4444-aaaa-666666666666'
assert output_dict['config_status'] == 'None'
assert output_dict['config_target'] == '00000000-bbbb-4444-aaaa-666666666666'
assert output_dict['console'] == 'ttyS0,115200n8'
assert output_dict['created_at'] == '2024-08-23T09:21:51.460082+00:00'
assert output_dict['cstates_available'] == 'C1,C1E,C6,POLL'
assert output_dict['device_image_update'] == 'None'
assert output_dict['hostname'] == 'controller-0'
assert output_dict['hw_settle'] == '0'
assert output_dict['id'] == '1'
assert output_dict['install_output'] == 'text'
assert output_dict['install_state'] == 'None'
assert output_dict['install_state_info'] == 'None'
assert output_dict['inv_state'] == 'inventoried'
assert output_dict['invprovision'] == 'provisioned'
assert output_dict['iscsi_initiator_name'] == 'iqn.2000-01.io.sssssssss:3sssssssssss'
assert output_dict['location'] == '{}'
assert output_dict['max_cpu_mhz_allowed'] == 'None'
assert output_dict['max_cpu_mhz_configured'] == 'None'
assert output_dict['mgmt_mac'] == 'dd:ff:ee:77:22:bb'
assert output_dict['min_cpu_mhz_allowed'] == 'None'
assert output_dict['nvme_host_id'] == '33333333-7777-4444-9999-888888888888'
assert output_dict['nvme_host_nqn'] == 'nqn.2014-08.org.nvmexpress:uuid:9bbbbbbb-2222-4444-aaaa-888888888888'
assert output_dict['operational'] == 'enabled'
assert output_dict['personality'] == 'controller'
assert output_dict['reboot_needed'] == 'False'
assert output_dict['reserved'] == 'False'
assert output_dict['rootfs_device'] == '/dev/disk/by-path/pci-0000:5c:00.0-sas-0x0000000000000000-lun-0'
assert output_dict['serialid'] == 'None'
assert output_dict['software_load'] == '24.09'
assert output_dict['subfunction_avail'] == 'available'
assert output_dict['subfunction_oper'] == 'enabled'
assert output_dict['subfunctions'] == 'controller,worker'
assert output_dict['sw_version'] == '24.09'
assert output_dict['task'] == ''
assert output_dict['tboot'] == ''
assert output_dict['ttys_dcd'] == 'False'
assert output_dict['updated_at'] == '2024-08-26T19:54:26.730136+00:00'
assert output_dict['uptime'] == '295248'
assert output_dict['uuid'] == 'bbbbbbbb-9999-4444-8888-aaaaaaaaaaaa'
assert output_dict['vim_progress_status'] == 'services-enabled'
def test_system_vertical_table_parser_error_in_first_row():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_first_row)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "It is expected that a table have exactly two columns."
def test_system_vertical_table_parser_error_in_second_row():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_second_row)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "It is expected that a table have a header with 'Property' and 'Value' labels."
def test_system_vertical_table_parser_error_in_third_row():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_third_row)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "It is expected that a table have exactly two columns."
def test_system_vertical_table_parser_error_in_some_row():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_some_row)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "It is expected that a table have exactly two columns."
def test_system_vertical_table_parser_error_in_last_row():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_last_row)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "It is expected that a table have exactly two columns."
def test_system_vertical_table_parser_error_in_first_property_name():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_host_show_output_error_first_property_name)
try:
system_vertical_table_parser.get_output_values_dict()
assert False, "There should be an exception when parsing the output."
except KeywordException as e:
assert e.args[0] == "The property name in the first data row cannot be empty."
def test_system_vertical_table_parser_with_valid_table_with_a_text_in_the_end():
"""
Tests the system vertical parser
Returns:
"""
system_vertical_table_parser = SystemVerticalTableParser(system_application_upload)
output_dict = system_vertical_table_parser.get_output_values_dict()
assert len(output_dict.keys()) == 9
assert len(output_dict.values()) == 9
assert output_dict.get("active") == "True"
assert output_dict.get("app_version") == "0.1.0"
assert output_dict.get("created_at") == "2024-10-16T14:58:17.305376+00:00"
assert output_dict.get("manifest_file") == "fluxcd-manifests"
assert output_dict.get("manifest_name") == "hello-kitty-fluxcd-manifests"
assert output_dict.get("name") == "hello-kitty"
assert output_dict.get("progress") == "None"
assert output_dict.get("status") == "removing"
assert output_dict.get("updated_at") == "2024-10-16T15:50:59.902779+00:00"