python-openstackclient 8.1.0__py3-none-any.whl → 8.2.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/api/compute_v2.py +2 -2
- openstackclient/api/volume_v2.py +60 -0
- openstackclient/api/volume_v3.py +60 -0
- openstackclient/compute/v2/flavor.py +14 -1
- openstackclient/compute/v2/server.py +1 -3
- openstackclient/identity/common.py +8 -13
- openstackclient/identity/v3/application_credential.py +86 -85
- openstackclient/identity/v3/domain.py +5 -6
- openstackclient/identity/v3/project.py +25 -20
- openstackclient/identity/v3/role.py +7 -2
- openstackclient/image/v1/image.py +16 -1
- openstackclient/image/v2/cache.py +10 -6
- openstackclient/image/v2/image.py +48 -1
- openstackclient/image/v2/metadef_objects.py +8 -2
- openstackclient/image/v2/metadef_properties.py +9 -2
- openstackclient/network/v2/port.py +16 -0
- openstackclient/network/v2/security_group.py +44 -3
- openstackclient/network/v2/security_group_rule.py +17 -0
- openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
- openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
- openstackclient/tests/functional/image/v2/test_image.py +36 -14
- openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
- openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
- openstackclient/tests/unit/api/test_volume_v2.py +124 -0
- openstackclient/tests/unit/api/test_volume_v3.py +124 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +159 -174
- openstackclient/tests/unit/compute/v2/test_server.py +42 -51
- openstackclient/tests/unit/identity/v3/test_application_credential.py +47 -41
- openstackclient/tests/unit/identity/v3/test_domain.py +2 -2
- openstackclient/tests/unit/identity/v3/test_project.py +30 -53
- openstackclient/tests/unit/identity/v3/test_role.py +2 -8
- openstackclient/tests/unit/image/v1/test_image.py +47 -0
- openstackclient/tests/unit/image/v2/test_image.py +79 -9
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
- openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +2 -2
- openstackclient/tests/unit/network/v2/test_port.py +40 -0
- openstackclient/tests/unit/network/v2/test_security_group_network.py +6 -0
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +49 -0
- openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
- openstackclient/tests/unit/volume/v3/test_volume.py +439 -415
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +78 -52
- openstackclient/volume/v3/service.py +1 -1
- openstackclient/volume/v3/volume.py +102 -75
- openstackclient/volume/v3/volume_group.py +1 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +5 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/METADATA +7 -7
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +55 -51
- python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
- python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/top_level.txt +0 -0
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
import copy
|
|
15
15
|
from unittest import mock
|
|
16
|
+
import uuid
|
|
16
17
|
|
|
18
|
+
from openstack.block_storage.v3 import backup as _backup
|
|
17
19
|
from openstack.block_storage.v3 import block_storage_summary as _summary
|
|
18
20
|
from openstack.block_storage.v3 import snapshot as _snapshot
|
|
19
21
|
from openstack.block_storage.v3 import volume as _volume
|
|
@@ -23,6 +25,7 @@ from osc_lib.cli import format_columns
|
|
|
23
25
|
from osc_lib import exceptions
|
|
24
26
|
from osc_lib import utils
|
|
25
27
|
|
|
28
|
+
from openstackclient.api import volume_v3
|
|
26
29
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|
27
30
|
from openstackclient.tests.unit.image.v2 import fakes as image_fakes
|
|
28
31
|
from openstackclient.tests.unit import utils as test_utils
|
|
@@ -30,55 +33,81 @@ from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
|
|
30
33
|
from openstackclient.volume.v3 import volume
|
|
31
34
|
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
35
|
-
project = identity_fakes.FakeProject.create_one_project()
|
|
36
|
-
user = identity_fakes.FakeUser.create_one_user()
|
|
37
|
-
|
|
36
|
+
class TestVolumeCreate(volume_fakes.TestVolume):
|
|
38
37
|
columns = (
|
|
39
38
|
'attachments',
|
|
40
39
|
'availability_zone',
|
|
41
40
|
'bootable',
|
|
41
|
+
'cluster_name',
|
|
42
|
+
'consistencygroup_id',
|
|
43
|
+
'consumes_quota',
|
|
44
|
+
'created_at',
|
|
42
45
|
'description',
|
|
46
|
+
'encrypted',
|
|
47
|
+
'encryption_key_id',
|
|
48
|
+
'group_id',
|
|
43
49
|
'id',
|
|
50
|
+
'multiattach',
|
|
44
51
|
'name',
|
|
52
|
+
'os-vol-host-attr:host',
|
|
53
|
+
'os-vol-mig-status-attr:migstat',
|
|
54
|
+
'os-vol-mig-status-attr:name_id',
|
|
55
|
+
'os-vol-tenant-attr:tenant_id',
|
|
45
56
|
'properties',
|
|
57
|
+
'provider_id',
|
|
58
|
+
'replication_status',
|
|
59
|
+
'service_uuid',
|
|
60
|
+
'shared_targets',
|
|
46
61
|
'size',
|
|
47
62
|
'snapshot_id',
|
|
63
|
+
'source_volid',
|
|
48
64
|
'status',
|
|
49
65
|
'type',
|
|
66
|
+
'updated_at',
|
|
67
|
+
'user_id',
|
|
68
|
+
'volume_image_metadata',
|
|
69
|
+
'volume_type_id',
|
|
50
70
|
)
|
|
51
71
|
|
|
52
72
|
def setUp(self):
|
|
53
73
|
super().setUp()
|
|
54
74
|
|
|
55
|
-
self.
|
|
56
|
-
self.
|
|
57
|
-
|
|
58
|
-
self.consistencygroups_mock = self.volume_client.consistencygroups
|
|
59
|
-
self.consistencygroups_mock.reset_mock()
|
|
60
|
-
|
|
61
|
-
self.snapshots_mock = self.volume_client.volume_snapshots
|
|
62
|
-
self.snapshots_mock.reset_mock()
|
|
63
|
-
|
|
64
|
-
self.backups_mock = self.volume_client.backups
|
|
65
|
-
self.backups_mock.reset_mock()
|
|
66
|
-
|
|
67
|
-
self.new_volume = volume_fakes.create_one_volume()
|
|
68
|
-
self.volumes_mock.create.return_value = self.new_volume
|
|
75
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
76
|
+
self.volume_sdk_client.create_volume.return_value = self.volume
|
|
69
77
|
|
|
70
78
|
self.datalist = (
|
|
71
|
-
self.
|
|
72
|
-
self.
|
|
73
|
-
self.
|
|
74
|
-
self.
|
|
75
|
-
self.
|
|
76
|
-
self.
|
|
77
|
-
|
|
78
|
-
self.
|
|
79
|
-
self.
|
|
80
|
-
self.
|
|
81
|
-
self.
|
|
79
|
+
self.volume.attachments,
|
|
80
|
+
self.volume.availability_zone,
|
|
81
|
+
self.volume.is_bootable,
|
|
82
|
+
self.volume.cluster_name,
|
|
83
|
+
self.volume.consistency_group_id,
|
|
84
|
+
self.volume.consumes_quota,
|
|
85
|
+
self.volume.created_at,
|
|
86
|
+
self.volume.description,
|
|
87
|
+
self.volume.is_encrypted,
|
|
88
|
+
self.volume.encryption_key_id,
|
|
89
|
+
self.volume.group_id,
|
|
90
|
+
self.volume.id,
|
|
91
|
+
self.volume.is_multiattach,
|
|
92
|
+
self.volume.name,
|
|
93
|
+
self.volume.host,
|
|
94
|
+
self.volume.migration_status,
|
|
95
|
+
self.volume.migration_id,
|
|
96
|
+
self.volume.project_id,
|
|
97
|
+
format_columns.DictColumn(self.volume.metadata),
|
|
98
|
+
self.volume.provider_id,
|
|
99
|
+
self.volume.replication_status,
|
|
100
|
+
self.volume.service_uuid,
|
|
101
|
+
self.volume.shared_targets,
|
|
102
|
+
self.volume.size,
|
|
103
|
+
self.volume.snapshot_id,
|
|
104
|
+
self.volume.source_volume_id,
|
|
105
|
+
self.volume.status,
|
|
106
|
+
self.volume.volume_type,
|
|
107
|
+
self.volume.updated_at,
|
|
108
|
+
self.volume.user_id,
|
|
109
|
+
self.volume.volume_image_metadata,
|
|
110
|
+
self.volume.volume_type_id,
|
|
82
111
|
)
|
|
83
112
|
|
|
84
113
|
# Get the command object to test
|
|
@@ -87,87 +116,88 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
87
116
|
def test_volume_create_min_options(self):
|
|
88
117
|
arglist = [
|
|
89
118
|
'--size',
|
|
90
|
-
str(self.
|
|
119
|
+
str(self.volume.size),
|
|
91
120
|
]
|
|
92
121
|
verifylist = [
|
|
93
|
-
('size', self.
|
|
122
|
+
('size', self.volume.size),
|
|
94
123
|
]
|
|
95
124
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
96
125
|
|
|
97
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
98
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
99
|
-
# data to be shown.
|
|
100
126
|
columns, data = self.cmd.take_action(parsed_args)
|
|
101
127
|
|
|
102
|
-
self.
|
|
103
|
-
size=self.
|
|
128
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
129
|
+
size=self.volume.size,
|
|
104
130
|
snapshot_id=None,
|
|
105
131
|
name=None,
|
|
106
132
|
description=None,
|
|
107
133
|
volume_type=None,
|
|
108
134
|
availability_zone=None,
|
|
109
135
|
metadata=None,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
image_id=None,
|
|
137
|
+
source_volume_id=None,
|
|
138
|
+
consistency_group_id=None,
|
|
113
139
|
scheduler_hints=None,
|
|
114
140
|
backup_id=None,
|
|
115
141
|
)
|
|
116
142
|
|
|
117
143
|
self.assertEqual(self.columns, columns)
|
|
118
|
-
self.
|
|
144
|
+
self.assertEqual(self.datalist, data)
|
|
119
145
|
|
|
120
146
|
def test_volume_create_options(self):
|
|
121
|
-
|
|
122
|
-
self.consistencygroups_mock.get.return_value = consistency_group
|
|
147
|
+
consistency_group_id = 'cg123'
|
|
123
148
|
arglist = [
|
|
124
149
|
'--size',
|
|
125
|
-
str(self.
|
|
150
|
+
str(self.volume.size),
|
|
126
151
|
'--description',
|
|
127
|
-
self.
|
|
152
|
+
self.volume.description,
|
|
128
153
|
'--type',
|
|
129
|
-
self.
|
|
154
|
+
self.volume.volume_type,
|
|
130
155
|
'--availability-zone',
|
|
131
|
-
self.
|
|
156
|
+
self.volume.availability_zone,
|
|
132
157
|
'--consistency-group',
|
|
133
|
-
|
|
158
|
+
consistency_group_id,
|
|
134
159
|
'--hint',
|
|
135
160
|
'k=v',
|
|
136
|
-
self.
|
|
161
|
+
self.volume.name,
|
|
137
162
|
]
|
|
138
163
|
verifylist = [
|
|
139
|
-
('size', self.
|
|
140
|
-
('description', self.
|
|
141
|
-
('type', self.
|
|
142
|
-
('availability_zone', self.
|
|
143
|
-
('consistency_group',
|
|
164
|
+
('size', self.volume.size),
|
|
165
|
+
('description', self.volume.description),
|
|
166
|
+
('type', self.volume.volume_type),
|
|
167
|
+
('availability_zone', self.volume.availability_zone),
|
|
168
|
+
('consistency_group', consistency_group_id),
|
|
144
169
|
('hint', {'k': 'v'}),
|
|
145
|
-
('name', self.
|
|
170
|
+
('name', self.volume.name),
|
|
146
171
|
]
|
|
147
172
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
148
173
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
174
|
+
with mock.patch.object(
|
|
175
|
+
volume_v3,
|
|
176
|
+
'find_consistency_group',
|
|
177
|
+
return_value={'id': consistency_group_id},
|
|
178
|
+
) as mock_find_cg:
|
|
179
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
153
180
|
|
|
154
|
-
self.
|
|
155
|
-
size=self.
|
|
181
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
182
|
+
size=self.volume.size,
|
|
156
183
|
snapshot_id=None,
|
|
157
|
-
name=self.
|
|
158
|
-
description=self.
|
|
159
|
-
volume_type=self.
|
|
160
|
-
availability_zone=self.
|
|
184
|
+
name=self.volume.name,
|
|
185
|
+
description=self.volume.description,
|
|
186
|
+
volume_type=self.volume.volume_type,
|
|
187
|
+
availability_zone=self.volume.availability_zone,
|
|
161
188
|
metadata=None,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
189
|
+
image_id=None,
|
|
190
|
+
source_volume_id=None,
|
|
191
|
+
consistency_group_id=consistency_group_id,
|
|
165
192
|
scheduler_hints={'k': 'v'},
|
|
166
193
|
backup_id=None,
|
|
167
194
|
)
|
|
195
|
+
mock_find_cg.assert_called_once_with(
|
|
196
|
+
self.volume_sdk_client, consistency_group_id
|
|
197
|
+
)
|
|
168
198
|
|
|
169
199
|
self.assertEqual(self.columns, columns)
|
|
170
|
-
self.
|
|
200
|
+
self.assertEqual(self.datalist, data)
|
|
171
201
|
|
|
172
202
|
def test_volume_create_properties(self):
|
|
173
203
|
arglist = [
|
|
@@ -176,38 +206,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
176
206
|
'--property',
|
|
177
207
|
'Beta=b',
|
|
178
208
|
'--size',
|
|
179
|
-
str(self.
|
|
180
|
-
self.
|
|
209
|
+
str(self.volume.size),
|
|
210
|
+
self.volume.name,
|
|
181
211
|
]
|
|
182
212
|
verifylist = [
|
|
183
213
|
('properties', {'Alpha': 'a', 'Beta': 'b'}),
|
|
184
|
-
('size', self.
|
|
185
|
-
('name', self.
|
|
214
|
+
('size', self.volume.size),
|
|
215
|
+
('name', self.volume.name),
|
|
186
216
|
]
|
|
187
217
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
188
218
|
|
|
189
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
190
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
191
|
-
# data to be shown.
|
|
192
219
|
columns, data = self.cmd.take_action(parsed_args)
|
|
193
220
|
|
|
194
|
-
self.
|
|
195
|
-
size=self.
|
|
221
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
222
|
+
size=self.volume.size,
|
|
196
223
|
snapshot_id=None,
|
|
197
|
-
name=self.
|
|
224
|
+
name=self.volume.name,
|
|
198
225
|
description=None,
|
|
199
226
|
volume_type=None,
|
|
200
227
|
availability_zone=None,
|
|
201
228
|
metadata={'Alpha': 'a', 'Beta': 'b'},
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
229
|
+
image_id=None,
|
|
230
|
+
source_volume_id=None,
|
|
231
|
+
consistency_group_id=None,
|
|
205
232
|
scheduler_hints=None,
|
|
206
233
|
backup_id=None,
|
|
207
234
|
)
|
|
208
235
|
|
|
209
236
|
self.assertEqual(self.columns, columns)
|
|
210
|
-
self.
|
|
237
|
+
self.assertEqual(self.datalist, data)
|
|
211
238
|
|
|
212
239
|
def test_volume_create_image_id(self):
|
|
213
240
|
image = image_fakes.create_one_image()
|
|
@@ -217,38 +244,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
217
244
|
'--image',
|
|
218
245
|
image.id,
|
|
219
246
|
'--size',
|
|
220
|
-
str(self.
|
|
221
|
-
self.
|
|
247
|
+
str(self.volume.size),
|
|
248
|
+
self.volume.name,
|
|
222
249
|
]
|
|
223
250
|
verifylist = [
|
|
224
251
|
('image', image.id),
|
|
225
|
-
('size', self.
|
|
226
|
-
('name', self.
|
|
252
|
+
('size', self.volume.size),
|
|
253
|
+
('name', self.volume.name),
|
|
227
254
|
]
|
|
228
255
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
229
256
|
|
|
230
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
231
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
232
|
-
# data to be shown.
|
|
233
257
|
columns, data = self.cmd.take_action(parsed_args)
|
|
234
258
|
|
|
235
|
-
self.
|
|
236
|
-
size=self.
|
|
259
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
260
|
+
size=self.volume.size,
|
|
237
261
|
snapshot_id=None,
|
|
238
|
-
name=self.
|
|
262
|
+
name=self.volume.name,
|
|
239
263
|
description=None,
|
|
240
264
|
volume_type=None,
|
|
241
265
|
availability_zone=None,
|
|
242
266
|
metadata=None,
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
267
|
+
image_id=image.id,
|
|
268
|
+
source_volume_id=None,
|
|
269
|
+
consistency_group_id=None,
|
|
246
270
|
scheduler_hints=None,
|
|
247
271
|
backup_id=None,
|
|
248
272
|
)
|
|
249
273
|
|
|
250
274
|
self.assertEqual(self.columns, columns)
|
|
251
|
-
self.
|
|
275
|
+
self.assertEqual(self.datalist, data)
|
|
252
276
|
|
|
253
277
|
def test_volume_create_image_name(self):
|
|
254
278
|
image = image_fakes.create_one_image()
|
|
@@ -258,177 +282,173 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
258
282
|
'--image',
|
|
259
283
|
image.name,
|
|
260
284
|
'--size',
|
|
261
|
-
str(self.
|
|
262
|
-
self.
|
|
285
|
+
str(self.volume.size),
|
|
286
|
+
self.volume.name,
|
|
263
287
|
]
|
|
264
288
|
verifylist = [
|
|
265
289
|
('image', image.name),
|
|
266
|
-
('size', self.
|
|
267
|
-
('name', self.
|
|
290
|
+
('size', self.volume.size),
|
|
291
|
+
('name', self.volume.name),
|
|
268
292
|
]
|
|
269
293
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
270
294
|
|
|
271
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
272
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
273
|
-
# data to be shown.
|
|
274
295
|
columns, data = self.cmd.take_action(parsed_args)
|
|
275
296
|
|
|
276
|
-
self.
|
|
277
|
-
size=self.
|
|
297
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
298
|
+
size=self.volume.size,
|
|
278
299
|
snapshot_id=None,
|
|
279
|
-
name=self.
|
|
300
|
+
name=self.volume.name,
|
|
280
301
|
description=None,
|
|
281
302
|
volume_type=None,
|
|
282
303
|
availability_zone=None,
|
|
283
304
|
metadata=None,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
305
|
+
image_id=image.id,
|
|
306
|
+
source_volume_id=None,
|
|
307
|
+
consistency_group_id=None,
|
|
287
308
|
scheduler_hints=None,
|
|
288
309
|
backup_id=None,
|
|
289
310
|
)
|
|
290
311
|
|
|
291
312
|
self.assertEqual(self.columns, columns)
|
|
292
|
-
self.
|
|
313
|
+
self.assertEqual(self.datalist, data)
|
|
293
314
|
|
|
294
315
|
def test_volume_create_with_snapshot(self):
|
|
295
|
-
snapshot =
|
|
296
|
-
self.
|
|
316
|
+
snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
|
|
317
|
+
self.volume_sdk_client.find_snapshot.return_value = snapshot
|
|
318
|
+
|
|
297
319
|
arglist = [
|
|
298
320
|
'--snapshot',
|
|
299
|
-
|
|
300
|
-
self.
|
|
321
|
+
snapshot.id,
|
|
322
|
+
self.volume.name,
|
|
301
323
|
]
|
|
302
324
|
verifylist = [
|
|
303
|
-
('snapshot',
|
|
304
|
-
('name', self.
|
|
325
|
+
('snapshot', snapshot.id),
|
|
326
|
+
('name', self.volume.name),
|
|
305
327
|
]
|
|
306
328
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
307
329
|
|
|
308
|
-
self.snapshots_mock.get.return_value = snapshot
|
|
309
|
-
|
|
310
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
311
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
312
|
-
# data to be shown.
|
|
313
330
|
columns, data = self.cmd.take_action(parsed_args)
|
|
314
331
|
|
|
315
|
-
self.
|
|
332
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
316
333
|
size=snapshot.size,
|
|
317
334
|
snapshot_id=snapshot.id,
|
|
318
|
-
name=self.
|
|
335
|
+
name=self.volume.name,
|
|
319
336
|
description=None,
|
|
320
337
|
volume_type=None,
|
|
321
338
|
availability_zone=None,
|
|
322
339
|
metadata=None,
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
340
|
+
image_id=None,
|
|
341
|
+
source_volume_id=None,
|
|
342
|
+
consistency_group_id=None,
|
|
326
343
|
scheduler_hints=None,
|
|
327
344
|
backup_id=None,
|
|
328
345
|
)
|
|
346
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
347
|
+
snapshot.id, ignore_missing=False
|
|
348
|
+
)
|
|
329
349
|
|
|
330
350
|
self.assertEqual(self.columns, columns)
|
|
331
|
-
self.
|
|
351
|
+
self.assertEqual(self.datalist, data)
|
|
332
352
|
|
|
333
353
|
def test_volume_create_with_backup(self):
|
|
334
354
|
self.set_volume_api_version('3.47')
|
|
335
355
|
|
|
336
|
-
backup =
|
|
337
|
-
self.
|
|
356
|
+
backup = sdk_fakes.generate_fake_resource(_backup.Backup)
|
|
357
|
+
self.volume_sdk_client.find_backup.return_value = backup
|
|
358
|
+
|
|
338
359
|
arglist = [
|
|
339
360
|
'--backup',
|
|
340
|
-
|
|
341
|
-
self.
|
|
361
|
+
backup.id,
|
|
362
|
+
self.volume.name,
|
|
342
363
|
]
|
|
343
364
|
verifylist = [
|
|
344
|
-
('backup',
|
|
345
|
-
('name', self.
|
|
365
|
+
('backup', backup.id),
|
|
366
|
+
('name', self.volume.name),
|
|
346
367
|
]
|
|
347
368
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
348
369
|
|
|
349
|
-
self.backups_mock.get.return_value = backup
|
|
350
|
-
|
|
351
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
352
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
353
|
-
# data to be shown.
|
|
354
370
|
columns, data = self.cmd.take_action(parsed_args)
|
|
355
371
|
|
|
356
|
-
self.
|
|
372
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
357
373
|
size=backup.size,
|
|
358
374
|
snapshot_id=None,
|
|
359
|
-
name=self.
|
|
375
|
+
name=self.volume.name,
|
|
360
376
|
description=None,
|
|
361
377
|
volume_type=None,
|
|
362
378
|
availability_zone=None,
|
|
363
379
|
metadata=None,
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
380
|
+
image_id=None,
|
|
381
|
+
source_volume_id=None,
|
|
382
|
+
consistency_group_id=None,
|
|
367
383
|
scheduler_hints=None,
|
|
368
384
|
backup_id=backup.id,
|
|
369
385
|
)
|
|
386
|
+
self.volume_sdk_client.find_backup.assert_called_once_with(
|
|
387
|
+
backup.id, ignore_missing=False
|
|
388
|
+
)
|
|
370
389
|
|
|
371
390
|
self.assertEqual(self.columns, columns)
|
|
372
|
-
self.
|
|
391
|
+
self.assertEqual(self.datalist, data)
|
|
373
392
|
|
|
374
393
|
def test_volume_create_with_backup_pre_v347(self):
|
|
375
|
-
backup =
|
|
376
|
-
self.
|
|
394
|
+
backup = sdk_fakes.generate_fake_resource(_backup.Backup)
|
|
395
|
+
self.volume_sdk_client.find_backup.return_value = backup
|
|
396
|
+
|
|
377
397
|
arglist = [
|
|
378
398
|
'--backup',
|
|
379
|
-
|
|
380
|
-
self.
|
|
399
|
+
backup.id,
|
|
400
|
+
self.volume.name,
|
|
381
401
|
]
|
|
382
402
|
verifylist = [
|
|
383
|
-
('backup',
|
|
384
|
-
('name', self.
|
|
403
|
+
('backup', backup.id),
|
|
404
|
+
('name', self.volume.name),
|
|
385
405
|
]
|
|
386
406
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
387
407
|
|
|
388
|
-
self.backups_mock.get.return_value = backup
|
|
389
|
-
|
|
390
408
|
exc = self.assertRaises(
|
|
391
409
|
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
392
410
|
)
|
|
393
411
|
self.assertIn("--os-volume-api-version 3.47 or greater", str(exc))
|
|
394
412
|
|
|
413
|
+
self.volume_sdk_client.create_volume.assert_not_called()
|
|
414
|
+
|
|
395
415
|
def test_volume_create_with_source_volume(self):
|
|
396
|
-
|
|
416
|
+
source_volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
417
|
+
self.volume_sdk_client.find_volume.return_value = source_volume
|
|
418
|
+
|
|
397
419
|
arglist = [
|
|
398
420
|
'--source',
|
|
399
|
-
|
|
400
|
-
|
|
421
|
+
source_volume.id,
|
|
422
|
+
self.volume.name,
|
|
401
423
|
]
|
|
402
424
|
verifylist = [
|
|
403
|
-
('source',
|
|
404
|
-
('name',
|
|
425
|
+
('source', source_volume.id),
|
|
426
|
+
('name', self.volume.name),
|
|
405
427
|
]
|
|
406
428
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
407
429
|
|
|
408
|
-
self.volumes_mock.get.return_value = self.new_volume
|
|
409
|
-
|
|
410
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
411
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
412
|
-
# data to be shown.
|
|
413
430
|
columns, data = self.cmd.take_action(parsed_args)
|
|
414
431
|
|
|
415
|
-
self.
|
|
416
|
-
size=
|
|
432
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
433
|
+
size=source_volume.size,
|
|
417
434
|
snapshot_id=None,
|
|
418
|
-
name=
|
|
435
|
+
name=self.volume.name,
|
|
419
436
|
description=None,
|
|
420
437
|
volume_type=None,
|
|
421
438
|
availability_zone=None,
|
|
422
439
|
metadata=None,
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
440
|
+
image_id=None,
|
|
441
|
+
source_volume_id=source_volume.id,
|
|
442
|
+
consistency_group_id=None,
|
|
426
443
|
scheduler_hints=None,
|
|
427
444
|
backup_id=None,
|
|
428
445
|
)
|
|
446
|
+
self.volume_sdk_client.find_volume.assert_called_once_with(
|
|
447
|
+
source_volume.id, ignore_missing=False
|
|
448
|
+
)
|
|
429
449
|
|
|
430
450
|
self.assertEqual(self.columns, columns)
|
|
431
|
-
self.
|
|
451
|
+
self.assertEqual(self.datalist, data)
|
|
432
452
|
|
|
433
453
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
434
454
|
def test_volume_create_with_bootable_and_readonly(self, mock_wait):
|
|
@@ -436,192 +456,191 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
436
456
|
'--bootable',
|
|
437
457
|
'--read-only',
|
|
438
458
|
'--size',
|
|
439
|
-
str(self.
|
|
440
|
-
self.
|
|
459
|
+
str(self.volume.size),
|
|
460
|
+
self.volume.name,
|
|
441
461
|
]
|
|
442
462
|
verifylist = [
|
|
443
463
|
('bootable', True),
|
|
444
464
|
('read_only', True),
|
|
445
|
-
('size', self.
|
|
446
|
-
('name', self.
|
|
465
|
+
('size', self.volume.size),
|
|
466
|
+
('name', self.volume.name),
|
|
447
467
|
]
|
|
448
468
|
|
|
449
469
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
450
470
|
|
|
451
471
|
columns, data = self.cmd.take_action(parsed_args)
|
|
452
472
|
|
|
453
|
-
self.
|
|
454
|
-
size=self.
|
|
473
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
474
|
+
size=self.volume.size,
|
|
455
475
|
snapshot_id=None,
|
|
456
|
-
name=self.
|
|
476
|
+
name=self.volume.name,
|
|
457
477
|
description=None,
|
|
458
478
|
volume_type=None,
|
|
459
479
|
availability_zone=None,
|
|
460
480
|
metadata=None,
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
481
|
+
image_id=None,
|
|
482
|
+
source_volume_id=None,
|
|
483
|
+
consistency_group_id=None,
|
|
464
484
|
scheduler_hints=None,
|
|
465
485
|
backup_id=None,
|
|
466
486
|
)
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
self.assertCountEqual(self.datalist, data)
|
|
470
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
471
|
-
self.new_volume.id, True
|
|
487
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
488
|
+
self.volume, True
|
|
472
489
|
)
|
|
473
|
-
self.
|
|
474
|
-
self.
|
|
490
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
491
|
+
self.volume, True
|
|
475
492
|
)
|
|
476
493
|
|
|
494
|
+
self.assertEqual(self.columns, columns)
|
|
495
|
+
self.assertEqual(self.datalist, data)
|
|
496
|
+
|
|
477
497
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
478
498
|
def test_volume_create_with_nonbootable_and_readwrite(self, mock_wait):
|
|
479
499
|
arglist = [
|
|
480
500
|
'--non-bootable',
|
|
481
501
|
'--read-write',
|
|
482
502
|
'--size',
|
|
483
|
-
str(self.
|
|
484
|
-
self.
|
|
503
|
+
str(self.volume.size),
|
|
504
|
+
self.volume.name,
|
|
485
505
|
]
|
|
486
506
|
verifylist = [
|
|
487
507
|
('bootable', False),
|
|
488
508
|
('read_only', False),
|
|
489
|
-
('size', self.
|
|
490
|
-
('name', self.
|
|
509
|
+
('size', self.volume.size),
|
|
510
|
+
('name', self.volume.name),
|
|
491
511
|
]
|
|
492
512
|
|
|
493
513
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
494
514
|
|
|
495
515
|
columns, data = self.cmd.take_action(parsed_args)
|
|
496
516
|
|
|
497
|
-
self.
|
|
498
|
-
size=self.
|
|
517
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
518
|
+
size=self.volume.size,
|
|
499
519
|
snapshot_id=None,
|
|
500
|
-
name=self.
|
|
520
|
+
name=self.volume.name,
|
|
501
521
|
description=None,
|
|
502
522
|
volume_type=None,
|
|
503
523
|
availability_zone=None,
|
|
504
524
|
metadata=None,
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
525
|
+
image_id=None,
|
|
526
|
+
source_volume_id=None,
|
|
527
|
+
consistency_group_id=None,
|
|
508
528
|
scheduler_hints=None,
|
|
509
529
|
backup_id=None,
|
|
510
530
|
)
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
self.assertCountEqual(self.datalist, data)
|
|
514
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
515
|
-
self.new_volume.id, False
|
|
531
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
532
|
+
self.volume, False
|
|
516
533
|
)
|
|
517
|
-
self.
|
|
518
|
-
self.
|
|
534
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
535
|
+
self.volume, False
|
|
519
536
|
)
|
|
520
537
|
|
|
538
|
+
self.assertEqual(self.columns, columns)
|
|
539
|
+
self.assertEqual(self.datalist, data)
|
|
540
|
+
|
|
521
541
|
@mock.patch.object(volume.LOG, 'error')
|
|
522
542
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
523
543
|
def test_volume_create_with_bootable_and_readonly_fail(
|
|
524
544
|
self, mock_wait, mock_error
|
|
525
545
|
):
|
|
526
|
-
self.
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
546
|
+
self.volume_sdk_client.set_volume_bootable_status.side_effect = (
|
|
547
|
+
sdk_exceptions.NotFoundException('foo')
|
|
548
|
+
)
|
|
549
|
+
self.volume_sdk_client.set_volume_readonly.side_effect = (
|
|
550
|
+
sdk_exceptions.NotFoundException('foo')
|
|
530
551
|
)
|
|
531
552
|
|
|
532
553
|
arglist = [
|
|
533
554
|
'--bootable',
|
|
534
555
|
'--read-only',
|
|
535
556
|
'--size',
|
|
536
|
-
str(self.
|
|
537
|
-
self.
|
|
557
|
+
str(self.volume.size),
|
|
558
|
+
self.volume.name,
|
|
538
559
|
]
|
|
539
560
|
verifylist = [
|
|
540
561
|
('bootable', True),
|
|
541
562
|
('read_only', True),
|
|
542
|
-
('size', self.
|
|
543
|
-
('name', self.
|
|
563
|
+
('size', self.volume.size),
|
|
564
|
+
('name', self.volume.name),
|
|
544
565
|
]
|
|
545
566
|
|
|
546
567
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
547
568
|
|
|
548
569
|
columns, data = self.cmd.take_action(parsed_args)
|
|
549
570
|
|
|
550
|
-
self.
|
|
551
|
-
size=self.
|
|
571
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
572
|
+
size=self.volume.size,
|
|
552
573
|
snapshot_id=None,
|
|
553
|
-
name=self.
|
|
574
|
+
name=self.volume.name,
|
|
554
575
|
description=None,
|
|
555
576
|
volume_type=None,
|
|
556
577
|
availability_zone=None,
|
|
557
578
|
metadata=None,
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
579
|
+
image_id=None,
|
|
580
|
+
source_volume_id=None,
|
|
581
|
+
consistency_group_id=None,
|
|
561
582
|
scheduler_hints=None,
|
|
562
583
|
backup_id=None,
|
|
563
584
|
)
|
|
585
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
586
|
+
self.volume, True
|
|
587
|
+
)
|
|
588
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
589
|
+
self.volume, True
|
|
590
|
+
)
|
|
564
591
|
|
|
565
592
|
self.assertEqual(2, mock_error.call_count)
|
|
566
593
|
self.assertEqual(self.columns, columns)
|
|
567
|
-
self.
|
|
568
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
569
|
-
self.new_volume.id, True
|
|
570
|
-
)
|
|
571
|
-
self.volumes_mock.update_readonly_flag.assert_called_with(
|
|
572
|
-
self.new_volume.id, True
|
|
573
|
-
)
|
|
594
|
+
self.assertEqual(self.datalist, data)
|
|
574
595
|
|
|
575
596
|
@mock.patch.object(volume.LOG, 'error')
|
|
576
597
|
@mock.patch.object(utils, 'wait_for_status', return_value=False)
|
|
577
598
|
def test_volume_create_non_available_with_readonly(
|
|
578
|
-
self,
|
|
579
|
-
mock_wait,
|
|
580
|
-
mock_error,
|
|
599
|
+
self, mock_wait, mock_error
|
|
581
600
|
):
|
|
582
601
|
arglist = [
|
|
583
602
|
'--non-bootable',
|
|
584
603
|
'--read-only',
|
|
585
604
|
'--size',
|
|
586
|
-
str(self.
|
|
587
|
-
self.
|
|
605
|
+
str(self.volume.size),
|
|
606
|
+
self.volume.name,
|
|
588
607
|
]
|
|
589
608
|
verifylist = [
|
|
590
609
|
('bootable', False),
|
|
591
610
|
('read_only', True),
|
|
592
|
-
('size', self.
|
|
593
|
-
('name', self.
|
|
611
|
+
('size', self.volume.size),
|
|
612
|
+
('name', self.volume.name),
|
|
594
613
|
]
|
|
595
614
|
|
|
596
615
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
597
616
|
|
|
598
617
|
columns, data = self.cmd.take_action(parsed_args)
|
|
599
618
|
|
|
600
|
-
self.
|
|
601
|
-
size=self.
|
|
619
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
620
|
+
size=self.volume.size,
|
|
602
621
|
snapshot_id=None,
|
|
603
|
-
name=self.
|
|
622
|
+
name=self.volume.name,
|
|
604
623
|
description=None,
|
|
605
624
|
volume_type=None,
|
|
606
625
|
availability_zone=None,
|
|
607
626
|
metadata=None,
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
627
|
+
image_id=None,
|
|
628
|
+
source_volume_id=None,
|
|
629
|
+
consistency_group_id=None,
|
|
611
630
|
scheduler_hints=None,
|
|
612
631
|
backup_id=None,
|
|
613
632
|
)
|
|
614
633
|
|
|
615
634
|
self.assertEqual(2, mock_error.call_count)
|
|
616
635
|
self.assertEqual(self.columns, columns)
|
|
617
|
-
self.
|
|
636
|
+
self.assertEqual(self.datalist, data)
|
|
618
637
|
|
|
619
638
|
def test_volume_create_without_size(self):
|
|
620
639
|
arglist = [
|
|
621
|
-
self.
|
|
640
|
+
self.volume.name,
|
|
622
641
|
]
|
|
623
642
|
verifylist = [
|
|
624
|
-
('name', self.
|
|
643
|
+
('name', self.volume.name),
|
|
625
644
|
]
|
|
626
645
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
627
646
|
|
|
@@ -638,15 +657,15 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
638
657
|
'--snapshot',
|
|
639
658
|
'source_snapshot',
|
|
640
659
|
'--size',
|
|
641
|
-
str(self.
|
|
642
|
-
self.
|
|
660
|
+
str(self.volume.size),
|
|
661
|
+
self.volume.name,
|
|
643
662
|
]
|
|
644
663
|
verifylist = [
|
|
645
664
|
('image', 'source_image'),
|
|
646
665
|
('source', 'source_volume'),
|
|
647
666
|
('snapshot', 'source_snapshot'),
|
|
648
|
-
('size', self.
|
|
649
|
-
('name', self.
|
|
667
|
+
('size', self.volume.size),
|
|
668
|
+
('name', self.volume.name),
|
|
650
669
|
]
|
|
651
670
|
|
|
652
671
|
self.assertRaises(
|
|
@@ -665,7 +684,7 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
665
684
|
"""
|
|
666
685
|
arglist = [
|
|
667
686
|
'--size',
|
|
668
|
-
str(self.
|
|
687
|
+
str(self.volume.size),
|
|
669
688
|
'--hint',
|
|
670
689
|
'k=v',
|
|
671
690
|
'--hint',
|
|
@@ -680,10 +699,10 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
680
699
|
'local_to_instance=v6',
|
|
681
700
|
'--hint',
|
|
682
701
|
'different_host=v7',
|
|
683
|
-
self.
|
|
702
|
+
self.volume.name,
|
|
684
703
|
]
|
|
685
704
|
verifylist = [
|
|
686
|
-
('size', self.
|
|
705
|
+
('size', self.volume.size),
|
|
687
706
|
(
|
|
688
707
|
'hint',
|
|
689
708
|
{
|
|
@@ -693,26 +712,23 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
693
712
|
'different_host': ['v5', 'v7'],
|
|
694
713
|
},
|
|
695
714
|
),
|
|
696
|
-
('name', self.
|
|
715
|
+
('name', self.volume.name),
|
|
697
716
|
]
|
|
698
717
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
699
718
|
|
|
700
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
701
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
702
|
-
# data to be shown.
|
|
703
719
|
columns, data = self.cmd.take_action(parsed_args)
|
|
704
720
|
|
|
705
|
-
self.
|
|
706
|
-
size=self.
|
|
721
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
722
|
+
size=self.volume.size,
|
|
707
723
|
snapshot_id=None,
|
|
708
|
-
name=self.
|
|
724
|
+
name=self.volume.name,
|
|
709
725
|
description=None,
|
|
710
726
|
volume_type=None,
|
|
711
727
|
availability_zone=None,
|
|
712
728
|
metadata=None,
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
729
|
+
image_id=None,
|
|
730
|
+
source_volume_id=None,
|
|
731
|
+
consistency_group_id=None,
|
|
716
732
|
scheduler_hints={
|
|
717
733
|
'k': 'v2',
|
|
718
734
|
'same_host': ['v3', 'v4'],
|
|
@@ -723,102 +739,22 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
723
739
|
)
|
|
724
740
|
|
|
725
741
|
self.assertEqual(self.columns, columns)
|
|
726
|
-
self.
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
class TestVolumeCreate(volume_fakes.TestVolume):
|
|
730
|
-
columns = (
|
|
731
|
-
'attachments',
|
|
732
|
-
'availability_zone',
|
|
733
|
-
'consistency_group_id',
|
|
734
|
-
'created_at',
|
|
735
|
-
'description',
|
|
736
|
-
'extended_replication_status',
|
|
737
|
-
'group_id',
|
|
738
|
-
'host',
|
|
739
|
-
'id',
|
|
740
|
-
'image_id',
|
|
741
|
-
'is_bootable',
|
|
742
|
-
'is_encrypted',
|
|
743
|
-
'is_multiattach',
|
|
744
|
-
'location',
|
|
745
|
-
'metadata',
|
|
746
|
-
'migration_id',
|
|
747
|
-
'migration_status',
|
|
748
|
-
'name',
|
|
749
|
-
'project_id',
|
|
750
|
-
'provider_id',
|
|
751
|
-
'replication_driver_data',
|
|
752
|
-
'replication_status',
|
|
753
|
-
'scheduler_hints',
|
|
754
|
-
'size',
|
|
755
|
-
'snapshot_id',
|
|
756
|
-
'source_volume_id',
|
|
757
|
-
'status',
|
|
758
|
-
'updated_at',
|
|
759
|
-
'user_id',
|
|
760
|
-
'volume_image_metadata',
|
|
761
|
-
'volume_type',
|
|
762
|
-
)
|
|
763
|
-
|
|
764
|
-
def setUp(self):
|
|
765
|
-
super().setUp()
|
|
766
|
-
|
|
767
|
-
self.new_volume = sdk_fakes.generate_fake_resource(
|
|
768
|
-
_volume.Volume, **{'size': 1}
|
|
769
|
-
)
|
|
770
|
-
|
|
771
|
-
self.datalist = (
|
|
772
|
-
self.new_volume.attachments,
|
|
773
|
-
self.new_volume.availability_zone,
|
|
774
|
-
self.new_volume.consistency_group_id,
|
|
775
|
-
self.new_volume.created_at,
|
|
776
|
-
self.new_volume.description,
|
|
777
|
-
self.new_volume.extended_replication_status,
|
|
778
|
-
self.new_volume.group_id,
|
|
779
|
-
self.new_volume.host,
|
|
780
|
-
self.new_volume.id,
|
|
781
|
-
self.new_volume.image_id,
|
|
782
|
-
self.new_volume.is_bootable,
|
|
783
|
-
self.new_volume.is_encrypted,
|
|
784
|
-
self.new_volume.is_multiattach,
|
|
785
|
-
self.new_volume.location,
|
|
786
|
-
self.new_volume.metadata,
|
|
787
|
-
self.new_volume.migration_id,
|
|
788
|
-
self.new_volume.migration_status,
|
|
789
|
-
self.new_volume.name,
|
|
790
|
-
self.new_volume.project_id,
|
|
791
|
-
self.new_volume.provider_id,
|
|
792
|
-
self.new_volume.replication_driver_data,
|
|
793
|
-
self.new_volume.replication_status,
|
|
794
|
-
self.new_volume.scheduler_hints,
|
|
795
|
-
self.new_volume.size,
|
|
796
|
-
self.new_volume.snapshot_id,
|
|
797
|
-
self.new_volume.source_volume_id,
|
|
798
|
-
self.new_volume.status,
|
|
799
|
-
self.new_volume.updated_at,
|
|
800
|
-
self.new_volume.user_id,
|
|
801
|
-
self.new_volume.volume_image_metadata,
|
|
802
|
-
self.new_volume.volume_type,
|
|
803
|
-
)
|
|
804
|
-
|
|
805
|
-
# Get the command object to test
|
|
806
|
-
self.cmd = volume.CreateVolume(self.app, None)
|
|
742
|
+
self.assertEqual(self.datalist, data)
|
|
807
743
|
|
|
808
744
|
def test_volume_create_remote_source(self):
|
|
809
|
-
self.volume_sdk_client.manage_volume.return_value = self.
|
|
745
|
+
self.volume_sdk_client.manage_volume.return_value = self.volume
|
|
810
746
|
|
|
811
747
|
arglist = [
|
|
812
748
|
'--remote-source',
|
|
813
749
|
'key=val',
|
|
814
750
|
'--host',
|
|
815
751
|
'fake_host',
|
|
816
|
-
self.
|
|
752
|
+
self.volume.name,
|
|
817
753
|
]
|
|
818
754
|
verifylist = [
|
|
819
755
|
('remote_source', {'key': 'val'}),
|
|
820
756
|
('host', 'fake_host'),
|
|
821
|
-
('name', self.
|
|
757
|
+
('name', self.volume.name),
|
|
822
758
|
]
|
|
823
759
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
824
760
|
|
|
@@ -837,7 +773,7 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
837
773
|
)
|
|
838
774
|
|
|
839
775
|
self.assertEqual(self.columns, columns)
|
|
840
|
-
self.
|
|
776
|
+
self.assertEqual(self.datalist, data)
|
|
841
777
|
|
|
842
778
|
def test_volume_create_remote_source_pre_v316(self):
|
|
843
779
|
self.set_volume_api_version('3.15')
|
|
@@ -846,12 +782,12 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
846
782
|
'key=val',
|
|
847
783
|
'--cluster',
|
|
848
784
|
'fake_cluster',
|
|
849
|
-
self.
|
|
785
|
+
self.volume.name,
|
|
850
786
|
]
|
|
851
787
|
verifylist = [
|
|
852
788
|
('remote_source', {'key': 'val'}),
|
|
853
789
|
('cluster', 'fake_cluster'),
|
|
854
|
-
('name', self.
|
|
790
|
+
('name', self.volume.name),
|
|
855
791
|
]
|
|
856
792
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
857
793
|
|
|
@@ -871,13 +807,13 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
871
807
|
'fake_host',
|
|
872
808
|
'--cluster',
|
|
873
809
|
'fake_cluster',
|
|
874
|
-
self.
|
|
810
|
+
self.volume.name,
|
|
875
811
|
]
|
|
876
812
|
verifylist = [
|
|
877
813
|
('remote_source', {'key': 'val'}),
|
|
878
814
|
('host', 'fake_host'),
|
|
879
815
|
('cluster', 'fake_cluster'),
|
|
880
|
-
('name', self.
|
|
816
|
+
('name', self.volume.name),
|
|
881
817
|
]
|
|
882
818
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
883
819
|
|
|
@@ -892,11 +828,11 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
892
828
|
arglist = [
|
|
893
829
|
'--remote-source',
|
|
894
830
|
'key=val',
|
|
895
|
-
self.
|
|
831
|
+
self.volume.name,
|
|
896
832
|
]
|
|
897
833
|
verifylist = [
|
|
898
834
|
('remote_source', {'key': 'val'}),
|
|
899
|
-
('name', self.
|
|
835
|
+
('name', self.volume.name),
|
|
900
836
|
]
|
|
901
837
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
902
838
|
|
|
@@ -910,15 +846,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
910
846
|
def test_volume_create_remote_source_size(self):
|
|
911
847
|
arglist = [
|
|
912
848
|
'--size',
|
|
913
|
-
str(self.
|
|
849
|
+
str(self.volume.size),
|
|
914
850
|
'--remote-source',
|
|
915
851
|
'key=val',
|
|
916
|
-
self.
|
|
852
|
+
self.volume.name,
|
|
917
853
|
]
|
|
918
854
|
verifylist = [
|
|
919
|
-
('size', self.
|
|
855
|
+
('size', self.volume.size),
|
|
920
856
|
('remote_source', {'key': 'val'}),
|
|
921
|
-
('name', self.
|
|
857
|
+
('name', self.volume.name),
|
|
922
858
|
]
|
|
923
859
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
924
860
|
|
|
@@ -934,15 +870,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
934
870
|
def test_volume_create_host_no_remote_source(self):
|
|
935
871
|
arglist = [
|
|
936
872
|
'--size',
|
|
937
|
-
str(self.
|
|
873
|
+
str(self.volume.size),
|
|
938
874
|
'--host',
|
|
939
875
|
'fake_host',
|
|
940
|
-
self.
|
|
876
|
+
self.volume.name,
|
|
941
877
|
]
|
|
942
878
|
verifylist = [
|
|
943
|
-
('size', self.
|
|
879
|
+
('size', self.volume.size),
|
|
944
880
|
('host', 'fake_host'),
|
|
945
|
-
('name', self.
|
|
881
|
+
('name', self.volume.name),
|
|
946
882
|
]
|
|
947
883
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
948
884
|
|
|
@@ -1239,6 +1175,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1239
1175
|
'user_id': None,
|
|
1240
1176
|
'name': None,
|
|
1241
1177
|
'status': None,
|
|
1178
|
+
'metadata': None,
|
|
1242
1179
|
}
|
|
1243
1180
|
self.volumes_mock.list.assert_called_once_with(
|
|
1244
1181
|
search_opts=search_opts,
|
|
@@ -1282,6 +1219,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1282
1219
|
'user_id': None,
|
|
1283
1220
|
'name': None,
|
|
1284
1221
|
'status': None,
|
|
1222
|
+
'metadata': None,
|
|
1285
1223
|
}
|
|
1286
1224
|
self.volumes_mock.list.assert_called_once_with(
|
|
1287
1225
|
search_opts=search_opts,
|
|
@@ -1328,6 +1266,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1328
1266
|
'user_id': None,
|
|
1329
1267
|
'name': None,
|
|
1330
1268
|
'status': None,
|
|
1269
|
+
'metadata': None,
|
|
1331
1270
|
}
|
|
1332
1271
|
self.volumes_mock.list.assert_called_once_with(
|
|
1333
1272
|
search_opts=search_opts,
|
|
@@ -1371,6 +1310,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1371
1310
|
'user_id': self.user.id,
|
|
1372
1311
|
'name': None,
|
|
1373
1312
|
'status': None,
|
|
1313
|
+
'metadata': None,
|
|
1374
1314
|
}
|
|
1375
1315
|
self.volumes_mock.list.assert_called_once_with(
|
|
1376
1316
|
search_opts=search_opts,
|
|
@@ -1416,6 +1356,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1416
1356
|
'user_id': self.user.id,
|
|
1417
1357
|
'name': None,
|
|
1418
1358
|
'status': None,
|
|
1359
|
+
'metadata': None,
|
|
1419
1360
|
}
|
|
1420
1361
|
self.volumes_mock.list.assert_called_once_with(
|
|
1421
1362
|
search_opts=search_opts,
|
|
@@ -1459,6 +1400,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1459
1400
|
'user_id': None,
|
|
1460
1401
|
'name': self.mock_volume.name,
|
|
1461
1402
|
'status': None,
|
|
1403
|
+
'metadata': None,
|
|
1462
1404
|
}
|
|
1463
1405
|
self.volumes_mock.list.assert_called_once_with(
|
|
1464
1406
|
search_opts=search_opts,
|
|
@@ -1502,6 +1444,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1502
1444
|
'user_id': None,
|
|
1503
1445
|
'name': None,
|
|
1504
1446
|
'status': self.mock_volume.status,
|
|
1447
|
+
'metadata': None,
|
|
1505
1448
|
}
|
|
1506
1449
|
self.volumes_mock.list.assert_called_once_with(
|
|
1507
1450
|
search_opts=search_opts,
|
|
@@ -1544,6 +1487,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1544
1487
|
'user_id': None,
|
|
1545
1488
|
'name': None,
|
|
1546
1489
|
'status': None,
|
|
1490
|
+
'metadata': None,
|
|
1547
1491
|
}
|
|
1548
1492
|
self.volumes_mock.list.assert_called_once_with(
|
|
1549
1493
|
search_opts=search_opts,
|
|
@@ -1587,6 +1531,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1587
1531
|
'user_id': None,
|
|
1588
1532
|
'name': None,
|
|
1589
1533
|
'status': None,
|
|
1534
|
+
'metadata': None,
|
|
1590
1535
|
}
|
|
1591
1536
|
self.volumes_mock.list.assert_called_once_with(
|
|
1592
1537
|
search_opts=search_opts,
|
|
@@ -1660,6 +1605,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1660
1605
|
'user_id': None,
|
|
1661
1606
|
'name': None,
|
|
1662
1607
|
'all_tenants': False,
|
|
1608
|
+
'metadata': None,
|
|
1663
1609
|
},
|
|
1664
1610
|
)
|
|
1665
1611
|
self.assertCountEqual(datalist, tuple(data))
|
|
@@ -1704,6 +1650,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1704
1650
|
'user_id': None,
|
|
1705
1651
|
'name': None,
|
|
1706
1652
|
'status': None,
|
|
1653
|
+
'metadata': None,
|
|
1707
1654
|
}
|
|
1708
1655
|
self.volumes_mock.list.assert_called_once_with(
|
|
1709
1656
|
search_opts=search_opts,
|
|
@@ -1719,71 +1666,79 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1719
1666
|
|
|
1720
1667
|
|
|
1721
1668
|
class TestVolumeMigrate(volume_fakes.TestVolume):
|
|
1722
|
-
_volume = volume_fakes.create_one_volume()
|
|
1723
|
-
|
|
1724
1669
|
def setUp(self):
|
|
1725
1670
|
super().setUp()
|
|
1726
1671
|
|
|
1727
|
-
self.
|
|
1728
|
-
self.
|
|
1672
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
1673
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
1674
|
+
self.volume_sdk_client.migrate_volume.return_value = None
|
|
1729
1675
|
|
|
1730
|
-
self.volumes_mock.get.return_value = self._volume
|
|
1731
|
-
self.volumes_mock.migrate_volume.return_value = None
|
|
1732
|
-
# Get the command object to test
|
|
1733
1676
|
self.cmd = volume.MigrateVolume(self.app, None)
|
|
1734
1677
|
|
|
1735
1678
|
def test_volume_migrate(self):
|
|
1736
1679
|
arglist = [
|
|
1737
1680
|
"--host",
|
|
1738
1681
|
"host@backend-name#pool",
|
|
1739
|
-
self.
|
|
1682
|
+
self.volume.id,
|
|
1740
1683
|
]
|
|
1741
1684
|
verifylist = [
|
|
1742
1685
|
("force_host_copy", False),
|
|
1743
1686
|
("lock_volume", False),
|
|
1744
1687
|
("host", "host@backend-name#pool"),
|
|
1745
|
-
("volume", self.
|
|
1688
|
+
("volume", self.volume.id),
|
|
1746
1689
|
]
|
|
1747
1690
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1748
1691
|
|
|
1749
1692
|
result = self.cmd.take_action(parsed_args)
|
|
1750
|
-
self.volumes_mock.get.assert_called_once_with(self._volume.id)
|
|
1751
|
-
self.volumes_mock.migrate_volume.assert_called_once_with(
|
|
1752
|
-
self._volume.id, "host@backend-name#pool", False, False
|
|
1753
|
-
)
|
|
1754
1693
|
self.assertIsNone(result)
|
|
1755
1694
|
|
|
1695
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
1696
|
+
self.volume.id, ignore_missing=False
|
|
1697
|
+
)
|
|
1698
|
+
self.volume_sdk_client.migrate_volume.assert_called_once_with(
|
|
1699
|
+
self.volume.id,
|
|
1700
|
+
host="host@backend-name#pool",
|
|
1701
|
+
force_host_copy=False,
|
|
1702
|
+
lock_volume=False,
|
|
1703
|
+
)
|
|
1704
|
+
|
|
1756
1705
|
def test_volume_migrate_with_option(self):
|
|
1757
1706
|
arglist = [
|
|
1758
1707
|
"--force-host-copy",
|
|
1759
1708
|
"--lock-volume",
|
|
1760
1709
|
"--host",
|
|
1761
1710
|
"host@backend-name#pool",
|
|
1762
|
-
self.
|
|
1711
|
+
self.volume.id,
|
|
1763
1712
|
]
|
|
1764
1713
|
verifylist = [
|
|
1765
1714
|
("force_host_copy", True),
|
|
1766
1715
|
("lock_volume", True),
|
|
1767
1716
|
("host", "host@backend-name#pool"),
|
|
1768
|
-
("volume", self.
|
|
1717
|
+
("volume", self.volume.id),
|
|
1769
1718
|
]
|
|
1770
1719
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1771
1720
|
|
|
1772
1721
|
result = self.cmd.take_action(parsed_args)
|
|
1773
|
-
self.volumes_mock.get.assert_called_once_with(self._volume.id)
|
|
1774
|
-
self.volumes_mock.migrate_volume.assert_called_once_with(
|
|
1775
|
-
self._volume.id, "host@backend-name#pool", True, True
|
|
1776
|
-
)
|
|
1777
1722
|
self.assertIsNone(result)
|
|
1778
1723
|
|
|
1724
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
1725
|
+
self.volume.id, ignore_missing=False
|
|
1726
|
+
)
|
|
1727
|
+
self.volume_sdk_client.migrate_volume.assert_called_once_with(
|
|
1728
|
+
self.volume.id,
|
|
1729
|
+
host="host@backend-name#pool",
|
|
1730
|
+
force_host_copy=True,
|
|
1731
|
+
lock_volume=True,
|
|
1732
|
+
)
|
|
1733
|
+
|
|
1779
1734
|
def test_volume_migrate_without_host(self):
|
|
1780
1735
|
arglist = [
|
|
1781
|
-
self.
|
|
1736
|
+
self.volume.id,
|
|
1782
1737
|
]
|
|
1783
1738
|
verifylist = [
|
|
1784
1739
|
("force_host_copy", False),
|
|
1785
1740
|
("lock_volume", False),
|
|
1786
|
-
("volume", self.
|
|
1741
|
+
("volume", self.volume.id),
|
|
1787
1742
|
]
|
|
1788
1743
|
|
|
1789
1744
|
self.assertRaises(
|
|
@@ -1794,6 +1749,9 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
|
|
|
1794
1749
|
verifylist,
|
|
1795
1750
|
)
|
|
1796
1751
|
|
|
1752
|
+
self.volume_sdk_client.find_volume.assert_not_called()
|
|
1753
|
+
self.volume_sdk_client.migrate_volume.assert_not_called()
|
|
1754
|
+
|
|
1797
1755
|
|
|
1798
1756
|
class TestVolumeSet(volume_fakes.TestVolume):
|
|
1799
1757
|
volume_type = volume_fakes.create_one_volume_type()
|
|
@@ -2047,41 +2005,91 @@ class TestVolumeShow(volume_fakes.TestVolume):
|
|
|
2047
2005
|
def setUp(self):
|
|
2048
2006
|
super().setUp()
|
|
2049
2007
|
|
|
2050
|
-
self.
|
|
2051
|
-
self.
|
|
2008
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
2009
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
2010
|
+
|
|
2011
|
+
self.columns = (
|
|
2012
|
+
'attachments',
|
|
2013
|
+
'availability_zone',
|
|
2014
|
+
'bootable',
|
|
2015
|
+
'cluster_name',
|
|
2016
|
+
'consistencygroup_id',
|
|
2017
|
+
'consumes_quota',
|
|
2018
|
+
'created_at',
|
|
2019
|
+
'description',
|
|
2020
|
+
'encrypted',
|
|
2021
|
+
'encryption_key_id',
|
|
2022
|
+
'group_id',
|
|
2023
|
+
'id',
|
|
2024
|
+
'multiattach',
|
|
2025
|
+
'name',
|
|
2026
|
+
'os-vol-host-attr:host',
|
|
2027
|
+
'os-vol-mig-status-attr:migstat',
|
|
2028
|
+
'os-vol-mig-status-attr:name_id',
|
|
2029
|
+
'os-vol-tenant-attr:tenant_id',
|
|
2030
|
+
'properties',
|
|
2031
|
+
'provider_id',
|
|
2032
|
+
'replication_status',
|
|
2033
|
+
'service_uuid',
|
|
2034
|
+
'shared_targets',
|
|
2035
|
+
'size',
|
|
2036
|
+
'snapshot_id',
|
|
2037
|
+
'source_volid',
|
|
2038
|
+
'status',
|
|
2039
|
+
'type',
|
|
2040
|
+
'updated_at',
|
|
2041
|
+
'user_id',
|
|
2042
|
+
'volume_image_metadata',
|
|
2043
|
+
'volume_type_id',
|
|
2044
|
+
)
|
|
2045
|
+
self.data = (
|
|
2046
|
+
self.volume.attachments,
|
|
2047
|
+
self.volume.availability_zone,
|
|
2048
|
+
self.volume.is_bootable,
|
|
2049
|
+
self.volume.cluster_name,
|
|
2050
|
+
self.volume.consistency_group_id,
|
|
2051
|
+
self.volume.consumes_quota,
|
|
2052
|
+
self.volume.created_at,
|
|
2053
|
+
self.volume.description,
|
|
2054
|
+
self.volume.is_encrypted,
|
|
2055
|
+
self.volume.encryption_key_id,
|
|
2056
|
+
self.volume.group_id,
|
|
2057
|
+
self.volume.id,
|
|
2058
|
+
self.volume.is_multiattach,
|
|
2059
|
+
self.volume.name,
|
|
2060
|
+
self.volume.host,
|
|
2061
|
+
self.volume.migration_status,
|
|
2062
|
+
self.volume.migration_id,
|
|
2063
|
+
self.volume.project_id,
|
|
2064
|
+
format_columns.DictColumn(self.volume.metadata),
|
|
2065
|
+
self.volume.provider_id,
|
|
2066
|
+
self.volume.replication_status,
|
|
2067
|
+
self.volume.service_uuid,
|
|
2068
|
+
self.volume.shared_targets,
|
|
2069
|
+
self.volume.size,
|
|
2070
|
+
self.volume.snapshot_id,
|
|
2071
|
+
self.volume.source_volume_id,
|
|
2072
|
+
self.volume.status,
|
|
2073
|
+
self.volume.volume_type,
|
|
2074
|
+
self.volume.updated_at,
|
|
2075
|
+
self.volume.user_id,
|
|
2076
|
+
self.volume.volume_image_metadata,
|
|
2077
|
+
self.volume.volume_type_id,
|
|
2078
|
+
)
|
|
2052
2079
|
|
|
2053
|
-
self._volume = volume_fakes.create_one_volume()
|
|
2054
|
-
self.volumes_mock.get.return_value = self._volume
|
|
2055
|
-
# Get the command object to test
|
|
2056
2080
|
self.cmd = volume.ShowVolume(self.app, None)
|
|
2057
2081
|
|
|
2058
2082
|
def test_volume_show(self):
|
|
2059
|
-
arglist = [self.
|
|
2060
|
-
verifylist = [("volume", self.
|
|
2083
|
+
arglist = [self.volume.id]
|
|
2084
|
+
verifylist = [("volume", self.volume.id)]
|
|
2061
2085
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
2062
2086
|
|
|
2063
2087
|
columns, data = self.cmd.take_action(parsed_args)
|
|
2064
|
-
self.volumes_mock.get.assert_called_with(self._volume.id)
|
|
2065
2088
|
|
|
2066
|
-
self.assertEqual(
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
self.assertTupleEqual(
|
|
2071
|
-
(
|
|
2072
|
-
self._volume.attachments,
|
|
2073
|
-
self._volume.availability_zone,
|
|
2074
|
-
self._volume.bootable,
|
|
2075
|
-
self._volume.description,
|
|
2076
|
-
self._volume.id,
|
|
2077
|
-
self._volume.name,
|
|
2078
|
-
format_columns.DictColumn(self._volume.metadata),
|
|
2079
|
-
self._volume.size,
|
|
2080
|
-
self._volume.snapshot_id,
|
|
2081
|
-
self._volume.status,
|
|
2082
|
-
self._volume.volume_type,
|
|
2083
|
-
),
|
|
2084
|
-
data,
|
|
2089
|
+
self.assertEqual(self.columns, columns)
|
|
2090
|
+
self.assertEqual(self.data, data)
|
|
2091
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
2092
|
+
self.volume.id, ignore_missing=False
|
|
2085
2093
|
)
|
|
2086
2094
|
|
|
2087
2095
|
|
|
@@ -2327,29 +2335,45 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume):
|
|
|
2327
2335
|
|
|
2328
2336
|
class TestColumns(volume_fakes.TestVolume):
|
|
2329
2337
|
def test_attachments_column_without_server_cache(self):
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2338
|
+
vol = sdk_fakes.generate_fake_resource(
|
|
2339
|
+
_volume.Volume,
|
|
2340
|
+
attachments=[
|
|
2341
|
+
{
|
|
2342
|
+
'device': '/dev/' + uuid.uuid4().hex,
|
|
2343
|
+
'server_id': uuid.uuid4().hex,
|
|
2344
|
+
},
|
|
2345
|
+
],
|
|
2346
|
+
)
|
|
2347
|
+
server_id = vol.attachments[0]['server_id']
|
|
2348
|
+
device = vol.attachments[0]['device']
|
|
2333
2349
|
|
|
2334
|
-
col = volume.AttachmentsColumn(
|
|
2350
|
+
col = volume.AttachmentsColumn(vol.attachments, {})
|
|
2335
2351
|
self.assertEqual(
|
|
2336
2352
|
f'Attached to {server_id} on {device} ',
|
|
2337
2353
|
col.human_readable(),
|
|
2338
2354
|
)
|
|
2339
|
-
self.assertEqual(
|
|
2355
|
+
self.assertEqual(vol.attachments, col.machine_readable())
|
|
2340
2356
|
|
|
2341
2357
|
def test_attachments_column_with_server_cache(self):
|
|
2342
|
-
|
|
2358
|
+
vol = sdk_fakes.generate_fake_resource(
|
|
2359
|
+
_volume.Volume,
|
|
2360
|
+
attachments=[
|
|
2361
|
+
{
|
|
2362
|
+
'device': '/dev/' + uuid.uuid4().hex,
|
|
2363
|
+
'server_id': uuid.uuid4().hex,
|
|
2364
|
+
},
|
|
2365
|
+
],
|
|
2366
|
+
)
|
|
2343
2367
|
|
|
2344
|
-
server_id =
|
|
2345
|
-
device =
|
|
2368
|
+
server_id = vol.attachments[0]['server_id']
|
|
2369
|
+
device = vol.attachments[0]['device']
|
|
2346
2370
|
fake_server = mock.Mock()
|
|
2347
2371
|
fake_server.name = 'fake-server-name'
|
|
2348
2372
|
server_cache = {server_id: fake_server}
|
|
2349
2373
|
|
|
2350
|
-
col = volume.AttachmentsColumn(
|
|
2374
|
+
col = volume.AttachmentsColumn(vol.attachments, server_cache)
|
|
2351
2375
|
self.assertEqual(
|
|
2352
2376
|
'Attached to {} on {} '.format('fake-server-name', device),
|
|
2353
2377
|
col.human_readable(),
|
|
2354
2378
|
)
|
|
2355
|
-
self.assertEqual(
|
|
2379
|
+
self.assertEqual(vol.attachments, col.machine_readable())
|