Merge "Add support for volume transfer request list"

This commit is contained in:
Jenkins 2016-06-04 20:36:24 +00:00 committed by Gerrit Code Review
commit 1c097b777c
10 changed files with 471 additions and 4 deletions

View File

@ -0,0 +1,21 @@
=======================
volume transfer request
=======================
Block Storage v1, v2
volume transfer request list
----------------------------
Lists all volume transfer requests.
.. program:: volume transfer request list
.. code:: bash
os volume transfer request list
--all-projects
.. option:: --all-projects
Shows detail for all projects. Admin only.
(defaults to False)

View File

@ -137,6 +137,7 @@ referring to both Compute and Volume quotas.
* ``volume qos``: (**Volume**) quality-of-service (QoS) specification for volumes
* ``volume type``: (**Volume**) deployment-specific types of volumes available
* ``volume service``: (**Volume**) services to manage block storage operations
* ``volume transfer request``: (**Volume**) volume owner transfer request
Plugin Objects

View File

@ -129,6 +129,57 @@ QOS_WITH_ASSOCIATIONS = {
}
class FakeTransferClient(object):
def __init__(self, **kwargs):
self.transfers = mock.Mock()
self.transfers.resource_class = fakes.FakeResource(None, {})
class TestTransfer(utils.TestCommand):
def setUp(self):
super(TestTransfer, self).setUp()
self.app.client_manager.volume = FakeTransferClient(
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN
)
class FakeTransfer(object):
"""Fake one or more Transfer."""
@staticmethod
def create_one_transfer(attrs=None):
"""Create a fake transfer.
:param Dictionary attrs:
A dictionary with all attributes of Transfer Request
:retrun:
A FakeResource object with volume_id, name, id.
"""
# Set default attribute
transfer_info = {
'volume_id': 'ce26708d-a7f8-4b4b-9861-4a80256615a7',
'name': 'fake_transfer_name',
'id': '731a7f53-aa92-4fbd-9de3-6f7d729c926b'
}
# Overwrite default attributes if there are some attributes set
attrs = attrs or {}
transfer_info.update(attrs)
transfer = fakes.FakeResource(
None,
transfer_info,
loaded=True)
return transfer
class FakeServiceClient(object):
def __init__(self, **kwargs):
@ -171,8 +222,8 @@ class FakeService(object):
}
# Overwrite default attributes if there are some attributes set
if attrs is None:
attrs = {}
attrs = attrs or {}
service_info.update(attrs)
service = fakes.FakeResource(

View File

@ -0,0 +1,114 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
from openstackclient.tests.volume.v1 import fakes as transfer_fakes
from openstackclient.volume.v1 import volume_transfer_request
class TestTransfer(transfer_fakes.TestTransfer):
def setUp(self):
super(TestTransfer, self).setUp()
# Get a shortcut to the TransferManager Mock
self.transfer_mock = self.app.client_manager.volume.transfers
self.transfer_mock.reset_mock()
class TestTransferList(TestTransfer):
# The Transfers to be listed
volume_transfers = transfer_fakes.FakeTransfer.create_one_transfer()
def setUp(self):
super(TestTransferList, self).setUp()
self.transfer_mock.list.return_value = [self.volume_transfers]
# Get the command object to test
self.cmd = volume_transfer_request.ListTransferRequests(self.app, None)
def test_transfer_list_without_argument(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# In base command class Lister in cliff, abstract method take_action()
# returns a tuple containing the column names and an iterable
# containing the data to be listed.
columns, data = self.cmd.take_action(parsed_args)
expected_columns = [
'ID',
'Volume',
'Name',
]
# confirming if all expected columns are present in the result.
self.assertEqual(expected_columns, columns)
datalist = ((
self.volume_transfers.id,
self.volume_transfers.volume_id,
self.volume_transfers.name,
), )
# confirming if all expected values are present in the result.
self.assertEqual(datalist, tuple(data))
# checking if proper call was made to list volume_transfers
self.transfer_mock.list.assert_called_with(
detailed=True,
search_opts={'all_tenants': 0}
)
def test_transfer_list_with_argument(self):
arglist = [
"--all-projects"
]
verifylist = [
("all_projects", True)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# In base command class Lister in cliff, abstract method take_action()
# returns a tuple containing the column names and an iterable
# containing the data to be listed.
columns, data = self.cmd.take_action(parsed_args)
expected_columns = [
'ID',
'Volume',
'Name',
]
# confirming if all expected columns are present in the result.
self.assertEqual(expected_columns, columns)
datalist = ((
self.volume_transfers.id,
self.volume_transfers.volume_id,
self.volume_transfers.name,
), )
# confirming if all expected values are present in the result.
self.assertEqual(datalist, tuple(data))
# checking if proper call was made to list volume_transfers
self.transfer_mock.list.assert_called_with(
detailed=True,
search_opts={'all_tenants': 1}
)

View File

@ -232,6 +232,57 @@ EXTENSION = {
}
class FakeTransferClient(object):
def __init__(self, **kwargs):
self.transfers = mock.Mock()
self.transfers.resource_class = fakes.FakeResource(None, {})
class TestTransfer(utils.TestCommand):
def setUp(self):
super(TestTransfer, self).setUp()
self.app.client_manager.volume = FakeTransferClient(
endpoint=fakes.AUTH_URL,
token=fakes.AUTH_TOKEN
)
class FakeTransfer(object):
"""Fake one or more Transfer."""
@staticmethod
def create_one_transfer(attrs=None):
"""Create a fake transfer.
:param Dictionary attrs:
A dictionary with all attributes of Transfer Request
:retrun:
A FakeResource object with volume_id, name, id.
"""
# Set default attribute
transfer_info = {
'volume_id': 'ce26708d-a7f8-4b4b-9861-4a80256615a7',
'name': 'fake_transfer_name',
'id': '731a7f53-aa92-4fbd-9de3-6f7d729c926b'
}
# Overwrite default attributes if there are some attributes set
attrs = attrs or {}
transfer_info.update(attrs)
transfer = fakes.FakeResource(
None,
transfer_info,
loaded=True)
return transfer
class FakeServiceClient(object):
def __init__(self, **kwargs):
@ -274,8 +325,8 @@ class FakeService(object):
}
# Overwrite default attributes if there are some attributes set
if attrs is None:
attrs = {}
attrs = attrs or {}
service_info.update(attrs)
service = fakes.FakeResource(

View File

@ -0,0 +1,114 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
from openstackclient.tests.volume.v2 import fakes as transfer_fakes
from openstackclient.volume.v2 import volume_transfer_request
class TestTransfer(transfer_fakes.TestTransfer):
def setUp(self):
super(TestTransfer, self).setUp()
# Get a shortcut to the TransferManager Mock
self.transfer_mock = self.app.client_manager.volume.transfers
self.transfer_mock.reset_mock()
class TestTransferList(TestTransfer):
# The Transfers to be listed
volume_transfers = transfer_fakes.FakeTransfer.create_one_transfer()
def setUp(self):
super(TestTransferList, self).setUp()
self.transfer_mock.list.return_value = [self.volume_transfers]
# Get the command object to test
self.cmd = volume_transfer_request.ListTransferRequests(self.app, None)
def test_transfer_list_without_argument(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# In base command class Lister in cliff, abstract method take_action()
# returns a tuple containing the column names and an iterable
# containing the data to be listed.
columns, data = self.cmd.take_action(parsed_args)
expected_columns = [
'ID',
'Volume',
'Name',
]
# confirming if all expected columns are present in the result.
self.assertEqual(expected_columns, columns)
datalist = ((
self.volume_transfers.id,
self.volume_transfers.volume_id,
self.volume_transfers.name,
), )
# confirming if all expected values are present in the result.
self.assertEqual(datalist, tuple(data))
# checking if proper call was made to list volume_transfers
self.transfer_mock.list.assert_called_with(
detailed=True,
search_opts={'all_tenants': 0}
)
def test_transfer_list_with_argument(self):
arglist = [
"--all-projects"
]
verifylist = [
("all_projects", True)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# In base command class Lister in cliff, abstract method take_action()
# returns a tuple containing the column names and an iterable
# containing the data to be listed.
columns, data = self.cmd.take_action(parsed_args)
expected_columns = [
'ID',
'Volume',
'Name',
]
# confirming if all expected columns are present in the result.
self.assertEqual(expected_columns, columns)
datalist = ((
self.volume_transfers.id,
self.volume_transfers.volume_id,
self.volume_transfers.name,
), )
# confirming if all expected values are present in the result.
self.assertEqual(datalist, tuple(data))
# checking if proper call was made to list volume_transfers
self.transfer_mock.list.assert_called_with(
detailed=True,
search_opts={'all_tenants': 1}
)

View File

@ -0,0 +1,51 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
"""Volume v2 transfer action implementations"""
from openstackclient.common import command
from openstackclient.common import utils
from openstackclient.i18n import _
class ListTransferRequests(command.Lister):
"""Lists all volume transfer requests."""
def get_parser(self, prog_name):
parser = super(ListTransferRequests, self).get_parser(prog_name)
parser.add_argument(
'--all-projects',
dest='all_projects',
action="store_true",
default=False,
help=_('Shows detail for all projects. Admin only. '
'(defaults to False)')
)
return parser
def take_action(self, parsed_args):
columns = ['ID', 'Volume ID', 'Name']
column_headers = ['ID', 'Volume', 'Name']
volume_client = self.app.client_manager.volume
volume_transfer_result = volume_client.transfers.list(
detailed=True,
search_opts={'all_tenants': parsed_args.all_projects}
)
return (column_headers, (
utils.get_item_properties(s, columns)
for s in volume_transfer_result))

View File

@ -0,0 +1,51 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
"""Volume v2 transfer action implementations"""
from openstackclient.common import command
from openstackclient.common import utils
from openstackclient.i18n import _
class ListTransferRequests(command.Lister):
"""Lists all volume transfer requests."""
def get_parser(self, prog_name):
parser = super(ListTransferRequests, self).get_parser(prog_name)
parser.add_argument(
'--all-projects',
dest='all_projects',
action="store_true",
default=False,
help=_('Shows detail for all projects. Admin only. '
'(defaults to False)')
)
return parser
def take_action(self, parsed_args):
columns = ['ID', 'Volume ID', 'Name']
column_headers = ['ID', 'Volume', 'Name']
volume_client = self.app.client_manager.volume
volume_transfer_result = volume_client.transfers.list(
detailed=True,
search_opts={'all_tenants': parsed_args.all_projects}
)
return (column_headers, (
utils.get_item_properties(s, columns)
for s in volume_transfer_result))

View File

@ -0,0 +1,9 @@
---
features:
- |
Adds support for volume transfer request.
An user can list available volume transfer requests using
``volume transfer request list``
[Bug `1554886 <https://bugs.launchpad.net/bugs/1554886>`_]

View File

@ -444,6 +444,8 @@ openstack.volume.v1 =
volume_service_list = openstackclient.volume.v1.service:ListService
volume_transfer_request_list = openstackclient.volume.v1.volume_transfer_request:ListTransferRequests
openstack.volume.v2 =
backup_create = openstackclient.volume.v2.backup:CreateBackup
backup_delete = openstackclient.volume.v2.backup:DeleteBackup
@ -483,6 +485,8 @@ openstack.volume.v2 =
volume_service_list = openstackclient.volume.v2.service:ListService
volume_transfer_request_list = openstackclient.volume.v2.volume_transfer_request:ListTransferRequests
[build_sphinx]
source-dir = doc/source
build-dir = doc/build