@@ -55,6 +55,11 @@
Git revision ID to test. Could be commit, tag, tree ID etc.
To test local changes, first commit them, then use their commit ID.
+.. option:: -f, --force
+.. envvar:: DTS_FORCE
+
+ Specify to remove an already existing dpdk tarball before copying/extracting a new one.
+
.. option:: --test-suite
.. envvar:: DTS_TEST_SUITES
@@ -110,6 +115,8 @@ class Settings:
#:
dpdk_tarball_path: Path | str = ""
#:
+ force: bool = False
+ #:
compile_timeout: float = 1200
#:
test_suites: list[TestSuiteConfig] = field(default_factory=list)
@@ -337,6 +344,16 @@ def _get_parser() -> _DTSArgumentParser:
)
_add_env_var_to_action(action)
+ action = parser.add_argument(
+ "-f",
+ "--force",
+ action="store_true",
+ default=SETTINGS.force,
+ help="Specify to remove an already existing dpdk tarball before copying/extracting a "
+ "new one.",
+ )
+ _add_env_var_to_action(action)
+
action = parser.add_argument(
"--compile-timeout",
default=SETTINGS.compile_timeout,
@@ -178,7 +178,9 @@ def join_remote_path(self, *args: str | PurePath) -> PurePath:
"""
@abstractmethod
- def copy_from(self, source_file: str | PurePath, destination_dir: str | Path) -> None:
+ def copy_from(
+ self, source_file: str | PurePath, destination_dir: str | Path, force: bool = SETTINGS.force
+ ) -> None:
"""Copy a file from the remote node to the local filesystem.
Copy `source_file` from the remote node associated with this remote
@@ -188,10 +190,14 @@ def copy_from(self, source_file: str | PurePath, destination_dir: str | Path) ->
source_file: The file on the remote node.
destination_dir: A dir path on the local filesystem, where the `source_file`
will be saved.
+ force: If :data:`True`, remove an already existing `source_file` at the
+ `destination_dir` before copying to prevent overwriting data.
"""
@abstractmethod
- def copy_to(self, source_file: str | Path, destination_dir: str | PurePath) -> None:
+ def copy_to(
+ self, source_file: str | Path, destination_dir: str | PurePath, force: bool = SETTINGS.force
+ ) -> None:
"""Copy a file from local filesystem to the remote node.
Copy `source_file` from local filesystem to `destination_dir`
@@ -201,6 +207,8 @@ def copy_to(self, source_file: str | Path, destination_dir: str | PurePath) -> N
source_file: The file on the local filesystem.
destination_dir: A dir path on the remote Node, where the `source_file`
will be saved.
+ force: If :data:`True`, remove an already existing `source_file` at the
+ `destination_dir` before copying to prevent overwriting data.
"""
@abstractmethod
@@ -210,6 +218,7 @@ def copy_dir_from(
destination_dir: str | Path,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Copy a dir from the remote node to the local filesystem.
@@ -222,6 +231,8 @@ def copy_dir_from(
destination_dir: A dir path on the local filesystem.
compress_format: The compression format to use. Default is no compression.
exclude: Files or dirs to exclude before creating the tarball.
+ force: If :data:`True`, remove an already existing `source_dir` at the `destination_dir`
+ before copying to prevent overwriting data.
"""
@abstractmethod
@@ -231,18 +242,21 @@ def copy_dir_to(
destination_dir: str | PurePath,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Copy a dir from the local filesystem to the remote node.
Copy `source_dir` from the local filesystem to `destination_dir` on the remote node
- associated with this remote session. The new remote dir will be created at
- `destination_dir` path.
+ associated with this remote session. The new remote dir will be created
+ at `destination_dir` path.
Args:
source_dir: The dir on the local filesystem.
destination_dir: A dir path on the remote node.
compress_format: The compression format to use. Default is no compression.
exclude: Files or dirs to exclude before creating the tarball.
+ force: If :data:`True`, remove an already existing `source_dir` at the `destination_dir`
+ before copying to prevent overwriting data.
"""
@abstractmethod
@@ -275,6 +289,7 @@ def create_remote_tarball(
remote_dir_path: str | PurePath,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Create a tarball from dir on the remote node.
@@ -284,6 +299,8 @@ def create_remote_tarball(
remote_dir_path: The path of dir on the remote node.
compress_format: The compression format to use. Default is no compression.
exclude: Files or dirs to exclude before creating the tarball.
+ force: If :data:`True`, remove an already existing tarball at the directory of
+ `remote_dir_path` before creating a new one to prevent overwriting data.
"""
@abstractmethod
@@ -291,13 +308,17 @@ def extract_remote_tarball(
self,
remote_tarball_path: str | PurePath,
expected_dir: str | PurePath | None = None,
+ force: bool = SETTINGS.force,
) -> None:
- """Extract remote tarball in its remote directory.
+ """Extract remote tarball in its remote dir.
Args:
remote_tarball_path: The path of the tarball on the remote node.
expected_dir: If non-empty, check whether `expected_dir` exists after extracting
the archive.
+ force: If :data:`True` and `expected_dir` is defined, remove an already
+ existing `expected_dir` at the directory of `remote_dir_path` before
+ extracting to prevent overwriting data.
"""
@abstractmethod
@@ -91,12 +91,22 @@ def join_remote_path(self, *args: str | PurePath) -> PurePosixPath:
"""Overrides :meth:`~.os_session.OSSession.join_remote_path`."""
return PurePosixPath(*args)
- def copy_from(self, source_file: str | PurePath, destination_dir: str | Path) -> None:
+ def copy_from(
+ self, source_file: str | PurePath, destination_dir: str | Path, force: bool = SETTINGS.force
+ ) -> None:
"""Overrides :meth:`~.os_session.OSSession.copy_from`."""
+ if force:
+ Path(destination_dir, PurePath(source_file).name).unlink(missing_ok=True)
+
self.remote_session.copy_from(source_file, destination_dir)
- def copy_to(self, source_file: str | Path, destination_dir: str | PurePath) -> None:
+ def copy_to(
+ self, source_file: str | Path, destination_dir: str | PurePath, force: bool = SETTINGS.force
+ ) -> None:
"""Overrides :meth:`~.os_session.OSSession.copy_to`."""
+ if force:
+ self.remove_remote_file(PurePath(destination_dir, Path(source_file).name))
+
self.remote_session.copy_to(source_file, destination_dir)
def copy_dir_from(
@@ -105,13 +115,14 @@ def copy_dir_from(
destination_dir: str | Path,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Overrides :meth:`~.os_session.OSSession.copy_dir_from`."""
tarball_name = f"{PurePath(source_dir).name}{compress_format.extension}"
remote_tarball_path = self.join_remote_path(PurePath(source_dir).parent, tarball_name)
self.create_remote_tarball(source_dir, compress_format, exclude)
- self.copy_from(remote_tarball_path, destination_dir)
+ self.copy_from(remote_tarball_path, destination_dir, force)
self.remove_remote_file(remote_tarball_path)
tarball_path = Path(destination_dir, tarball_name)
@@ -124,6 +135,7 @@ def copy_dir_to(
destination_dir: str | PurePath,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Overrides :meth:`~.os_session.OSSession.copy_dir_to`."""
source_dir_name = Path(source_dir).name
@@ -131,7 +143,7 @@ def copy_dir_to(
tar_path = Path(Path(source_dir).parent, tar_name)
create_tarball(source_dir, compress_format, arcname=source_dir_name, exclude=exclude)
- self.copy_to(tar_path, destination_dir)
+ self.copy_to(tar_path, destination_dir, force)
tar_path.unlink()
remote_tar_path = self.join_remote_path(destination_dir, tar_name)
@@ -158,6 +170,7 @@ def create_remote_tarball(
remote_dir_path: str | PurePath,
compress_format: TarCompressionFormat = TarCompressionFormat.none,
exclude: str | list[str] | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Overrides :meth:`~.os_session.OSSession.create_remote_tarball`."""
@@ -176,6 +189,9 @@ def generate_tar_exclude_args(exclude_patterns):
return ""
target_tarball_path = f"{remote_dir_path}{compress_format.extension}"
+ if force:
+ self.remove_remote_file(target_tarball_path)
+
self.send_command(
f"tar caf {target_tarball_path}{generate_tar_exclude_args(exclude)} "
f"-C {PurePath(remote_dir_path).parent} {PurePath(remote_dir_path).name}",
@@ -183,13 +199,20 @@ def generate_tar_exclude_args(exclude_patterns):
)
def extract_remote_tarball(
- self, remote_tarball_path: str | PurePath, expected_dir: str | PurePath | None = None
+ self,
+ remote_tarball_path: str | PurePath,
+ expected_dir: str | PurePath | None = None,
+ force: bool = SETTINGS.force,
) -> None:
"""Overrides :meth:`~.os_session.OSSession.extract_remote_tarball`."""
+ if force and expected_dir:
+ self.remove_remote_dir(expected_dir)
+
self.send_command(
f"tar xfm {remote_tarball_path} -C {PurePosixPath(remote_tarball_path).parent}",
60,
)
+
if expected_dir:
self.send_command(f"ls {expected_dir}", verify=True)