From 570348fc955e14345ab5691467535e695f5a77f3 Mon Sep 17 00:00:00 2001 From: Rafael Galarza Date: Thu, 14 Apr 2016 15:52:41 -0500 Subject: [PATCH] Added volume_transfer client models for v1 and v2 -removed instances of v1 on url and comments -changed names for clarity Change-Id: Ifd26389b399d9bc3b5d4bfba52112c49613cee6c --- .../blockstorage/volumes_api/common/client.py | 86 ++++++++++ .../volumes_api/common/models/requests.py | 15 ++ .../volumes_api/common/models/responses.py | 160 ++++++++++++++++++ .../volumes_api/v1/models/requests.py | 2 +- .../volumes_api/v2/models/requests.py | 2 +- 5 files changed, 263 insertions(+), 2 deletions(-) diff --git a/cloudcafe/blockstorage/volumes_api/common/client.py b/cloudcafe/blockstorage/volumes_api/common/client.py index 868f4091..41827f9a 100644 --- a/cloudcafe/blockstorage/volumes_api/common/client.py +++ b/cloudcafe/blockstorage/volumes_api/common/client.py @@ -265,3 +265,89 @@ class BaseVolumesClient(AutoMarshallingHTTPClient): 'GET', url, response_entity_type=self.response_models.QuotaSet, requestslib_kwargs=requestslib_kwargs) + + # Volume Transfers + def create_volume_transfer( + self, target_tenant_id, volume_id, name=None, + requestslib_kwargs=None): + """POST /{target_tenant_id}/os-volume-transfer""" + + url = '{url}/{target_tenant_id}/os-volume-transfer'.format( + url=self.url, target_tenant_id=target_tenant_id) + + request_entity = self.request_models.VolumeTransferRequest( + volume_id=volume_id, name=name) + + return self.request( + 'POST', url, request_entity=request_entity, + response_entity_type=self.response_models.VolumeTransferResponse, + requestslib_kwargs=requestslib_kwargs) + + def list_all_volume_transfers( + self, target_tenant_id, requestslib_kwargs=None): + """GET /{tenant_id}/os-volume-transfer""" + + url = '{url}/{target_tenant_id}/os-volume-transfer'.format( + url=self.url, target_tenant_id=target_tenant_id) + + return self.request( + 'GET', url, + response_entity_type=self.response_models. + VolumeTransfersListResponse, + requestslib_kwargs=requestslib_kwargs) + + def list_all_volume_transfers_info( + self, target_tenant_id, requestslib_kwargs=None): + """GET /{tenant_id}/os-volume-transfer/detail""" + + url = '{url}/{target_tenant_id}/os-volume-transfer/detail'.format( + url=self.url, target_tenant_id=target_tenant_id) + + return self.request( + 'GET', url, + response_entity_type=self.response_models. + VolumeTransfersListDetailedResponse, + requestslib_kwargs=requestslib_kwargs) + + def get_volume_transfer( + self, target_tenant_id, target_transfer_id, + requestslib_kwargs=None): + """GET /{tenant_id}/os-volume-transfer/{transfer_id}""" + + url = '{url}/{target_tenant_id}/os-volume-transfer/ \ + {target_transfer_id}'.format( + url=self.url, target_tenant_id=target_tenant_id, + target_transfer_id=target_transfer_id) + + return self.request( + 'GET', url, response_entity_type=self.response_models. + VolumeTransferDetailedResponse, + requestslib_kwargs=requestslib_kwargs) + + def delete_volume_transfer( + self, target_tenant_id, target_transfer_id, + requestslib_kwargs=None): + """DELETE /{tenant_id}/os-volume-transfer/{transfer_id}""" + + url = '{url}/{target_tenant_id}/os-volume-transfer/ \ + {target_transfer_id}'.format( + url=self.url, target_tenant_id=target_tenant_id, + target_transfer_id=target_transfer_id) + + return self.request( + 'DELETE', url, requestslib_kwargs=requestslib_kwargs) + + def accept_volume_transfer( + self, target_tenant_id, target_transfer_id, + requestslib_kwargs=None): + """POST /{tenant_id}/os-volume-transfer/{transfer_id}/accept""" + + url = '{url}/{target_tenant_id}/os-volume-transfer/ \ + {target_transfer_id}/accept'.format( + url=self.url, target_tenant_id=target_tenant_id, + target_transfer_id=target_transfer_id) + + return self.request( + 'POST', url, response_entity_type=self.response_models. + VolumeTransferAcceptResponse, + requestslib_kwargs=requestslib_kwargs) diff --git a/cloudcafe/blockstorage/volumes_api/common/models/requests.py b/cloudcafe/blockstorage/volumes_api/common/models/requests.py index a621510d..2310efcf 100644 --- a/cloudcafe/blockstorage/volumes_api/common/models/requests.py +++ b/cloudcafe/blockstorage/volumes_api/common/models/requests.py @@ -10,3 +10,18 @@ class StatusResetRequest(AutoMarshallingModel): def _obj_to_json(self): data = {"os-reset_status": {"status": self.status}} return json.dumps(data) + + +class VolumeTransferRequest(AutoMarshallingModel): + def __init__(self, volume_id=None, name=None): + super(VolumeTransferRequest, self).__init__() + self.volume_id = volume_id + self.name = name + + def _obj_to_json(self): + volume_attrs = { + "volume_id": self.volume_id, + "name": self.name} + + return json.dumps( + {'transfer': self._remove_empty_values(volume_attrs)}) diff --git a/cloudcafe/blockstorage/volumes_api/common/models/responses.py b/cloudcafe/blockstorage/volumes_api/common/models/responses.py index 9c6f38cb..5d8c316f 100644 --- a/cloudcafe/blockstorage/volumes_api/common/models/responses.py +++ b/cloudcafe/blockstorage/volumes_api/common/models/responses.py @@ -1,6 +1,24 @@ import json from cafe.engine.models.base import \ AutoMarshallingDictModel, AutoMarshallingModel +from cloudcafe.blockstorage.volumes_api.common.models.automarshalling import \ + _VolumesAPIBaseModel, _VolumesAPIBaseListModel + + +class _LinksItem(_VolumesAPIBaseModel): + kwarg_map = { + "href": "href", + "rel": "rel"} + + def __init__(self, href=None, rel=None): + super(_LinksItem, self).__init__() + self.href = href + self.rel = rel + + +class _LinksList(_VolumesAPIBaseListModel): + list_model_key = 'links' + ObjectModel = _LinksItem class QuotaUsageResponse(AutoMarshallingDictModel): @@ -57,3 +75,145 @@ class QuotaSet(AutoMarshallingModel): for k, v in data.items(): setattr(quotaset, k, v) return quotaset + + +class VolumeTransferResponse(_VolumesAPIBaseModel): + obj_model_key = 'transfer' + kwarg_map = { + "id_": "id", + "created_at": "created_at", + "name": "name", + "volume_id": "volume_id", + "auth_key": "auth_key", + "links": "links"} + + def __init__( + self, id_=None, created_at=None, name=None, volume_id=None, + auth_key=None, links=None): + + super(VolumeTransferResponse, self).__init__() + self.id_ = id_ + self.created_at = created_at + self.name = name + self.volume_id = volume_id + self.auth_key = auth_key + self.links = links + + @classmethod + def _json_dict_to_obj(cls, json_dict): + volume_transfer = cls._map_values_to_kwargs(json_dict) + volume_transfer.links = _LinksList._json_dict_to_obj( + volume_transfer.links) + return volume_transfer + + +class _VolumeTransfersListResponseItem(_VolumesAPIBaseModel): + kwarg_map = { + "id_": "id", + "name": "name", + "volume_id": "volume_id", + "links": "links"} + + def __init__( + self, id_=None, name=None, volume_id=None, links=None): + + super(_VolumeTransfersListResponseItem, self).__init__() + self.id_ = id_ + self.name = name + self.volume_id = volume_id + self.links = links + + @classmethod + def _json_dict_to_obj(cls, json_dict): + volume_transfer = cls._map_values_to_kwargs(json_dict) + volume_transfer.links = _LinksList._json_dict_to_obj( + volume_transfer.links) + return volume_transfer + + +class VolumeTransfersListResponse(_VolumesAPIBaseListModel): + list_model_key = 'transfers' + ObjectModel = _VolumeTransfersListResponseItem + + +class _VolumeTransfersListDetailedResponseItem(_VolumesAPIBaseModel): + kwarg_map = { + "id_": "id", + "created_at": "created_at", + "name": "name", + "volume_id": "volume_id", + "links": "links"} + + def __init__( + self, id_=None, created_at=None, name=None, volume_id=None, + links=None): + + super(_VolumeTransfersListDetailedResponseItem, self).__init__() + self.id_ = id_ + self.created_at = created_at + self.name = name + self.volume_id = volume_id + self.links = links + + @classmethod + def _json_dict_to_obj(cls, json_dict): + volume_transfer = cls._map_values_to_kwargs(json_dict) + volume_transfer.links = _LinksList._json_dict_to_obj( + volume_transfer.links) + return volume_transfer + + +class VolumeTransfersListDetailedResponse(_VolumesAPIBaseListModel): + list_model_key = 'transfers' + ObjectModel = _VolumeTransfersListDetailedResponseItem + + +class VolumeTransferDetailedResponse(_VolumesAPIBaseModel): + kwarg_map = { + "id_": "id", + "created_at": "created_at", + "name": "name", + "volume_id": "volume_id", + "links": "links"} + + def __init__( + self, id_=None, created_at=None, name=None, volume_id=None, + links=None): + + super(VolumeTransferDetailedResponse, self).__init__() + self.id_ = id_ + self.created_at = created_at + self.name = name + self.volume_id = volume_id + self.links = links + + @classmethod + def _json_dict_to_obj(cls, json_dict): + volume_transfer = cls._map_values_to_kwargs(json_dict) + volume_transfer.links = _LinksList._json_dict_to_obj( + volume_transfer.links) + return volume_transfer + + +class VolumeTransferAcceptResponse(_VolumesAPIBaseModel): + kwarg_map = { + "id_": "id", + "name": "name", + "volume_id": "volume_id", + "links": "links"} + + def __init__( + self, id_=None, name=None, volume_id=None, links=None): + + super(VolumeTransferAcceptResponse, self).__init__() + self.id_ = id_ + self.name = name + self.volume_id = volume_id + self.links = links + + @classmethod + def _json_dict_to_obj(cls, json_dict): + volume_transfer = cls._map_values_to_kwargs(json_dict) + volume_transfer.links = _LinksList._json_dict_to_obj( + volume_transfer.links) + return volume_transfer diff --git a/cloudcafe/blockstorage/volumes_api/v1/models/requests.py b/cloudcafe/blockstorage/volumes_api/v1/models/requests.py index 49114641..d5126bb5 100644 --- a/cloudcafe/blockstorage/volumes_api/v1/models/requests.py +++ b/cloudcafe/blockstorage/volumes_api/v1/models/requests.py @@ -23,7 +23,7 @@ from cloudcafe.blockstorage.volumes_api.common.models.automarshalling import \ # Import common requests from cloudcafe.blockstorage.volumes_api.common.models.requests import \ - StatusResetRequest + StatusResetRequest, VolumeTransferRequest class VolumeRequest(CommonModelProperties, AutoMarshallingModel): diff --git a/cloudcafe/blockstorage/volumes_api/v2/models/requests.py b/cloudcafe/blockstorage/volumes_api/v2/models/requests.py index 24be9714..edd0a919 100644 --- a/cloudcafe/blockstorage/volumes_api/v2/models/requests.py +++ b/cloudcafe/blockstorage/volumes_api/v2/models/requests.py @@ -23,7 +23,7 @@ from cloudcafe.blockstorage.volumes_api.common.models.automarshalling import \ # Import common requests from cloudcafe.blockstorage.volumes_api.common.models.requests import \ - StatusResetRequest + StatusResetRequest, VolumeTransferRequest class VolumeRequest(CommonModelProperties, AutoMarshallingModel):