-
Notifications
You must be signed in to change notification settings - Fork 261
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* CLI interface to the rosbag2_cpp Reindexer `ros2 bag reindex` Distro A, OPSEC #4584 Signed-off-by: Jacob Hassold <[email protected]>
- Loading branch information
Showing
9 changed files
with
181 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# Copyright 2021 DCS Corporation, All Rights Reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
# | ||
# DISTRIBUTION A. Approved for public release; distribution unlimited. | ||
# OPSEC #4584. | ||
# | ||
# Delivered to the U.S. Government with Unlimited Rights, as defined in DFARS | ||
# Part 252.227-7013 or 7014 (Feb 2014). | ||
# | ||
# This notice must appear in all copies of this file and its derivatives. | ||
|
||
import os | ||
|
||
from ros2bag.api import check_path_exists | ||
from ros2bag.api import print_error | ||
from ros2bag.verb import VerbExtension | ||
from rosbag2_py import get_registered_readers, Reindexer, StorageOptions | ||
|
||
|
||
class ReindexVerb(VerbExtension): | ||
"""Reconstruct metadata file for a bag.""" | ||
|
||
def add_arguments(self, parser, cli_name): | ||
storage_choices = get_registered_readers() | ||
default_storage = 'sqlite3' if 'sqlite3' in storage_choices else storage_choices[0] | ||
parser.add_argument( | ||
'bag_directory', type=check_path_exists, help='bag to reindex') | ||
parser.add_argument( | ||
'storage_id', default=default_storage, choices=storage_choices, | ||
help=f"storage identifier to be used, defaults to '{default_storage}'") | ||
|
||
def main(self, *, args): | ||
if not os.path.isdir(args.bag_directory): | ||
return print_error('Must specify a bag directory') | ||
|
||
storage_options = StorageOptions( | ||
uri=args.bag_directory, | ||
storage_id=args.storage_id, | ||
) | ||
|
||
reindexer = Reindexer() | ||
reindexer.reindex(storage_options) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file added
BIN
+88 KB
rosbag2_py/resources/reindex_test_bags/multiple_files/multiple_files_0.db3
Binary file not shown.
Binary file added
BIN
+88 KB
rosbag2_py/resources/reindex_test_bags/multiple_files/multiple_files_1.db3
Binary file not shown.
Binary file added
BIN
+48 KB
rosbag2_py/resources/reindex_test_bags/multiple_files/multiple_files_2.db3
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// Copyright 2021 DCS Corporation, All Rights Reserved. | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
// | ||
// DISTRIBUTION A. Approved for public release; distribution unlimited. | ||
// OPSEC #4584. | ||
// | ||
// Delivered to the U.S. Government with Unlimited Rights, as defined in DFARS | ||
// Part 252.227-7013 or 7014 (Feb 2014). | ||
// | ||
// This notice must appear in all copies of this file and its derivatives. | ||
|
||
#include <memory> | ||
#include <string> | ||
#include <vector> | ||
|
||
#include "rosbag2_cpp/reindexer.hpp" | ||
#include "rosbag2_storage/storage_options.hpp" | ||
|
||
#include "./pybind11.hpp" | ||
|
||
namespace rosbag2_py | ||
{ | ||
|
||
class Reindexer | ||
{ | ||
public: | ||
Reindexer() | ||
: reindexer_(std::make_unique<rosbag2_cpp::Reindexer>()) | ||
{ | ||
} | ||
|
||
void reindex(const rosbag2_storage::StorageOptions & storage_options) | ||
{ | ||
reindexer_->reindex(storage_options); | ||
} | ||
|
||
protected: | ||
std::unique_ptr<rosbag2_cpp::Reindexer> reindexer_; | ||
}; | ||
} // namespace rosbag2_py | ||
|
||
PYBIND11_MODULE(_reindexer, m) { | ||
m.doc() = "Python wrapper of the rosbag2_cpp reindexer API"; | ||
|
||
pybind11::class_<rosbag2_py::Reindexer>( | ||
m, "Reindexer") | ||
.def(pybind11::init()) | ||
.def("reindex", &rosbag2_py::Reindexer::reindex); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# Copyright 2021 DCS Corporation, All Rights Reserved. | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
# | ||
# DISTRIBUTION A. Approved for public release; distribution unlimited. | ||
# OPSEC #4584. | ||
# | ||
# Delivered to the U.S. Government with Unlimited Rights, as defined in DFARS | ||
# Part 252.227-7013 or 7014 (Feb 2014). | ||
# | ||
# This notice must appear in all copies of this file and its derivatives. | ||
|
||
import os | ||
from pathlib import Path | ||
import sys | ||
|
||
if os.environ.get('ROSBAG2_PY_TEST_WITH_RTLD_GLOBAL', None) is not None: | ||
# This is needed on Linux when compiling with clang/libc++. | ||
# TL;DR This makes class_loader work when using a python extension compiled with libc++. | ||
# | ||
# For the fun RTTI ABI details, see https://whatofhow.wordpress.com/2015/03/17/odr-rtti-dso/. | ||
sys.setdlopenflags(os.RTLD_GLOBAL | os.RTLD_LAZY) | ||
|
||
from common import get_rosbag_options # noqa | ||
import rosbag2_py # noqa | ||
|
||
|
||
def test_reindexer_multiple_files(): | ||
bag_path = Path(__file__).parent.parent / 'resources' / 'reindex_test_bags' / 'multiple_files' | ||
result_path = bag_path / 'metadata.yaml' | ||
|
||
storage_options, converter_options = get_rosbag_options(str(bag_path)) | ||
reindexer = rosbag2_py.Reindexer() | ||
reindexer.reindex(storage_options) | ||
|
||
assert(result_path.exists()) | ||
|
||
result_path.unlink(missing_ok=True) |