]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
tests: updated librbd test cases for updated maint ops API
authorJason Dillaman <dillaman@redhat.com>
Thu, 17 Dec 2015 16:09:18 +0000 (11:09 -0500)
committerJason Dillaman <dillaman@redhat.com>
Fri, 15 Jan 2016 15:40:29 +0000 (10:40 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/librbd/object_map/test_mock_InvalidateRequest.cc
src/test/librbd/object_map/test_mock_ResizeRequest.cc
src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc
src/test/librbd/object_map/test_mock_SnapshotRollbackRequest.cc
src/test/librbd/object_map/test_mock_UpdateRequest.cc
src/test/librbd/operation/test_mock_SnapshotProtectRequest.cc
src/test/librbd/operation/test_mock_SnapshotRemoveRequest.cc
src/test/librbd/operation/test_mock_SnapshotUnprotectRequest.cc
src/test/librbd/test_fixture.cc
src/test/librbd/test_fixture.h
src/test/librbd/test_internal.cc

index 9c0f4ea6f4c4d4161fc98e45f33ed5d7dc47a5a2..9f20a4799dc8ddc02bc158606a0deec523220dbd 100644 (file)
@@ -77,7 +77,7 @@ TEST_F(TestMockObjectMapInvalidateRequest, UpdatesSnapOnDiskFlag) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
 
   C_SaferCond cond_ctx;
index 197fabeb60b9aec8abd6fdae75c1a0bdc53539d7..f21d645f81b36d1438dc5439b3041cffdbbdf323 100644 (file)
@@ -98,7 +98,7 @@ TEST_F(TestMockObjectMapResizeRequest, UpdateSnapOnDisk) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
 
   uint64_t snap_id = ictx->snap_id;
index 224a43d68d44b20beb75deb8f2b082df32508757..a29699e86fdf918ce5d4512f1953cd1d6cabbcaa 100644 (file)
@@ -76,7 +76,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, Success) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -105,7 +105,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, LoadMapError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -132,7 +132,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, RemoveSnapshotMissing) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -159,7 +159,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, RemoveSnapshotError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -187,7 +187,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, RemoveMapMissing) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -216,7 +216,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, RemoveMapError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -245,7 +245,7 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, ScrubCleanObjects) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
index 25c615bf328ffc020dc3da89521f0aebe78ec328..2465ffd5f26839f49d510ee28b2ddfa1e3c752dc 100644 (file)
@@ -66,7 +66,7 @@ TEST_F(TestMockObjectMapSnapshotRollbackRequest, Success) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -87,7 +87,7 @@ TEST_F(TestMockObjectMapSnapshotRollbackRequest, ReadMapError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
@@ -115,7 +115,7 @@ TEST_F(TestMockObjectMapSnapshotRollbackRequest, WriteMapError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
index bc5cafab9102e79e9f14c22b8733ffb8f57e4812..0d7dffad5b7fd91b3952afb75dcf4f5073374522 100644 (file)
@@ -114,7 +114,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateSnapOnDisk) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, librbd::snap_set(ictx, "snap1"));
 
   uint64_t snap_id = ictx->snap_id;
@@ -169,7 +169,7 @@ TEST_F(TestMockObjectMapUpdateRequest, RebuildSnapOnDisk) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
   ASSERT_EQ(CEPH_NOSNAP, ictx->snap_id);
 
index 3c64d2738811d4d3dde221421eb45fdb7ab3d2a1..ab7a8e485eeadcd0b0cdb3253606529af363fcb6 100644 (file)
@@ -61,7 +61,7 @@ TEST_F(TestMockOperationSnapshotProtectRequest, Success) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -88,7 +88,7 @@ TEST_F(TestMockOperationSnapshotProtectRequest, GetSnapIdMissing) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -113,7 +113,7 @@ TEST_F(TestMockOperationSnapshotProtectRequest, IsSnapProtectedError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -139,7 +139,7 @@ TEST_F(TestMockOperationSnapshotProtectRequest, SnapAlreadyProtected) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -165,7 +165,7 @@ TEST_F(TestMockOperationSnapshotProtectRequest, SetProtectionStateError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
index 122f4bf1761b64f7a09fa5e19eb4340998a17625..fc1fe2a9cdb9fb4f484fa012fe3d4a9bfa2deac4 100644 (file)
@@ -36,13 +36,13 @@ public:
       return r;
     }
 
-    r = librbd::snap_create(ictx, snap_name);
+    r = snap_create(*ictx, snap_name);
     if (r < 0) {
       return r;
     }
 
-    r = librbd::snap_protect(ictx, snap_name);
-     if (r < 0) {
+    r = snap_protect(*ictx, snap_name);
+    if (r < 0) {
       return r;
     }
     close_image(ictx);
@@ -119,7 +119,7 @@ public:
 TEST_F(TestMockOperationSnapshotRemoveRequest, Success) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -169,10 +169,10 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, FlattenedCloneRemovesChild) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(clone_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
 
   librbd::NoOpProgressContext prog_ctx;
-  ASSERT_EQ(0, librbd::flatten(ictx, prog_ctx));
+  ASSERT_EQ(0, flatten(*ictx, prog_ctx));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -213,7 +213,7 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, ObjectMapSnapRemoveError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -242,7 +242,7 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, ObjectMapSnapRemoveError) {
 TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveChildParentError) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -288,10 +288,10 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveChildError) {
     return SUCCEED();
   }
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
 
   librbd::NoOpProgressContext prog_ctx;
-  ASSERT_EQ(0, librbd::flatten(ictx, prog_ctx));
+  ASSERT_EQ(0, flatten(*ictx, prog_ctx));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -321,7 +321,7 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveChildError) {
 TEST_F(TestMockOperationSnapshotRemoveRequest, RemoveSnapError) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
index 07cb296a41f29e8153b04e69c8d5008946753acf..4d437d0eae254229d14eb9cf3d40d3839a67ed1f 100644 (file)
@@ -105,7 +105,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, Success) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -138,7 +138,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, GetSnapIdMissing) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -163,7 +163,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, IsSnapUnprotectedError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -189,7 +189,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, SnapAlreadyUnprotected) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -215,7 +215,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, SetProtectionStatusError) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
@@ -244,7 +244,7 @@ TEST_F(TestMockOperationSnapshotUnprotectRequest, ChildrenExist) {
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   ASSERT_EQ(0, ictx->state->refresh_if_required());
 
   MockImageCtx mock_image_ctx(*ictx);
index 8c6a4b9e3925ea0025f8377bace10ad523e4c444..8ed42998f954bba7959cfd18cb34b53627e2ee20 100644 (file)
@@ -7,6 +7,7 @@
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageState.h"
 #include "librbd/ImageWatcher.h"
+#include "librbd/Operations.h"
 #include "cls/lock/cls_lock_client.h"
 #include "cls/lock/cls_lock_types.h"
 #include "librbd/internal.h"
@@ -62,6 +63,21 @@ int TestFixture::open_image(const std::string &image_name,
   return (*ictx)->state->open();
 }
 
+int TestFixture::snap_create(librbd::ImageCtx &ictx,
+                             const std::string &snap_name) {
+  return ictx.operations->snap_create(snap_name.c_str());
+}
+
+int TestFixture::snap_protect(librbd::ImageCtx &ictx,
+                              const std::string &snap_name) {
+  return ictx.operations->snap_protect(snap_name.c_str());
+}
+
+int TestFixture::flatten(librbd::ImageCtx &ictx,
+                         librbd::ProgressContext &prog_ctx) {
+  return ictx.operations->flatten(prog_ctx);
+}
+
 void TestFixture::close_image(librbd::ImageCtx *ictx) {
   m_ictxs.erase(ictx);
 
index 5d6b86e85e7b179512118c76601c8059d034bb82..a6fa6af77b76a0dcd6c3e5b1d7e1097a0e87f485 100644 (file)
@@ -26,6 +26,11 @@ public:
   int open_image(const std::string &image_name, librbd::ImageCtx **ictx);
   void close_image(librbd::ImageCtx *ictx);
 
+  int snap_create(librbd::ImageCtx &ictx, const std::string &snap_name);
+  int snap_protect(librbd::ImageCtx &ictx, const std::string &snap_name);
+
+  int flatten(librbd::ImageCtx &ictx, librbd::ProgressContext &prog_ctx);
+
   int lock_image(librbd::ImageCtx &ictx, ClsLockType lock_type,
                  const std::string &cookie);
   int unlock_image();
index 61d58beaf68d5572ffc12dfd3000f7c7f817af81..a3fb09653072396b815ec8aac0959d2ed60a6e42 100644 (file)
@@ -9,6 +9,7 @@
 #include "librbd/ImageWatcher.h"
 #include "librbd/internal.h"
 #include "librbd/ObjectMap.h"
+#include "librbd/Operations.h"
 #include <boost/scope_exit.hpp>
 #include <boost/assign/list_of.hpp>
 #include <utility>
@@ -30,9 +31,9 @@ public:
       librbd::ImageCtx *ictx;
       EXPECT_EQ(0, open_image(m_image_name, &ictx));
       if (iter->second) {
-       EXPECT_EQ(0, librbd::snap_unprotect(ictx, iter->first.c_str()));
+       EXPECT_EQ(0, ictx->operations->snap_unprotect(iter->first.c_str()));
       }
-      EXPECT_EQ(0, librbd::snap_remove(ictx, iter->first.c_str()));
+      EXPECT_EQ(0, ictx->operations->snap_remove(iter->first.c_str()));
     }
 
     TestFixture::TearDown();
@@ -45,14 +46,14 @@ public:
       return r;
     }
 
-    r = librbd::snap_create(ictx, snap_name);
+    r = snap_create(*ictx, snap_name);
     if (r < 0) {
       return r;
     }
 
     m_snaps.push_back(std::make_pair(snap_name, snap_protect));
     if (snap_protect) {
-      r = librbd::snap_protect(ictx, snap_name);
+      r = ictx->operations->snap_protect(snap_name);
       if (r < 0) {
        return r;
       }
@@ -97,7 +98,7 @@ TEST_F(TestInternal, ResizeLocksImage) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::resize(ictx, m_image_size >> 1, no_op));
+  ASSERT_EQ(0, ictx->operations->resize(m_image_size >> 1, no_op));
 
   bool is_owner;
   ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx, &is_owner));
@@ -112,7 +113,7 @@ TEST_F(TestInternal, ResizeFailsToLockImage) {
   ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(-EROFS, librbd::resize(ictx, m_image_size >> 1, no_op));
+  ASSERT_EQ(-EROFS, ictx->operations->resize(m_image_size >> 1, no_op));
 }
 
 TEST_F(TestInternal, SnapCreateLocksImage) {
@@ -121,9 +122,9 @@ TEST_F(TestInternal, SnapCreateLocksImage) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
   BOOST_SCOPE_EXIT( (ictx) ) {
-    ASSERT_EQ(0, librbd::snap_remove(ictx, "snap1"));
+    ASSERT_EQ(0, ictx->operations->snap_remove("snap1"));
   } BOOST_SCOPE_EXIT_END;
 
   bool is_owner;
@@ -138,7 +139,7 @@ TEST_F(TestInternal, SnapCreateFailsToLockImage) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
   ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
 
-  ASSERT_EQ(-EROFS, librbd::snap_create(ictx, "snap1"));
+  ASSERT_EQ(-EROFS, snap_create(*ictx, "snap1"));
 }
 
 TEST_F(TestInternal, SnapRollbackLocksImage) {
@@ -150,7 +151,7 @@ TEST_F(TestInternal, SnapRollbackLocksImage) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::snap_rollback(ictx, "snap1", no_op));
+  ASSERT_EQ(0, ictx->operations->snap_rollback("snap1", no_op));
 
   bool is_owner;
   ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx, &is_owner));
@@ -168,7 +169,7 @@ TEST_F(TestInternal, SnapRollbackFailsToLockImage) {
   ASSERT_EQ(0, lock_image(*ictx, LOCK_EXCLUSIVE, "manually locked"));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(-EROFS, librbd::snap_rollback(ictx, "snap1", no_op));
+  ASSERT_EQ(-EROFS, ictx->operations->snap_rollback("snap1", no_op));
 }
 
 TEST_F(TestInternal, SnapSetReleasesLock) {
@@ -205,7 +206,7 @@ TEST_F(TestInternal, FlattenLocksImage) {
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::flatten(ictx2, no_op));
+  ASSERT_EQ(0, ictx2->operations->flatten(no_op));
 
   bool is_owner;
   ASSERT_EQ(0, librbd::is_exclusive_lock_owner(ictx2, &is_owner));
@@ -243,7 +244,7 @@ TEST_F(TestInternal, FlattenFailsToLockImage) {
   ASSERT_EQ(0, lock_image(*ictx2, LOCK_EXCLUSIVE, "manually locked"));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(-EROFS, librbd::flatten(ictx2, no_op));
+  ASSERT_EQ(-EROFS, ictx2->operations->flatten(no_op));
 }
 
 TEST_F(TestInternal, AioWriteRequestsLock) {
@@ -320,7 +321,7 @@ TEST_F(TestInternal, CancelAsyncResize) {
     size -= MIN(size, 1<<18);
     {
       RWLock::RLocker l(ictx->owner_lock);
-      librbd::async_resize(ictx, &ctx, size, prog_ctx);
+      ictx->operations->resize(size, prog_ctx, &ctx);
     }
 
     // try to interrupt the in-progress resize
@@ -368,7 +369,7 @@ TEST_F(TestInternal, MultipleResize) {
 
     RWLock::RLocker l(ictx->owner_lock);
     contexts.push_back(new C_SaferCond());
-    librbd::async_resize(ictx, contexts.back(), new_size, prog_ctx);
+    ictx->operations->resize(new_size, prog_ctx, contexts.back());
   }
 
   for (uint32_t i = 0; i < contexts.size(); ++i) {
@@ -478,8 +479,8 @@ TEST_F(TestInternal, SnapshotCopyup)
   bl.append(std::string(256, '1'));
   ASSERT_EQ(256, ictx->aio_work_queue->write(0, bl.length(), bl.c_str(), 0));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
-  ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+  ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
 
   uint64_t features;
   ASSERT_EQ(0, librbd::get_features(ictx, &features));
@@ -492,8 +493,8 @@ TEST_F(TestInternal, SnapshotCopyup)
   librbd::ImageCtx *ictx2;
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
-  ASSERT_EQ(0, librbd::snap_create(ictx2, "snap2"));
+  ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx2, "snap2"));
 
   ASSERT_EQ(256, ictx2->aio_work_queue->write(256, bl.length(), bl.c_str(), 0));
 
@@ -576,8 +577,8 @@ TEST_F(TestInternal, ResizeCopyup)
                                                        bl.c_str(), 0));
   }
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
-  ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+  ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
 
   std::string clone_name = get_temp_image_name();
   ASSERT_EQ(0, librbd::clone(m_ioctx, m_image_name.c_str(), "snap1", m_ioctx,
@@ -586,7 +587,7 @@ TEST_F(TestInternal, ResizeCopyup)
   librbd::ImageCtx *ictx2;
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
 
   bufferptr read_ptr(bl.length());
   bufferlist read_bl;
@@ -594,7 +595,7 @@ TEST_F(TestInternal, ResizeCopyup)
 
   // verify full / partial object removal properly copyup
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::resize(ictx2, m_image_size - (1 << order) - 32, no_op));
+  ASSERT_EQ(0, ictx2->operations->resize(m_image_size - (1 << order) - 32, no_op));
   ASSERT_EQ(0, librbd::snap_set(ictx2, "snap1"));
 
   {
@@ -633,8 +634,8 @@ TEST_F(TestInternal, DiscardCopyup)
                                                        bl.c_str(), 0));
   }
 
-  ASSERT_EQ(0, librbd::snap_create(ictx, "snap1"));
-  ASSERT_EQ(0, librbd::snap_protect(ictx, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+  ASSERT_EQ(0, ictx->operations->snap_protect("snap1"));
 
   std::string clone_name = get_temp_image_name();
   ASSERT_EQ(0, librbd::clone(m_ioctx, m_image_name.c_str(), "snap1", m_ioctx,
@@ -643,7 +644,7 @@ TEST_F(TestInternal, DiscardCopyup)
   librbd::ImageCtx *ictx2;
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
 
-  ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+  ASSERT_EQ(0, snap_create(*ictx2, "snap1"));
 
   bufferptr read_ptr(bl.length());
   bufferlist read_bl;
@@ -681,7 +682,7 @@ TEST_F(TestInternal, ShrinkFlushesCache) {
   ictx->aio_work_queue->aio_write(c, 0, buffer.size(), buffer.c_str(), 0);
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::resize(ictx, m_image_size >> 1, no_op));
+  ASSERT_EQ(0, ictx->operations->resize(m_image_size >> 1, no_op));
 
   ASSERT_TRUE(c->is_complete());
   ASSERT_EQ(0, c->wait_for_complete());
@@ -763,7 +764,7 @@ TEST_F(TestInternal, WriteFullCopyup) {
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
   librbd::NoOpProgressContext no_op;
-  ASSERT_EQ(0, librbd::resize(ictx, 1 << ictx->order, no_op));
+  ASSERT_EQ(0, ictx->operations->resize(1 << ictx->order, no_op));
 
   bufferlist bl;
   bl.append(std::string(1 << ictx->order, '1'));
@@ -782,7 +783,7 @@ TEST_F(TestInternal, WriteFullCopyup) {
   librbd::ImageCtx *ictx2 = NULL;
   BOOST_SCOPE_EXIT( (&m_ioctx) (clone_name) (parent) (&ictx2) ) {
     if (ictx2 != NULL) {
-      librbd::snap_remove(ictx2, "snap1");
+      ictx2->operations->snap_remove("snap1");
       parent->close_image(ictx2);
     }
 
@@ -791,7 +792,7 @@ TEST_F(TestInternal, WriteFullCopyup) {
   } BOOST_SCOPE_EXIT_END;
 
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
-  ASSERT_EQ(0, librbd::snap_create(ictx2, "snap1"));
+  ASSERT_EQ(0, ictx2->operations->snap_create("snap1"));
 
   bufferlist write_full_bl;
   write_full_bl.append(std::string(1 << ictx2->order, '2'));
@@ -799,7 +800,7 @@ TEST_F(TestInternal, WriteFullCopyup) {
             ictx2->aio_work_queue->write(0, write_full_bl.length(),
             write_full_bl.c_str(), 0));
 
-  ASSERT_EQ(0, librbd::flatten(ictx2, no_op));
+  ASSERT_EQ(0, ictx2->operations->flatten(no_op));
 
   bufferptr read_ptr(bl.length());
   bufferlist read_bl;