def test_reapply_stx_openstack_no_change(stx_openstack_applied_required, check_nodes, controller): """ Args: stx_openstack_applied_required: Pre-requisite: - stx-openstack application in applied state Test Steps: - Re-apply stx-openstack application - Check openstack pods healthy """ # if controller == 'controller-1': # skip("CGTS-10708") if system_helper.is_aio_simplex() and controller != 'controller-0': skip('Simplex system only has controller-0') active, standby = system_helper.get_active_standby_controllers() if active != controller: if not standby: skip('{} is not ready to take over'.format(controller)) LOG.tc_step("Swact active controller to test reapply from {}".format(controller)) host_helper.swact_host() time.sleep(60) LOG.info("helm list before reapply after swact") from utils.clients.ssh import ControllerClient con_ssh = ControllerClient.get_active_controller() end_time = time.time() + 180 while time.time() < end_time: code = con_ssh.exec_cmd('helm list', expect_timeout=60)[0] if code == 0: break time.sleep(30) LOG.tc_step("Re-apply stx-openstack application") container_helper.apply_app(app_name='stx-openstack') LOG.tc_step("Check openstack pods in good state on all controllers after stx-openstack " "re-applied") for host in get_valid_controllers(): check_openstack_pods_healthy(host=host, timeout=120)
def test_reapply_stx_openstack(): """ Re-apply stx openstack application without any modification to helm charts. """ # Modified the check_interval set on robot test from 300 t0 30 to shorten the timeouts application_status = container_helper.apply_app(app_name="stx-openstack", applied_timeout=5400, check_interval=30)[0] assert application_status == 0, "Reapply STX OpenStack has failed"
def set_retention_period(period, fail_ok=False, check_first=True, con_ssh=None, auth_info=Tenant.get('admin_platform')): """ Sets the PM retention period in K8S settings Args: period (int): the length of time to set the retention period (in seconds) fail_ok: True or False check_first: True or False con_ssh (SSHClient): auth_info (dict): could be Tenant.get('admin'), Tenant.get('tenant1') Returns (tuple): (rtn_code (int), msg (str)) (-1, "The retention period is already set to specified period") (0, "Current retention period is: <retention_period>") (1, "Current retention period is still: <retention_period>") US100247 US99793 system helm-override-update --reset-values panko database --set conf.panko.database.event_time_to_live=45678 system application-apply stx-openstack """ from keywords import container_helper if check_first: retention = get_retention_period(con_ssh=con_ssh) if period == retention: msg = "The retention period is already set to {}".format(period) LOG.info(msg) return -1, msg app_name = 'stx-openstack' service = 'panko' section = 'openstack' name = 'conf.panko.database.event_time_to_live' container_helper.update_helm_override(chart=service, namespace=section, reset_vals=False, kv_pairs={name: period}, auth_info=auth_info, con_ssh=con_ssh) override_info = container_helper.get_helm_override_values( chart=service, namespace=section, fields='user_overrides', auth_info=auth_info, con_ssh=con_ssh) LOG.debug('override_info:{}'.format(override_info)) code, output = container_helper.apply_app(app_name=app_name, check_first=False, applied_timeout=1800, fail_ok=fail_ok, con_ssh=con_ssh, auth_info=auth_info) if code > 0: return code, output post_retention = get_retention_period(con_ssh=con_ssh) if post_retention != period: raise exceptions.TiSError('event_time_to_live in panko conf is ' 'not updated to {}'.format(period)) msg = 'event_time_to_live value in panko.conf is successfully updated' LOG.info(msg) return 0, msg
def test_launch_app_via_sysinv(copy_test_apps): """ Test upload, apply, remove, delete custom app via system cmd Args: copy_test_apps (str): module fixture cleanup_app: fixture Setups: - Copy test files from test server to tis system (module) - Remove and delete test app if exists Test Steps: - system application-upload test app tar file and wait for it to be uploaded - system application-apply test app and wait for it to be applied - wget <oam_ip>:<app_targetPort> from remote host - Verify app contains expected content - system application-remove test app and wait for it to be uninstalled - system application-delete test app from system """ app_dir = copy_test_apps app_name = HELM_APP_NAME central_ssh = ControllerClient.get_active_controller(name='RegionOne') central_auth = Tenant.get('admin_platform', dc_region='SystemController') platform_app = container_helper.get_apps(auth_info=central_auth, application='platform-integ-apps') LOG.info('Test platform-integ-apps is applied') assert len(platform_app) != 0 and platform_app[0] == 'applied' subclouds = dc_helper.get_subclouds() LOG.tc_step("Upload and apply {} on system controller".format(app_name)) container_helper.upload_app(app_name=app_name, app_version=HELM_APP_VERSION, tar_file=os.path.join(app_dir, HELM_TAR), auth_info=central_auth) container_helper.apply_app(app_name=app_name, auth_info=central_auth) LOG.tc_step( "Check docker image stored in System controller registry.local") code, output = cli.system(cmd="registry-image-list | fgrep hellokitty", ssh_client=central_ssh, fail_ok=True) assert code == 0 # LOG.info("code %s, output %s", code, output) for subcloud in subclouds: subcloud_auth = Tenant.get('admin_platform', dc_region=subcloud) LOG.tc_step("Upload/apply custom app on subcloud: {}".format(subcloud)) platform_app = container_helper.get_apps( auth_info=subcloud_auth, application='platform-integ-apps') LOG.info('Test platform-integ-apps is applied, on subcloud {}'.format( subcloud)) assert len(platform_app) != 0 and platform_app[0] == 'applied' LOG.tc_step("Upload and apply {} on subcloud: {}".format( app_name, subcloud)) container_helper.upload_app(app_name=app_name, app_version=HELM_APP_VERSION, tar_file=os.path.join(app_dir, HELM_TAR), auth_info=subcloud_auth) container_helper.apply_app(app_name=app_name, auth_info=subcloud_auth) LOG.tc_step("Check docker image stored on {} registry.central".format( subcloud)) code, output = cli.system(cmd="registry-image-list | fgrep hellokitty", ssh_client=central_ssh, auth_info=subcloud_auth, fail_ok=True) assert code == 0
def test_stx_openstack_helm_override_update_and_reset(check_nodes, reset_if_modified): """ Test helm override for openstack nova chart and reset Args: reset_if_modified: Pre-requisite: - stx-openstack application in applied state Test Steps: - Update nova helm-override default conf - Check nova helm-override is updated in system helm-override-show - Re-apply stx-openstack application and ensure it is applied (in applied status and alarm cleared) - On all controller(s): - Check nova compute pods names are changed in kubectl get - Check actual nova-compute.conf is updated in all nova-compute containers Teardown: - Update nova helm-override to reset values - Re-apply stx-openstack application and ensure it is applied """ valid_hosts, conf_path = reset_if_modified new_conf = 'conf.nova.DEFAULT.foo=bar' LOG.tc_step("Update nova helm-override: {}".format(new_conf)) container_helper.update_helm_override( chart='nova', namespace='openstack', kv_pairs={'conf.nova.DEFAULT.foo': 'bar'}) LOG.tc_step("Check nova helm-override is updated in system " "helm-override-show") fields = ('combined_overrides', 'system_overrides', 'user_overrides') combined_overrides, system_overrides, user_overrides = \ container_helper.get_helm_override_values(chart='nova', namespace='openstack', fields=fields) assert 'bar' == \ user_overrides['conf']['nova'].get('DEFAULT', {}).get('foo'), \ "{} is not shown in user overrides".format(new_conf) assert 'bar' == \ combined_overrides['conf']['nova'].get('DEFAULT', {}).get('foo'), \ "{} is not shown in combined overrides".format(new_conf) assert not system_overrides['conf']['nova'].get('DEFAULT', {}).get('foo'), \ "User override {} listed in system overrides " \ "unexpectedly".format(new_conf) prev_nova_cell_setup_pods = kube_helper.get_openstack_pods( application='nova', component='cell-setup', fail_ok=False) prev_count = len(prev_nova_cell_setup_pods) prev_nova_compute_pods = sorted(kube_helper.get_openstack_pods( application='nova', component='compute')) LOG.tc_step("Re-apply stx-openstack application and ensure it is applied") container_helper.apply_app(app_name='stx-openstack', check_first=False, applied_timeout=1800, fail_ok=False, check_interval=10) post_names = None for host in valid_hosts: with host_helper.ssh_to_host(hostname=host) as host_ssh: LOG.tc_step("Wait for all nova-cell-setup pods reach completed " "status on {}".format(host)) kube_helper.wait_for_openstack_pods_status( application='nova', component='cell-setup', status=PodStatus.COMPLETED, con_ssh=host_ssh) LOG.tc_step("Check nova compute pods names are changed in kubectl " "get on {}".format(host)) post_nova_cell_setup_pods = kube_helper.get_openstack_pods( application='nova', component='cell-setup', con_ssh=host_ssh) post_nova_compute_pods = sorted(kube_helper.get_openstack_pods( application='nova', component='compute', con_ssh=host_ssh)) assert prev_count + 1 == len(post_nova_cell_setup_pods), \ "No new nova cell setup pod created" if post_names: assert post_nova_compute_pods == post_names, \ "nova compute pods names differ on two controllers" else: post_names = post_nova_compute_pods assert prev_nova_compute_pods != post_names, \ "No new release generated for nova compute pods" LOG.tc_step("Check actual {} is updated in nova-compute " "containers on {}".format(conf_path, host)) check_cmd = 'grep foo {}'.format(conf_path) for nova_compute_pod in post_nova_compute_pods: kube_helper.exec_cmd_in_container(cmd=check_cmd, pod=nova_compute_pod, fail_ok=False, con_ssh=host_ssh, namespace='openstack', container_name='nova-compute')
def reset(): app_name = 'stx-openstack' post_status = container_helper.get_apps(application=app_name, field='status')[0] if not post_status.endswith('ed'): LOG.fixture_step("Wait for application apply finish") container_helper.wait_for_apps_status(apps=app_name, status=AppStatus.APPLIED, timeout=1800, check_interval=15, fail_ok=False) user_overrides = container_helper.get_helm_override_values( chart='nova', namespace='openstack', fields='user_overrides')[0] if not user_overrides or user_overrides == 'None': LOG.info("No change in nova user_overrides. Do nothing.") return LOG.fixture_step("Update nova helm-override to reset values") container_helper.update_helm_override(chart='nova', namespace='openstack', reset_vals=True) user_overrides = container_helper.get_helm_override_values( chart='nova', namespace='openstack', fields='user_overrides')[0] assert not user_overrides, "nova helm user_overrides still exist " \ "after reset-values" LOG.fixture_step("Re-apply stx-openstack application and ensure " "it is applied") container_helper.apply_app(app_name='stx-openstack', check_first=False, applied_timeout=1800) check_cmd = 'grep foo {}'.format(conf_path) LOG.fixture_step("Ensure user_override is removed from {} in " "nova-compute containers".format(conf_path)) for host in valid_hosts: with host_helper.ssh_to_host(host) as host_ssh: LOG.info( "Wait for nova-cell-setup completed on {}".format(host)) kube_helper.wait_for_openstack_pods_status( application='nova', component='cell-setup', con_ssh=host_ssh, status=PodStatus.COMPLETED) LOG.info("Check new release generated for nova compute " "pods on {}".format(host)) nova_compute_pods = kube_helper.get_openstack_pods( field='NAME', application='nova', component='compute', con_ssh=host_ssh)[0] nova_compute_pods = sorted(nova_compute_pods) if NEW_NOVA_COMPUTE_PODS: assert NEW_NOVA_COMPUTE_PODS != nova_compute_pods, \ "No new release generated after reset values" LOG.info("Check custom conf is removed from {} in nova " "compute container on {}".format(conf_path, host)) for nova_compute_pod in nova_compute_pods: code, output = kube_helper.exec_cmd_in_container( cmd=check_cmd, pod=nova_compute_pod, fail_ok=True, con_ssh=host_ssh, namespace='openstack', container_name='nova-compute') assert code == 1, \ "{} on {} still contains user override info after " \ "reset nova helm-override values and reapply " \ "stx-openstack app: {}".format(conf_path, host, output)
def test_launch_app_via_sysinv(copy_test_apps, cleanup_app): """ Test upload, apply, remove, delete custom app via system cmd Args: copy_test_apps (str): module fixture cleanup_app: fixture Setups: - Copy test files from test server to tis system (module) - Remove and delete test app if exists Test Steps: - system application-upload test app tar file and wait for it to be uploaded - system application-apply test app and wait for it to be applied - wget <oam_ip>:<app_targetPort> from remote host - Verify app contains expected content - system application-remove test app and wait for it to be uninstalled - system application-delete test app from system """ app_dir = copy_test_apps app_name = HELM_APP_NAME LOG.tc_step("Upload {} helm charts".format(app_name)) container_helper.upload_app(app_name=app_name, app_version=HELM_APP_VERSION, tar_file=os.path.join(app_dir, HELM_TAR)) LOG.tc_step("Apply {}".format(app_name)) container_helper.apply_app(app_name=app_name) LOG.tc_step("wget app via <oam_ip>:<targetPort>") json_path = '{.spec.ports[0].nodePort}' node_port = kube_helper.get_pod_value_jsonpath( type_name='service/{}'.format(HELM_POD_FULL_NAME), jsonpath=json_path) assert re.match(r'\d+', node_port), "Unable to get nodePort via " \ "jsonpath '{}'".format(json_path) localhost = LocalHostClient(connect=True) prefix = 'http' oam_ip = ProjVar.get_var('LAB')['floating ip'] if common.get_ip_version(oam_ip) == 6: oam_ip = '[{}]'.format(oam_ip) output_file = '{}/{}.html'.format(ProjVar.get_var('TEMP_DIR'), HELM_APP_NAME) localhost.exec_cmd('wget {}://{}:{} -O {}'.format(prefix, oam_ip, node_port, output_file), fail_ok=False) LOG.tc_step("Verify app contains expected content") app_content = localhost.exec_cmd('cat {}; echo'.format(output_file), get_exit_code=False)[1] assert app_content.startswith(HELM_MSG), \ "App does not start with expected message." LOG.tc_step("Remove applied app") container_helper.remove_app(app_name=app_name) LOG.tc_step("Delete uninstalled app") container_helper.delete_app(app_name=app_name) LOG.tc_step("Wait for pod terminate") kube_helper.wait_for_resources_gone(resource_names=HELM_POD_FULL_NAME, check_interval=10, namespace='default')