Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pass storage namespace to all odf-cli commands that we run in automation #10446

Open
DanielOsypenko opened this issue Sep 9, 2024 · 2 comments

Comments

@DanielOsypenko
Copy link
Contributor

DanielOsypenko commented Sep 9, 2024

test test_pvc_stale_volume_cleanup_cli fails, and all other tests will fail on managed platforms.
openshift-storage namespace is not allowed on ROSA clusters because of "openshift" prefix in name

2024-09-06T11:19:23.149Z] 07:19:22 - MainThread - ocs_ci.framework.pytest_customization.reports - �[32mINFO�[0m  - duration reported by tests/functional/odf-cli/test_pvc_stale_volume_cleanup_cli.py::TestSubvolumesCommand::test_pvc_stale_volume_cleanup_cli immediately after test execution: 9.88
[2024-09-06T11:19:23.403Z] �[31mFAILED�[0m
[2024-09-06T11:19:23.403Z] ___________ TestSubvolumesCommand.test_pvc_stale_volume_cleanup_cli ____________
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z] self = <test_pvc_stale_volume_cleanup_cli.TestSubvolumesCommand object at 0x7f612d213910>
[2024-09-06T11:19:23.403Z] storageclass_factory = <function storageclass_factory_fixture.<locals>.factory at 0x7f60fb147c10>
[2024-09-06T11:19:23.403Z] pvc_factory = <function pvc_factory_fixture.<locals>.factory at 0x7f60fb147dc0>
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z]     @skipif_ocs_version("<4.15")
[2024-09-06T11:19:23.403Z]     @pytest.mark.polarion_id("OCS-5794")
[2024-09-06T11:19:23.403Z]     def test_pvc_stale_volume_cleanup_cli(self, storageclass_factory, pvc_factory):
[2024-09-06T11:19:23.403Z]         """
[2024-09-06T11:19:23.403Z]         1. Create a new PVC with Retain strategy.
[2024-09-06T11:19:23.403Z]         2. Delete the PVC
[2024-09-06T11:19:23.403Z]         3. Check for stale volumes
[2024-09-06T11:19:23.403Z]         4. Run the odf cli.
[2024-09-06T11:19:23.403Z]         5. Check for stale volumes
[2024-09-06T11:19:23.403Z]         6. No stale volumes should be present of the deleted PVC.
[2024-09-06T11:19:23.403Z]         """
[2024-09-06T11:19:23.403Z]         from pathlib import Path
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         if not Path(constants.CLI_TOOL_LOCAL_PATH).exists():
[2024-09-06T11:19:23.403Z]             retrieve_cli_binary(cli_type="odf")
[2024-09-06T11:19:23.403Z] >       output = run_cmd(cmd="odf-cli subvolume ls")
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z] �[1m�[31mtests/functional/odf-cli/test_pvc_stale_volume_cleanup_cli.py�[0m:37: 
[2024-09-06T11:19:23.403Z] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[2024-09-06T11:19:23.403Z] �[1m�[31mocs_ci/utility/utils.py�[0m:486: in run_cmd
[2024-09-06T11:19:23.403Z]     completed_process = exec_cmd(
[2024-09-06T11:19:23.403Z] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z] cmd = ['odf-cli', 'subvolume', 'ls'], secrets = None, timeout = 600
[2024-09-06T11:19:23.403Z] ignore_error = False, threading_lock = None, silent = False, use_shell = False
[2024-09-06T11:19:23.403Z] cluster_config = None, kwargs = {}, masked_cmd = 'odf-cli subvolume ls'
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z]     def exec_cmd(
[2024-09-06T11:19:23.403Z]         cmd,
[2024-09-06T11:19:23.403Z]         secrets=None,
[2024-09-06T11:19:23.403Z]         timeout=600,
[2024-09-06T11:19:23.403Z]         ignore_error=False,
[2024-09-06T11:19:23.403Z]         threading_lock=None,
[2024-09-06T11:19:23.403Z]         silent=False,
[2024-09-06T11:19:23.403Z]         use_shell=False,
[2024-09-06T11:19:23.403Z]         cluster_config=None,
[2024-09-06T11:19:23.403Z]         **kwargs,
[2024-09-06T11:19:23.403Z]     ):
[2024-09-06T11:19:23.403Z]         """
[2024-09-06T11:19:23.403Z]         Run an arbitrary command locally
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         If the command is grep and matching pattern is not found, then this function
[2024-09-06T11:19:23.403Z]         returns "command terminated with exit code 1" in stderr.
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         Args:
[2024-09-06T11:19:23.403Z]             cmd (str): command to run
[2024-09-06T11:19:23.403Z]             secrets (list): A list of secrets to be masked with asterisks
[2024-09-06T11:19:23.403Z]                 This kwarg is popped in order to not interfere with
[2024-09-06T11:19:23.403Z]                 subprocess.run(``**kwargs``)
[2024-09-06T11:19:23.403Z]             timeout (int): Timeout for the command, defaults to 600 seconds.
[2024-09-06T11:19:23.403Z]             ignore_error (bool): True if ignore non zero return code and do not
[2024-09-06T11:19:23.403Z]                 raise the exception.
[2024-09-06T11:19:23.403Z]             threading_lock (threading.RLock): threading.RLock object that is used
[2024-09-06T11:19:23.403Z]                 for handling concurrent oc commands
[2024-09-06T11:19:23.403Z]             silent (bool): If True will silent errors from the server, default false
[2024-09-06T11:19:23.403Z]             use_shell (bool): If True will pass the cmd without splitting
[2024-09-06T11:19:23.403Z]             cluster_config (MultiClusterConfig): In case of multicluster environment this object
[2024-09-06T11:19:23.403Z]                     will be non-null
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         Raises:
[2024-09-06T11:19:23.403Z]             CommandFailed: In case the command execution fails
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         Returns:
[2024-09-06T11:19:23.403Z]             (CompletedProcess) A CompletedProcess object of the command that was executed
[2024-09-06T11:19:23.403Z]             CompletedProcess attributes:
[2024-09-06T11:19:23.403Z]             args: The list or str args passed to run().
[2024-09-06T11:19:23.403Z]             returncode (str): The exit code of the process, negative for signals.
[2024-09-06T11:19:23.403Z]             stdout     (str): The standard output (None if not captured).
[2024-09-06T11:19:23.403Z]             stderr     (str): The standard error (None if not captured).
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         """
[2024-09-06T11:19:23.403Z]         masked_cmd = mask_secrets(cmd, secrets)
[2024-09-06T11:19:23.403Z]         log.info(f"Executing command: {masked_cmd}")
[2024-09-06T11:19:23.403Z]         if isinstance(cmd, str) and not kwargs.get("shell"):
[2024-09-06T11:19:23.403Z]             cmd = shlex.split(cmd)
[2024-09-06T11:19:23.403Z]         if config.RUN.get("custom_kubeconfig_location") and cmd[0] == "oc":
[2024-09-06T11:19:23.403Z]             if "--kubeconfig" in cmd:
[2024-09-06T11:19:23.403Z]                 cmd.pop(2)
[2024-09-06T11:19:23.403Z]                 cmd.pop(1)
[2024-09-06T11:19:23.403Z]             cmd = list_insert_at_position(cmd, 1, ["--kubeconfig"])
[2024-09-06T11:19:23.403Z]             cmd = list_insert_at_position(
[2024-09-06T11:19:23.403Z]                 cmd, 2, [config.RUN["custom_kubeconfig_location"]]
[2024-09-06T11:19:23.403Z]             )
[2024-09-06T11:19:23.403Z]         if cluster_config and cmd[0] == "oc" and "--kubeconfig" not in cmd:
[2024-09-06T11:19:23.403Z]             kubepath = cluster_config.RUN["kubeconfig"]
[2024-09-06T11:19:23.403Z]             kube_index = 1
[2024-09-06T11:19:23.403Z]             # check if we have an oc plugin in the command
[2024-09-06T11:19:23.403Z]             plugin_list = "oc plugin list"
[2024-09-06T11:19:23.403Z]             cp = subprocess.run(
[2024-09-06T11:19:23.403Z]                 shlex.split(plugin_list),
[2024-09-06T11:19:23.403Z]                 stdout=subprocess.PIPE,
[2024-09-06T11:19:23.403Z]                 stderr=subprocess.PIPE,
[2024-09-06T11:19:23.403Z]             )
[2024-09-06T11:19:23.403Z]             subcmd = cmd[1].split("-")
[2024-09-06T11:19:23.403Z]             if len(subcmd) > 1:
[2024-09-06T11:19:23.403Z]                 subcmd = "_".join(subcmd)
[2024-09-06T11:19:23.403Z]             if not isinstance(subcmd, str) and isinstance(subcmd, list):
[2024-09-06T11:19:23.403Z]                 subcmd = str(subcmd[0])
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]             for l in cp.stdout.decode().splitlines():
[2024-09-06T11:19:23.403Z]                 if subcmd in l:
[2024-09-06T11:19:23.403Z]                     # If oc cmdline has plugin name then we need to push the
[2024-09-06T11:19:23.403Z]                     # --kubeconfig to next index
[2024-09-06T11:19:23.403Z]                     kube_index = 2
[2024-09-06T11:19:23.403Z]                     log.info(f"Found oc plugin {subcmd}")
[2024-09-06T11:19:23.403Z]             cmd = list_insert_at_position(cmd, kube_index, ["--kubeconfig"])
[2024-09-06T11:19:23.403Z]             cmd = list_insert_at_position(cmd, kube_index + 1, [kubepath])
[2024-09-06T11:19:23.403Z]         if threading_lock and cmd[0] == "oc":
[2024-09-06T11:19:23.403Z]             threading_lock.acquire()
[2024-09-06T11:19:23.403Z]         completed_process = subprocess.run(
[2024-09-06T11:19:23.403Z]             cmd,
[2024-09-06T11:19:23.403Z]             stdout=subprocess.PIPE,
[2024-09-06T11:19:23.403Z]             stderr=subprocess.PIPE,
[2024-09-06T11:19:23.403Z]             stdin=subprocess.PIPE,
[2024-09-06T11:19:23.403Z]             timeout=timeout,
[2024-09-06T11:19:23.403Z]             **kwargs,
[2024-09-06T11:19:23.403Z]         )
[2024-09-06T11:19:23.403Z]         if threading_lock and cmd[0] == "oc":
[2024-09-06T11:19:23.403Z]             threading_lock.release()
[2024-09-06T11:19:23.403Z]         masked_stdout = mask_secrets(completed_process.stdout.decode(), secrets)
[2024-09-06T11:19:23.403Z]         if len(completed_process.stdout) > 0:
[2024-09-06T11:19:23.403Z]             log.debug(f"Command stdout: {masked_stdout}")
[2024-09-06T11:19:23.403Z]         else:
[2024-09-06T11:19:23.403Z]             log.debug("Command stdout is empty")
[2024-09-06T11:19:23.403Z]     
[2024-09-06T11:19:23.403Z]         masked_stderr = mask_secrets(completed_process.stderr.decode(), secrets)
[2024-09-06T11:19:23.403Z]         if len(completed_process.stderr) > 0:
[2024-09-06T11:19:23.403Z]             if not silent:
[2024-09-06T11:19:23.403Z]                 log.warning(f"Command stderr: {masked_stderr}")
[2024-09-06T11:19:23.403Z]         else:
[2024-09-06T11:19:23.403Z]             log.debug("Command stderr is empty")
[2024-09-06T11:19:23.403Z]         log.debug(f"Command return code: {completed_process.returncode}")
[2024-09-06T11:19:23.403Z]         if completed_process.returncode and not ignore_error:
[2024-09-06T11:19:23.403Z]             masked_stderr = bin_xml_escape(filter_out_emojis(masked_stderr))
[2024-09-06T11:19:23.403Z]             if (
[2024-09-06T11:19:23.403Z]                 "grep" in masked_cmd
[2024-09-06T11:19:23.403Z]                 and b"command terminated with exit code 1" in completed_process.stderr
[2024-09-06T11:19:23.403Z]             ):
[2024-09-06T11:19:23.403Z]                 log.info(f"No results found for grep command: {masked_cmd}")
[2024-09-06T11:19:23.403Z]             else:
[2024-09-06T11:19:23.403Z] >               raise CommandFailed(
[2024-09-06T11:19:23.403Z]                     f"Error during execution of command: {masked_cmd}."
[2024-09-06T11:19:23.403Z]                     f"\nError is {masked_stderr}"
[2024-09-06T11:19:23.403Z]                 )
[2024-09-06T11:19:23.403Z] �[1m�[31mE               ocs_ci.ocs.exceptions.CommandFailed: Error during execution of command: odf-cli subvolume ls.�[0m
[2024-09-06T11:19:23.403Z] �[1m�[31mE               Error is Error: Operator namespace 'openshift-storage' does not exist. namespaces "openshift-storage" not found�[0m
[2024-09-06T11:19:23.403Z] 
[2024-09-06T11:19:23.403Z] �[1m�[31mocs_ci/utility/utils.py�[0m:704: CommandFailed

this issue opened following slack conversation https://ibm-systems-storage.slack.com/archives/C06EEKSUPPZ/p1725885411893119

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants