diff --git a/keywords/cloud_platform/system/addrpool/object/system_addrpool_list_output.py b/keywords/cloud_platform/system/addrpool/object/system_addrpool_list_output.py index fd1f6a8e..c4c37178 100644 --- a/keywords/cloud_platform/system/addrpool/object/system_addrpool_list_output.py +++ b/keywords/cloud_platform/system/addrpool/object/system_addrpool_list_output.py @@ -39,7 +39,6 @@ class SystemAddrpoolListOutput: """ - def __init__(self, system_addrpool_list_output): """ Constructor @@ -54,15 +53,15 @@ class SystemAddrpoolListOutput: if self.is_valid_output(value): self.system_addrpool.append( SystemAddrpoolListObject( - value['uuid'], - value['name'], - value['network'], - value['order'], - value['ranges'], - value['floating_address'], - value['controller0_address'], - value['controller1_address'], - value['gateway_address'], + value["uuid"], + value["name"], + value["network"], + value["order"], + value["ranges"], + value["floating_address"], + value["controller0_address"], + value["controller1_address"], + value["gateway_address"], ) ) else: @@ -88,19 +87,27 @@ class SystemAddrpoolListOutput: raise KeywordException(f"No addrpool with name {name} was found.") return addrpools[0].get_floating_address() + def get_gateway_address_by_name(self, name: str) -> str: + """ + Gets the gateway address for the given name. + + Args: + name: the name of the desired addrpool + + Returns: + The floating address of the addrpool with the specified name. + + """ + addrpools = list(filter(lambda pool: name in pool.get_name(), self.system_addrpool)) + if not addrpools: + raise KeywordException(f"No addrpool with name {name} was found.") + return addrpools[0].get_gateway_address() + @staticmethod def is_valid_output(value): - required_keys = ['uuid', 'name', 'network', 'order', 'ranges', 'floating_address', 'controller0_address', 'controller1_address', 'gateway_address'] + required_keys = ["uuid", "name", "network", "order", "ranges", "floating_address", "controller0_address", "controller1_address", "gateway_address"] for key in required_keys: if key not in value: - get_logger().log_error(f'{key} is not in the output value: {value}') + get_logger().log_error(f"{key} is not in the output value: {value}") return False return True - - - - - - - - diff --git a/keywords/cloud_platform/system/addrpool/system_addrpool_list_keywords.py b/keywords/cloud_platform/system/addrpool/system_addrpool_list_keywords.py index 5e43683c..c41464ff 100644 --- a/keywords/cloud_platform/system/addrpool/system_addrpool_list_keywords.py +++ b/keywords/cloud_platform/system/addrpool/system_addrpool_list_keywords.py @@ -40,4 +40,13 @@ class SystemAddrpoolListKeywords(BaseKeyword): Returns: The floating address for the name with management field. """ - return self.get_system_addrpool_list().get_floating_address_by_name("management") \ No newline at end of file + return self.get_system_addrpool_list().get_floating_address_by_name("management") + + def get_management_gateway_address(self) -> str: + """ + Retrieves the gateway address for the addrpool with name 'management'. + + Returns: + The gateway address for the name with management field. + """ + return self.get_system_addrpool_list().get_gateway_address_by_name("management") \ No newline at end of file diff --git a/testcases/cloud_platform/regression/dc/rehoming/test_subcloud_mgmt_rehome.py b/testcases/cloud_platform/regression/dc/rehoming/test_subcloud_mgmt_rehome.py new file mode 100644 index 00000000..9a1c4fcc --- /dev/null +++ b/testcases/cloud_platform/regression/dc/rehoming/test_subcloud_mgmt_rehome.py @@ -0,0 +1,79 @@ +from pytest import fail, mark + +from config.configuration_manager import ConfigurationManager +from framework.logging.automation_logger import get_logger +from framework.validation.validation import validate_equals, validate_not_equals +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_add_keywords import DcManagerSubcloudAddKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_delete_keywords import DcManagerSubcloudDeleteKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_list_keywords import DcManagerSubcloudListKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_manager_keywords import DcManagerSubcloudManagerKeywords +from keywords.cloud_platform.ssh.lab_connection_keywords import LabConnectionKeywords +from keywords.cloud_platform.system.addrpool.system_addrpool_list_keywords import SystemAddrpoolListKeywords +from keywords.cloud_platform.system.host.system_host_list_keywords import SystemHostListKeywords +from keywords.cloud_platform.system.host.system_host_route_keywords import SystemHostRouteKeywords + + +@mark.p2 +@mark.lab_has_subcloud +@mark.lab_has_secondary_system_controller +def test_rehome_one_subcloud_mgmt_subcloud(request): + """ + Execute a subcloud rehome + + Test Steps: + - Ensure both initial and target system controllers have the same date. + - Deploy a subcloud with mgmt network + - Unmanage the subcloud to be rehomed. + - Shutdown both initial controller and subcloud + - run dcmanager subcloud migration command. + + """ + + deployment_assets_config = ConfigurationManager.get_deployment_assets_config() + + origin_system_controller_ssh = LabConnectionKeywords().get_active_controller_ssh() + destination_system_controller_ssh = LabConnectionKeywords().get_secondary_active_controller_ssh() + + # Gets the lowest subcloud (the subcloud with the lowest id). + dcmanager_subcloud_list_keywords = DcManagerSubcloudListKeywords(origin_system_controller_ssh) + lowest_subcloud = dcmanager_subcloud_list_keywords.get_dcmanager_subcloud_list().get_healthy_subcloud_with_lowest_id() + subcloud_name = lowest_subcloud.get_name() + subcloud_ssh = LabConnectionKeywords().get_subcloud_ssh(subcloud_name) + + subcloud_hostname = SystemHostListKeywords(subcloud_ssh).get_active_controller().get_host_name() + + subcloud_bootstrap_values = deployment_assets_config.get_subcloud_deployment_assets(subcloud_name).get_bootstrap_file() + subcloud_install_values = deployment_assets_config.get_subcloud_deployment_assets(subcloud_name).get_install_file() + + network_list = SystemHostRouteKeywords(subcloud_ssh).get_system_host_route_list_networks(subcloud_hostname) + subcloud_mgmt_gateway_address = SystemAddrpoolListKeywords(subcloud_ssh).get_management_gateway_address() + old_subcloud_oam_subnet = SystemAddrpoolListKeywords(subcloud_ssh).get_system_addrpool_list().get_floating_address_by_name("system-controller-oam-subnet") + old_subcloud_subnet = SystemAddrpoolListKeywords(subcloud_ssh).get_system_addrpool_list().get_floating_address_by_name("system-controller-subnet") + + if not subcloud_mgmt_gateway_address: + fail("Subcloud has no management gateway address") + + get_logger().log_info(f"Running rehome command on {destination_system_controller_ssh}") + DcManagerSubcloudAddKeywords(destination_system_controller_ssh).dcmanager_subcloud_add_migrate(subcloud_name, bootstrap_values=subcloud_bootstrap_values, install_values=subcloud_install_values) + DcManagerSubcloudListKeywords(destination_system_controller_ssh).validate_subcloud_status(subcloud_name=subcloud_name, status="rehoming") + DcManagerSubcloudListKeywords(destination_system_controller_ssh).validate_subcloud_status(subcloud_name=subcloud_name, status="complete") + + new_subcloud_oam_subnet = SystemAddrpoolListKeywords(subcloud_ssh).get_system_addrpool_list().get_floating_address_by_name("system-controller-oam-subnet") + new_subcloud_subnet = SystemAddrpoolListKeywords(subcloud_ssh).get_system_addrpool_list().get_floating_address_by_name("system-controller-subnet") + + validate_not_equals(old_subcloud_oam_subnet, new_subcloud_oam_subnet, "Validate subcloud system-controller-oam-subnet changed.") + validate_not_equals(old_subcloud_subnet, new_subcloud_subnet, "Validate subcloud system-controller-subnet changed.") + + get_logger().log_info(f"Deleting subcloud from {origin_system_controller_ssh}") + DcManagerSubcloudManagerKeywords(origin_system_controller_ssh).get_dcmanager_subcloud_unmanage(subcloud_name=subcloud_name, timeout=30) + DcManagerSubcloudDeleteKeywords(origin_system_controller_ssh).dcmanager_subcloud_delete(subcloud_name=subcloud_name) + + get_logger().log_info(f"Running rehome command on {origin_system_controller_ssh}") + DcManagerSubcloudAddKeywords(origin_system_controller_ssh).dcmanager_subcloud_add_migrate(subcloud_name, bootstrap_values=subcloud_bootstrap_values, install_values=subcloud_install_values) + dcmanager_subcloud_list_keywords.validate_subcloud_status(subcloud_name=subcloud_name, status="rehoming") + dcmanager_subcloud_list_keywords.validate_subcloud_status(subcloud_name=subcloud_name, status="complete") + + get_logger().log_info(f"Deleting subcloud from {destination_system_controller_ssh}") + DcManagerSubcloudDeleteKeywords(destination_system_controller_ssh).dcmanager_subcloud_delete(subcloud_name=subcloud_name) + + validate_equals(len(network_list), 1, "Validate system host route list only has one route.")