ENCODE_START(1, 1, bl);
encode(header_type, bl);
encode(pool_id, bl);
+ encode(pool_namespace, bl);
encode(image_name, bl);
encode(image_id, bl);
encode(snap_seqs, bl);
DECODE_START(1, bl);
decode(header_type, bl);
decode(pool_id, bl);
+ decode(pool_namespace, bl);
decode(image_name, bl);
decode(image_id, bl);
decode(snap_seqs, bl);
void MigrationSpec::dump(Formatter *f) const {
f->dump_stream("header_type") << header_type;
f->dump_int("pool_id", pool_id);
+ f->dump_string("pool_namespace", pool_namespace);
f->dump_string("image_name", image_name);
f->dump_string("image_id", image_id);
f->dump_stream("snap_seqs") << snap_seqs;
void MigrationSpec::generate_test_instances(std::list<MigrationSpec*> &o) {
o.push_back(new MigrationSpec());
- o.push_back(new MigrationSpec(MIGRATION_HEADER_TYPE_SRC, 1, "image_name",
- "image_id", {{1, 2}}, 123, true, true,
- MIGRATION_STATE_PREPARED, "description"));
+ o.push_back(new MigrationSpec(MIGRATION_HEADER_TYPE_SRC, 1, "ns",
+ "image_name", "image_id", {{1, 2}}, 123, true,
+ true, MIGRATION_STATE_PREPARED, "description"));
}
std::ostream& operator<<(std::ostream& os,
os << "["
<< "header_type=" << migration_spec.header_type << ", "
<< "pool_id=" << migration_spec.pool_id << ", "
+ << "pool_namespace=" << migration_spec.pool_namespace << ", "
<< "image_name=" << migration_spec.image_name << ", "
<< "image_id=" << migration_spec.image_id << ", "
<< "snap_seqs=" << migration_spec.snap_seqs << ", "
struct MigrationSpec {
MigrationHeaderType header_type = MIGRATION_HEADER_TYPE_SRC;
int64_t pool_id = -1;
+ std::string pool_namespace;
std::string image_name;
std::string image_id;
std::map<uint64_t, uint64_t> snap_seqs;
MigrationSpec() {
}
MigrationSpec(MigrationHeaderType header_type, int64_t pool_id,
+ const std::string& pool_namespace,
const std::string &image_name, const std::string &image_id,
const std::map<uint64_t, uint64_t> &snap_seqs, uint64_t overlap,
bool mirroring, bool flatten, MigrationState state,
const std::string &state_description)
- : header_type(header_type), pool_id(pool_id), image_name(image_name),
+ : header_type(header_type), pool_id(pool_id),
+ pool_namespace(pool_namespace), image_name(image_name),
image_id(image_id), snap_seqs(snap_seqs), overlap(overlap),
flatten(flatten), mirroring(mirroring), state(state),
state_description(state_description) {
inline bool operator==(const MigrationSpec& ms) const {
return header_type == ms.header_type && pool_id == ms.pool_id &&
- image_name == ms.image_name && image_id == ms.image_id &&
- snap_seqs == ms.snap_seqs && overlap == ms.overlap &&
- flatten == ms.flatten && mirroring == ms.mirroring && state == ms.state &&
+ pool_namespace == ms.pool_namespace && image_name == ms.image_name &&
+ image_id == ms.image_id && snap_seqs == ms.snap_seqs &&
+ overlap == ms.overlap && flatten == ms.flatten &&
+ mirroring == ms.mirroring && state == ms.state &&
state_description == ms.state_description;
}
};
typedef struct {
int64_t source_pool_id;
+ char *source_pool_namespace;
char *source_image_name;
char *source_image_id;
int64_t dest_pool_id;
+ char *dest_pool_namespace;
char *dest_image_name;
char *dest_image_id;
rbd_image_migration_state_t state;
typedef struct {
int64_t source_pool_id;
+ std::string source_pool_namespace;
std::string source_image_name;
std::string source_image_id;
int64_t dest_pool_id;
+ std::string dest_pool_namespace;
std::string dest_image_name;
std::string dest_image_id;
image_migration_state_t state;
struct MigrationInfo {
int64_t pool_id = -1;
+ std::string pool_namespace;
std::string image_name;
std::string image_id;
deep_copy::SnapMap snap_map;
MigrationInfo() {
}
- MigrationInfo(int64_t pool_id, std::string image_name, std::string image_id,
+ MigrationInfo(int64_t pool_id, const std::string& pool_namespace,
+ const std::string& image_name, const std::string& image_id,
const deep_copy::SnapMap &snap_map, uint64_t overlap,
bool flatten)
- : pool_id(pool_id), image_name(image_name), image_id(image_id),
- snap_map(snap_map), overlap(overlap), flatten(flatten) {
+ : pool_id(pool_id), pool_namespace(pool_namespace), image_name(image_name),
+ image_id(image_id), snap_map(snap_map), overlap(overlap),
+ flatten(flatten) {
}
bool empty() const {
return r;
}
- // TODO support namespaces
- if (io_ctx.get_id() == migration_spec.pool_id) {
- src_io_ctx.dup(io_ctx);
- } else {
- r = util::create_ioctx(io_ctx, "source image", migration_spec.pool_id,
- {}, &src_io_ctx);
- if (r < 0) {
- return r;
- }
+ r = util::create_ioctx(io_ctx, "source image", migration_spec.pool_id,
+ migration_spec.pool_namespace, &src_io_ctx);
+ if (r < 0) {
+ return r;
}
src_image_name = migration_spec.image_name;
ldout(cct, 20) << "migration spec: " << migration_spec << dendl;
}
- // TODO support namespaces
- if (image_ctx->md_ctx.get_id() == migration_spec.pool_id) {
- dst_io_ctx->dup(io_ctx);
- } else {
- r = util::create_ioctx(image_ctx->md_ctx, "source image",
- migration_spec.pool_id, {}, dst_io_ctx);
- if (r < 0) {
- return r;
- }
+ r = util::create_ioctx(image_ctx->md_ctx, "source image",
+ migration_spec.pool_id, migration_spec.pool_namespace,
+ dst_io_ctx);
+ if (r < 0) {
+ return r;
}
*src_image_ctx = image_ctx;
m_dst_header_oid(util::header_name(m_dst_image_id)), m_image_options(opts),
m_flatten(flatten), m_mirroring(mirroring), m_prog_ctx(prog_ctx),
m_src_migration_spec(cls::rbd::MIGRATION_HEADER_TYPE_SRC,
- m_dst_io_ctx.get_id(), m_dst_image_name,
- m_dst_image_id, {}, 0, flatten, mirroring, state,
- state_description),
+ m_dst_io_ctx.get_id(), m_dst_io_ctx.get_namespace(),
+ m_dst_image_name, m_dst_image_id, {}, 0, flatten,
+ mirroring, state, state_description),
m_dst_migration_spec(cls::rbd::MIGRATION_HEADER_TYPE_DST,
- src_image_ctx->md_ctx.get_id(), m_src_image_ctx->name,
- m_src_image_ctx->id, {}, 0, flatten, mirroring, state,
- state_description) {
+ src_image_ctx->md_ctx.get_id(),
+ src_image_ctx->md_ctx.get_namespace(),
+ m_src_image_ctx->name, m_src_image_ctx->id, {}, 0,
+ flatten, mirroring, state, state_description) {
m_src_io_ctx.dup(src_image_ctx->md_ctx);
}
ldout(m_cct, 10) << dendl;
status->source_pool_id = m_dst_migration_spec.pool_id;
+ status->source_pool_namespace = m_dst_migration_spec.pool_namespace;
status->source_image_name = m_dst_migration_spec.image_name;
status->source_image_id = m_dst_migration_spec.image_id;
status->dest_pool_id = m_src_migration_spec.pool_id;
+ status->dest_pool_namespace = m_src_migration_spec.pool_namespace;
status->dest_image_name = m_src_migration_spec.image_name;
status->dest_image_id = m_src_migration_spec.image_id;
}
m_dst_migration_spec = {cls::rbd::MIGRATION_HEADER_TYPE_DST,
- m_src_io_ctx.get_id(), m_src_image_name,
- m_src_image_id, snap_seqs, size, m_flatten,
- m_mirroring, cls::rbd::MIGRATION_STATE_PREPARING, ""};
+ m_src_io_ctx.get_id(), m_src_io_ctx.get_namespace(),
+ m_src_image_name, m_src_image_id, snap_seqs, size,
+ m_flatten, m_mirroring,
+ cls::rbd::MIGRATION_STATE_PREPARING, ""};
r = cls_client::migration_set(&m_dst_io_ctx, m_dst_header_oid,
m_dst_migration_spec);
}
parent_md->spec.pool_id = m_migration_spec.pool_id;
+ parent_md->spec.pool_namespace = m_migration_spec.pool_namespace;
parent_md->spec.image_id = m_migration_spec.image_id;
parent_md->spec.snap_id = CEPH_NOSNAP;
parent_md->overlap = std::min(m_size, m_migration_spec.overlap);
}
}
- *migration_info = {m_migration_spec.pool_id, m_migration_spec.image_name,
- m_migration_spec.image_id, {}, overlap,
- m_migration_spec.flatten};
+ *migration_info = {m_migration_spec.pool_id, m_migration_spec.pool_namespace,
+ m_migration_spec.image_name, m_migration_spec.image_id, {},
+ overlap, m_migration_spec.flatten};
deep_copy::util::compute_snap_map(0, CEPH_NOSNAP, snap_seqs,
&migration_info->snap_map);
int r = librbd::api::Migration<>::status(io_ctx, image_name, &cpp_status);
if (r >= 0) {
status->source_pool_id = cpp_status.source_pool_id;
+ status->source_pool_namespace =
+ strdup(cpp_status.source_pool_namespace.c_str());
status->source_image_name = strdup(cpp_status.source_image_name.c_str());
status->source_image_id = strdup(cpp_status.source_image_id.c_str());
status->dest_pool_id = cpp_status.dest_pool_id;
+ status->dest_pool_namespace =
+ strdup(cpp_status.dest_pool_namespace.c_str());
status->dest_image_name = strdup(cpp_status.dest_image_name.c_str());
status->dest_image_id = strdup(cpp_status.dest_image_id.c_str());
status->state = cpp_status.state;
extern "C" void rbd_migration_status_cleanup(rbd_image_migration_status_t *s)
{
+ free(s->source_pool_namespace);
free(s->source_image_name);
free(s->source_image_id);
+ free(s->dest_pool_namespace);
free(s->dest_image_name);
free(s->dest_image_id);
free(s->state_description);
ctypedef struct rbd_image_migration_status_t:
int64_t source_pool_id
+ char *source_pool_namespace
char *source_image_name
char *source_image_id
int64_t dest_pool_id
+ char *dest_pool_namespace
char *dest_image_name
char *dest_image_id
rbd_image_migration_state_t state
* ``source_pool_id`` (int) - source image pool id
+ * ``source_pool_namespace`` (str) - source image pool namespace
+
* ``source_image_name`` (str) - source image name
* ``source_image_id`` (str) - source image id
* ``dest_pool_id`` (int) - destination image pool id
+ * ``dest_pool_namespace`` (str) - destination image pool namespace
+
* ``dest_image_name`` (str) - destination image name
* ``dest_image_id`` (str) - destination image id
raise make_ex(ret, 'error getting migration status')
status = {
- 'source_pool_id' : c_status.source_pool_id,
- 'source_image_name' : decode_cstr(c_status.source_image_name),
- 'source_image_id' : decode_cstr(c_status.source_image_id),
- 'dest_pool_id' : c_status.source_pool_id,
- 'dest_image_name' : decode_cstr(c_status.dest_image_name),
- 'dest_image_id' : decode_cstr(c_status.dest_image_id),
- 'state' : c_status.state,
- 'state_description' : decode_cstr(c_status.state_description)
+ 'source_pool_id' : c_status.source_pool_id,
+ 'source_pool_namespace' : decode_cstr(c_status.source_pool_namespace),
+ 'source_image_name' : decode_cstr(c_status.source_image_name),
+ 'source_image_id' : decode_cstr(c_status.source_image_id),
+ 'dest_pool_id' : c_status.source_pool_id,
+ 'dest_pool_namespace' : decode_cstr(c_status.dest_pool_namespace),
+ 'dest_image_name' : decode_cstr(c_status.dest_image_name),
+ 'dest_image_id' : decode_cstr(c_status.dest_image_id),
+ 'state' : c_status.state,
+ 'state_description' : decode_cstr(c_status.state_description)
}
rbd_migration_status_cleanup(&c_status)
ASSERT_EQ(0, create_image(&ioctx, oid, 0, 22, 0, oid, -1));
cls::rbd::MigrationSpec migration_spec(cls::rbd::MIGRATION_HEADER_TYPE_DST, 1,
- "name", "id", {}, 0, false, false,
+ "name", "ns", "id", {}, 0, false,
+ false,
cls::rbd::MIGRATION_STATE_PREPARING,
"123");
cls::rbd::MigrationSpec read_migration_spec;
ASSERT_EQ(0, ioctx.write(oid, header, header.length(), 0));
cls::rbd::MigrationSpec migration_spec(cls::rbd::MIGRATION_HEADER_TYPE_DST, 1,
- "name", "id", {}, 0, false, false,
+ "name", "ns", "id", {}, 0, false,
+ false,
cls::rbd::MIGRATION_STATE_PREPARING,
"123");
cls::rbd::MigrationSpec read_migration_spec;
EXPECT_EQ(0, librbd::api::Migration<>::status(m_ioctx, m_image_name,
&status));
EXPECT_EQ(status.source_pool_id, m_ioctx.get_id());
+ EXPECT_EQ(status.source_pool_namespace, m_ioctx.get_namespace());
EXPECT_EQ(status.source_image_name, m_image_name);
EXPECT_EQ(status.source_image_id, m_image_id);
EXPECT_EQ(status.dest_pool_id, m_ictx->md_ctx.get_id());
+ EXPECT_EQ(status.dest_pool_namespace, m_ictx->md_ctx.get_namespace());
EXPECT_EQ(status.dest_image_name, m_ictx->name);
EXPECT_EQ(status.dest_image_id, m_ictx->id);
EXPECT_EQ(status.state, state);
if (!migration_state.empty()) {
f->open_object_section("migration");
f->dump_string("source_pool_name", source_pool_name);
+ f->dump_string("source_pool_namespace",
+ migration_status.source_pool_namespace);
f->dump_string("source_image_name", migration_status.source_image_name);
f->dump_string("source_image_id", migration_status.source_image_id);
f->dump_string("dest_pool_name", dest_pool_name);
+ f->dump_string("dest_pool_namespace",
+ migration_status.dest_pool_namespace);
f->dump_string("dest_image_name", migration_status.dest_image_name);
f->dump_string("dest_image_id", migration_status.dest_image_id);
f->dump_string("state", migration_state);
std::cout << "Watchers: none" << std::endl;
}
if (!migration_state.empty()) {
+ if (!migration_status.source_pool_namespace.empty()) {
+ source_pool_name += ("/" + migration_status.source_pool_namespace);
+ }
+ if (!migration_status.dest_pool_namespace.empty()) {
+ dest_pool_name += ("/" + migration_status.dest_pool_namespace);
+ }
+
std::cout << "Migration:" << std::endl;
std::cout << "\tsource: " << source_pool_name << "/"
<< migration_status.source_image_name;