diff --git a/testcases/cloud_platform/regression/dc/geo_redundancy/test_geo_redundancy.py b/testcases/cloud_platform/regression/dc/geo_redundancy/test_geo_redundancy.py new file mode 100644 index 00000000..38c406c4 --- /dev/null +++ b/testcases/cloud_platform/regression/dc/geo_redundancy/test_geo_redundancy.py @@ -0,0 +1,129 @@ +from pytest import mark + +from config.configuration_manager import ConfigurationManager +from framework.logging.automation_logger import get_logger +from framework.ssh.ssh_connection import SSHConnection +from keywords.cloud_platform.dcmanager.dcmanager_peer_group_association_add_keywords import DcManagerPeerGroupAssociationAddKeywords +from keywords.cloud_platform.dcmanager.dcmanager_peer_group_association_list_keywords import DcManagerPeerGroupAssociationListKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_list_keywords import DcManagerSubcloudListKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_peer_group_add_keywords import DcManagerSubcloudPeerGroupAddKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_peer_group_list_keywords import DcManagerSubcloudPeerGroupListKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_peer_group_list_subclouds_keywords import DcManagerSubcloudPeerGroupListSubcloudsKeywords +from keywords.cloud_platform.dcmanager.dcmanager_subcloud_update_keywords import DcManagerSubcloudUpdateKeywords +from keywords.cloud_platform.dcmanager.dcmanager_system_peer_add_keywords import DcManagerSystemPeerAddKeywords +from keywords.cloud_platform.dcmanager.dcmanager_system_peer_list_keywords import DcManagerSystemPeerListKeywords +from keywords.cloud_platform.openstack.endpoint.objects.openstack_endpoint_list_object_filter import OpenStackEndpointListObjectFilter +from keywords.cloud_platform.openstack.endpoint.openstack_endpoint_list_keywords import OpenStackEndpointListKeywords +from keywords.cloud_platform.ssh.lab_connection_keywords import LabConnectionKeywords +from keywords.cloud_platform.system.host.system_host_route_keywords import SystemHostRouteKeywords +from keywords.cloud_platform.system.show.system_show_keywords import SystemShowKeywords + + +def configure_system_peer_site(origin_ssh_connection: SSHConnection, target_ssh_connection: SSHConnection) -> None: + """Configures a system peer on the target site using details gathered from the origin site. + + This function connects to the origin site via `origin_ssh_connection` to retrieve necessary + system information (such as UUID, identity endpoint URL, and gateway). It then uses + `target_ssh_connection` to configure the system peer on the target site. + + Args: + origin_ssh_connection (SSHConnection): SSH connection to the origin site (the site being peered from). + target_ssh_connection (SSHConnection): SSH connection to the target site (the site where the peer is added). + """ + # get the endpoint url + # openstack endpoint list | grep identity | grep public | grep RegionOne + os_ep_list_fltr = OpenStackEndpointListObjectFilter().set_region("RegionOne").set_interface("public").set_service_type("identity") + os_ep_list = OpenStackEndpointListKeywords(origin_ssh_connection).endpoint_list().get_endpoints_list_objects_filtered(os_ep_list_fltr) + if not os_ep_list: + raise Exception("No endpoints found in the source site.") + manager_endpoint_url = os_ep_list[0].get_url() + + peer_controller_gateway_address = SystemHostRouteKeywords(origin_ssh_connection).get_system_host_route_list("controller-0").get_gateway_address() + + peer_uuid = SystemShowKeywords(origin_ssh_connection).system_show().get_system_show_object().get_uuid() + + peer_name = f"{target_ssh_connection.get_name()}-{origin_ssh_connection.get_name()}-system-peer" + + manager_password = ConfigurationManager.get_lab_config().get_admin_credentials().get_password() + + DcManagerSystemPeerAddKeywords(target_ssh_connection).dcmanager_system_peer_add(peer_uuid, peer_name, manager_endpoint_url, peer_controller_gateway_address, manager_password) + + +def subcloud_update(controller_ssh: SSHConnection, subcloud_name: str) -> None: + """Updates the specified subcloud on the source site using its bootstrap address and configuration files. + + Args: + controller_ssh (SSHConnection): SSH connection to the site's controller. + subcloud_name (str): Name of the subcloud to update + """ + # Get the subcloud config + sc_config = ConfigurationManager.get_lab_config().get_subcloud(subcloud_name) + # Get the subcloud bootstrap address + boot_add = sc_config.get_first_controller().get_ip() + + # Get the subcloud deployment assets + deployment_assets_config = ConfigurationManager.get_deployment_assets_config() + sc_assets = deployment_assets_config.get_subcloud_deployment_assets(subcloud_name) + bootstrap_file = sc_assets.get_bootstrap_file() + + # Update the subcloud details for rehoming purpose. + # We need to import bootstrap_file first for remove + DcManagerSubcloudUpdateKeywords(controller_ssh).dcmanager_subcloud_update(subcloud_name, "bootstrap-values", bootstrap_file) + DcManagerSubcloudUpdateKeywords(controller_ssh).dcmanager_subcloud_update(subcloud_name, "bootstrap-address", boot_add) + + +@mark.p0 +@mark.lab_has_subcloud +@mark.lab_has_secondary_system_controller +def test_geo_redundancy(): + """ + Test to verify the geo-redundancy setup rehoming subcloud from one site to another + Assuming the Site A is the Source site from which subcloud will move, + and Site B is the Destination site where the subcloud will be moved. + """ + src_site_ssh_conn = LabConnectionKeywords().get_active_controller_ssh() + dest_site_ssh_conn = LabConnectionKeywords().get_secondary_active_controller_ssh() + + # Assign site names to SSH connections + src_site_ssh_conn.set_name(ConfigurationManager.get_lab_config().get_lab_name()) + dest_site_ssh_conn.set_name(ConfigurationManager.get_lab_config().get_secondary_system_controller_config().get_lab_name()) + + get_logger().log_test_case_step("Source site: Retrieve subcloud name for rehoming") + subcloud_name = DcManagerSubcloudListKeywords(src_site_ssh_conn).get_dcmanager_subcloud_list().get_healthy_subcloud_with_lowest_id().get_name() + + get_logger().log_test_case_step("Source site: Update subcloud bootstrap values") + subcloud_update(src_site_ssh_conn, subcloud_name) + + # get Site B Destination info and add system-peer in Site A source + get_logger().log_test_case_step("Source site: Add system-peer in Site A (source) using Site B (destination) details and list system peers") + configure_system_peer_site(dest_site_ssh_conn, src_site_ssh_conn) + DcManagerSystemPeerListKeywords(src_site_ssh_conn).get_dcmanager_system_peer_list() + + # get Site A Destination info and add system-peer in Site B Destination + get_logger().log_test_case_step("Destination site: Add system-peer in Site B (destination) using Site A (source) details and list system peers") + configure_system_peer_site(src_site_ssh_conn, dest_site_ssh_conn) + DcManagerSystemPeerListKeywords(dest_site_ssh_conn).get_dcmanager_system_peer_list() + + get_logger().log_test_case_step("Source site: Add subcloud peer group (derived from source site name) and list subcloud peer groups") + peer_group_name = f"{src_site_ssh_conn.get_name()}--subcloud-peer-group" + DcManagerSubcloudPeerGroupAddKeywords(src_site_ssh_conn).dcmanager_subcloud_peer_group_add(peer_group_name) + DcManagerSubcloudPeerGroupListKeywords(src_site_ssh_conn).get_dcmanager_subcloud_peer_group_list() + + get_logger().log_test_case_step("Source site: Retrieve subcloud peer group ID and Update subcloud with peer group ID") + subcloud_peer_group_id = DcManagerSubcloudPeerGroupListKeywords(src_site_ssh_conn).get_dcmanager_subcloud_peer_group_list().get_latest_subcloud_peer_group_id() + DcManagerSubcloudUpdateKeywords(src_site_ssh_conn).dcmanager_subcloud_update(subcloud_name, "peer-group", subcloud_peer_group_id) + + # Add peer group association using subcloud peer group ID, system peer ID, and peer group priority + get_logger().log_test_case_step("Source site: Retrieve system peer ID, add peer group association with priority 1, and list peer group associations") + system_peer_id = DcManagerSystemPeerListKeywords(src_site_ssh_conn).get_dcmanager_system_peer_list().get_latest_system_peer_id() + DcManagerPeerGroupAssociationAddKeywords(src_site_ssh_conn).dcmanager_peer_group_association_add(subcloud_peer_group_id, system_peer_id, 1) + DcManagerPeerGroupAssociationListKeywords(src_site_ssh_conn).get_dcmanager_peer_group_association_list() + + get_logger().log_test_case_step("Destination site: List subcloud peer groups, peer group associations, and all subclouds") + DcManagerSubcloudPeerGroupListKeywords(dest_site_ssh_conn).get_dcmanager_subcloud_peer_group_list() + DcManagerPeerGroupAssociationListKeywords(dest_site_ssh_conn).get_dcmanager_peer_group_association_list() + DcManagerSubcloudListKeywords(dest_site_ssh_conn).get_dcmanager_subcloud_list_all() + + get_logger().log_test_case_step("Destination site: Retrieve subcloud peer group ID and list associated subclouds") + subcloud_peer_group_id = DcManagerSubcloudPeerGroupListKeywords(dest_site_ssh_conn).get_dcmanager_subcloud_peer_group_list().get_latest_subcloud_peer_group_id() + DcManagerSubcloudPeerGroupListSubcloudsKeywords(dest_site_ssh_conn).get_dcmanager_subcloud_peer_group_list_subclouds(subcloud_peer_group_id)