From 378ebb79d0deaabb404fa8838870cef749aa6f59 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sat, 13 Dec 2014 11:30:26 +0800 Subject: [PATCH] python-rados: refactor class Rados a little bit Signed-off-by: Kefu Chai --- src/pybind/rados.py | 13 ++++----- src/test/pybind/test_rados.py | 53 +++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/pybind/rados.py b/src/pybind/rados.py index d6cfe2f07e492..b50b67ce392c0 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -196,11 +196,10 @@ class Rados(object): :raises: RadosStateError """ - for a in args: - if self.state == a: - return + if self.state in args: + return raise RadosStateError("You cannot perform that operation on a \ -Rados object in state %s." % (self.state)) +Rados object in state %s." % self.state) def __init__(self, rados_id=None, name=None, clustername=None, conf_defaults=None, conffile=None, conf=None, flags=0): @@ -231,9 +230,9 @@ Rados object in state %s." % (self.state)) raise TypeError('clustername must be a string or None') if rados_id and name: raise Error("Rados(): can't supply both rados_id and name") - if rados_id: + elif rados_id: name = 'client.' + rados_id - if name is None: + elif name is None: name = 'client.admin' if clustername is None: clustername = 'ceph' @@ -262,7 +261,7 @@ Rados object in state %s." % (self.state)) Disconnects from the cluster. Call this explicitly when a Rados.connect()ed object is no longer used. """ - if (self.__dict__.has_key("state") and self.state != "shutdown"): + if hasattr(self, "state") and self.state != "shutdown": run_in_thread(self.librados.rados_shutdown, (self.cluster,)) self.state = "shutdown" diff --git a/src/test/pybind/test_rados.py b/src/test/pybind/test_rados.py index 758993fbd894a..4595586e26192 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -1,6 +1,6 @@ from nose.tools import eq_ as eq, assert_raises -from rados import (Rados, Error, Object, ObjectExists, ObjectNotFound, - ObjectBusy, +from rados import (Rados, Error, RadosStateError, Object, ObjectExists, + ObjectNotFound, ObjectBusy, ANONYMOUS_AUID, ADMIN_AUID, LIBRADOS_ALL_NSPACES) import time import threading @@ -38,6 +38,55 @@ def test_ioctx_context_manager(): with conn.open_ioctx('rbd') as ioctx: pass + +class TestRadosStateError(object): + def _requires_configuring(self, rados): + assert_raises(RadosStateError, rados.connect) + + def _requires_configuring_or_connected(self, rados): + assert_raises(RadosStateError, rados.conf_read_file) + assert_raises(RadosStateError, rados.conf_parse_argv, None) + assert_raises(RadosStateError, rados.conf_parse_env) + assert_raises(RadosStateError, rados.conf_get, 'opt') + assert_raises(RadosStateError, rados.conf_set, 'opt', 'val') + assert_raises(RadosStateError, rados.ping_monitor, 0) + + def _requires_connected(self, rados): + assert_raises(RadosStateError, rados.pool_exists, 'foo') + assert_raises(RadosStateError, rados.pool_lookup, 'foo') + assert_raises(RadosStateError, rados.pool_reverse_lookup, 0) + assert_raises(RadosStateError, rados.create_pool, 'foo') + assert_raises(RadosStateError, rados.get_pool_base_tier, 0) + assert_raises(RadosStateError, rados.delete_pool, 'foo') + assert_raises(RadosStateError, rados.list_pools) + assert_raises(RadosStateError, rados.get_fsid) + assert_raises(RadosStateError, rados.open_ioctx, 'foo') + assert_raises(RadosStateError, rados.mon_command, '', '') + assert_raises(RadosStateError, rados.osd_command, 0, '', '') + assert_raises(RadosStateError, rados.pg_command, '', '', '') + assert_raises(RadosStateError, rados.wait_for_latest_osdmap) + + def test_configuring(self): + rados = Rados(conffile='') + eq('configuring', rados.state) + self._requires_connected(rados) + + def test_connected(self): + rados = Rados(conffile='') + with rados: + eq('connected', rados.state) + self._requires_configuring(rados) + + def test_shutdown(self): + rados = Rados(conffile='') + with rados: + pass + eq('shutdown', rados.state) + self._requires_configuring(rados) + self._requires_configuring_or_connected(rados) + self._requires_connected(rados) + + class TestRados(object): def setUp(self): -- 2.39.5