
Fresh start for the StarlingX automation framework. Change-Id: Ie265e0791024f45f71faad6315c2b91b022934d1
493 lines
26 KiB
Python
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"
|