CMAKE_DEPENDENT_OPTION(WITH_BLUESTORE_PMEM "Enable PMDK libraries" OFF
"WITH_BLUESTORE" OFF)
+CMAKE_DEPENDENT_OPTION(WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+ "Enable librbd QCOW v1 migration format support" ON
+ "WITH_RBD" OFF)
+
CMAKE_DEPENDENT_OPTION(WITH_RBD_RWL "Enable librbd persistent write back cache" OFF
"WITH_RBD" OFF)
EOF
cat ${TEMPDIR}/spec.json
+ set +e
rbd migration prepare --import-only \
--source-spec-path ${TEMPDIR}/spec.json ${dest_image}
+ local error_code=$?
+ set -e
+
+ if [ $error_code -eq 95 ]; then
+ echo "skipping QCOW test (librbd support disabled)"
+ return 0
+ fi
+ test $error_code -eq 0
compare_images "${base_image}" "${dest_image}"
/* Define if unit tests are built. */
#cmakedefine UNIT_TESTS_BUILT
+/* Define if RBD QCOW migration format is enabled */
+#cmakedefine WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
/* Define if RWL is enabled */
#cmakedefine WITH_RBD_RWL
m_bl.clear();
if (header_probe.version == 1) {
+#ifdef WITH_RBD_MIGRATION_FORMAT_QCOW_V1
read_v1_header(on_finish);
+#else // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+ lderr(cct) << "QCOW is not supported" << dendl;
+ on_finish->complete(-ENOTSUP);
+#endif // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
return;
} else if (header_probe.version >= 2 && header_probe.version <= 3) {
read_v2_header(on_finish);
}
}
+#ifdef WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
template <typename I>
void QCOWFormat<I>::read_v1_header(Context* on_finish) {
auto cct = m_image_ctx->cct;
read_l1_table(on_finish);
}
+#endif // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
template <typename I>
void QCOWFormat<I>::read_v2_header(Context* on_finish) {
auto cct = m_image_ctx->cct;
#include "librbd/Types.h"
#include "librbd/migration/FormatInterface.h"
#include "librbd/migration/QCOW.h"
+#include "acconfig.h"
#include "json_spirit/json_spirit.h"
#include <boost/asio/io_context_strand.hpp>
#include <boost/iostreams/filter/zlib.hpp>
void probe(Context* on_finish);
void handle_probe(int r, Context* on_finish);
+#ifdef WITH_RBD_MIGRATION_FORMAT_QCOW_V1
void read_v1_header(Context* on_finish);
void handle_read_v1_header(int r, Context* on_finish);
+#endif // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
void read_v2_header(Context* on_finish);
void handle_read_v2_header(int r, Context* on_finish);
#include "common/ceph_mutex.h"
#include "librbd/migration/QCOWFormat.h"
#include "librbd/migration/SourceSpecBuilder.h"
+#include "acconfig.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "json_spirit/json_spirit.h"
expect_stream_open(*mock_stream_interface, 0);
+ int expected_open_ret_val = 0;
QCowHeaderV1 qcow_header;
memset(&qcow_header, 0, sizeof(qcow_header));
qcow_header.magic = htobe32(QCOW_MAGIC);
probe_bl.append(std::string_view(reinterpret_cast<char*>(&qcow_header), 8));
expect_stream_read(*mock_stream_interface, {{0, 8}}, probe_bl, 0);
+#ifdef WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
bufferlist header_bl;
header_bl.append(std::string_view(reinterpret_cast<char*>(&qcow_header),
sizeof(qcow_header)));
l1_table_bl.append_zero(16);
expect_stream_read(*mock_stream_interface, {{1<<20, 16}}, l1_table_bl, 0);
+#else // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
+ expected_open_ret_val = -ENOTSUP;
+
+#endif // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
expect_stream_close(*mock_stream_interface, 0);
MockQCOWFormat mock_qcow_format(&mock_image_ctx, json_object,
C_SaferCond ctx1;
mock_qcow_format.open(&ctx1);
- ASSERT_EQ(0, ctx1.wait());
+ ASSERT_EQ(expected_open_ret_val, ctx1.wait());
C_SaferCond ctx2;
mock_qcow_format.close(&ctx2);
ASSERT_EQ(0, ctx2.wait());
}
+#ifdef WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
TEST_F(TestMockMigrationQCOWFormat, ReadHeaderV1Error) {
MockTestImageCtx mock_image_ctx(*m_image_ctx);
ASSERT_EQ(0, ctx2.wait());
}
+#endif // WITH_RBD_MIGRATION_FORMAT_QCOW_V1
+
TEST_F(TestMockMigrationQCOWFormat, ReadHeaderV2Error) {
MockTestImageCtx mock_image_ctx(*m_image_ctx);