Skip to content

Commit d2273ec

Browse files
Huanxuan Aoranasheel2000
andcommitted
Implement "volume transfer request delete" command
Add "volume transfer request delete" command in volume v1 and v2. Also add the unit tests, docs, release note and functional tests Change-Id: Ic3d375bc8df3312fac53c1800d75f48376b8c91c Implements: bp cinder-command-support Co-Authored-By: Sheel Rana <ranasheel2000@gmail.com>
1 parent 6f4acc4 commit d2273ec

11 files changed

Lines changed: 450 additions & 1 deletion

File tree

doc/source/command-objects/volume-transfer-request.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,22 @@ Create volume transfer request
2525

2626
Volume to transfer (name or ID)
2727

28+
volume transfer request delete
29+
------------------------------
30+
31+
Delete volume transfer request(s)
32+
33+
.. program:: volume transfer request delete
34+
.. code:: bash
35+
36+
os volume transfer request delete
37+
<transfer-request> [<transfer-request> ...]
38+
39+
.. _volume_transfer_request_delete-transfer-request:
40+
.. describe:: <transfer-request>
41+
42+
Volume transfer request(s) to delete (name or ID)
43+
2844
volume transfer request list
2945
----------------------------
3046

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
13+
import uuid
14+
15+
from openstackclient.tests.functional.volume.v1 import common
16+
17+
18+
class TransferRequestTests(common.BaseVolumeTests):
19+
"""Functional tests for transfer request. """
20+
21+
NAME = uuid.uuid4().hex
22+
VOLUME_NAME = uuid.uuid4().hex
23+
HEADERS = ['Name']
24+
FIELDS = ['name']
25+
26+
@classmethod
27+
def setUpClass(cls):
28+
super(TransferRequestTests, cls).setUpClass()
29+
opts = cls.get_opts(['display_name'])
30+
raw_output = cls.openstack(
31+
'volume create --size 1 ' + cls.VOLUME_NAME + opts)
32+
cls.assertOutput(cls.VOLUME_NAME + '\n', raw_output)
33+
34+
opts = cls.get_opts(cls.FIELDS)
35+
raw_output = cls.openstack(
36+
'volume transfer request create ' +
37+
cls.VOLUME_NAME +
38+
' --name ' + cls.NAME + opts)
39+
cls.assertOutput(cls.NAME + '\n', raw_output)
40+
41+
@classmethod
42+
def tearDownClass(cls):
43+
raw_output_transfer = cls.openstack(
44+
'volume transfer request delete ' + cls.NAME)
45+
raw_output_volume = cls.openstack(
46+
'volume delete ' + cls.VOLUME_NAME)
47+
cls.assertOutput('', raw_output_transfer)
48+
cls.assertOutput('', raw_output_volume)
49+
50+
def test_volume_transfer_request_list(self):
51+
opts = self.get_opts(self.HEADERS)
52+
raw_output = self.openstack('volume transfer request list' + opts)
53+
self.assertIn(self.NAME, raw_output)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
13+
import uuid
14+
15+
from openstackclient.tests.functional.volume.v2 import common
16+
17+
18+
class TransferRequestTests(common.BaseVolumeTests):
19+
"""Functional tests for transfer request. """
20+
21+
NAME = uuid.uuid4().hex
22+
VOLUME_NAME = uuid.uuid4().hex
23+
HEADERS = ['Name']
24+
FIELDS = ['name']
25+
26+
@classmethod
27+
def setUpClass(cls):
28+
super(TransferRequestTests, cls).setUpClass()
29+
opts = cls.get_opts(cls.FIELDS)
30+
31+
raw_output = cls.openstack(
32+
'volume create --size 1 ' + cls.VOLUME_NAME + opts)
33+
cls.assertOutput(cls.VOLUME_NAME + '\n', raw_output)
34+
35+
raw_output = cls.openstack(
36+
'volume transfer request create ' +
37+
cls.VOLUME_NAME +
38+
' --name ' + cls.NAME + opts)
39+
cls.assertOutput(cls.NAME + '\n', raw_output)
40+
41+
@classmethod
42+
def tearDownClass(cls):
43+
raw_output_transfer = cls.openstack(
44+
'volume transfer request delete ' + cls.NAME)
45+
raw_output_volume = cls.openstack(
46+
'volume delete ' + cls.VOLUME_NAME)
47+
cls.assertOutput('', raw_output_transfer)
48+
cls.assertOutput('', raw_output_volume)
49+
50+
def test_volume_transfer_request_list(self):
51+
opts = self.get_opts(self.HEADERS)
52+
raw_output = self.openstack('volume transfer request list' + opts)
53+
self.assertIn(self.NAME, raw_output)

openstackclient/tests/unit/volume/v1/fakes.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,43 @@ def create_one_transfer(attrs=None):
166166

167167
return transfer
168168

169+
@staticmethod
170+
def create_transfers(attrs=None, count=2):
171+
"""Create multiple fake transfers.
172+
173+
:param Dictionary attrs:
174+
A dictionary with all attributes of transfer
175+
:param Integer count:
176+
The number of transfers to be faked
177+
:return:
178+
A list of FakeResource objects
179+
"""
180+
transfers = []
181+
for n in range(0, count):
182+
transfers.append(FakeTransfer.create_one_transfer(attrs))
183+
184+
return transfers
185+
186+
@staticmethod
187+
def get_transfers(transfers=None, count=2):
188+
"""Get an iterable MagicMock object with a list of faked transfers.
189+
190+
If transfers list is provided, then initialize the Mock object with the
191+
list. Otherwise create one.
192+
193+
:param List transfers:
194+
A list of FakeResource objects faking transfers
195+
:param Integer count:
196+
The number of transfers to be faked
197+
:return
198+
An iterable Mock object with side_effect set to a list of faked
199+
transfers
200+
"""
201+
if transfers is None:
202+
transfers = FakeTransfer.create_transfers(count)
203+
204+
return mock.MagicMock(side_effect=transfers)
205+
169206

170207
class FakeService(object):
171208
"""Fake one or more Services."""

openstackclient/tests/unit/volume/v1/test_transfer_request.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
# under the License.
1313
#
1414

15+
import mock
16+
from mock import call
17+
18+
from osc_lib import exceptions
19+
from osc_lib import utils
20+
1521
from openstackclient.tests.unit.volume.v1 import fakes as transfer_fakes
1622
from openstackclient.volume.v1 import volume_transfer_request
1723

@@ -97,6 +103,84 @@ def test_transfer_create_with_name(self):
97103
self.assertEqual(self.data, data)
98104

99105

106+
class TestTransferDelete(TestTransfer):
107+
108+
volume_transfers = transfer_fakes.FakeTransfer.create_transfers(count=2)
109+
110+
def setUp(self):
111+
super(TestTransferDelete, self).setUp()
112+
113+
self.transfer_mock.get = (
114+
transfer_fakes.FakeTransfer.get_transfers(self.volume_transfers))
115+
self.transfer_mock.delete.return_value = None
116+
117+
# Get the command object to mock
118+
self.cmd = volume_transfer_request.DeleteTransferRequest(
119+
self.app, None)
120+
121+
def test_transfer_delete(self):
122+
arglist = [
123+
self.volume_transfers[0].id
124+
]
125+
verifylist = [
126+
("transfer_request", [self.volume_transfers[0].id])
127+
]
128+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
129+
130+
result = self.cmd.take_action(parsed_args)
131+
132+
self.transfer_mock.delete.assert_called_with(
133+
self.volume_transfers[0].id)
134+
self.assertIsNone(result)
135+
136+
def test_delete_multiple_transfers(self):
137+
arglist = []
138+
for v in self.volume_transfers:
139+
arglist.append(v.id)
140+
verifylist = [
141+
('transfer_request', arglist),
142+
]
143+
144+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
145+
result = self.cmd.take_action(parsed_args)
146+
147+
calls = []
148+
for v in self.volume_transfers:
149+
calls.append(call(v.id))
150+
self.transfer_mock.delete.assert_has_calls(calls)
151+
self.assertIsNone(result)
152+
153+
def test_delete_multiple_transfers_with_exception(self):
154+
arglist = [
155+
self.volume_transfers[0].id,
156+
'unexist_transfer',
157+
]
158+
verifylist = [
159+
('transfer_request', arglist),
160+
]
161+
162+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
163+
164+
find_mock_result = [self.volume_transfers[0], exceptions.CommandError]
165+
with mock.patch.object(utils, 'find_resource',
166+
side_effect=find_mock_result) as find_mock:
167+
try:
168+
self.cmd.take_action(parsed_args)
169+
self.fail('CommandError should be raised.')
170+
except exceptions.CommandError as e:
171+
self.assertEqual('1 of 2 volume transfer requests failed '
172+
'to delete.', str(e))
173+
174+
find_mock.assert_any_call(
175+
self.transfer_mock, self.volume_transfers[0].id)
176+
find_mock.assert_any_call(self.transfer_mock, 'unexist_transfer')
177+
178+
self.assertEqual(2, find_mock.call_count)
179+
self.transfer_mock.delete.assert_called_once_with(
180+
self.volume_transfers[0].id,
181+
)
182+
183+
100184
class TestTransferList(TestTransfer):
101185

102186
# The Transfers to be listed

openstackclient/tests/unit/volume/v2/fakes.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,43 @@ def create_one_transfer(attrs=None):
5959

6060
return transfer
6161

62+
@staticmethod
63+
def create_transfers(attrs=None, count=2):
64+
"""Create multiple fake transfers.
65+
66+
:param Dictionary attrs:
67+
A dictionary with all attributes of transfer
68+
:param Integer count:
69+
The number of transfers to be faked
70+
:return:
71+
A list of FakeResource objects
72+
"""
73+
transfers = []
74+
for n in range(0, count):
75+
transfers.append(FakeTransfer.create_one_transfer(attrs))
76+
77+
return transfers
78+
79+
@staticmethod
80+
def get_transfers(transfers=None, count=2):
81+
"""Get an iterable MagicMock object with a list of faked transfers.
82+
83+
If transfers list is provided, then initialize the Mock object with the
84+
list. Otherwise create one.
85+
86+
:param List transfers:
87+
A list of FakeResource objects faking transfers
88+
:param Integer count:
89+
The number of transfers to be faked
90+
:return
91+
An iterable Mock object with side_effect set to a list of faked
92+
transfers
93+
"""
94+
if transfers is None:
95+
transfers = FakeTransfer.create_transfers(count)
96+
97+
return mock.MagicMock(side_effect=transfers)
98+
6299

63100
class FakeTypeAccess(object):
64101
"""Fake one or more volume type access."""

0 commit comments

Comments
 (0)