Merge "Deprecate VolumeDetail and BackupDetail classes"
This commit is contained in:
commit
ebd4922ecc
@ -10,12 +10,3 @@ The ``Backup`` class inherits from :class:`~openstack.resource.Resource`.
|
|||||||
|
|
||||||
.. autoclass:: openstack.block_storage.v2.backup.Backup
|
.. autoclass:: openstack.block_storage.v2.backup.Backup
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
The BackupDetail Class
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
The ``BackupDetail`` class inherits from
|
|
||||||
:class:`~openstack.block_storage.v2.backup.Backup`.
|
|
||||||
|
|
||||||
.. autoclass:: openstack.block_storage.v2.backup.BackupDetail
|
|
||||||
:members:
|
|
||||||
|
@ -10,12 +10,3 @@ The ``Volume`` class inherits from :class:`~openstack.resource.Resource`.
|
|||||||
|
|
||||||
.. autoclass:: openstack.block_storage.v2.volume.Volume
|
.. autoclass:: openstack.block_storage.v2.volume.Volume
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
The VolumeDetail Class
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
The ``VolumeDetail`` class inherits from
|
|
||||||
:class:`~openstack.block_storage.v2.volume.Volume`.
|
|
||||||
|
|
||||||
.. autoclass:: openstack.block_storage.v2.volume.VolumeDetail
|
|
||||||
:members:
|
|
||||||
|
@ -147,11 +147,9 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
def volumes(self, details=True, **query):
|
def volumes(self, details=True, **query):
|
||||||
"""Retrieve a generator of volumes
|
"""Retrieve a generator of volumes
|
||||||
|
|
||||||
:param bool details: When set to ``False``
|
:param bool details: When set to ``False`` no extended attributes
|
||||||
:class:`~openstack.block_storage.v2.volume.Volume` objects
|
will be returned. The default, ``True``, will cause objects with
|
||||||
will be returned. The default, ``True``, will cause
|
additional attributes to be returned.
|
||||||
:class:`~openstack.block_storage.v2.volume.VolumeDetail`
|
|
||||||
objects to be returned.
|
|
||||||
:param kwargs query: Optional query parameters to be sent to limit
|
:param kwargs query: Optional query parameters to be sent to limit
|
||||||
the volumes being returned. Available parameters include:
|
the volumes being returned. Available parameters include:
|
||||||
|
|
||||||
@ -162,8 +160,8 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
|
|
||||||
:returns: A generator of volume objects.
|
:returns: A generator of volume objects.
|
||||||
"""
|
"""
|
||||||
volume = _volume.VolumeDetail if details else _volume.Volume
|
base_path = '/volumes/detail' if details else None
|
||||||
return self._list(volume, **query)
|
return self._list(_volume.Volume, base_path=base_path, **query)
|
||||||
|
|
||||||
def create_volume(self, **attrs):
|
def create_volume(self, **attrs):
|
||||||
"""Create a new volume from attributes
|
"""Create a new volume from attributes
|
||||||
@ -214,11 +212,9 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
def backups(self, details=True, **query):
|
def backups(self, details=True, **query):
|
||||||
"""Retrieve a generator of backups
|
"""Retrieve a generator of backups
|
||||||
|
|
||||||
:param bool details: When set to ``False``
|
:param bool details: When set to ``False`` no additional details will
|
||||||
:class:`~openstack.block_storage.v2.backup.Backup` objects
|
be returned. The default, ``True``, will cause objects with
|
||||||
will be returned. The default, ``True``, will cause
|
additional attributes to be returned.
|
||||||
:class:`~openstack.block_storage.v2.backup.BackupDetail`
|
|
||||||
objects to be returned.
|
|
||||||
:param dict query: Optional query parameters to be sent to limit the
|
:param dict query: Optional query parameters to be sent to limit the
|
||||||
resources being returned:
|
resources being returned:
|
||||||
|
|
||||||
@ -239,8 +235,8 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
raise exceptions.SDKException(
|
raise exceptions.SDKException(
|
||||||
'Object-store service is required for block-store backups'
|
'Object-store service is required for block-store backups'
|
||||||
)
|
)
|
||||||
backup = _backup.BackupDetail if details else _backup.Backup
|
base_path = '/backups/detail' if details else None
|
||||||
return self._list(backup, **query)
|
return self._list(_backup.Backup, base_path=base_path, **query)
|
||||||
|
|
||||||
def get_backup(self, backup):
|
def get_backup(self, backup):
|
||||||
"""Get a backup
|
"""Get a backup
|
||||||
|
@ -90,11 +90,4 @@ class Backup(resource.Resource):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
class BackupDetail(Backup):
|
BackupDetail = Backup
|
||||||
"""Volume Backup with Details"""
|
|
||||||
base_path = "/backups/detail"
|
|
||||||
|
|
||||||
# capabilities
|
|
||||||
allow_list = True
|
|
||||||
|
|
||||||
#: Properties
|
|
||||||
|
@ -75,32 +75,6 @@ class Volume(resource.Resource):
|
|||||||
#: The timestamp of this volume creation.
|
#: The timestamp of this volume creation.
|
||||||
created_at = resource.Body("created_at")
|
created_at = resource.Body("created_at")
|
||||||
|
|
||||||
def _action(self, session, body):
|
|
||||||
"""Preform volume actions given the message body."""
|
|
||||||
# NOTE: This is using Volume.base_path instead of self.base_path
|
|
||||||
# as both Volume and VolumeDetail instances can be acted on, but
|
|
||||||
# the URL used is sans any additional /detail/ part.
|
|
||||||
url = utils.urljoin(Volume.base_path, self.id, 'action')
|
|
||||||
headers = {'Accept': ''}
|
|
||||||
return session.post(url, json=body, headers=headers)
|
|
||||||
|
|
||||||
def extend(self, session, size):
|
|
||||||
"""Extend a volume size."""
|
|
||||||
body = {'os-extend': {'new_size': size}}
|
|
||||||
self._action(session, body)
|
|
||||||
|
|
||||||
|
|
||||||
class VolumeDetail(Volume):
|
|
||||||
|
|
||||||
base_path = "/volumes/detail"
|
|
||||||
|
|
||||||
# capabilities
|
|
||||||
allow_fetch = False
|
|
||||||
allow_create = False
|
|
||||||
allow_delete = False
|
|
||||||
allow_commit = False
|
|
||||||
allow_list = True
|
|
||||||
|
|
||||||
#: The volume's current back-end.
|
#: The volume's current back-end.
|
||||||
host = resource.Body("os-vol-host-attr:host")
|
host = resource.Body("os-vol-host-attr:host")
|
||||||
#: The project ID associated with current back-end.
|
#: The project ID associated with current back-end.
|
||||||
@ -123,3 +97,20 @@ class VolumeDetail(Volume):
|
|||||||
#: ``True`` if this volume is encrypted, ``False`` if not.
|
#: ``True`` if this volume is encrypted, ``False`` if not.
|
||||||
#: *Type: bool*
|
#: *Type: bool*
|
||||||
is_encrypted = resource.Body("encrypted", type=format.BoolStr)
|
is_encrypted = resource.Body("encrypted", type=format.BoolStr)
|
||||||
|
|
||||||
|
def _action(self, session, body):
|
||||||
|
"""Preform volume actions given the message body."""
|
||||||
|
# NOTE: This is using Volume.base_path instead of self.base_path
|
||||||
|
# as both Volume and VolumeDetail instances can be acted on, but
|
||||||
|
# the URL used is sans any additional /detail/ part.
|
||||||
|
url = utils.urljoin(Volume.base_path, self.id, 'action')
|
||||||
|
headers = {'Accept': ''}
|
||||||
|
return session.post(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
def extend(self, session, size):
|
||||||
|
"""Extend a volume size."""
|
||||||
|
body = {'os-extend': {'new_size': size}}
|
||||||
|
self._action(session, body)
|
||||||
|
|
||||||
|
|
||||||
|
VolumeDetail = Volume
|
||||||
|
@ -147,11 +147,9 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
def volumes(self, details=True, **query):
|
def volumes(self, details=True, **query):
|
||||||
"""Retrieve a generator of volumes
|
"""Retrieve a generator of volumes
|
||||||
|
|
||||||
:param bool details: When set to ``False``
|
:param bool details: When set to ``False`` no extended attributes
|
||||||
:class:`~openstack.block_storage.v3.volume.Volume` objects
|
will be returned. The default, ``True``, will cause objects with
|
||||||
will be returned. The default, ``True``, will cause
|
additional attributes to be returned.
|
||||||
:class:`~openstack.block_storage.v3.volume.VolumeDetail`
|
|
||||||
objects to be returned.
|
|
||||||
:param kwargs query: Optional query parameters to be sent to limit
|
:param kwargs query: Optional query parameters to be sent to limit
|
||||||
the volumes being returned. Available parameters include:
|
the volumes being returned. Available parameters include:
|
||||||
|
|
||||||
@ -162,8 +160,8 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
|
|
||||||
:returns: A generator of volume objects.
|
:returns: A generator of volume objects.
|
||||||
"""
|
"""
|
||||||
volume = _volume.VolumeDetail if details else _volume.Volume
|
base_path = '/volumes/detail' if details else None
|
||||||
return self._list(volume, **query)
|
return self._list(_volume.Volume, base_path=base_path, **query)
|
||||||
|
|
||||||
def create_volume(self, **attrs):
|
def create_volume(self, **attrs):
|
||||||
"""Create a new volume from attributes
|
"""Create a new volume from attributes
|
||||||
@ -215,10 +213,8 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
"""Retrieve a generator of backups
|
"""Retrieve a generator of backups
|
||||||
|
|
||||||
:param bool details: When set to ``False``
|
:param bool details: When set to ``False``
|
||||||
:class:`~openstack.block_storage.v3.backup.Backup` objects
|
no additional details will be returned. The default, ``True``,
|
||||||
will be returned. The default, ``True``, will cause
|
will cause objects with additional attributes to be returned.
|
||||||
:class:`~openstack.block_storage.v3.backup.BackupDetail`
|
|
||||||
objects to be returned.
|
|
||||||
:param dict query: Optional query parameters to be sent to limit the
|
:param dict query: Optional query parameters to be sent to limit the
|
||||||
resources being returned:
|
resources being returned:
|
||||||
|
|
||||||
@ -239,8 +235,8 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
raise exceptions.SDKException(
|
raise exceptions.SDKException(
|
||||||
'Object-store service is required for block-store backups'
|
'Object-store service is required for block-store backups'
|
||||||
)
|
)
|
||||||
backup = _backup.BackupDetail if details else _backup.Backup
|
base_path = '/backups/detail' if details else None
|
||||||
return self._list(backup, **query)
|
return self._list(_backup.Backup, base_path=base_path, **query)
|
||||||
|
|
||||||
def get_backup(self, backup):
|
def get_backup(self, backup):
|
||||||
"""Get a backup
|
"""Get a backup
|
||||||
|
@ -90,11 +90,4 @@ class Backup(resource.Resource):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
class BackupDetail(Backup):
|
BackupDetail = Backup
|
||||||
"""Volume Backup with Details"""
|
|
||||||
base_path = "/backups/detail"
|
|
||||||
|
|
||||||
# capabilities
|
|
||||||
allow_list = True
|
|
||||||
|
|
||||||
#: Properties
|
|
||||||
|
@ -75,32 +75,6 @@ class Volume(resource.Resource):
|
|||||||
#: The timestamp of this volume creation.
|
#: The timestamp of this volume creation.
|
||||||
created_at = resource.Body("created_at")
|
created_at = resource.Body("created_at")
|
||||||
|
|
||||||
def _action(self, session, body):
|
|
||||||
"""Preform volume actions given the message body."""
|
|
||||||
# NOTE: This is using Volume.base_path instead of self.base_path
|
|
||||||
# as both Volume and VolumeDetail instances can be acted on, but
|
|
||||||
# the URL used is sans any additional /detail/ part.
|
|
||||||
url = utils.urljoin(Volume.base_path, self.id, 'action')
|
|
||||||
headers = {'Accept': ''}
|
|
||||||
return session.post(url, json=body, headers=headers)
|
|
||||||
|
|
||||||
def extend(self, session, size):
|
|
||||||
"""Extend a volume size."""
|
|
||||||
body = {'os-extend': {'new_size': size}}
|
|
||||||
self._action(session, body)
|
|
||||||
|
|
||||||
|
|
||||||
class VolumeDetail(Volume):
|
|
||||||
|
|
||||||
base_path = "/volumes/detail"
|
|
||||||
|
|
||||||
# capabilities
|
|
||||||
allow_fetch = False
|
|
||||||
allow_create = False
|
|
||||||
allow_delete = False
|
|
||||||
allow_commit = False
|
|
||||||
allow_list = True
|
|
||||||
|
|
||||||
#: The volume's current back-end.
|
#: The volume's current back-end.
|
||||||
host = resource.Body("os-vol-host-attr:host")
|
host = resource.Body("os-vol-host-attr:host")
|
||||||
#: The project ID associated with current back-end.
|
#: The project ID associated with current back-end.
|
||||||
@ -123,3 +97,20 @@ class VolumeDetail(Volume):
|
|||||||
#: ``True`` if this volume is encrypted, ``False`` if not.
|
#: ``True`` if this volume is encrypted, ``False`` if not.
|
||||||
#: *Type: bool*
|
#: *Type: bool*
|
||||||
is_encrypted = resource.Body("encrypted", type=format.BoolStr)
|
is_encrypted = resource.Body("encrypted", type=format.BoolStr)
|
||||||
|
|
||||||
|
def _action(self, session, body):
|
||||||
|
"""Preform volume actions given the message body."""
|
||||||
|
# NOTE: This is using Volume.base_path instead of self.base_path
|
||||||
|
# as both Volume and VolumeDetail instances can be acted on, but
|
||||||
|
# the URL used is sans any additional /detail/ part.
|
||||||
|
url = utils.urljoin(Volume.base_path, self.id, 'action')
|
||||||
|
headers = {'Accept': ''}
|
||||||
|
return session.post(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
def extend(self, session, size):
|
||||||
|
"""Extend a volume size."""
|
||||||
|
body = {'os-extend': {'new_size': size}}
|
||||||
|
self._action(session, body)
|
||||||
|
|
||||||
|
|
||||||
|
VolumeDetail = Volume
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import copy
|
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from keystoneauth1 import adapter
|
from keystoneauth1 import adapter
|
||||||
@ -38,12 +37,6 @@ BACKUP = {
|
|||||||
"has_dependent_backups": False
|
"has_dependent_backups": False
|
||||||
}
|
}
|
||||||
|
|
||||||
DETAILS = {
|
|
||||||
}
|
|
||||||
|
|
||||||
BACKUP_DETAIL = copy.copy(BACKUP)
|
|
||||||
BACKUP_DETAIL.update(DETAILS)
|
|
||||||
|
|
||||||
|
|
||||||
class TestBackup(base.TestCase):
|
class TestBackup(base.TestCase):
|
||||||
|
|
||||||
@ -92,30 +85,3 @@ class TestBackup(base.TestCase):
|
|||||||
self.assertEqual(BACKUP["size"], sot.size)
|
self.assertEqual(BACKUP["size"], sot.size)
|
||||||
self.assertEqual(BACKUP["has_dependent_backups"],
|
self.assertEqual(BACKUP["has_dependent_backups"],
|
||||||
sot.has_dependent_backups)
|
sot.has_dependent_backups)
|
||||||
|
|
||||||
|
|
||||||
class TestBackupDetail(base.TestCase):
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
sot = backup.BackupDetail(BACKUP_DETAIL)
|
|
||||||
self.assertIsInstance(sot, backup.Backup)
|
|
||||||
self.assertEqual("/backups/detail", sot.base_path)
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
sot = backup.Backup(**BACKUP_DETAIL)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["id"], sot.id)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["name"], sot.name)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["status"], sot.status)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["container"], sot.container)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["availability_zone"],
|
|
||||||
sot.availability_zone)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["created_at"], sot.created_at)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["updated_at"], sot.updated_at)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["description"], sot.description)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["fail_reason"], sot.fail_reason)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["volume_id"], sot.volume_id)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["object_count"], sot.object_count)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["is_incremental"], sot.is_incremental)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["size"], sot.size)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["has_dependent_backups"],
|
|
||||||
sot.has_dependent_backups)
|
|
||||||
|
@ -70,9 +70,10 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
|
|||||||
self.verify_get(self.proxy.get_volume, volume.Volume)
|
self.verify_get(self.proxy.get_volume, volume.Volume)
|
||||||
|
|
||||||
def test_volumes_detailed(self):
|
def test_volumes_detailed(self):
|
||||||
self.verify_list(self.proxy.volumes, volume.VolumeDetail,
|
self.verify_list(self.proxy.volumes, volume.Volume,
|
||||||
method_kwargs={"details": True, "query": 1},
|
method_kwargs={"details": True, "query": 1},
|
||||||
expected_kwargs={"query": 1})
|
expected_kwargs={"query": 1,
|
||||||
|
"base_path": "/volumes/detail"})
|
||||||
|
|
||||||
def test_volumes_not_detailed(self):
|
def test_volumes_not_detailed(self):
|
||||||
self.verify_list(self.proxy.volumes, volume.Volume,
|
self.verify_list(self.proxy.volumes, volume.Volume,
|
||||||
@ -101,9 +102,10 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
|
|||||||
# NOTE: mock has_service
|
# NOTE: mock has_service
|
||||||
self.proxy._connection = mock.Mock()
|
self.proxy._connection = mock.Mock()
|
||||||
self.proxy._connection.has_service = mock.Mock(return_value=True)
|
self.proxy._connection.has_service = mock.Mock(return_value=True)
|
||||||
self.verify_list(self.proxy.backups, backup.BackupDetail,
|
self.verify_list(self.proxy.backups, backup.Backup,
|
||||||
method_kwargs={"details": True, "query": 1},
|
method_kwargs={"details": True, "query": 1},
|
||||||
expected_kwargs={"query": 1})
|
expected_kwargs={"query": 1,
|
||||||
|
"base_path": "/backups/detail"})
|
||||||
|
|
||||||
def test_backups_not_detailed(self):
|
def test_backups_not_detailed(self):
|
||||||
# NOTE: mock has_service
|
# NOTE: mock has_service
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import copy
|
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from openstack.tests.unit import base
|
from openstack.tests.unit import base
|
||||||
@ -42,10 +41,7 @@ VOLUME = {
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"volume_image_metadata": IMAGE_METADATA,
|
"volume_image_metadata": IMAGE_METADATA,
|
||||||
"id": FAKE_ID,
|
"id": FAKE_ID,
|
||||||
"size": 10
|
"size": 10,
|
||||||
}
|
|
||||||
|
|
||||||
DETAILS = {
|
|
||||||
"os-vol-host-attr:host": "127.0.0.1",
|
"os-vol-host-attr:host": "127.0.0.1",
|
||||||
"os-vol-tenant-attr:tenant_id": "some tenant",
|
"os-vol-tenant-attr:tenant_id": "some tenant",
|
||||||
"os-vol-mig-status-attr:migstat": "done",
|
"os-vol-mig-status-attr:migstat": "done",
|
||||||
@ -55,12 +51,9 @@ DETAILS = {
|
|||||||
"consistencygroup_id": "123asf-asdf123",
|
"consistencygroup_id": "123asf-asdf123",
|
||||||
"os-volume-replication:driver_data": "ahasadfasdfasdfasdfsdf",
|
"os-volume-replication:driver_data": "ahasadfasdfasdfasdfsdf",
|
||||||
"snapshot_id": "93c2e2aa-7744-4fd6-a31a-80c4726b08d7",
|
"snapshot_id": "93c2e2aa-7744-4fd6-a31a-80c4726b08d7",
|
||||||
"encrypted": "false",
|
"encrypted": "false"
|
||||||
}
|
}
|
||||||
|
|
||||||
VOLUME_DETAIL = copy.copy(VOLUME)
|
|
||||||
VOLUME_DETAIL.update(DETAILS)
|
|
||||||
|
|
||||||
|
|
||||||
class TestVolume(base.TestCase):
|
class TestVolume(base.TestCase):
|
||||||
|
|
||||||
@ -108,6 +101,23 @@ class TestVolume(base.TestCase):
|
|||||||
sot.volume_image_metadata)
|
sot.volume_image_metadata)
|
||||||
self.assertEqual(VOLUME["size"], sot.size)
|
self.assertEqual(VOLUME["size"], sot.size)
|
||||||
self.assertEqual(VOLUME["imageRef"], sot.image_id)
|
self.assertEqual(VOLUME["imageRef"], sot.image_id)
|
||||||
|
self.assertEqual(VOLUME["os-vol-host-attr:host"], sot.host)
|
||||||
|
self.assertEqual(VOLUME["os-vol-tenant-attr:tenant_id"],
|
||||||
|
sot.project_id)
|
||||||
|
self.assertEqual(VOLUME["os-vol-mig-status-attr:migstat"],
|
||||||
|
sot.migration_status)
|
||||||
|
self.assertEqual(VOLUME["os-vol-mig-status-attr:name_id"],
|
||||||
|
sot.migration_id)
|
||||||
|
self.assertEqual(VOLUME["replication_status"],
|
||||||
|
sot.replication_status)
|
||||||
|
self.assertEqual(
|
||||||
|
VOLUME["os-volume-replication:extended_status"],
|
||||||
|
sot.extended_replication_status)
|
||||||
|
self.assertEqual(VOLUME["consistencygroup_id"],
|
||||||
|
sot.consistency_group_id)
|
||||||
|
self.assertEqual(VOLUME["os-volume-replication:driver_data"],
|
||||||
|
sot.replication_driver_data)
|
||||||
|
self.assertFalse(sot.is_encrypted)
|
||||||
|
|
||||||
def test_extend(self):
|
def test_extend(self):
|
||||||
sot = volume.Volume(**VOLUME)
|
sot = volume.Volume(**VOLUME)
|
||||||
@ -118,36 +128,3 @@ class TestVolume(base.TestCase):
|
|||||||
body = {"os-extend": {"new_size": "20"}}
|
body = {"os-extend": {"new_size": "20"}}
|
||||||
headers = {'Accept': ''}
|
headers = {'Accept': ''}
|
||||||
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
|
||||||
class TestVolumeDetail(base.TestCase):
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
sot = volume.VolumeDetail(VOLUME_DETAIL)
|
|
||||||
self.assertIsInstance(sot, volume.Volume)
|
|
||||||
self.assertEqual("/volumes/detail", sot.base_path)
|
|
||||||
self.assertFalse(sot.allow_fetch)
|
|
||||||
self.assertFalse(sot.allow_commit)
|
|
||||||
self.assertFalse(sot.allow_create)
|
|
||||||
self.assertFalse(sot.allow_delete)
|
|
||||||
self.assertTrue(sot.allow_list)
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
sot = volume.VolumeDetail(**VOLUME_DETAIL)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-host-attr:host"], sot.host)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-tenant-attr:tenant_id"],
|
|
||||||
sot.project_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-mig-status-attr:migstat"],
|
|
||||||
sot.migration_status)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-mig-status-attr:name_id"],
|
|
||||||
sot.migration_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["replication_status"],
|
|
||||||
sot.replication_status)
|
|
||||||
self.assertEqual(
|
|
||||||
VOLUME_DETAIL["os-volume-replication:extended_status"],
|
|
||||||
sot.extended_replication_status)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["consistencygroup_id"],
|
|
||||||
sot.consistency_group_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-volume-replication:driver_data"],
|
|
||||||
sot.replication_driver_data)
|
|
||||||
self.assertFalse(sot.is_encrypted)
|
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import copy
|
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from keystoneauth1 import adapter
|
from keystoneauth1 import adapter
|
||||||
@ -38,12 +37,6 @@ BACKUP = {
|
|||||||
"has_dependent_backups": False
|
"has_dependent_backups": False
|
||||||
}
|
}
|
||||||
|
|
||||||
DETAILS = {
|
|
||||||
}
|
|
||||||
|
|
||||||
BACKUP_DETAIL = copy.copy(BACKUP)
|
|
||||||
BACKUP_DETAIL.update(DETAILS)
|
|
||||||
|
|
||||||
|
|
||||||
class TestBackup(base.TestCase):
|
class TestBackup(base.TestCase):
|
||||||
|
|
||||||
@ -92,30 +85,3 @@ class TestBackup(base.TestCase):
|
|||||||
self.assertEqual(BACKUP["size"], sot.size)
|
self.assertEqual(BACKUP["size"], sot.size)
|
||||||
self.assertEqual(BACKUP["has_dependent_backups"],
|
self.assertEqual(BACKUP["has_dependent_backups"],
|
||||||
sot.has_dependent_backups)
|
sot.has_dependent_backups)
|
||||||
|
|
||||||
|
|
||||||
class TestBackupDetail(base.TestCase):
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
sot = backup.BackupDetail(BACKUP_DETAIL)
|
|
||||||
self.assertIsInstance(sot, backup.Backup)
|
|
||||||
self.assertEqual("/backups/detail", sot.base_path)
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
sot = backup.Backup(**BACKUP_DETAIL)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["id"], sot.id)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["name"], sot.name)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["status"], sot.status)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["container"], sot.container)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["availability_zone"],
|
|
||||||
sot.availability_zone)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["created_at"], sot.created_at)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["updated_at"], sot.updated_at)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["description"], sot.description)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["fail_reason"], sot.fail_reason)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["volume_id"], sot.volume_id)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["object_count"], sot.object_count)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["is_incremental"], sot.is_incremental)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["size"], sot.size)
|
|
||||||
self.assertEqual(BACKUP_DETAIL["has_dependent_backups"],
|
|
||||||
sot.has_dependent_backups)
|
|
||||||
|
@ -70,9 +70,10 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
|
|||||||
self.verify_get(self.proxy.get_volume, volume.Volume)
|
self.verify_get(self.proxy.get_volume, volume.Volume)
|
||||||
|
|
||||||
def test_volumes_detailed(self):
|
def test_volumes_detailed(self):
|
||||||
self.verify_list(self.proxy.volumes, volume.VolumeDetail,
|
self.verify_list(self.proxy.volumes, volume.Volume,
|
||||||
method_kwargs={"details": True, "query": 1},
|
method_kwargs={"details": True, "query": 1},
|
||||||
expected_kwargs={"query": 1})
|
expected_kwargs={"query": 1,
|
||||||
|
"base_path": "/volumes/detail"})
|
||||||
|
|
||||||
def test_volumes_not_detailed(self):
|
def test_volumes_not_detailed(self):
|
||||||
self.verify_list(self.proxy.volumes, volume.Volume,
|
self.verify_list(self.proxy.volumes, volume.Volume,
|
||||||
@ -101,9 +102,10 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
|
|||||||
# NOTE: mock has_service
|
# NOTE: mock has_service
|
||||||
self.proxy._connection = mock.Mock()
|
self.proxy._connection = mock.Mock()
|
||||||
self.proxy._connection.has_service = mock.Mock(return_value=True)
|
self.proxy._connection.has_service = mock.Mock(return_value=True)
|
||||||
self.verify_list(self.proxy.backups, backup.BackupDetail,
|
self.verify_list(self.proxy.backups, backup.Backup,
|
||||||
method_kwargs={"details": True, "query": 1},
|
method_kwargs={"details": True, "query": 1},
|
||||||
expected_kwargs={"query": 1})
|
expected_kwargs={"query": 1,
|
||||||
|
"base_path": "/backups/detail"})
|
||||||
|
|
||||||
def test_backups_not_detailed(self):
|
def test_backups_not_detailed(self):
|
||||||
# NOTE: mock has_service
|
# NOTE: mock has_service
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import copy
|
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from openstack.tests.unit import base
|
from openstack.tests.unit import base
|
||||||
@ -42,10 +41,7 @@ VOLUME = {
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"volume_image_metadata": IMAGE_METADATA,
|
"volume_image_metadata": IMAGE_METADATA,
|
||||||
"id": FAKE_ID,
|
"id": FAKE_ID,
|
||||||
"size": 10
|
"size": 10,
|
||||||
}
|
|
||||||
|
|
||||||
DETAILS = {
|
|
||||||
"os-vol-host-attr:host": "127.0.0.1",
|
"os-vol-host-attr:host": "127.0.0.1",
|
||||||
"os-vol-tenant-attr:tenant_id": "some tenant",
|
"os-vol-tenant-attr:tenant_id": "some tenant",
|
||||||
"os-vol-mig-status-attr:migstat": "done",
|
"os-vol-mig-status-attr:migstat": "done",
|
||||||
@ -55,12 +51,9 @@ DETAILS = {
|
|||||||
"consistencygroup_id": "123asf-asdf123",
|
"consistencygroup_id": "123asf-asdf123",
|
||||||
"os-volume-replication:driver_data": "ahasadfasdfasdfasdfsdf",
|
"os-volume-replication:driver_data": "ahasadfasdfasdfasdfsdf",
|
||||||
"snapshot_id": "93c2e2aa-7744-4fd6-a31a-80c4726b08d7",
|
"snapshot_id": "93c2e2aa-7744-4fd6-a31a-80c4726b08d7",
|
||||||
"encrypted": "false",
|
"encrypted": "false"
|
||||||
}
|
}
|
||||||
|
|
||||||
VOLUME_DETAIL = copy.copy(VOLUME)
|
|
||||||
VOLUME_DETAIL.update(DETAILS)
|
|
||||||
|
|
||||||
|
|
||||||
class TestVolume(base.TestCase):
|
class TestVolume(base.TestCase):
|
||||||
|
|
||||||
@ -108,6 +101,23 @@ class TestVolume(base.TestCase):
|
|||||||
sot.volume_image_metadata)
|
sot.volume_image_metadata)
|
||||||
self.assertEqual(VOLUME["size"], sot.size)
|
self.assertEqual(VOLUME["size"], sot.size)
|
||||||
self.assertEqual(VOLUME["imageRef"], sot.image_id)
|
self.assertEqual(VOLUME["imageRef"], sot.image_id)
|
||||||
|
self.assertEqual(VOLUME["os-vol-host-attr:host"], sot.host)
|
||||||
|
self.assertEqual(VOLUME["os-vol-tenant-attr:tenant_id"],
|
||||||
|
sot.project_id)
|
||||||
|
self.assertEqual(VOLUME["os-vol-mig-status-attr:migstat"],
|
||||||
|
sot.migration_status)
|
||||||
|
self.assertEqual(VOLUME["os-vol-mig-status-attr:name_id"],
|
||||||
|
sot.migration_id)
|
||||||
|
self.assertEqual(VOLUME["replication_status"],
|
||||||
|
sot.replication_status)
|
||||||
|
self.assertEqual(
|
||||||
|
VOLUME["os-volume-replication:extended_status"],
|
||||||
|
sot.extended_replication_status)
|
||||||
|
self.assertEqual(VOLUME["consistencygroup_id"],
|
||||||
|
sot.consistency_group_id)
|
||||||
|
self.assertEqual(VOLUME["os-volume-replication:driver_data"],
|
||||||
|
sot.replication_driver_data)
|
||||||
|
self.assertFalse(sot.is_encrypted)
|
||||||
|
|
||||||
def test_extend(self):
|
def test_extend(self):
|
||||||
sot = volume.Volume(**VOLUME)
|
sot = volume.Volume(**VOLUME)
|
||||||
@ -118,36 +128,3 @@ class TestVolume(base.TestCase):
|
|||||||
body = {"os-extend": {"new_size": "20"}}
|
body = {"os-extend": {"new_size": "20"}}
|
||||||
headers = {'Accept': ''}
|
headers = {'Accept': ''}
|
||||||
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
|
||||||
class TestVolumeDetail(base.TestCase):
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
sot = volume.VolumeDetail(VOLUME_DETAIL)
|
|
||||||
self.assertIsInstance(sot, volume.Volume)
|
|
||||||
self.assertEqual("/volumes/detail", sot.base_path)
|
|
||||||
self.assertFalse(sot.allow_fetch)
|
|
||||||
self.assertFalse(sot.allow_commit)
|
|
||||||
self.assertFalse(sot.allow_create)
|
|
||||||
self.assertFalse(sot.allow_delete)
|
|
||||||
self.assertTrue(sot.allow_list)
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
sot = volume.VolumeDetail(**VOLUME_DETAIL)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-host-attr:host"], sot.host)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-tenant-attr:tenant_id"],
|
|
||||||
sot.project_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-mig-status-attr:migstat"],
|
|
||||||
sot.migration_status)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-vol-mig-status-attr:name_id"],
|
|
||||||
sot.migration_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["replication_status"],
|
|
||||||
sot.replication_status)
|
|
||||||
self.assertEqual(
|
|
||||||
VOLUME_DETAIL["os-volume-replication:extended_status"],
|
|
||||||
sot.extended_replication_status)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["consistencygroup_id"],
|
|
||||||
sot.consistency_group_id)
|
|
||||||
self.assertEqual(VOLUME_DETAIL["os-volume-replication:driver_data"],
|
|
||||||
sot.replication_driver_data)
|
|
||||||
self.assertFalse(sot.is_encrypted)
|
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
deprecations:
|
||||||
|
- |
|
||||||
|
Requesting volumes or backups with details from block_storage will return
|
||||||
|
objects of classes Volume and Backup correspondingly, instead
|
||||||
|
of VolumeDetail and BackupDetail.
|
Loading…
Reference in New Issue
Block a user