diff --git a/docs/conf.py b/docs/conf.py index 2e2b50c..dbe474d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -203,6 +203,13 @@ author, 1, ), + ( + "yamcs_rocksdb", + "yamcs-rocksdb", + "Manage RocksDB storage engine", + author, + 1, + ), ( "yamcs_services", "yamcs-services", diff --git a/docs/index.rst b/docs/index.rst index 0fbf2a0..51b2e39 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,6 +39,7 @@ Run :doc:`yamcs_login` to initialize your environment: yamcs_parameter-archive yamcs_parameters yamcs_processors + yamcs_rocksdb yamcs_services yamcs_space-systems yamcs_storage diff --git a/docs/yamcs.rst b/docs/yamcs.rst index 501f851..abb9933 100644 --- a/docs/yamcs.rst +++ b/docs/yamcs.rst @@ -64,6 +64,8 @@ Commands Manipulate the Parameter Archive. See :manpage:`yamcs-parameter-archive(1)`. :doc:`processors ` Manage processors. See :manpage:`yamcs-processors(1)`. +:doc:`rocksdb ` + Manage RocksDB storage engine. See :manpage:`yamcs-rocksdb(1)`. :doc:`services ` Read and manipulate services. See :manpage:`yamcs-services(1)`. :doc:`space-systems ` diff --git a/docs/yamcs_rocksdb.rst b/docs/yamcs_rocksdb.rst new file mode 100644 index 0000000..9a938da --- /dev/null +++ b/docs/yamcs_rocksdb.rst @@ -0,0 +1,38 @@ +yamcs rocksdb +============= + +.. program:: yamcs rocksdb + +Synopsis +-------- + +.. rst-class:: synopsis + + | **yamcs rocksdb** tablespaces + | **yamcs rocksdb** compact [--dbpath <*DBPATH*>] <*TABLESPACE*> <*CF*> + + +Description +----------- + +Manage RocksDB storage engine. + + +Commands +-------- + +.. describe:: tablespaces + + List processors + +.. describe:: compact [--dbpath ] + + Delete a processor + + +Options +------- + +.. option:: --dbpath + + With ``compact``, specify a path within the tablespace. Leave unspecified for the root database. diff --git a/setup.py b/setup.py index c4c647e..9a4b551 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ "Operating System :: OS Independent", ], platforms="Posix; MacOS X; Windows", - install_requires=["argcomplete", "python-dateutil", "yamcs-client>=1.9.5"], + install_requires=["argcomplete", "python-dateutil", "yamcs-client>=1.9.8"], extras_require={"kerberos": ["yamcs-client-kerberos>=1.2.2"]}, include_package_data=True, zip_safe=False, diff --git a/src/yamcs/cli/__main__.py b/src/yamcs/cli/__main__.py index 563d080..876d640 100644 --- a/src/yamcs/cli/__main__.py +++ b/src/yamcs/cli/__main__.py @@ -24,6 +24,7 @@ from yamcs.cli.parameter_archive import ParameterArchiveCommand from yamcs.cli.parameters import ParametersCommand from yamcs.cli.processors import ProcessorsCommand +from yamcs.cli.rocksdb import RocksDBCommand from yamcs.cli.services import ServicesCommand from yamcs.cli.space_systems import SpaceSystemsCommand from yamcs.cli.storage import StorageCommand @@ -86,6 +87,7 @@ def main(): ParameterArchiveCommand(subparsers) ParametersCommand(subparsers) ProcessorsCommand(subparsers) + RocksDBCommand(subparsers) ServicesCommand(subparsers) SpaceSystemsCommand(subparsers) StorageCommand(subparsers) diff --git a/src/yamcs/cli/rocksdb.py b/src/yamcs/cli/rocksdb.py new file mode 100644 index 0000000..0dc4da5 --- /dev/null +++ b/src/yamcs/cli/rocksdb.py @@ -0,0 +1,65 @@ +import sys +from typing import Any, List + +from yamcs.client import YamcsClient + +from yamcs.cli import utils + + +class RocksDBCommand(utils.Command): + def __init__(self, parent): + super(RocksDBCommand, self).__init__( + parent, "rocksdb", "Manage RocksDB storage engine" + ) + + subparsers = self.parser.add_subparsers(title="Commands", metavar="COMMAND") + subparsers.required = True + + subparser = self.create_subparser(subparsers, "tablespaces", "List tablespaces") + subparser.set_defaults(func=self.tablespaces) + + subparser = self.create_subparser( + subparsers, "compact", "Compact column family" + ) + subparser.set_defaults(func=self.compact) + subparser.add_argument( + "tablespace", + metavar="TABLESPACE", + type=str, + help="RocksDB tablespace", + ) + subparser.add_argument( + "cf", + metavar="CF", + type=str, + help="RocksDB column family", + ) + subparser.add_argument( + "--dbpath", + metavar="PATH", + type=str, + help="Path within the tablespace", + ) + + def tablespaces(self, args): + opts = utils.CommandOptions(args) + client = YamcsClient(**opts.client_kwargs) + + rows: List[List[Any]] = [["NAME", "DATA DIR"]] + for tablespace in client.list_rdb_tablespaces(): + rows.append([tablespace.name, tablespace.data_dir]) + utils.print_table(rows) + + def compact(self, args): + opts = utils.CommandOptions(args) + client = YamcsClient(**opts.client_kwargs) + + sys.stderr.write("Compacting... ") + sys.stderr.flush() + client.compact_rdb_column_family( + tablespace=args.tablespace, + cf=args.cf, + dbpath=args.dbpath or "", + ) + sys.stderr.write("done\n") + sys.stderr.flush()