From 5775010bafda7a151728794fbbc4cb8ba8a91ede Mon Sep 17 00:00:00 2001 From: Hayk Hovsepyan Date: Fri, 16 Apr 2021 15:48:11 +0200 Subject: [PATCH] Fixed unstable overview actions tests. Fixed DR hosts tests after last fix. Fixed logs tab failures. --- .../istio_objects/dr_hosts/dest-rules1.yaml | 4 +- .../istio_objects/dr_hosts/dest-rules2.yaml | 4 +- .../istio_objects/dr_hosts/dest-rules3.yaml | 4 +- .../istio_objects/dr_hosts/dest-rules4.yaml | 2 +- .../istio_objects/dr_hosts/dest-rules5.yaml | 2 +- .../istio_objects/dr_hosts/dest-rules6.yaml | 2 +- .../istio_objects/dr_hosts/dest-rules7.yaml | 2 +- .../istio_objects/dr_hosts/dest-rules8.yaml | 2 +- .../istio_objects/dr_hosts/dest-rules9.yaml | 2 +- kiali_qe/components/__init__.py | 11 +- kiali_qe/components/enums.py | 14 +- kiali_qe/tests/__init__.py | 282 +++++++++--------- kiali_qe/tests/test_istio_objects_crud.py | 2 +- kiali_qe/tests/test_workloads_page.py | 2 +- 14 files changed, 170 insertions(+), 165 deletions(-) diff --git a/data/resources/istio_objects/dr_hosts/dest-rules1.yaml b/data/resources/istio_objects/dr_hosts/dest-rules1.yaml index 38956057..8110c200 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules1.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules1.yaml @@ -1,10 +1,10 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-1 + name: auto-mongodb-dr-1 namespace: bookinfo spec: - host: reviews + host: mongodb trafficPolicy: loadBalancer: simple: RANDOM diff --git a/data/resources/istio_objects/dr_hosts/dest-rules2.yaml b/data/resources/istio_objects/dr_hosts/dest-rules2.yaml index 3bfa4d32..691c8a87 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules2.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules2.yaml @@ -1,10 +1,10 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-2 + name: auto-mongodb-dr-2 namespace: bookinfo spec: - host: reviews.bookinfo + host: mongodb.bookinfo trafficPolicy: loadBalancer: simple: RANDOM diff --git a/data/resources/istio_objects/dr_hosts/dest-rules3.yaml b/data/resources/istio_objects/dr_hosts/dest-rules3.yaml index f2068ef7..795de7be 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules3.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules3.yaml @@ -1,10 +1,10 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-3 + name: auto-mongodb-dr-3 namespace: bookinfo spec: - host: reviews.bookinfo.svc.cluster.local + host: mongodb.bookinfo.svc.cluster.local trafficPolicy: loadBalancer: simple: RANDOM diff --git a/data/resources/istio_objects/dr_hosts/dest-rules4.yaml b/data/resources/istio_objects/dr_hosts/dest-rules4.yaml index 1a64e4ba..0b923b54 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules4.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules4.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-4 + name: auto-mongodb-dr-4 namespace: bookinfo spec: host: kubernetes.default.svc.cluster.local diff --git a/data/resources/istio_objects/dr_hosts/dest-rules5.yaml b/data/resources/istio_objects/dr_hosts/dest-rules5.yaml index 482145d7..7e01b219 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules5.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules5.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-5 + name: auto-mongodb-dr-5 namespace: bookinfo spec: host: "*.svc.cluster.local" diff --git a/data/resources/istio_objects/dr_hosts/dest-rules6.yaml b/data/resources/istio_objects/dr_hosts/dest-rules6.yaml index 844e6419..f3cf9762 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules6.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules6.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-6 + name: auto-mongodb-dr-6 namespace: bookinfo spec: host: "*.cluster.local" diff --git a/data/resources/istio_objects/dr_hosts/dest-rules7.yaml b/data/resources/istio_objects/dr_hosts/dest-rules7.yaml index 008618c0..63f9eeb6 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules7.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules7.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-7 + name: auto-mongodb-dr-7 namespace: bookinfo spec: host: "*.local" diff --git a/data/resources/istio_objects/dr_hosts/dest-rules8.yaml b/data/resources/istio_objects/dr_hosts/dest-rules8.yaml index 5a1e02e1..782839c9 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules8.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules8.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-8 + name: auto-mongodb-dr-8 namespace: bookinfo spec: host: "*.bookinfo.svc.cluster.local" diff --git a/data/resources/istio_objects/dr_hosts/dest-rules9.yaml b/data/resources/istio_objects/dr_hosts/dest-rules9.yaml index 94010ad7..d40a01e0 100644 --- a/data/resources/istio_objects/dr_hosts/dest-rules9.yaml +++ b/data/resources/istio_objects/dr_hosts/dest-rules9.yaml @@ -1,7 +1,7 @@ apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: - name: auto-reviews-dr-9 + name: auto-mongodb-dr-9 namespace: bookinfo spec: host: "www.google.com" diff --git a/kiali_qe/components/__init__.py b/kiali_qe/components/__init__.py index 980758e1..fe5cf40a 100644 --- a/kiali_qe/components/__init__.py +++ b/kiali_qe/components/__init__.py @@ -2734,6 +2734,9 @@ def overview_action_options(self, namespace): logger=logger).options return None + def overview_action_present(self, namespace, action): + return action in self.overview_action_options(namespace) + def select_action(self, namespace, action): _options = self.overview_action_options(namespace) if action in _options: @@ -3652,11 +3655,7 @@ class LogsView(TabViewAbstract): duration = DropDown(locator=DROP_DOWN.format('metrics_filter_interval_duration')) interval = DropDown(locator=DROP_DOWN.format('metrics-refresh')) refresh = Button(locator='//button[@id="refresh_button"]') - pod_textarea = Text(locator='//textarea/..//div[contains(@class, "pf-l-toolbar__item") ' - 'and not(contains(normalize-space(text()), ' - '"Istio proxy (sidecar)"))]/../../textarea') - proxy_textarea = Text(locator='//div[contains(normalize-space(text()), ' - '"Istio proxy (sidecar)")]/../../textarea') + logs_textarea = Text(locator='//div[@id="logsText"]') def open(self): tab = self.browser.element(locator=self.LOGS_TAB, @@ -3669,8 +3668,8 @@ def open(self): except StaleElementReferenceException: pass wait_to_spinner_disappear(self.browser) - self.logs_switch = ButtonSwitch(parent=self, label="Side by Side") self.log_hide = FilterInput(parent=self, locator='//input[@id="log_hide"]') + self.log_show = FilterInput(parent=self, locator='//input[@id="log_show"]') class MetricsView(TabViewAbstract): diff --git a/kiali_qe/components/enums.py b/kiali_qe/components/enums.py index 73350446..369c6248 100644 --- a/kiali_qe/components/enums.py +++ b/kiali_qe/components/enums.py @@ -94,13 +94,13 @@ class TimeIntervalRestParam(StringEnum): class TailLines(StringEnum): - LINES_10 = ('Last 10 lines') - LINES_50 = ('Last 50 lines') - LINES_100 = ('Last 100 lines') - LINES_300 = ('Last 300 lines') - LINES_500 = ('Last 500 lines') - LINES_1000 = ('Last 1000 lines') - LINES_5000 = ('Last 5000 lines') + LINES_10 = ('10 lines') + LINES_50 = ('50 lines') + LINES_100 = ('100 lines') + LINES_300 = ('300 lines') + LINES_500 = ('500 lines') + LINES_1000 = ('1000 lines') + LINES_5000 = ('5000 lines') LINES_ALL = ('All lines') diff --git a/kiali_qe/tests/__init__.py b/kiali_qe/tests/__init__.py index ccf3e414..1e7045db 100644 --- a/kiali_qe/tests/__init__.py +++ b/kiali_qe/tests/__init__.py @@ -36,7 +36,6 @@ RoutingWizardTLS, RoutingWizardLoadBalancer, TrafficType, - OverviewLinks, OverviewInjectionLinks, OverviewGraphTypeLink, OverviewTrafficLinks, @@ -454,13 +453,10 @@ def assert_logs_tab(self, logs_tab, all_pods=[]): logs_tab.duration.options) assert is_equal([item.text for item in GraphRefreshInterval], logs_tab.interval.options) - logs_tab.logs_switch.on() logs_tab.log_hide.fill(_filter) self.browser.click(logs_tab.refresh) wait_to_spinner_disappear(self.browser) - assert logs_tab.logs_switch.is_on - assert _filter not in logs_tab.pod_textarea.text - assert _filter not in logs_tab.proxy_textarea.text + assert _filter not in logs_tab.logs_textarea.text def assert_traffic(self, name, traffic_tab, self_object_type, traffic_object_type): bound_traffic = traffic_tab.traffic_items() @@ -683,7 +679,8 @@ def assert_all_items(self, filters=[], assert found, '{} not found in REST {}'.format(overview_ui, overviews_rest) self._assert_overview_config_status(overview_ui.namespace, overview_ui.config_status) - assert overview_ui.labels == self.openshift_client.namespace_labels( + assert self.kiali_client.namespace_labels(overview_ui.namespace) == \ + self.openshift_client.namespace_labels( overview_ui.namespace) def _apply_overview_filters(self, overviews=[], filters=[], @@ -744,61 +741,85 @@ def test_disable_enable_delete_auto_injection(self, namespace): self.apply_filters(filters=[{"name": OverviewPageFilter.NAME.text, "value": namespace}], force_clear_all=True) - self.kiali_client.update_namespace_auto_injection(namespace, 'enabled') - self.kiali_client.update_namespace_auto_injection(namespace, 'disabled') - self.page.page_refresh() overviews_ui = self.page.content.list_items - for overview_ui in overviews_ui: - if overview_ui.namespace == namespace: - assert 'istio-injection' in overview_ui.labels and \ - overview_ui.labels['istio-injection'] == 'disabled' - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=False) + assert len(overviews_ui) == 1 - self.kiali_client.update_namespace_auto_injection(namespace, 'enabled') + overview_ui = overviews_ui[0] - self.page.page_refresh() - overviews_ui = self.page.content.list_items + assert overview_ui.namespace == namespace - for overview_ui in overviews_ui: - if overview_ui.namespace == namespace: - assert 'istio-injection' in overview_ui.labels and \ - overview_ui.labels['istio-injection'] == 'enabled' - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=True, - deleted=False) - - self.kiali_client.update_namespace_auto_injection(namespace, None) - - self.page.page_refresh() - overviews_ui = self.page.content.list_items - - for overview_ui in overviews_ui: - if overview_ui.namespace == namespace: - assert 'istio-injection' not in overview_ui.labels - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=True) - - self.kiali_client.update_namespace_auto_injection(namespace, 'enabled') - - self.page.page_refresh() - overviews_ui = self.page.content.list_items - - for overview_ui in overviews_ui: - if overview_ui.namespace == namespace: - assert 'istio-injection' in overview_ui.labels and \ - overview_ui.labels['istio-injection'] == 'enabled' - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=True, - deleted=False) + if self.page.content.overview_action_present(namespace, + OverviewInjectionLinks. + ENABLE_AUTO_INJECTION.text): + self.page.content.select_action( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) + self.page.page_refresh() + overviews_ui = self.page.content.list_items + overview_ui = overviews_ui[0] + assert 'istio-injection' in overview_ui.labels and \ + overview_ui.labels['istio-injection'] == 'enabled', \ + 'istio-injection should be enabled in {}'.format(overview_ui.labels) + assert not self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) + assert self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.DISABLE_AUTO_INJECTION.text) + assert self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.REMOVE_AUTO_INJECTION.text) + elif self.page.content.overview_action_present(namespace, + OverviewInjectionLinks. + DISABLE_AUTO_INJECTION.text): + self.page.content.select_action( + namespace, + OverviewInjectionLinks.DISABLE_AUTO_INJECTION.text) + self.page.page_refresh() + overviews_ui = self.page.content.list_items + overview_ui = overviews_ui[0] + assert 'istio-injection' in overview_ui.labels and \ + overview_ui.labels['istio-injection'] == 'disabled', \ + 'istio-injection should be disabled in {}'.format(overview_ui.labels) + assert self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.DISABLE_AUTO_INJECTION.text) + assert self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.REMOVE_AUTO_INJECTION.text) + self.page.page_refresh() + self.page.content.select_action( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) + elif self.page.content.overview_action_present(namespace, + OverviewInjectionLinks. + REMOVE_AUTO_INJECTION.text): + self.page.content.select_action( + namespace, + OverviewInjectionLinks.REMOVE_AUTO_INJECTION.text) + self.page.page_refresh() + overviews_ui = self.page.content.list_items + overview_ui = overviews_ui[0] + assert 'istio-injection' not in overview_ui.labels, \ + 'istio-injection should not be in {}'.format(overview_ui.labels) + assert self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.DISABLE_AUTO_INJECTION.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewInjectionLinks.REMOVE_AUTO_INJECTION.text) + self.page.page_refresh() + self.page.content.select_action( + namespace, + OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) def test_create_update_delete_traffic_policies(self, namespace): # load the page first @@ -806,92 +827,76 @@ def test_create_update_delete_traffic_policies(self, namespace): self.apply_filters(filters=[{"name": OverviewPageFilter.NAME.text, "value": namespace}], force_clear_all=True) - # first delete the policies if exists - self.kiali_client.update_namespace_auto_injection(namespace, 'enabled') - self.kiali_client.update_namespace_auto_injection(namespace, 'disabled') - self.page.page_refresh() - wait_to_spinner_disappear(self.browser) - if self.page.content.select_action( - namespace, OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text): + if self.page.content.overview_action_present(namespace, + OverviewTrafficLinks. + DELETE_TRAFFIC_POLICIES.text): + self.page.page_refresh() + wait_to_spinner_disappear(self.browser) + if self.page.content.select_action( + namespace, OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text): + wait_to_spinner_disappear(self.browser) + self.browser.wait_for_element( + parent=ListViewAbstract.DIALOG_ROOT, + locator=('.//button[text()="Delete"]')) + self.browser.click(self.browser.element( + parent=ListViewAbstract.DIALOG_ROOT, + locator=('.//button[text()="Delete"]'))) + wait_to_spinner_disappear(self.browser) + self.page.page_refresh() + wait_to_spinner_disappear(self.browser) + self.page.content.list_items + assert not self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) + assert self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) + elif self.page.content.overview_action_present(namespace, + OverviewTrafficLinks. + CREATE_TRAFFIC_POLICIES.text): + assert self.page.content.select_action( + namespace, OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) + wait_to_spinner_disappear(self.browser) + self.page.page_refresh() + wait_to_spinner_disappear(self.browser) + self.page.content.list_items + assert self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text) + assert self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) + elif self.page.content.overview_action_present(namespace, + OverviewTrafficLinks. + UPDATE_TRAFFIC_POLICIES.text): + assert self.page.content.select_action( + namespace, OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) + wait_to_spinner_disappear(self.browser) self.browser.wait_for_element( parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Delete"]')) + locator=('.//button[text()="Update"]')) self.browser.click(self.browser.element( parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Delete"]'))) - wait_to_spinner_disappear(self.browser) - self.page.page_refresh() - wait_to_spinner_disappear(self.browser) - - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=False, - policy_created=False) - - assert self.page.content.select_action( - namespace, OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) - wait_to_spinner_disappear(self.browser) - self.page.page_refresh() - wait_to_spinner_disappear(self.browser) - - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=False, - policy_created=True) - - assert self.page.content.select_action( - namespace, OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) - self.browser.wait_for_element( - parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Update"]')) - self.browser.click(self.browser.element( - parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Update"]'))) - wait_to_spinner_disappear(self.browser) - self.page.page_refresh() - wait_to_spinner_disappear(self.browser) - - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=False, - policy_created=True) - - assert self.page.content.select_action( - namespace, OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text) - self.browser.wait_for_element( - parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Delete"]')) - self.browser.click(self.browser.element( - parent=ListViewAbstract.DIALOG_ROOT, - locator=('.//button[text()="Delete"]'))) - wait_to_spinner_disappear(self.browser) - self.page.page_refresh() - wait_to_spinner_disappear(self.browser) - - self._assert_overview_options( - options=self.page.content.overview_action_options(namespace), - enabled=False, - deleted=False, - policy_created=False) - - def _assert_overview_options(self, options, enabled=True, deleted=False, policy_created=False): - expected_options = [item.text for item in OverviewLinks] - if not enabled: - expected_options.append(OverviewInjectionLinks.ENABLE_AUTO_INJECTION.text) - if enabled: - expected_options.append(OverviewInjectionLinks.DISABLE_AUTO_INJECTION.text) - if not deleted: - expected_options.append(OverviewInjectionLinks.REMOVE_AUTO_INJECTION.text) - if not policy_created: - expected_options.append(OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) - else: - expected_options.append(OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) - expected_options.append(OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text) - assert is_equal(expected_options, options), \ - '{} not equal to {}'.format(expected_options, options) + locator=('.//button[text()="Update"]'))) + wait_to_spinner_disappear(self.browser) + self.page.page_refresh() + wait_to_spinner_disappear(self.browser) + self.page.content.list_items + assert self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.DELETE_TRAFFIC_POLICIES.text) + assert self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.UPDATE_TRAFFIC_POLICIES.text) + assert not self.page.content.overview_action_present( + namespace, + OverviewTrafficLinks.CREATE_TRAFFIC_POLICIES.text) def _assert_overview_config_status(self, namespace, config_status): expected_status = IstioConfigValidation.NA @@ -2234,7 +2239,8 @@ def _is_skip_key(self, key): return 'last-applied-configuration' in key \ or key.startswith('f:') \ or 'managedFields' in key \ - or 'creationTimestamp' in key + or 'creationTimestamp' in key \ + or 'selfLink' in key def test_gateway_create(self, name, hosts, port_name, port_number, namespaces): logger.debug('Creating Gateway: {}, from namespaces: {}'.format(name, namespaces)) diff --git a/kiali_qe/tests/test_istio_objects_crud.py b/kiali_qe/tests/test_istio_objects_crud.py index f2a36fe8..f015af35 100644 --- a/kiali_qe/tests/test_istio_objects_crud.py +++ b/kiali_qe/tests/test_istio_objects_crud.py @@ -295,7 +295,7 @@ def test_virtual_service_broken(kiali_client, openshift_client, browser): api_version='networking.istio.io/v1alpha3', service_name=REVIEWS, error_messages=[KIA1101, KIA1107], - check_service_details=True) + check_service_details=False) finally: _delete_dest_rule_vs(openshift_client, DEST_RULE_VS_REVIEWS) diff --git a/kiali_qe/tests/test_workloads_page.py b/kiali_qe/tests/test_workloads_page.py index 74f0763b..af8fc41c 100644 --- a/kiali_qe/tests/test_workloads_page.py +++ b/kiali_qe/tests/test_workloads_page.py @@ -196,7 +196,7 @@ def test_workload_details_random(kiali_client, openshift_client, browser): @pytest.mark.p_ro_top -@pytest.mark.p_ro_group9 +@pytest.mark.p_ro_group6 def test_workload_auto_injection(kiali_client, openshift_client, browser, pick_namespace): tests = WorkloadsPageTest( kiali_client=kiali_client, openshift_client=openshift_client, browser=browser)