Skip to content

Commit c88b433

Browse files
author
Amey Bhide
committed
Add support for volume snapshot v2 command
openstack snapshot create openstack snapshot set openstack snapshot unset openstack snapshot list Implements: blueprint volume-v2 Change-Id: Ia1d9f4426baa0099281a9931f4eec99ebe1969b1
1 parent 7e067c6 commit c88b433

4 files changed

Lines changed: 401 additions & 6 deletions

File tree

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

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

15+
import copy
1516
import mock
1617

1718
from openstackclient.tests import fakes
@@ -62,11 +63,17 @@
6263
"name": snapshot_name,
6364
"description": snapshot_description,
6465
"size": snapshot_size,
65-
"metadata": snapshot_metadata
66+
"status": "available",
67+
"metadata": snapshot_metadata,
68+
"created_at": "2015-06-03T18:49:19.000000",
69+
"volume_id": volume_name
6670
}
67-
68-
SNAPSHOT_columns = tuple(sorted(SNAPSHOT))
69-
SNAPSHOT_data = tuple((SNAPSHOT[x] for x in sorted(SNAPSHOT)))
71+
EXPECTED_SNAPSHOT = copy.deepcopy(SNAPSHOT)
72+
EXPECTED_SNAPSHOT.pop("metadata")
73+
EXPECTED_SNAPSHOT['properties'] = "foo='bar'"
74+
SNAPSHOT_columns = tuple(sorted(EXPECTED_SNAPSHOT))
75+
SNAPSHOT_data = tuple((EXPECTED_SNAPSHOT[x]
76+
for x in sorted(EXPECTED_SNAPSHOT)))
7077

7178

7279
type_id = "5520dc9e-6f9b-4378-a719-729911c0f407"

‎openstackclient/tests/volume/v2/test_snapshot.py‎

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,53 @@ def setUp(self):
2626

2727
self.snapshots_mock = self.app.client_manager.volume.volume_snapshots
2828
self.snapshots_mock.reset_mock()
29+
self.volumes_mock = self.app.client_manager.volume.volumes
30+
self.volumes_mock.reset_mock()
31+
32+
33+
class TestSnapshotCreate(TestSnapshot):
34+
def setUp(self):
35+
super(TestSnapshotCreate, self).setUp()
36+
37+
self.volumes_mock.get.return_value = fakes.FakeResource(
38+
None,
39+
copy.deepcopy(volume_fakes.VOLUME),
40+
loaded=True
41+
)
42+
43+
self.snapshots_mock.create.return_value = fakes.FakeResource(
44+
None,
45+
copy.deepcopy(volume_fakes.SNAPSHOT),
46+
loaded=True
47+
)
48+
# Get the command object to test
49+
self.cmd = snapshot.CreateSnapshot(self.app, None)
50+
51+
def test_snapshot_create(self):
52+
arglist = [
53+
volume_fakes.volume_id,
54+
"--name", volume_fakes.snapshot_name,
55+
"--description", volume_fakes.snapshot_description,
56+
"--force"
57+
]
58+
verifylist = [
59+
("volume", volume_fakes.volume_id),
60+
("name", volume_fakes.snapshot_name),
61+
("description", volume_fakes.snapshot_description),
62+
("force", True)
63+
]
64+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
65+
66+
columns, data = self.cmd.take_action(parsed_args)
67+
68+
self.snapshots_mock.create.assert_called_with(
69+
volume_fakes.volume_id,
70+
force=True,
71+
name=volume_fakes.snapshot_name,
72+
description=volume_fakes.snapshot_description
73+
)
74+
self.assertEqual(columns, volume_fakes.SNAPSHOT_columns)
75+
self.assertEqual(data, volume_fakes.SNAPSHOT_data)
2976

3077

3178
class TestSnapshotShow(TestSnapshot):
@@ -80,3 +127,139 @@ def test_snapshot_delete(self):
80127

81128
self.cmd.take_action(parsed_args)
82129
self.snapshots_mock.delete.assert_called_with(volume_fakes.snapshot_id)
130+
131+
132+
class TestSnapshotSet(TestSnapshot):
133+
def setUp(self):
134+
super(TestSnapshotSet, self).setUp()
135+
136+
self.snapshots_mock.get.return_value = fakes.FakeResource(
137+
None,
138+
copy.deepcopy(volume_fakes.SNAPSHOT),
139+
loaded=True
140+
)
141+
self.snapshots_mock.set_metadata.return_value = None
142+
self.snapshots_mock.update.return_value = None
143+
# Get the command object to mock
144+
self.cmd = snapshot.SetSnapshot(self.app, None)
145+
146+
def test_snapshot_set(self):
147+
arglist = [
148+
volume_fakes.snapshot_id,
149+
"--name", "new_snapshot",
150+
"--property", "x=y",
151+
"--property", "foo=foo"
152+
]
153+
new_property = {"x": "y", "foo": "foo"}
154+
verifylist = [
155+
("snapshot", volume_fakes.snapshot_id),
156+
("name", "new_snapshot"),
157+
("property", new_property)
158+
]
159+
160+
kwargs = {
161+
"name": "new_snapshot",
162+
}
163+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
164+
self.cmd.take_action(parsed_args)
165+
166+
self.snapshots_mock.update.assert_called_with(
167+
volume_fakes.snapshot_id, **kwargs)
168+
self.snapshots_mock.set_metadata.assert_called_with(
169+
volume_fakes.snapshot_id, new_property
170+
)
171+
172+
173+
class TestSnapshotUnset(TestSnapshot):
174+
def setUp(self):
175+
super(TestSnapshotUnset, self).setUp()
176+
177+
self.snapshots_mock.get.return_value = fakes.FakeResource(
178+
None,
179+
copy.deepcopy(volume_fakes.SNAPSHOT),
180+
loaded=True
181+
)
182+
self.snapshots_mock.delete_metadata.return_value = None
183+
# Get the command object to mock
184+
self.cmd = snapshot.UnsetSnapshot(self.app, None)
185+
186+
def test_snapshot_unset(self):
187+
arglist = [
188+
volume_fakes.snapshot_id,
189+
"--property", "foo"
190+
]
191+
verifylist = [
192+
("snapshot", volume_fakes.snapshot_id),
193+
("property", ["foo"])
194+
]
195+
196+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
197+
self.cmd.take_action(parsed_args)
198+
199+
self.snapshots_mock.delete_metadata.assert_called_with(
200+
volume_fakes.snapshot_id, ["foo"]
201+
)
202+
203+
204+
class TestSnapshotList(TestSnapshot):
205+
def setUp(self):
206+
super(TestSnapshotList, self).setUp()
207+
208+
self.volumes_mock.list.return_value = [
209+
fakes.FakeResource(
210+
None,
211+
copy.deepcopy(volume_fakes.VOLUME),
212+
loaded=True
213+
)
214+
]
215+
self.snapshots_mock.list.return_value = [
216+
fakes.FakeResource(
217+
None,
218+
copy.deepcopy(volume_fakes.SNAPSHOT),
219+
loaded=True
220+
)
221+
]
222+
# Get the command to test
223+
self.cmd = snapshot.ListSnapshot(self.app, None)
224+
225+
def test_snapshot_list_without_options(self):
226+
arglist = []
227+
verifylist = [
228+
("long", False)
229+
]
230+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
231+
232+
columns, data = self.cmd.take_action(parsed_args)
233+
collist = ["ID", "Name", "Description", "Status", "Size"]
234+
self.assertEqual(collist, columns)
235+
datalist = ((
236+
volume_fakes.snapshot_id,
237+
volume_fakes.snapshot_name,
238+
volume_fakes.snapshot_description,
239+
"available",
240+
volume_fakes.snapshot_size
241+
),)
242+
self.assertEqual(datalist, tuple(data))
243+
244+
def test_snapshot_list_with_options(self):
245+
arglist = ["--long"]
246+
verifylist = [("long", True)]
247+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
248+
249+
columns, data = self.cmd.take_action(parsed_args)
250+
251+
collist = ["ID", "Name", "Description", "Status", "Size", "Created At",
252+
"Volume", "Properties"]
253+
self.assertEqual(collist, columns)
254+
255+
datalist = ((
256+
volume_fakes.snapshot_id,
257+
volume_fakes.snapshot_name,
258+
volume_fakes.snapshot_description,
259+
"available",
260+
volume_fakes.snapshot_size,
261+
"2015-06-03T18:49:19.000000",
262+
volume_fakes.volume_name,
263+
volume_fakes.EXPECTED_SNAPSHOT.get("properties")
264+
),)
265+
self.assertEqual(datalist, tuple(data))

0 commit comments

Comments
 (0)