X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=rwlaunchpad%2Fra%2Fpytest%2Fns%2Fha%2Ftest_ha_operations.py;fp=rwlaunchpad%2Fra%2Fpytest%2Fns%2Fha%2Ftest_ha_operations.py;h=5372a1e81f74f5d3b87b0dee6736ace5403ec4e8;hb=4870d0ee29789b859931e4e2c73e13dcb29537d5;hp=0000000000000000000000000000000000000000;hpb=6f1a3fe149e4a6b9803382cb299c902f4cf58ec9;p=osm%2FSO.git diff --git a/rwlaunchpad/ra/pytest/ns/ha/test_ha_operations.py b/rwlaunchpad/ra/pytest/ns/ha/test_ha_operations.py new file mode 100644 index 00000000..5372a1e8 --- /dev/null +++ b/rwlaunchpad/ra/pytest/ns/ha/test_ha_operations.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python3 +""" +# +# Copyright 2017 RIFT.IO Inc +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" + +import gi +import pytest +import random +import time + +import rift.auto.mano as mano +import rift.auto.descriptor +from gi.repository.RwKeyspec import quoted_key + +from gi.repository import ( + RwProjectNsdYang, + RwNsrYang, + RwVnfrYang, + RwVlrYang, + RwProjectVnfdYang, + RwCloudYang +) + + +@pytest.mark.setup('active_configuration') +@pytest.mark.incremental +class TestActiveLpConfiguration(object): + """Setting up the configuration.""" + + def collect_active_lp_data( + self, active_lp_node_obj, active_confd_host, + standby_confd_host, logger): + """Collect active lp data.""" + mano.verify_hagr_endpoints(active_confd_host, standby_confd_host) + active_lp_node_obj.collect_data() + + def wait_for_standby_to_comeup( + self, standby_mgmt_session, active_confd_host, standby_confd_host): + """Wait for the standby to come up. + + Wait for endpoint 'ha/geographic/active' to return 200 + """ + mano.wait_for_standby_to_become_active(standby_mgmt_session) + # mano.verify_hagr_endpoints( + # active_host=standby_confd_host, standby_host=active_confd_host) + + def collect_standby_lp_data( + self, standby_lp_node_obj, standby_mgmt_session, cloud_account, + fmt_cloud_xpath, projects, fmt_nsd_catalog_xpath): + """Collect standby lp data.""" + time.sleep(180) + rw_new_active_cloud_pxy = standby_mgmt_session.proxy(RwCloudYang) + nsd_pxy = standby_mgmt_session.proxy(RwProjectNsdYang) + rwnsr_proxy = standby_mgmt_session.proxy(RwNsrYang) + + for project_name in projects: + rw_new_active_cloud_pxy.wait_for( + fmt_cloud_xpath.format( + project=quoted_key(project_name), + account_name=quoted_key(cloud_account.name)) + + '/connection-status/status', 'success', + timeout=60, fail_on=['failure']) + + # nsd_catalog = nsd_pxy.get_config( + # fmt_nsd_catalog_xpath.format(project=quoted_key(project_name))) + # assert nsd_catalog + + if pytest.config.getoption("--nsr-test"): + nsr_opdata = rwnsr_proxy.get( + '/rw-project:project[rw-project:name={project}]' + + '/ns-instance-opdata'.format( + project=quoted_key(project_name)) + ) + + assert nsr_opdata + nsrs = nsr_opdata.nsr + + for nsr in nsrs: + xpath = ( + '/rw-project:project[rw-project:name={project}]' + + '/ns-instance-opdata/nsr[ns-instance-config-ref=' + + '{config_ref}]/config-status'.format( + project=quoted_key(project_name), + config_ref=quoted_key(nsr.ns_instance_config_ref)) + ) + + rwnsr_proxy.wait_for( + xpath, "configured", fail_on=['failed'], timeout=400) + + standby_lp_node_obj.collect_data() + + def attempt_indirect_failover( + self, revertive_pref_host, active_confd_host, standby_confd_host, + active_site_name, standby_site_name, logger): + """Try indirect failover.""" + time.sleep(5) + logger.debug( + 'Attempting first failover. Host {} will be new active'.format( + standby_confd_host)) + + mano.indirect_failover( + revertive_pref_host, new_active_ip=standby_confd_host, + new_active_site=standby_site_name, + new_standby_ip=active_confd_host, + new_standby_site=active_site_name) + + def match_active_standby(self, active_lp_node_obj, standby_lp_node_obj): + """Compare active standby.""" + active_lp_node_obj.compare(standby_lp_node_obj) + + def test_create_project_users_cloud_acc( + self, rbac_user_passwd, user_domain, rw_active_user_proxy, logger, + rw_active_project_proxy, rw_active_rbac_int_proxy, cloud_account, + rw_active_conman_proxy, rw_active_cloud_pxy, user_roles, + fmt_prefixed_cloud_xpath, fmt_cloud_xpath, descriptors, + active_mgmt_session, fmt_nsd_catalog_xpath, active_lp_node_obj, + standby_lp_node_obj, active_confd_host, standby_confd_host, + revertive_pref_host, active_site_name, standby_site_name, + standby_mgmt_session): + """Create 3 of users, projects, cloud accounts, decriptors & nsrs.""" + def failover_and_match(): + """Try an indirect failover. + + Match active and standby data + """ + self.collect_active_lp_data( + active_lp_node_obj, active_confd_host, + standby_confd_host, logger) + self.attempt_indirect_failover( + revertive_pref_host, active_confd_host, standby_confd_host, + active_site_name, standby_site_name, logger) + self.wait_for_standby_to_comeup( + standby_mgmt_session, active_confd_host, standby_confd_host) + self.collect_standby_lp_data( + standby_lp_node_obj, standby_mgmt_session, cloud_account, + fmt_cloud_xpath, projects, fmt_nsd_catalog_xpath) + self.match_active_standby(active_lp_node_obj, standby_lp_node_obj) + + def delete_data_set(idx): + + rift.auto.descriptor.terminate_nsr( + rwvnfr_pxy, rwnsr_pxy, rwvlr_pxy, logger, + project=projects[idx]) + + rift.auto.descriptor.delete_descriptors( + active_mgmt_session, project_name) + + rw_active_cloud_pxy.delete_config( + fmt_prefixed_cloud_xpath.format( + project=quoted_key(projects[idx]), + account_name=quoted_key(cloud_account.name) + ) + ) + response = rw_active_cloud_pxy.get( + fmt_cloud_xpath.format( + project=quoted_key(projects[idx]), + account_name=quoted_key(cloud_account.name) + ) + ) + assert response is None + + mano.delete_project(rw_active_conman_proxy, projects[idx]) + projects.pop() + mano.delete_user(rw_active_user_proxy, users[idx], user_domain) + users.pop() + + # Create test users + user_name_pfx = 'user_ha_' + users = [] + for idx in range(1, 4): + users.append(user_name_pfx + str(idx)) + + mano.create_user( + rw_active_user_proxy, user_name_pfx + str(idx), + rbac_user_passwd, user_domain) + + # Create projects and assign roles to users + prj_name_pfx = 'prj_ha_' + projects = [] + for idx in range(1, 4): + project_name = prj_name_pfx + str(idx) + projects.append(project_name) + mano.create_project( + rw_active_conman_proxy, project_name) + + for idx in range(0, 3): + project_name = projects[idx] + role = random.choice(user_roles) + user = users[idx] + logger.debug( + 'Assinging role {} to user {} in project {}'.format( + role, user, project_name)) + + mano.assign_project_role_to_user( + rw_active_project_proxy, role, user, project_name, + user_domain, rw_active_rbac_int_proxy) + + logger.debug( + 'Creating cloud account {} for project {}'.format( + cloud_account.name, project_name)) + + xpath = fmt_prefixed_cloud_xpath.format( + project=quoted_key(project_name), + account_name=quoted_key(cloud_account.name)) + + rw_active_cloud_pxy.replace_config(xpath, cloud_account) + + xpath_no_pfx = fmt_cloud_xpath.format( + project=quoted_key(project_name), + account_name=quoted_key(cloud_account.name)) + + response = rw_active_cloud_pxy.get(xpath_no_pfx) + assert response.name == cloud_account.name + assert response.account_type == cloud_account.account_type + + rw_active_cloud_pxy.wait_for( + fmt_cloud_xpath.format( + project=quoted_key(project_name), + account_name=quoted_key(cloud_account.name)) + + '/connection-status/status', 'success', timeout=30, + fail_on=['failure']) + + # Uploads the descriptors + for descriptor in descriptors: + rift.auto.descriptor.onboard( + active_mgmt_session, descriptor, project=project_name) + + # Verify whether the descriptors uploaded successfully + logger.debug( + 'Onboarding descriptors for project {}'.format(project_name)) + + nsd_pxy = active_mgmt_session.proxy(RwProjectNsdYang) + rwnsr_pxy = active_mgmt_session.proxy(RwNsrYang) + rwvnfr_pxy = active_mgmt_session.proxy(RwVnfrYang) + rwvlr_pxy = active_mgmt_session.proxy(RwVlrYang) + + nsd_xpath = fmt_nsd_catalog_xpath.format( + project=quoted_key(project_name)) + nsd_catalog = nsd_pxy.get_config(nsd_xpath) + assert nsd_catalog + + nsd_xpath = fmt_nsd_catalog_xpath.format( + project=quoted_key(project_name)) + nsd_catalog = nsd_pxy.get_config(nsd_xpath) + assert nsd_catalog + nsd = nsd_catalog.nsd[0] + nsr = rift.auto.descriptor.create_nsr( + cloud_account.name, nsd.name, nsd) + + logger.debug( + 'Instantiating NS for project {}'.format(project_name)) + rift.auto.descriptor.instantiate_nsr( + nsr, rwnsr_pxy, logger, project=project_name) + + delete_data_set(2) + failover_and_match() + delete_data_set(1) + failover_and_match() + +