python-openstackclient 8.0.0__py3-none-any.whl → 8.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openstackclient/compute/client.py +5 -0
- openstackclient/compute/v2/console.py +7 -0
- openstackclient/compute/v2/console_connection.py +48 -0
- openstackclient/compute/v2/keypair.py +10 -3
- openstackclient/compute/v2/server.py +75 -10
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/identity/common.py +79 -0
- openstackclient/identity/v3/application_credential.py +2 -2
- openstackclient/identity/v3/domain.py +62 -43
- openstackclient/identity/v3/group.py +113 -68
- openstackclient/identity/v3/project.py +17 -0
- openstackclient/identity/v3/user.py +38 -5
- openstackclient/image/client.py +5 -0
- openstackclient/image/v2/image.py +11 -11
- openstackclient/network/client.py +0 -6
- openstackclient/network/v2/floating_ip.py +58 -29
- openstackclient/network/v2/network_qos_rule.py +3 -11
- openstackclient/network/v2/router.py +1 -1
- openstackclient/network/v2/security_group.py +5 -4
- openstackclient/network/v2/security_group_rule.py +1 -1
- openstackclient/shell.py +1 -1
- openstackclient/tests/functional/base.py +5 -1
- openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
- openstackclient/tests/unit/compute/v2/fakes.py +81 -305
- openstackclient/tests/unit/compute/v2/test_console.py +18 -1
- openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +1 -1
- openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
- openstackclient/tests/unit/compute/v2/test_server.py +169 -46
- openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
- openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
- openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
- openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
- openstackclient/tests/unit/identity/v3/test_application_credential.py +47 -25
- openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
- openstackclient/tests/unit/identity/v3/test_group.py +353 -202
- openstackclient/tests/unit/identity/v3/test_project.py +16 -0
- openstackclient/tests/unit/identity/v3/test_user.py +86 -6
- openstackclient/tests/unit/image/v1/test_image.py +8 -9
- openstackclient/tests/unit/image/v2/test_image.py +49 -49
- openstackclient/tests/unit/network/v2/fakes.py +405 -485
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
- openstackclient/tests/unit/network/v2/test_network.py +4 -4
- openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
- openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
- openstackclient/tests/unit/network/v2/test_port.py +17 -17
- openstackclient/tests/unit/network/v2/test_router.py +73 -57
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
- openstackclient/tests/unit/volume/v2/fakes.py +1 -2
- openstackclient/tests/unit/volume/v2/test_service.py +57 -91
- openstackclient/tests/unit/volume/v2/test_volume.py +108 -105
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
- openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
- openstackclient/tests/unit/volume/v3/test_service.py +221 -141
- openstackclient/tests/unit/volume/v3/test_volume.py +130 -119
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
- openstackclient/volume/v2/service.py +41 -38
- openstackclient/volume/v2/volume.py +63 -37
- openstackclient/volume/v2/volume_backup.py +9 -3
- openstackclient/volume/v2/volume_snapshot.py +121 -84
- openstackclient/volume/v3/block_storage_log_level.py +22 -28
- openstackclient/volume/v3/service.py +105 -14
- openstackclient/volume/v3/volume.py +200 -39
- openstackclient/volume/v3/volume_backup.py +24 -19
- openstackclient/volume/v3/volume_snapshot.py +485 -10
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +8 -0
- python_openstackclient-8.1.0.dist-info/METADATA +264 -0
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +83 -81
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -6
- python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
- python_openstackclient-8.0.0.dist-info/METADATA +0 -166
- python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
|
@@ -11,91 +11,83 @@
|
|
|
11
11
|
# License for the specific language governing permissions and limitations
|
|
12
12
|
# under the License.
|
|
13
13
|
|
|
14
|
-
from unittest
|
|
14
|
+
from unittest import mock
|
|
15
15
|
|
|
16
|
+
from openstack.block_storage.v3 import backup as _backup
|
|
17
|
+
from openstack.block_storage.v3 import snapshot as _snapshot
|
|
18
|
+
from openstack.block_storage.v3 import volume as _volume
|
|
19
|
+
from openstack import exceptions as sdk_exceptions
|
|
20
|
+
from openstack.test import fakes as sdk_fakes
|
|
16
21
|
from osc_lib import exceptions
|
|
17
22
|
|
|
18
23
|
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
|
19
24
|
from openstackclient.volume.v3 import volume_backup
|
|
20
25
|
|
|
21
26
|
|
|
22
|
-
class TestBackupLegacy(volume_fakes.TestVolume):
|
|
23
|
-
def setUp(self):
|
|
24
|
-
super().setUp()
|
|
25
|
-
|
|
26
|
-
self.backups_mock = self.volume_client.backups
|
|
27
|
-
self.backups_mock.reset_mock()
|
|
28
|
-
self.volumes_mock = self.volume_client.volumes
|
|
29
|
-
self.volumes_mock.reset_mock()
|
|
30
|
-
self.snapshots_mock = self.volume_client.volume_snapshots
|
|
31
|
-
self.snapshots_mock.reset_mock()
|
|
32
|
-
self.restores_mock = self.volume_client.restores
|
|
33
|
-
self.restores_mock.reset_mock()
|
|
34
|
-
|
|
35
|
-
|
|
36
27
|
class TestBackupCreate(volume_fakes.TestVolume):
|
|
37
|
-
volume = volume_fakes.create_one_volume()
|
|
38
|
-
snapshot = volume_fakes.create_one_snapshot()
|
|
39
|
-
new_backup = volume_fakes.create_one_backup(
|
|
40
|
-
attrs={'volume_id': volume.id, 'snapshot_id': snapshot.id}
|
|
41
|
-
)
|
|
42
|
-
|
|
43
28
|
columns = (
|
|
44
29
|
'id',
|
|
45
30
|
'name',
|
|
46
31
|
'volume_id',
|
|
47
32
|
)
|
|
48
|
-
data = (
|
|
49
|
-
new_backup.id,
|
|
50
|
-
new_backup.name,
|
|
51
|
-
new_backup.volume_id,
|
|
52
|
-
)
|
|
53
33
|
|
|
54
34
|
def setUp(self):
|
|
55
35
|
super().setUp()
|
|
56
36
|
|
|
37
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
57
38
|
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
39
|
+
self.snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
|
|
58
40
|
self.volume_sdk_client.find_snapshot.return_value = self.snapshot
|
|
59
|
-
self.
|
|
41
|
+
self.backup = sdk_fakes.generate_fake_resource(
|
|
42
|
+
_backup.Backup,
|
|
43
|
+
volume_id=self.volume.id,
|
|
44
|
+
snapshot_id=self.snapshot.id,
|
|
45
|
+
)
|
|
46
|
+
self.volume_sdk_client.create_backup.return_value = self.backup
|
|
47
|
+
|
|
48
|
+
self.data = (
|
|
49
|
+
self.backup.id,
|
|
50
|
+
self.backup.name,
|
|
51
|
+
self.backup.volume_id,
|
|
52
|
+
)
|
|
60
53
|
|
|
61
|
-
# Get the command object to test
|
|
62
54
|
self.cmd = volume_backup.CreateVolumeBackup(self.app, None)
|
|
63
55
|
|
|
64
56
|
def test_backup_create(self):
|
|
65
57
|
arglist = [
|
|
66
58
|
"--name",
|
|
67
|
-
self.
|
|
59
|
+
self.backup.name,
|
|
68
60
|
"--description",
|
|
69
|
-
self.
|
|
61
|
+
self.backup.description,
|
|
70
62
|
"--container",
|
|
71
|
-
self.
|
|
63
|
+
self.backup.container,
|
|
72
64
|
"--force",
|
|
73
65
|
"--incremental",
|
|
74
66
|
"--snapshot",
|
|
75
|
-
self.
|
|
76
|
-
self.
|
|
67
|
+
self.backup.snapshot_id,
|
|
68
|
+
self.backup.volume_id,
|
|
77
69
|
]
|
|
78
70
|
verifylist = [
|
|
79
|
-
("name", self.
|
|
80
|
-
("description", self.
|
|
81
|
-
("container", self.
|
|
71
|
+
("name", self.backup.name),
|
|
72
|
+
("description", self.backup.description),
|
|
73
|
+
("container", self.backup.container),
|
|
82
74
|
("force", True),
|
|
83
75
|
("incremental", True),
|
|
84
|
-
("snapshot", self.
|
|
85
|
-
("volume", self.
|
|
76
|
+
("snapshot", self.backup.snapshot_id),
|
|
77
|
+
("volume", self.backup.volume_id),
|
|
86
78
|
]
|
|
87
79
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
88
80
|
|
|
89
81
|
columns, data = self.cmd.take_action(parsed_args)
|
|
90
82
|
|
|
91
83
|
self.volume_sdk_client.create_backup.assert_called_with(
|
|
92
|
-
volume_id=self.
|
|
93
|
-
container=self.
|
|
94
|
-
name=self.
|
|
95
|
-
description=self.
|
|
84
|
+
volume_id=self.backup.volume_id,
|
|
85
|
+
container=self.backup.container,
|
|
86
|
+
name=self.backup.name,
|
|
87
|
+
description=self.backup.description,
|
|
96
88
|
force=True,
|
|
97
89
|
is_incremental=True,
|
|
98
|
-
snapshot_id=self.
|
|
90
|
+
snapshot_id=self.backup.snapshot_id,
|
|
99
91
|
)
|
|
100
92
|
self.assertEqual(self.columns, columns)
|
|
101
93
|
self.assertEqual(self.data, data)
|
|
@@ -108,18 +100,18 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
108
100
|
"foo=bar",
|
|
109
101
|
"--property",
|
|
110
102
|
"wow=much-cool",
|
|
111
|
-
self.
|
|
103
|
+
self.backup.volume_id,
|
|
112
104
|
]
|
|
113
105
|
verifylist = [
|
|
114
106
|
("properties", {"foo": "bar", "wow": "much-cool"}),
|
|
115
|
-
("volume", self.
|
|
107
|
+
("volume", self.backup.volume_id),
|
|
116
108
|
]
|
|
117
109
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
118
110
|
|
|
119
111
|
columns, data = self.cmd.take_action(parsed_args)
|
|
120
112
|
|
|
121
113
|
self.volume_sdk_client.create_backup.assert_called_with(
|
|
122
|
-
volume_id=self.
|
|
114
|
+
volume_id=self.backup.volume_id,
|
|
123
115
|
container=None,
|
|
124
116
|
name=None,
|
|
125
117
|
description=None,
|
|
@@ -138,11 +130,11 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
138
130
|
"foo=bar",
|
|
139
131
|
"--property",
|
|
140
132
|
"wow=much-cool",
|
|
141
|
-
self.
|
|
133
|
+
self.backup.volume_id,
|
|
142
134
|
]
|
|
143
135
|
verifylist = [
|
|
144
136
|
("properties", {"foo": "bar", "wow": "much-cool"}),
|
|
145
|
-
("volume", self.
|
|
137
|
+
("volume", self.backup.volume_id),
|
|
146
138
|
]
|
|
147
139
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
148
140
|
|
|
@@ -157,18 +149,18 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
157
149
|
arglist = [
|
|
158
150
|
"--availability-zone",
|
|
159
151
|
"my-az",
|
|
160
|
-
self.
|
|
152
|
+
self.backup.volume_id,
|
|
161
153
|
]
|
|
162
154
|
verifylist = [
|
|
163
155
|
("availability_zone", "my-az"),
|
|
164
|
-
("volume", self.
|
|
156
|
+
("volume", self.backup.volume_id),
|
|
165
157
|
]
|
|
166
158
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
167
159
|
|
|
168
160
|
columns, data = self.cmd.take_action(parsed_args)
|
|
169
161
|
|
|
170
162
|
self.volume_sdk_client.create_backup.assert_called_with(
|
|
171
|
-
volume_id=self.
|
|
163
|
+
volume_id=self.backup.volume_id,
|
|
172
164
|
container=None,
|
|
173
165
|
name=None,
|
|
174
166
|
description=None,
|
|
@@ -185,11 +177,11 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
185
177
|
arglist = [
|
|
186
178
|
"--availability-zone",
|
|
187
179
|
"my-az",
|
|
188
|
-
self.
|
|
180
|
+
self.backup.volume_id,
|
|
189
181
|
]
|
|
190
182
|
verifylist = [
|
|
191
183
|
("availability_zone", "my-az"),
|
|
192
|
-
("volume", self.
|
|
184
|
+
("volume", self.backup.volume_id),
|
|
193
185
|
]
|
|
194
186
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
195
187
|
|
|
@@ -201,25 +193,25 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
201
193
|
def test_backup_create_without_name(self):
|
|
202
194
|
arglist = [
|
|
203
195
|
"--description",
|
|
204
|
-
self.
|
|
196
|
+
self.backup.description,
|
|
205
197
|
"--container",
|
|
206
|
-
self.
|
|
207
|
-
self.
|
|
198
|
+
self.backup.container,
|
|
199
|
+
self.backup.volume_id,
|
|
208
200
|
]
|
|
209
201
|
verifylist = [
|
|
210
|
-
("description", self.
|
|
211
|
-
("container", self.
|
|
212
|
-
("volume", self.
|
|
202
|
+
("description", self.backup.description),
|
|
203
|
+
("container", self.backup.container),
|
|
204
|
+
("volume", self.backup.volume_id),
|
|
213
205
|
]
|
|
214
206
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
215
207
|
|
|
216
208
|
columns, data = self.cmd.take_action(parsed_args)
|
|
217
209
|
|
|
218
210
|
self.volume_sdk_client.create_backup.assert_called_with(
|
|
219
|
-
volume_id=self.
|
|
220
|
-
container=self.
|
|
211
|
+
volume_id=self.backup.volume_id,
|
|
212
|
+
container=self.backup.container,
|
|
221
213
|
name=None,
|
|
222
|
-
description=self.
|
|
214
|
+
description=self.backup.description,
|
|
223
215
|
force=False,
|
|
224
216
|
is_incremental=False,
|
|
225
217
|
)
|
|
@@ -228,17 +220,13 @@ class TestBackupCreate(volume_fakes.TestVolume):
|
|
|
228
220
|
|
|
229
221
|
|
|
230
222
|
class TestBackupDelete(volume_fakes.TestVolume):
|
|
231
|
-
backups = volume_fakes.create_backups(count=2)
|
|
232
|
-
|
|
233
223
|
def setUp(self):
|
|
234
224
|
super().setUp()
|
|
235
225
|
|
|
236
|
-
self.
|
|
237
|
-
|
|
238
|
-
)
|
|
226
|
+
self.backups = list(sdk_fakes.generate_fake_resources(_backup.Backup))
|
|
227
|
+
self.volume_sdk_client.find_backup.side_effect = self.backups
|
|
239
228
|
self.volume_sdk_client.delete_backup.return_value = None
|
|
240
229
|
|
|
241
|
-
# Get the command object to mock
|
|
242
230
|
self.cmd = volume_backup.DeleteVolumeBackup(self.app, None)
|
|
243
231
|
|
|
244
232
|
def test_backup_delete(self):
|
|
@@ -281,7 +269,7 @@ class TestBackupDelete(volume_fakes.TestVolume):
|
|
|
281
269
|
|
|
282
270
|
calls = []
|
|
283
271
|
for b in self.backups:
|
|
284
|
-
calls.append(call(b.id, ignore_missing=False, force=False))
|
|
272
|
+
calls.append(mock.call(b.id, ignore_missing=False, force=False))
|
|
285
273
|
self.volume_sdk_client.delete_backup.assert_has_calls(calls)
|
|
286
274
|
self.assertIsNone(result)
|
|
287
275
|
|
|
@@ -321,11 +309,6 @@ class TestBackupDelete(volume_fakes.TestVolume):
|
|
|
321
309
|
|
|
322
310
|
|
|
323
311
|
class TestBackupList(volume_fakes.TestVolume):
|
|
324
|
-
volume = volume_fakes.create_one_volume()
|
|
325
|
-
backups = volume_fakes.create_backups(
|
|
326
|
-
attrs={'volume_id': volume.name}, count=3
|
|
327
|
-
)
|
|
328
|
-
|
|
329
312
|
columns = (
|
|
330
313
|
'ID',
|
|
331
314
|
'Name',
|
|
@@ -341,45 +324,51 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
341
324
|
'Container',
|
|
342
325
|
)
|
|
343
326
|
|
|
344
|
-
data = []
|
|
345
|
-
for b in backups:
|
|
346
|
-
data.append(
|
|
347
|
-
(
|
|
348
|
-
b.id,
|
|
349
|
-
b.name,
|
|
350
|
-
b.description,
|
|
351
|
-
b.status,
|
|
352
|
-
b.size,
|
|
353
|
-
b.is_incremental,
|
|
354
|
-
b.created_at,
|
|
355
|
-
)
|
|
356
|
-
)
|
|
357
|
-
data_long = []
|
|
358
|
-
for b in backups:
|
|
359
|
-
data_long.append(
|
|
360
|
-
(
|
|
361
|
-
b.id,
|
|
362
|
-
b.name,
|
|
363
|
-
b.description,
|
|
364
|
-
b.status,
|
|
365
|
-
b.size,
|
|
366
|
-
b.is_incremental,
|
|
367
|
-
b.created_at,
|
|
368
|
-
b.availability_zone,
|
|
369
|
-
volume_backup.VolumeIdColumn(b.volume_id),
|
|
370
|
-
b.container,
|
|
371
|
-
)
|
|
372
|
-
)
|
|
373
|
-
|
|
374
327
|
def setUp(self):
|
|
375
328
|
super().setUp()
|
|
376
329
|
|
|
330
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
331
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
377
332
|
self.volume_sdk_client.volumes.return_value = [self.volume]
|
|
333
|
+
self.backups = list(
|
|
334
|
+
sdk_fakes.generate_fake_resources(
|
|
335
|
+
_backup.Backup,
|
|
336
|
+
attrs={'volume_id': self.volume.id},
|
|
337
|
+
)
|
|
338
|
+
)
|
|
378
339
|
self.volume_sdk_client.backups.return_value = self.backups
|
|
379
|
-
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
380
340
|
self.volume_sdk_client.find_backup.return_value = self.backups[0]
|
|
381
341
|
|
|
382
|
-
|
|
342
|
+
self.data = []
|
|
343
|
+
for b in self.backups:
|
|
344
|
+
self.data.append(
|
|
345
|
+
(
|
|
346
|
+
b.id,
|
|
347
|
+
b.name,
|
|
348
|
+
b.description,
|
|
349
|
+
b.status,
|
|
350
|
+
b.size,
|
|
351
|
+
b.is_incremental,
|
|
352
|
+
b.created_at,
|
|
353
|
+
)
|
|
354
|
+
)
|
|
355
|
+
self.data_long = []
|
|
356
|
+
for b in self.backups:
|
|
357
|
+
self.data_long.append(
|
|
358
|
+
(
|
|
359
|
+
b.id,
|
|
360
|
+
b.name,
|
|
361
|
+
b.description,
|
|
362
|
+
b.status,
|
|
363
|
+
b.size,
|
|
364
|
+
b.is_incremental,
|
|
365
|
+
b.created_at,
|
|
366
|
+
b.availability_zone,
|
|
367
|
+
volume_backup.VolumeIdColumn(b.volume_id),
|
|
368
|
+
b.container,
|
|
369
|
+
)
|
|
370
|
+
)
|
|
371
|
+
|
|
383
372
|
self.cmd = volume_backup.ListVolumeBackup(self.app, None)
|
|
384
373
|
|
|
385
374
|
def test_backup_list_without_options(self):
|
|
@@ -457,35 +446,34 @@ class TestBackupList(volume_fakes.TestVolume):
|
|
|
457
446
|
|
|
458
447
|
|
|
459
448
|
class TestBackupRestore(volume_fakes.TestVolume):
|
|
460
|
-
volume = volume_fakes.create_one_volume()
|
|
461
|
-
backup = volume_fakes.create_one_backup(
|
|
462
|
-
attrs={'volume_id': volume.id},
|
|
463
|
-
)
|
|
464
|
-
|
|
465
449
|
columns = (
|
|
466
450
|
"id",
|
|
467
451
|
"volume_id",
|
|
468
452
|
"volume_name",
|
|
469
453
|
)
|
|
470
454
|
|
|
471
|
-
data = (
|
|
472
|
-
backup.id,
|
|
473
|
-
volume.id,
|
|
474
|
-
volume.name,
|
|
475
|
-
)
|
|
476
|
-
|
|
477
455
|
def setUp(self):
|
|
478
456
|
super().setUp()
|
|
479
457
|
|
|
480
|
-
self.
|
|
458
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
481
459
|
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
460
|
+
self.backup = sdk_fakes.generate_fake_resource(
|
|
461
|
+
_backup.Backup, volume_id=self.volume.id
|
|
462
|
+
)
|
|
463
|
+
self.volume_sdk_client.find_backup.return_value = self.backup
|
|
464
|
+
self.volume_sdk_client.create_backup.return_value = self.backup
|
|
482
465
|
self.volume_sdk_client.restore_backup.return_value = {
|
|
483
466
|
'id': self.backup['id'],
|
|
484
467
|
'volume_id': self.volume['id'],
|
|
485
468
|
'volume_name': self.volume['name'],
|
|
486
469
|
}
|
|
487
470
|
|
|
488
|
-
|
|
471
|
+
self.data = (
|
|
472
|
+
self.backup.id,
|
|
473
|
+
self.volume.id,
|
|
474
|
+
self.volume.name,
|
|
475
|
+
)
|
|
476
|
+
|
|
489
477
|
self.cmd = volume_backup.RestoreVolumeBackup(self.app, None)
|
|
490
478
|
|
|
491
479
|
def test_backup_restore(self):
|
|
@@ -574,17 +562,15 @@ class TestBackupRestore(volume_fakes.TestVolume):
|
|
|
574
562
|
)
|
|
575
563
|
|
|
576
564
|
|
|
577
|
-
class TestBackupSet(
|
|
578
|
-
backup = volume_fakes.create_one_backup(
|
|
579
|
-
attrs={'metadata': {'wow': 'cool'}},
|
|
580
|
-
)
|
|
581
|
-
|
|
565
|
+
class TestBackupSet(volume_fakes.TestVolume):
|
|
582
566
|
def setUp(self):
|
|
583
567
|
super().setUp()
|
|
584
568
|
|
|
585
|
-
self.
|
|
569
|
+
self.backup = sdk_fakes.generate_fake_resource(
|
|
570
|
+
_backup.Backup, metadata={'wow': 'cool'}
|
|
571
|
+
)
|
|
572
|
+
self.volume_sdk_client.find_backup.return_value = self.backup
|
|
586
573
|
|
|
587
|
-
# Get the command object to test
|
|
588
574
|
self.cmd = volume_backup.SetVolumeBackup(self.app, None)
|
|
589
575
|
|
|
590
576
|
def test_backup_set_name(self):
|
|
@@ -601,14 +587,16 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
601
587
|
]
|
|
602
588
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
603
589
|
|
|
604
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
605
|
-
# returns nothing
|
|
606
590
|
result = self.cmd.take_action(parsed_args)
|
|
607
|
-
self.backups_mock.update.assert_called_once_with(
|
|
608
|
-
self.backup.id, **{'name': 'new_name'}
|
|
609
|
-
)
|
|
610
591
|
self.assertIsNone(result)
|
|
611
592
|
|
|
593
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
594
|
+
self.backup.id, ignore_missing=False
|
|
595
|
+
)
|
|
596
|
+
self.volume_sdk_client.update_backup.assert_called_once_with(
|
|
597
|
+
self.backup, name='new_name'
|
|
598
|
+
)
|
|
599
|
+
|
|
612
600
|
def test_backup_set_name_pre_v39(self):
|
|
613
601
|
self.set_volume_api_version('3.8')
|
|
614
602
|
|
|
@@ -644,13 +632,14 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
644
632
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
645
633
|
|
|
646
634
|
result = self.cmd.take_action(parsed_args)
|
|
635
|
+
self.assertIsNone(result)
|
|
647
636
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
637
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
638
|
+
self.backup.id, ignore_missing=False
|
|
639
|
+
)
|
|
640
|
+
self.volume_sdk_client.update_backup.assert_called_once_with(
|
|
641
|
+
self.backup, description='new_description'
|
|
652
642
|
)
|
|
653
|
-
self.assertIsNone(result)
|
|
654
643
|
|
|
655
644
|
def test_backup_set_description_pre_v39(self):
|
|
656
645
|
self.set_volume_api_version('3.8')
|
|
@@ -679,26 +668,34 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
679
668
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
680
669
|
|
|
681
670
|
result = self.cmd.take_action(parsed_args)
|
|
682
|
-
self.backups_mock.reset_state.assert_called_once_with(
|
|
683
|
-
self.backup.id, 'error'
|
|
684
|
-
)
|
|
685
671
|
self.assertIsNone(result)
|
|
686
672
|
|
|
673
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
674
|
+
self.backup.id, ignore_missing=False
|
|
675
|
+
)
|
|
676
|
+
self.volume_sdk_client.reset_backup_status.assert_called_with(
|
|
677
|
+
self.backup, status='error'
|
|
678
|
+
)
|
|
679
|
+
|
|
687
680
|
def test_backup_set_state_failed(self):
|
|
688
|
-
self.
|
|
681
|
+
self.volume_sdk_client.reset_backup_status.side_effect = (
|
|
682
|
+
sdk_exceptions.NotFoundException('foo')
|
|
683
|
+
)
|
|
684
|
+
|
|
689
685
|
arglist = ['--state', 'error', self.backup.id]
|
|
690
686
|
verifylist = [('state', 'error'), ('backup', self.backup.id)]
|
|
691
687
|
|
|
692
688
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
693
|
-
|
|
694
|
-
self.cmd.take_action
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
689
|
+
exc = self.assertRaises(
|
|
690
|
+
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
691
|
+
)
|
|
692
|
+
self.assertEqual('One or more of the set operations failed', str(exc))
|
|
693
|
+
|
|
694
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
695
|
+
self.backup.id, ignore_missing=False
|
|
696
|
+
)
|
|
697
|
+
self.volume_sdk_client.reset_backup_status.assert_called_with(
|
|
698
|
+
self.backup, status='error'
|
|
702
699
|
)
|
|
703
700
|
|
|
704
701
|
def test_backup_set_no_property(self):
|
|
@@ -715,15 +712,14 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
715
712
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
716
713
|
|
|
717
714
|
result = self.cmd.take_action(parsed_args)
|
|
715
|
+
self.assertIsNone(result)
|
|
718
716
|
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
self.backup.id, **kwargs
|
|
717
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
718
|
+
self.backup.id, ignore_missing=False
|
|
719
|
+
)
|
|
720
|
+
self.volume_sdk_client.update_backup.assert_called_once_with(
|
|
721
|
+
self.backup, metadata={}
|
|
725
722
|
)
|
|
726
|
-
self.assertIsNone(result)
|
|
727
723
|
|
|
728
724
|
def test_backup_set_no_property_pre_v343(self):
|
|
729
725
|
self.set_volume_api_version('3.42')
|
|
@@ -758,15 +754,14 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
758
754
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
759
755
|
|
|
760
756
|
result = self.cmd.take_action(parsed_args)
|
|
757
|
+
self.assertIsNone(result)
|
|
761
758
|
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
self.backup.id, **kwargs
|
|
759
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
760
|
+
self.backup.id, ignore_missing=False
|
|
761
|
+
)
|
|
762
|
+
self.volume_sdk_client.update_backup.assert_called_once_with(
|
|
763
|
+
self.backup, metadata={'wow': 'cool', 'foo': 'bar'}
|
|
768
764
|
)
|
|
769
|
-
self.assertIsNone(result)
|
|
770
765
|
|
|
771
766
|
def test_backup_set_property_pre_v343(self):
|
|
772
767
|
self.set_volume_api_version('3.42')
|
|
@@ -788,17 +783,16 @@ class TestBackupSet(TestBackupLegacy):
|
|
|
788
783
|
self.assertIn("--os-volume-api-version 3.43 or greater", str(exc))
|
|
789
784
|
|
|
790
785
|
|
|
791
|
-
class TestBackupUnset(
|
|
792
|
-
backup = volume_fakes.create_one_backup(
|
|
793
|
-
attrs={'metadata': {'foo': 'bar'}},
|
|
794
|
-
)
|
|
795
|
-
|
|
786
|
+
class TestBackupUnset(volume_fakes.TestVolume):
|
|
796
787
|
def setUp(self):
|
|
797
788
|
super().setUp()
|
|
798
789
|
|
|
799
|
-
self.
|
|
790
|
+
self.backup = sdk_fakes.generate_fake_resource(
|
|
791
|
+
_backup.Backup, metadata={'foo': 'bar', 'wow': 'cool'}
|
|
792
|
+
)
|
|
793
|
+
self.volume_sdk_client.find_backup.return_value = self.backup
|
|
794
|
+
self.volume_sdk_client.delete_backup_metadata.return_value = None
|
|
800
795
|
|
|
801
|
-
# Get the command object to test
|
|
802
796
|
self.cmd = volume_backup.UnsetVolumeBackup(self.app, None)
|
|
803
797
|
|
|
804
798
|
def test_backup_unset_property(self):
|
|
@@ -816,15 +810,14 @@ class TestBackupUnset(TestBackupLegacy):
|
|
|
816
810
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
817
811
|
|
|
818
812
|
result = self.cmd.take_action(parsed_args)
|
|
813
|
+
self.assertIsNone(result)
|
|
819
814
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
self.backup.id, **kwargs
|
|
815
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
816
|
+
self.backup.id, ignore_missing=False
|
|
817
|
+
)
|
|
818
|
+
self.volume_sdk_client.delete_backup_metadata.assert_called_once_with(
|
|
819
|
+
self.backup, keys=['wow']
|
|
826
820
|
)
|
|
827
|
-
self.assertIsNone(result)
|
|
828
821
|
|
|
829
822
|
def test_backup_unset_property_pre_v343(self):
|
|
830
823
|
self.set_volume_api_version('3.42')
|
|
@@ -847,8 +840,6 @@ class TestBackupUnset(TestBackupLegacy):
|
|
|
847
840
|
|
|
848
841
|
|
|
849
842
|
class TestBackupShow(volume_fakes.TestVolume):
|
|
850
|
-
backup = volume_fakes.create_one_backup()
|
|
851
|
-
|
|
852
843
|
columns = (
|
|
853
844
|
"availability_zone",
|
|
854
845
|
"container",
|
|
@@ -871,34 +862,36 @@ class TestBackupShow(volume_fakes.TestVolume):
|
|
|
871
862
|
"user_id",
|
|
872
863
|
"volume_id",
|
|
873
864
|
)
|
|
874
|
-
data = (
|
|
875
|
-
backup.availability_zone,
|
|
876
|
-
backup.container,
|
|
877
|
-
backup.created_at,
|
|
878
|
-
backup.data_timestamp,
|
|
879
|
-
backup.description,
|
|
880
|
-
backup.encryption_key_id,
|
|
881
|
-
backup.fail_reason,
|
|
882
|
-
backup.has_dependent_backups,
|
|
883
|
-
backup.id,
|
|
884
|
-
backup.is_incremental,
|
|
885
|
-
backup.metadata,
|
|
886
|
-
backup.name,
|
|
887
|
-
backup.object_count,
|
|
888
|
-
backup.project_id,
|
|
889
|
-
backup.size,
|
|
890
|
-
backup.snapshot_id,
|
|
891
|
-
backup.status,
|
|
892
|
-
backup.updated_at,
|
|
893
|
-
backup.user_id,
|
|
894
|
-
backup.volume_id,
|
|
895
|
-
)
|
|
896
865
|
|
|
897
866
|
def setUp(self):
|
|
898
867
|
super().setUp()
|
|
899
868
|
|
|
869
|
+
self.backup = sdk_fakes.generate_fake_resource(_backup.Backup)
|
|
900
870
|
self.volume_sdk_client.find_backup.return_value = self.backup
|
|
901
|
-
|
|
871
|
+
|
|
872
|
+
self.data = (
|
|
873
|
+
self.backup.availability_zone,
|
|
874
|
+
self.backup.container,
|
|
875
|
+
self.backup.created_at,
|
|
876
|
+
self.backup.data_timestamp,
|
|
877
|
+
self.backup.description,
|
|
878
|
+
self.backup.encryption_key_id,
|
|
879
|
+
self.backup.fail_reason,
|
|
880
|
+
self.backup.has_dependent_backups,
|
|
881
|
+
self.backup.id,
|
|
882
|
+
self.backup.is_incremental,
|
|
883
|
+
self.backup.metadata,
|
|
884
|
+
self.backup.name,
|
|
885
|
+
self.backup.object_count,
|
|
886
|
+
self.backup.project_id,
|
|
887
|
+
self.backup.size,
|
|
888
|
+
self.backup.snapshot_id,
|
|
889
|
+
self.backup.status,
|
|
890
|
+
self.backup.updated_at,
|
|
891
|
+
self.backup.user_id,
|
|
892
|
+
self.backup.volume_id,
|
|
893
|
+
)
|
|
894
|
+
|
|
902
895
|
self.cmd = volume_backup.ShowVolumeBackup(self.app, None)
|
|
903
896
|
|
|
904
897
|
def test_backup_show(self):
|
|
@@ -907,7 +900,9 @@ class TestBackupShow(volume_fakes.TestVolume):
|
|
|
907
900
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
908
901
|
|
|
909
902
|
columns, data = self.cmd.take_action(parsed_args)
|
|
910
|
-
self.volume_sdk_client.find_backup.assert_called_with(
|
|
903
|
+
self.volume_sdk_client.find_backup.assert_called_with(
|
|
904
|
+
self.backup.id, ignore_missing=False
|
|
905
|
+
)
|
|
911
906
|
|
|
912
907
|
self.assertEqual(self.columns, columns)
|
|
913
908
|
self.assertEqual(self.data, data)
|