python-openstackclient 6.3.0__py3-none-any.whl → 6.5.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/common/availability_zone.py +4 -4
- openstackclient/common/pagination.py +82 -0
- openstackclient/compute/v2/flavor.py +2 -16
- openstackclient/compute/v2/hypervisor.py +2 -21
- openstackclient/compute/v2/keypair.py +2 -9
- openstackclient/compute/v2/server.py +220 -131
- openstackclient/compute/v2/server_event.py +30 -19
- openstackclient/compute/v2/server_group.py +2 -23
- openstackclient/compute/v2/server_migration.py +2 -22
- openstackclient/compute/v2/usage.py +4 -6
- openstackclient/identity/v3/mapping.py +25 -3
- openstackclient/identity/v3/policy.py +3 -1
- openstackclient/image/v2/cache.py +218 -0
- openstackclient/image/v2/image.py +40 -17
- openstackclient/image/v2/metadef_namespaces.py +25 -21
- openstackclient/image/v2/metadef_objects.py +189 -0
- openstackclient/image/v2/metadef_properties.py +284 -0
- openstackclient/network/utils.py +100 -0
- openstackclient/network/v2/default_security_group_rule.py +418 -0
- openstackclient/network/v2/local_ip_association.py +1 -1
- openstackclient/network/v2/ndp_proxy.py +7 -3
- openstackclient/network/v2/network.py +2 -2
- openstackclient/network/v2/port.py +65 -19
- openstackclient/network/v2/security_group_rule.py +18 -111
- openstackclient/network/v2/subnet.py +1 -0
- openstackclient/object/v1/container.py +2 -12
- openstackclient/object/v1/object.py +2 -11
- openstackclient/tests/functional/base.py +13 -6
- openstackclient/tests/functional/identity/v3/test_role.py +11 -3
- openstackclient/tests/functional/network/v2/common.py +7 -1
- openstackclient/tests/functional/network/v2/test_address_group.py +2 -4
- openstackclient/tests/functional/network/v2/test_address_scope.py +0 -6
- openstackclient/tests/functional/network/v2/test_default_security_group_rule.py +67 -0
- openstackclient/tests/functional/network/v2/test_floating_ip.py +3 -6
- openstackclient/tests/functional/network/v2/test_ip_availability.py +3 -8
- openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +3 -4
- openstackclient/tests/functional/network/v2/test_local_ip.py +2 -4
- openstackclient/tests/functional/network/v2/test_network.py +18 -17
- openstackclient/tests/functional/network/v2/test_network_agent.py +24 -21
- openstackclient/tests/functional/network/v2/test_network_flavor.py +0 -6
- openstackclient/tests/functional/network/v2/test_network_flavor_profile.py +0 -6
- openstackclient/tests/functional/network/v2/test_network_meter.py +6 -6
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +7 -8
- openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +1 -3
- openstackclient/tests/functional/network/v2/test_network_qos_policy.py +4 -4
- openstackclient/tests/functional/network/v2/test_network_qos_rule.py +16 -20
- openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py +4 -4
- openstackclient/tests/functional/network/v2/test_network_rbac.py +1 -4
- openstackclient/tests/functional/network/v2/test_network_segment.py +7 -12
- openstackclient/tests/functional/network/v2/test_network_segment_range.py +3 -4
- openstackclient/tests/functional/network/v2/test_network_service_provider.py +2 -4
- openstackclient/tests/functional/network/v2/test_network_trunk.py +3 -3
- openstackclient/tests/functional/network/v2/test_port.py +2 -8
- openstackclient/tests/functional/network/v2/test_router.py +0 -6
- openstackclient/tests/functional/network/v2/test_security_group.py +1 -4
- openstackclient/tests/functional/network/v2/test_security_group_rule.py +1 -4
- openstackclient/tests/functional/network/v2/test_subnet.py +4 -22
- openstackclient/tests/functional/network/v2/test_subnet_pool.py +0 -6
- openstackclient/tests/unit/common/test_availability_zone.py +28 -30
- openstackclient/tests/unit/common/test_extension.py +1 -4
- openstackclient/tests/unit/common/test_limits.py +2 -4
- openstackclient/tests/unit/common/test_project_cleanup.py +3 -10
- openstackclient/tests/unit/common/test_quota.py +18 -24
- openstackclient/tests/unit/compute/v2/fakes.py +24 -11
- openstackclient/tests/unit/compute/v2/test_agent.py +1 -1
- openstackclient/tests/unit/compute/v2/test_aggregate.py +62 -72
- openstackclient/tests/unit/compute/v2/test_console.py +18 -30
- openstackclient/tests/unit/compute/v2/test_flavor.py +85 -89
- openstackclient/tests/unit/compute/v2/test_host.py +12 -19
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +23 -25
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -6
- openstackclient/tests/unit/compute/v2/test_keypair.py +25 -39
- openstackclient/tests/unit/compute/v2/test_server.py +316 -365
- openstackclient/tests/unit/compute/v2/test_server_backup.py +5 -17
- openstackclient/tests/unit/compute/v2/test_server_event.py +23 -25
- openstackclient/tests/unit/compute/v2/test_server_group.py +41 -33
- openstackclient/tests/unit/compute/v2/test_server_image.py +6 -18
- openstackclient/tests/unit/compute/v2/test_server_migration.py +45 -45
- openstackclient/tests/unit/compute/v2/test_server_volume.py +15 -31
- openstackclient/tests/unit/compute/v2/test_service.py +51 -56
- openstackclient/tests/unit/compute/v2/test_usage.py +10 -13
- openstackclient/tests/unit/fakes.py +4 -0
- openstackclient/tests/unit/identity/v3/test_mappings.py +9 -4
- openstackclient/tests/unit/identity/v3/test_trust.py +0 -2
- openstackclient/tests/unit/image/v1/fakes.py +2 -1
- openstackclient/tests/unit/image/v1/test_image.py +1 -1
- openstackclient/tests/unit/image/v2/fakes.py +82 -0
- openstackclient/tests/unit/image/v2/test_cache.py +214 -0
- openstackclient/tests/unit/image/v2/test_image.py +62 -4
- openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +5 -19
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +162 -0
- openstackclient/tests/unit/image/v2/test_metadef_properties.py +227 -0
- openstackclient/tests/unit/integ/cli/test_shell.py +0 -2
- openstackclient/tests/unit/network/test_common.py +3 -3
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +1133 -0
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +5 -13
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -9
- openstackclient/tests/unit/network/v2/test_network.py +33 -0
- openstackclient/tests/unit/network/v2/test_network_compute.py +5 -11
- openstackclient/tests/unit/network/v2/test_network_trunk.py +6 -8
- openstackclient/tests/unit/network/v2/test_port.py +83 -38
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +7 -15
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +19 -27
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +3 -6
- openstackclient/tests/unit/network/v2/test_subnet.py +92 -0
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +11 -13
- openstackclient/tests/unit/test_shell.py +1 -7
- openstackclient/tests/unit/utils.py +10 -4
- openstackclient/tests/unit/volume/v1/fakes.py +7 -1
- openstackclient/tests/unit/volume/v1/test_qos_specs.py +2 -2
- openstackclient/tests/unit/volume/v1/test_service.py +1 -1
- openstackclient/tests/unit/volume/v1/test_transfer_request.py +2 -2
- openstackclient/tests/unit/volume/v1/test_type.py +2 -4
- openstackclient/tests/unit/volume/v1/test_volume.py +5 -7
- openstackclient/tests/unit/volume/v1/test_volume_backup.py +4 -4
- openstackclient/tests/unit/volume/v2/fakes.py +32 -12
- openstackclient/tests/unit/volume/v2/test_backup_record.py +1 -1
- openstackclient/tests/unit/volume/v2/test_consistency_group.py +4 -6
- openstackclient/tests/unit/volume/v2/test_consistency_group_snapshot.py +2 -4
- openstackclient/tests/unit/volume/v2/test_qos_specs.py +2 -2
- openstackclient/tests/unit/volume/v2/test_service.py +1 -1
- openstackclient/tests/unit/volume/v2/test_volume.py +78 -16
- openstackclient/tests/unit/volume/v2/test_volume_backend.py +10 -22
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +76 -89
- openstackclient/tests/unit/volume/v2/test_volume_host.py +1 -1
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +5 -7
- openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +4 -8
- openstackclient/tests/unit/volume/v2/test_volume_type.py +164 -24
- openstackclient/tests/unit/volume/v3/fakes.py +91 -15
- openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py +3 -7
- openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py +11 -31
- openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +6 -16
- openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +219 -157
- openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +32 -23
- openstackclient/tests/unit/volume/v3/test_volume.py +50 -48
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +17 -47
- openstackclient/tests/unit/volume/v3/test_volume_group.py +23 -65
- openstackclient/tests/unit/volume/v3/test_volume_group_snapshot.py +88 -77
- openstackclient/tests/unit/volume/v3/test_volume_group_type.py +14 -42
- openstackclient/tests/unit/volume/v3/test_volume_message.py +10 -28
- openstackclient/volume/v1/volume.py +2 -14
- openstackclient/volume/v2/volume.py +30 -15
- openstackclient/volume/v2/volume_backend.py +10 -18
- openstackclient/volume/v2/volume_backup.py +18 -15
- openstackclient/volume/v2/volume_snapshot.py +2 -12
- openstackclient/volume/v2/volume_type.py +211 -14
- openstackclient/volume/v3/block_storage_manage.py +72 -11
- openstackclient/volume/v3/block_storage_resource_filter.py +33 -11
- openstackclient/volume/v3/volume_attachment.py +2 -14
- openstackclient/volume/v3/volume_group_snapshot.py +27 -27
- openstackclient/volume/v3/volume_message.py +2 -13
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/AUTHORS +11 -0
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/METADATA +6 -5
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/RECORD +160 -151
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/entry_points.txt +23 -5
- python_openstackclient-6.5.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_parseractions.py +0 -233
- python_openstackclient-6.3.0.dist-info/pbr.json +0 -1
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/top_level.txt +0 -0
|
@@ -11,12 +11,10 @@
|
|
|
11
11
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
12
12
|
# License for the specific language governing permissions and limitations
|
|
13
13
|
# under the License.
|
|
14
|
-
#
|
|
15
14
|
|
|
16
15
|
from unittest import mock
|
|
17
16
|
from unittest.mock import call
|
|
18
17
|
|
|
19
|
-
from novaclient import api_versions
|
|
20
18
|
from openstack import utils as sdk_utils
|
|
21
19
|
from osc_lib import exceptions
|
|
22
20
|
|
|
@@ -24,22 +22,13 @@ from openstackclient.compute.v2 import service
|
|
|
24
22
|
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
|
|
25
23
|
|
|
26
24
|
|
|
27
|
-
class
|
|
28
|
-
def setUp(self):
|
|
29
|
-
super(TestService, self).setUp()
|
|
30
|
-
|
|
31
|
-
self.app.client_manager.sdk_connection = mock.Mock()
|
|
32
|
-
self.app.client_manager.sdk_connection.compute = mock.Mock()
|
|
33
|
-
self.sdk_client = self.app.client_manager.sdk_connection.compute
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class TestServiceDelete(TestService):
|
|
25
|
+
class TestServiceDelete(compute_fakes.TestComputev2):
|
|
37
26
|
services = compute_fakes.create_services(count=2)
|
|
38
27
|
|
|
39
28
|
def setUp(self):
|
|
40
29
|
super(TestServiceDelete, self).setUp()
|
|
41
30
|
|
|
42
|
-
self.
|
|
31
|
+
self.compute_sdk_client.delete_service.return_value = None
|
|
43
32
|
|
|
44
33
|
# Get the command object to test
|
|
45
34
|
self.cmd = service.DeleteService(self.app, None)
|
|
@@ -55,7 +44,7 @@ class TestServiceDelete(TestService):
|
|
|
55
44
|
|
|
56
45
|
result = self.cmd.take_action(parsed_args)
|
|
57
46
|
|
|
58
|
-
self.
|
|
47
|
+
self.compute_sdk_client.delete_service.assert_called_with(
|
|
59
48
|
self.services[0].binary, ignore_missing=False
|
|
60
49
|
)
|
|
61
50
|
self.assertIsNone(result)
|
|
@@ -74,7 +63,7 @@ class TestServiceDelete(TestService):
|
|
|
74
63
|
calls = []
|
|
75
64
|
for s in self.services:
|
|
76
65
|
calls.append(call(s.binary, ignore_missing=False))
|
|
77
|
-
self.
|
|
66
|
+
self.compute_sdk_client.delete_service.assert_has_calls(calls)
|
|
78
67
|
self.assertIsNone(result)
|
|
79
68
|
|
|
80
69
|
def test_multi_services_delete_with_exception(self):
|
|
@@ -86,7 +75,7 @@ class TestServiceDelete(TestService):
|
|
|
86
75
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
87
76
|
|
|
88
77
|
delete_mock_result = [None, exceptions.CommandError]
|
|
89
|
-
self.
|
|
78
|
+
self.compute_sdk_client.delete_service = mock.Mock(
|
|
90
79
|
side_effect=delete_mock_result
|
|
91
80
|
)
|
|
92
81
|
|
|
@@ -98,15 +87,15 @@ class TestServiceDelete(TestService):
|
|
|
98
87
|
'1 of 2 compute services failed to delete.', str(e)
|
|
99
88
|
)
|
|
100
89
|
|
|
101
|
-
self.
|
|
90
|
+
self.compute_sdk_client.delete_service.assert_any_call(
|
|
102
91
|
self.services[0].binary, ignore_missing=False
|
|
103
92
|
)
|
|
104
|
-
self.
|
|
93
|
+
self.compute_sdk_client.delete_service.assert_any_call(
|
|
105
94
|
'unexist_service', ignore_missing=False
|
|
106
95
|
)
|
|
107
96
|
|
|
108
97
|
|
|
109
|
-
class TestServiceList(
|
|
98
|
+
class TestServiceList(compute_fakes.TestComputev2):
|
|
110
99
|
service = compute_fakes.create_one_service()
|
|
111
100
|
|
|
112
101
|
columns = (
|
|
@@ -136,7 +125,7 @@ class TestServiceList(TestService):
|
|
|
136
125
|
def setUp(self):
|
|
137
126
|
super(TestServiceList, self).setUp()
|
|
138
127
|
|
|
139
|
-
self.
|
|
128
|
+
self.compute_sdk_client.services.return_value = [self.service]
|
|
140
129
|
|
|
141
130
|
# Get the command object to test
|
|
142
131
|
self.cmd = service.ListService(self.app, None)
|
|
@@ -159,7 +148,7 @@ class TestServiceList(TestService):
|
|
|
159
148
|
# containing the data to be listed.
|
|
160
149
|
columns, data = self.cmd.take_action(parsed_args)
|
|
161
150
|
|
|
162
|
-
self.
|
|
151
|
+
self.compute_sdk_client.services.assert_called_with(
|
|
163
152
|
host=self.service.host,
|
|
164
153
|
binary=self.service.binary,
|
|
165
154
|
)
|
|
@@ -190,7 +179,7 @@ class TestServiceList(TestService):
|
|
|
190
179
|
# containing the data to be listed.
|
|
191
180
|
columns, data = self.cmd.take_action(parsed_args)
|
|
192
181
|
|
|
193
|
-
self.
|
|
182
|
+
self.compute_sdk_client.services.assert_called_with(
|
|
194
183
|
host=self.service.host,
|
|
195
184
|
binary=self.service.binary,
|
|
196
185
|
)
|
|
@@ -215,16 +204,13 @@ class TestServiceList(TestService):
|
|
|
215
204
|
('long', True),
|
|
216
205
|
]
|
|
217
206
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
218
|
-
self.app.client_manager.compute.api_version = api_versions.APIVersion(
|
|
219
|
-
'2.11'
|
|
220
|
-
)
|
|
221
207
|
|
|
222
208
|
# In base command class Lister in cliff, abstract method take_action()
|
|
223
209
|
# returns a tuple containing the column names and an iterable
|
|
224
210
|
# containing the data to be listed.
|
|
225
211
|
columns, data = self.cmd.take_action(parsed_args)
|
|
226
212
|
|
|
227
|
-
self.
|
|
213
|
+
self.compute_sdk_client.services.assert_called_with(
|
|
228
214
|
host=self.service.host,
|
|
229
215
|
binary=self.service.binary,
|
|
230
216
|
)
|
|
@@ -237,14 +223,14 @@ class TestServiceList(TestService):
|
|
|
237
223
|
self.assertEqual(data_long, list(data))
|
|
238
224
|
|
|
239
225
|
|
|
240
|
-
class TestServiceSet(
|
|
226
|
+
class TestServiceSet(compute_fakes.TestComputev2):
|
|
241
227
|
def setUp(self):
|
|
242
228
|
super(TestServiceSet, self).setUp()
|
|
243
229
|
|
|
244
230
|
self.service = compute_fakes.create_one_service()
|
|
245
231
|
|
|
246
|
-
self.
|
|
247
|
-
self.
|
|
232
|
+
self.compute_sdk_client.enable_service.return_value = self.service
|
|
233
|
+
self.compute_sdk_client.disable_service.return_value = self.service
|
|
248
234
|
|
|
249
235
|
self.cmd = service.SetService(self.app, None)
|
|
250
236
|
|
|
@@ -262,8 +248,8 @@ class TestServiceSet(TestService):
|
|
|
262
248
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
263
249
|
result = self.cmd.take_action(parsed_args)
|
|
264
250
|
|
|
265
|
-
self.
|
|
266
|
-
self.
|
|
251
|
+
self.compute_sdk_client.enable_service.assert_not_called()
|
|
252
|
+
self.compute_sdk_client.disable_service.assert_not_called()
|
|
267
253
|
self.assertIsNone(result)
|
|
268
254
|
|
|
269
255
|
@mock.patch.object(sdk_utils, 'supports_microversion')
|
|
@@ -283,7 +269,7 @@ class TestServiceSet(TestService):
|
|
|
283
269
|
|
|
284
270
|
result = self.cmd.take_action(parsed_args)
|
|
285
271
|
|
|
286
|
-
self.
|
|
272
|
+
self.compute_sdk_client.enable_service.assert_called_with(
|
|
287
273
|
None, self.service.host, self.service.binary
|
|
288
274
|
)
|
|
289
275
|
self.assertIsNone(result)
|
|
@@ -305,7 +291,7 @@ class TestServiceSet(TestService):
|
|
|
305
291
|
|
|
306
292
|
result = self.cmd.take_action(parsed_args)
|
|
307
293
|
|
|
308
|
-
self.
|
|
294
|
+
self.compute_sdk_client.disable_service.assert_called_with(
|
|
309
295
|
None, self.service.host, self.service.binary, None
|
|
310
296
|
)
|
|
311
297
|
self.assertIsNone(result)
|
|
@@ -331,7 +317,7 @@ class TestServiceSet(TestService):
|
|
|
331
317
|
|
|
332
318
|
result = self.cmd.take_action(parsed_args)
|
|
333
319
|
|
|
334
|
-
self.
|
|
320
|
+
self.compute_sdk_client.disable_service.assert_called_with(
|
|
335
321
|
None, self.service.host, self.service.binary, reason
|
|
336
322
|
)
|
|
337
323
|
self.assertIsNone(result)
|
|
@@ -405,11 +391,11 @@ class TestServiceSet(TestService):
|
|
|
405
391
|
]
|
|
406
392
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
407
393
|
result = self.cmd.take_action(parsed_args)
|
|
408
|
-
self.
|
|
394
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
409
395
|
None, self.service.host, self.service.binary, False
|
|
410
396
|
)
|
|
411
|
-
self.assertNotCalled(self.
|
|
412
|
-
self.assertNotCalled(self.
|
|
397
|
+
self.assertNotCalled(self.compute_sdk_client.enable_service)
|
|
398
|
+
self.assertNotCalled(self.compute_sdk_client.disable_service)
|
|
413
399
|
self.assertIsNone(result)
|
|
414
400
|
|
|
415
401
|
@mock.patch.object(sdk_utils, 'supports_microversion')
|
|
@@ -427,11 +413,11 @@ class TestServiceSet(TestService):
|
|
|
427
413
|
]
|
|
428
414
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
429
415
|
result = self.cmd.take_action(parsed_args)
|
|
430
|
-
self.
|
|
416
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
431
417
|
None, self.service.host, self.service.binary, True
|
|
432
418
|
)
|
|
433
|
-
self.assertNotCalled(self.
|
|
434
|
-
self.assertNotCalled(self.
|
|
419
|
+
self.assertNotCalled(self.compute_sdk_client.enable_service)
|
|
420
|
+
self.assertNotCalled(self.compute_sdk_client.disable_service)
|
|
435
421
|
self.assertIsNone(result)
|
|
436
422
|
|
|
437
423
|
@mock.patch.object(sdk_utils, 'supports_microversion')
|
|
@@ -451,10 +437,10 @@ class TestServiceSet(TestService):
|
|
|
451
437
|
]
|
|
452
438
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
453
439
|
result = self.cmd.take_action(parsed_args)
|
|
454
|
-
self.
|
|
440
|
+
self.compute_sdk_client.enable_service.assert_called_once_with(
|
|
455
441
|
None, self.service.host, self.service.binary
|
|
456
442
|
)
|
|
457
|
-
self.
|
|
443
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
458
444
|
None, self.service.host, self.service.binary, True
|
|
459
445
|
)
|
|
460
446
|
self.assertIsNone(result)
|
|
@@ -477,12 +463,12 @@ class TestServiceSet(TestService):
|
|
|
477
463
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
478
464
|
|
|
479
465
|
with mock.patch.object(
|
|
480
|
-
self.
|
|
466
|
+
self.compute_sdk_client, 'enable_service', side_effect=Exception()
|
|
481
467
|
):
|
|
482
468
|
self.assertRaises(
|
|
483
469
|
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
484
470
|
)
|
|
485
|
-
self.
|
|
471
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
486
472
|
None, self.service.host, self.service.binary, True
|
|
487
473
|
)
|
|
488
474
|
|
|
@@ -505,12 +491,14 @@ class TestServiceSet(TestService):
|
|
|
505
491
|
]
|
|
506
492
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
507
493
|
service_id = '339478d0-0b95-4a94-be63-d5be05dfeb1c'
|
|
508
|
-
self.
|
|
494
|
+
self.compute_sdk_client.services.return_value = [
|
|
495
|
+
mock.Mock(id=service_id)
|
|
496
|
+
]
|
|
509
497
|
result = self.cmd.take_action(parsed_args)
|
|
510
|
-
self.
|
|
498
|
+
self.compute_sdk_client.disable_service.assert_called_once_with(
|
|
511
499
|
service_id, self.service.host, self.service.binary, None
|
|
512
500
|
)
|
|
513
|
-
self.
|
|
501
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
514
502
|
service_id, self.service.host, self.service.binary, True
|
|
515
503
|
)
|
|
516
504
|
self.assertIsNone(result)
|
|
@@ -536,9 +524,11 @@ class TestServiceSet(TestService):
|
|
|
536
524
|
]
|
|
537
525
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
538
526
|
service_id = '339478d0-0b95-4a94-be63-d5be05dfeb1c'
|
|
539
|
-
self.
|
|
527
|
+
self.compute_sdk_client.services.return_value = [
|
|
528
|
+
mock.Mock(id=service_id)
|
|
529
|
+
]
|
|
540
530
|
result = self.cmd.take_action(parsed_args)
|
|
541
|
-
self.
|
|
531
|
+
self.compute_sdk_client.disable_service.assert_called_once_with(
|
|
542
532
|
service_id, self.service.host, self.service.binary, reason
|
|
543
533
|
)
|
|
544
534
|
self.assertIsNone(result)
|
|
@@ -562,23 +552,25 @@ class TestServiceSet(TestService):
|
|
|
562
552
|
]
|
|
563
553
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
564
554
|
service_id = '339478d0-0b95-4a94-be63-d5be05dfeb1c'
|
|
565
|
-
self.
|
|
555
|
+
self.compute_sdk_client.services.return_value = [
|
|
556
|
+
mock.Mock(id=service_id)
|
|
557
|
+
]
|
|
566
558
|
result = self.cmd.take_action(parsed_args)
|
|
567
|
-
self.
|
|
559
|
+
self.compute_sdk_client.enable_service.assert_called_once_with(
|
|
568
560
|
service_id, self.service.host, self.service.binary
|
|
569
561
|
)
|
|
570
|
-
self.
|
|
562
|
+
self.compute_sdk_client.update_service_forced_down.assert_called_once_with(
|
|
571
563
|
service_id, self.service.host, self.service.binary, False
|
|
572
564
|
)
|
|
573
565
|
self.assertIsNone(result)
|
|
574
566
|
|
|
575
567
|
def test_service_set_find_service_by_host_and_binary_no_results(self):
|
|
576
568
|
# Tests that no compute services are found by host and binary.
|
|
577
|
-
self.
|
|
569
|
+
self.compute_sdk_client.services.return_value = []
|
|
578
570
|
ex = self.assertRaises(
|
|
579
571
|
exceptions.CommandError,
|
|
580
572
|
self.cmd._find_service_by_host_and_binary,
|
|
581
|
-
self.
|
|
573
|
+
self.compute_sdk_client,
|
|
582
574
|
'fake-host',
|
|
583
575
|
'nova-compute',
|
|
584
576
|
)
|
|
@@ -590,11 +582,14 @@ class TestServiceSet(TestService):
|
|
|
590
582
|
|
|
591
583
|
def test_service_set_find_service_by_host_and_binary_many_results(self):
|
|
592
584
|
# Tests that more than one compute service is found by host and binary.
|
|
593
|
-
self.
|
|
585
|
+
self.compute_sdk_client.services.return_value = [
|
|
586
|
+
mock.Mock(),
|
|
587
|
+
mock.Mock(),
|
|
588
|
+
]
|
|
594
589
|
ex = self.assertRaises(
|
|
595
590
|
exceptions.CommandError,
|
|
596
591
|
self.cmd._find_service_by_host_and_binary,
|
|
597
|
-
self.
|
|
592
|
+
self.compute_sdk_client,
|
|
598
593
|
'fake-host',
|
|
599
594
|
'nova-compute',
|
|
600
595
|
)
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
# under the License.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
+
import datetime
|
|
14
15
|
from unittest import mock
|
|
15
16
|
|
|
16
17
|
from openstackclient.compute.v2 import usage as usage_cmds
|
|
@@ -22,10 +23,6 @@ class TestUsage(compute_fakes.TestComputev2):
|
|
|
22
23
|
def setUp(self):
|
|
23
24
|
super(TestUsage, self).setUp()
|
|
24
25
|
|
|
25
|
-
self.app.client_manager.sdk_connection = mock.Mock()
|
|
26
|
-
self.app.client_manager.sdk_connection.compute = mock.Mock()
|
|
27
|
-
self.sdk_client = self.app.client_manager.sdk_connection.compute
|
|
28
|
-
|
|
29
26
|
self.projects_mock = self.app.client_manager.identity.projects
|
|
30
27
|
self.projects_mock.reset_mock()
|
|
31
28
|
|
|
@@ -58,7 +55,7 @@ class TestUsageList(TestUsage):
|
|
|
58
55
|
def setUp(self):
|
|
59
56
|
super(TestUsageList, self).setUp()
|
|
60
57
|
|
|
61
|
-
self.
|
|
58
|
+
self.compute_sdk_client.usages.return_value = self.usages
|
|
62
59
|
|
|
63
60
|
self.projects_mock.list.return_value = [self.project]
|
|
64
61
|
# Get the command object to test
|
|
@@ -97,9 +94,9 @@ class TestUsageList(TestUsage):
|
|
|
97
94
|
columns, data = self.cmd.take_action(parsed_args)
|
|
98
95
|
|
|
99
96
|
self.projects_mock.list.assert_called_with()
|
|
100
|
-
self.
|
|
101
|
-
start=
|
|
102
|
-
end=
|
|
97
|
+
self.compute_sdk_client.usages.assert_called_with(
|
|
98
|
+
start=datetime.datetime(2016, 11, 11, 0, 0),
|
|
99
|
+
end=datetime.datetime(2016, 12, 20, 0, 0),
|
|
103
100
|
detailed=True,
|
|
104
101
|
)
|
|
105
102
|
|
|
@@ -118,7 +115,7 @@ class TestUsageList(TestUsage):
|
|
|
118
115
|
columns, data = self.cmd.take_action(parsed_args)
|
|
119
116
|
|
|
120
117
|
self.projects_mock.list.assert_called_with()
|
|
121
|
-
self.
|
|
118
|
+
self.compute_sdk_client.usages.assert_has_calls(
|
|
122
119
|
[mock.call(start=mock.ANY, end=mock.ANY, detailed=True)]
|
|
123
120
|
)
|
|
124
121
|
self.assertCountEqual(self.columns, columns)
|
|
@@ -149,7 +146,7 @@ class TestUsageShow(TestUsage):
|
|
|
149
146
|
def setUp(self):
|
|
150
147
|
super(TestUsageShow, self).setUp()
|
|
151
148
|
|
|
152
|
-
self.
|
|
149
|
+
self.compute_sdk_client.get_usage.return_value = self.usage
|
|
153
150
|
|
|
154
151
|
self.projects_mock.get.return_value = self.project
|
|
155
152
|
# Get the command object to test
|
|
@@ -192,10 +189,10 @@ class TestUsageShow(TestUsage):
|
|
|
192
189
|
|
|
193
190
|
columns, data = self.cmd.take_action(parsed_args)
|
|
194
191
|
|
|
195
|
-
self.
|
|
192
|
+
self.compute_sdk_client.get_usage.assert_called_with(
|
|
196
193
|
project=self.project.id,
|
|
197
|
-
start=
|
|
198
|
-
end=
|
|
194
|
+
start=datetime.datetime(2016, 11, 11, 0, 0),
|
|
195
|
+
end=datetime.datetime(2016, 12, 20, 0, 0),
|
|
199
196
|
)
|
|
200
197
|
|
|
201
198
|
self.assertEqual(self.columns, columns)
|
|
@@ -115,12 +115,16 @@ class FakeClientManager(object):
|
|
|
115
115
|
self.object_store = None
|
|
116
116
|
self.volume = None
|
|
117
117
|
self.network = None
|
|
118
|
+
self.sdk_connection = mock.Mock()
|
|
119
|
+
|
|
118
120
|
self.session = None
|
|
119
121
|
self.auth_ref = None
|
|
120
122
|
self.auth_plugin_name = None
|
|
123
|
+
|
|
121
124
|
self.network_endpoint_enabled = True
|
|
122
125
|
self.compute_endpoint_enabled = True
|
|
123
126
|
self.volume_endpoint_enabled = True
|
|
127
|
+
|
|
124
128
|
# The source of configuration. This is either 'cloud_config' (a
|
|
125
129
|
# clouds.yaml file) or 'global_env' ('OS_'-prefixed envvars)
|
|
126
130
|
self.configuration_type = 'cloud_config'
|
|
@@ -63,6 +63,7 @@ class TestMappingCreate(TestMapping):
|
|
|
63
63
|
self.mapping_mock.create.assert_called_with(
|
|
64
64
|
mapping_id=identity_fakes.mapping_id,
|
|
65
65
|
rules=identity_fakes.MAPPING_RULES,
|
|
66
|
+
schema_version=None,
|
|
66
67
|
)
|
|
67
68
|
|
|
68
69
|
collist = ('id', 'rules')
|
|
@@ -106,12 +107,12 @@ class TestMappingList(TestMapping):
|
|
|
106
107
|
self.mapping_mock.list.return_value = [
|
|
107
108
|
fakes.FakeResource(
|
|
108
109
|
None,
|
|
109
|
-
{'id': identity_fakes.mapping_id},
|
|
110
|
+
{'id': identity_fakes.mapping_id, 'schema_version': '1.0'},
|
|
110
111
|
loaded=True,
|
|
111
112
|
),
|
|
112
113
|
fakes.FakeResource(
|
|
113
114
|
None,
|
|
114
|
-
{'id': 'extra_mapping'},
|
|
115
|
+
{'id': 'extra_mapping', 'schema_version': '2.0'},
|
|
115
116
|
loaded=True,
|
|
116
117
|
),
|
|
117
118
|
]
|
|
@@ -128,10 +129,13 @@ class TestMappingList(TestMapping):
|
|
|
128
129
|
|
|
129
130
|
self.mapping_mock.list.assert_called_with()
|
|
130
131
|
|
|
131
|
-
collist = ('ID',)
|
|
132
|
+
collist = ('ID', 'schema_version')
|
|
132
133
|
self.assertEqual(collist, columns)
|
|
133
134
|
|
|
134
|
-
datalist = [
|
|
135
|
+
datalist = [
|
|
136
|
+
(identity_fakes.mapping_id, '1.0'),
|
|
137
|
+
('extra_mapping', '2.0'),
|
|
138
|
+
]
|
|
135
139
|
self.assertEqual(datalist, data)
|
|
136
140
|
|
|
137
141
|
|
|
@@ -173,6 +177,7 @@ class TestMappingSet(TestMapping):
|
|
|
173
177
|
self.mapping_mock.update.assert_called_with(
|
|
174
178
|
mapping=identity_fakes.mapping_id,
|
|
175
179
|
rules=identity_fakes.MAPPING_RULES_2,
|
|
180
|
+
schema_version=None,
|
|
176
181
|
)
|
|
177
182
|
|
|
178
183
|
self.assertIsNone(result)
|
|
@@ -294,7 +294,6 @@ class TestTrustList(TestTrust):
|
|
|
294
294
|
# containing the data to be listed.
|
|
295
295
|
columns, data = self.cmd.take_action(parsed_args)
|
|
296
296
|
|
|
297
|
-
print(self.trusts_mock.list.call_args_list)
|
|
298
297
|
self.trusts_mock.list.assert_any_call(
|
|
299
298
|
trustee_user=self.users_mock.get(),
|
|
300
299
|
trustor_user=None,
|
|
@@ -335,7 +334,6 @@ class TestTrustList(TestTrust):
|
|
|
335
334
|
# containing the data to be listed.
|
|
336
335
|
columns, data = self.cmd.take_action(parsed_args)
|
|
337
336
|
|
|
338
|
-
print(self.trusts_mock.list.call_args_list)
|
|
339
337
|
self.trusts_mock.list.assert_any_call(
|
|
340
338
|
trustor_user=self.users_mock.get(),
|
|
341
339
|
trustee_user=None,
|
|
@@ -39,13 +39,14 @@ class TestImagev1(FakeClientMixin, utils.TestCommand):
|
|
|
39
39
|
endpoint=fakes.AUTH_URL,
|
|
40
40
|
token=fakes.AUTH_TOKEN,
|
|
41
41
|
)
|
|
42
|
+
self.volume_client = self.app.client_manager.volume
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
def create_one_image(attrs=None):
|
|
45
46
|
"""Create a fake image.
|
|
46
47
|
|
|
47
48
|
:param Dictionary attrs:
|
|
48
|
-
A dictionary with all
|
|
49
|
+
A dictionary with all attributes of image
|
|
49
50
|
:return:
|
|
50
51
|
A FakeResource object with id, name, owner, protected,
|
|
51
52
|
visibility and tags attrs
|
|
@@ -593,7 +593,7 @@ class TestImageSet(image_fakes.TestImagev1):
|
|
|
593
593
|
|
|
594
594
|
def test_image_update_volume(self):
|
|
595
595
|
# Set up VolumeManager Mock
|
|
596
|
-
volumes_mock = self.
|
|
596
|
+
volumes_mock = self.volume_client.volumes
|
|
597
597
|
volumes_mock.reset_mock()
|
|
598
598
|
volumes_mock.get.return_value = fakes.FakeResource(
|
|
599
599
|
None,
|
|
@@ -17,9 +17,12 @@ from unittest import mock
|
|
|
17
17
|
import uuid
|
|
18
18
|
|
|
19
19
|
from openstack.image.v2 import _proxy
|
|
20
|
+
from openstack.image.v2 import cache
|
|
20
21
|
from openstack.image.v2 import image
|
|
21
22
|
from openstack.image.v2 import member
|
|
22
23
|
from openstack.image.v2 import metadef_namespace
|
|
24
|
+
from openstack.image.v2 import metadef_object
|
|
25
|
+
from openstack.image.v2 import metadef_property
|
|
23
26
|
from openstack.image.v2 import metadef_resource_type
|
|
24
27
|
from openstack.image.v2 import service_info as _service_info
|
|
25
28
|
from openstack.image.v2 import task
|
|
@@ -238,6 +241,28 @@ def create_tasks(attrs=None, count=2):
|
|
|
238
241
|
return tasks
|
|
239
242
|
|
|
240
243
|
|
|
244
|
+
def create_cache(attrs=None):
|
|
245
|
+
attrs = attrs or {}
|
|
246
|
+
cache_info = {
|
|
247
|
+
'cached_images': [
|
|
248
|
+
{
|
|
249
|
+
'hits': 0,
|
|
250
|
+
'image_id': '1a56983c-f71f-490b-a7ac-6b321a18935a',
|
|
251
|
+
'last_accessed': 1671699579.444378,
|
|
252
|
+
'last_modified': 1671699579.444378,
|
|
253
|
+
'size': 0,
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
'queued_images': [
|
|
257
|
+
'3a4560a1-e585-443e-9b39-553b46ec92d1',
|
|
258
|
+
'6f99bf80-2ee6-47cf-acfe-1f1fabb7e810',
|
|
259
|
+
],
|
|
260
|
+
}
|
|
261
|
+
cache_info.update(attrs)
|
|
262
|
+
|
|
263
|
+
return cache.Cache(**cache_info)
|
|
264
|
+
|
|
265
|
+
|
|
241
266
|
def create_one_metadef_namespace(attrs=None):
|
|
242
267
|
"""Create a fake MetadefNamespace member.
|
|
243
268
|
|
|
@@ -263,6 +288,20 @@ def create_one_metadef_namespace(attrs=None):
|
|
|
263
288
|
return metadef_namespace.MetadefNamespace(**metadef_namespace_list)
|
|
264
289
|
|
|
265
290
|
|
|
291
|
+
def create_one_metadef_property(attrs=None):
|
|
292
|
+
attrs = attrs or {}
|
|
293
|
+
|
|
294
|
+
metadef_property_list = {
|
|
295
|
+
'name': 'cpu_cores',
|
|
296
|
+
'title': 'vCPU Cores',
|
|
297
|
+
'type': 'integer',
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
# Overwrite default attributes if there are some attributes set
|
|
301
|
+
metadef_property_list.update(attrs)
|
|
302
|
+
return metadef_property.MetadefProperty(**metadef_property_list)
|
|
303
|
+
|
|
304
|
+
|
|
266
305
|
def create_one_resource_type(attrs=None):
|
|
267
306
|
"""Create a fake MetadefResourceType member.
|
|
268
307
|
|
|
@@ -299,3 +338,46 @@ def create_resource_types(attrs=None, count=2):
|
|
|
299
338
|
metadef_resource_types.append(create_one_resource_type(attrs))
|
|
300
339
|
|
|
301
340
|
return metadef_resource_types
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def create_one_metadef_object(attrs=None):
|
|
344
|
+
"""Create a fake MetadefNamespace member.
|
|
345
|
+
|
|
346
|
+
:param attrs: A dictionary with all attributes of metadef_namespace member
|
|
347
|
+
:type attrs: dict
|
|
348
|
+
:return: a list of MetadefNamespace objects
|
|
349
|
+
:rtype: list of `metadef_namespace.MetadefNamespace`
|
|
350
|
+
"""
|
|
351
|
+
attrs = attrs or {}
|
|
352
|
+
|
|
353
|
+
metadef_objects_list = {
|
|
354
|
+
'created_at': '2014-09-19T18:20:56Z',
|
|
355
|
+
'description': 'The CPU limits with control parameters.',
|
|
356
|
+
'name': 'CPU Limits',
|
|
357
|
+
'properties': {
|
|
358
|
+
'quota:cpu_period': {
|
|
359
|
+
'description': 'The enforcement interval',
|
|
360
|
+
'maximum': 1000000,
|
|
361
|
+
'minimum': 1000,
|
|
362
|
+
'title': 'Quota: CPU Period',
|
|
363
|
+
'type': 'integer',
|
|
364
|
+
},
|
|
365
|
+
'quota:cpu_quota': {
|
|
366
|
+
'description': 'The maximum allowed bandwidth',
|
|
367
|
+
'title': 'Quota: CPU Quota',
|
|
368
|
+
'type': 'integer',
|
|
369
|
+
},
|
|
370
|
+
'quota:cpu_shares': {
|
|
371
|
+
'description': 'The proportional weighted',
|
|
372
|
+
'title': 'Quota: CPU Shares',
|
|
373
|
+
'type': 'integer',
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
'required': [],
|
|
377
|
+
'schema': '/v2/schemas/metadefs/object',
|
|
378
|
+
'updated_at': '2014-09-19T18:20:56Z',
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
# Overwrite default attributes if there are some attributes set
|
|
382
|
+
metadef_objects_list.update(attrs)
|
|
383
|
+
return metadef_object.MetadefObject(**metadef_objects_list)
|