python-openstackclient 8.1.0__py3-none-any.whl → 8.3.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/object_store_v1.py +4 -1
- openstackclient/api/volume_v2.py +60 -0
- openstackclient/api/volume_v3.py +60 -0
- openstackclient/command.py +27 -0
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +59 -21
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/module.py +4 -2
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +23 -6
- openstackclient/common/versions.py +1 -2
- openstackclient/compute/v2/agent.py +1 -1
- openstackclient/compute/v2/aggregate.py +6 -5
- openstackclient/compute/v2/console.py +5 -3
- openstackclient/compute/v2/console_connection.py +1 -1
- openstackclient/compute/v2/flavor.py +15 -2
- openstackclient/compute/v2/host.py +1 -1
- openstackclient/compute/v2/hypervisor.py +1 -1
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +1 -1
- openstackclient/compute/v2/server.py +77 -30
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -2
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +1 -1
- openstackclient/compute/v2/server_volume.py +1 -1
- openstackclient/compute/v2/service.py +1 -1
- openstackclient/compute/v2/usage.py +6 -4
- openstackclient/identity/common.py +10 -14
- openstackclient/identity/v2_0/catalog.py +3 -2
- openstackclient/identity/v2_0/ec2creds.py +1 -1
- openstackclient/identity/v2_0/endpoint.py +1 -1
- openstackclient/identity/v2_0/project.py +17 -7
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +3 -3
- openstackclient/identity/v2_0/service.py +1 -1
- openstackclient/identity/v2_0/token.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +16 -4
- openstackclient/identity/v3/application_credential.py +116 -95
- openstackclient/identity/v3/catalog.py +3 -3
- openstackclient/identity/v3/consumer.py +1 -1
- openstackclient/identity/v3/credential.py +1 -1
- openstackclient/identity/v3/domain.py +15 -10
- openstackclient/identity/v3/ec2creds.py +1 -1
- openstackclient/identity/v3/endpoint.py +33 -12
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/federation_protocol.py +1 -1
- openstackclient/identity/v3/group.py +11 -5
- openstackclient/identity/v3/identity_provider.py +12 -10
- openstackclient/identity/v3/implied_role.py +1 -1
- openstackclient/identity/v3/limit.py +1 -1
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +34 -22
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +16 -11
- openstackclient/identity/v3/role.py +27 -41
- openstackclient/identity/v3/role_assignment.py +12 -23
- openstackclient/identity/v3/service.py +1 -1
- openstackclient/identity/v3/service_provider.py +1 -1
- openstackclient/identity/v3/tag.py +3 -2
- openstackclient/identity/v3/token.py +3 -2
- openstackclient/identity/v3/trust.py +4 -2
- openstackclient/identity/v3/unscoped_saml.py +1 -1
- openstackclient/identity/v3/user.py +22 -13
- openstackclient/image/v1/image.py +35 -17
- openstackclient/image/v2/cache.py +11 -7
- openstackclient/image/v2/image.py +62 -12
- openstackclient/image/v2/info.py +1 -1
- openstackclient/image/v2/metadef_namespaces.py +1 -1
- openstackclient/image/v2/metadef_objects.py +9 -3
- openstackclient/image/v2/metadef_properties.py +11 -3
- openstackclient/image/v2/metadef_resource_type_association.py +1 -1
- openstackclient/image/v2/metadef_resource_types.py +1 -1
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +10 -9
- openstackclient/network/v2/address_group.py +4 -3
- openstackclient/network/v2/address_scope.py +8 -6
- openstackclient/network/v2/default_security_group_rule.py +9 -8
- openstackclient/network/v2/floating_ip.py +16 -9
- openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
- openstackclient/network/v2/ip_availability.py +7 -4
- openstackclient/network/v2/l3_conntrack_helper.py +11 -4
- openstackclient/network/v2/local_ip.py +13 -7
- openstackclient/network/v2/local_ip_association.py +7 -4
- openstackclient/network/v2/ndp_proxy.py +13 -6
- openstackclient/network/v2/network.py +33 -16
- openstackclient/network/v2/network_agent.py +5 -5
- openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +1 -1
- openstackclient/network/v2/network_meter.py +1 -1
- openstackclient/network/v2/network_meter_rule.py +1 -1
- openstackclient/network/v2/network_qos_policy.py +7 -5
- openstackclient/network/v2/network_qos_rule.py +1 -1
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +8 -5
- openstackclient/network/v2/network_segment.py +2 -2
- openstackclient/network/v2/network_segment_range.py +13 -6
- openstackclient/network/v2/network_service_provider.py +1 -1
- openstackclient/network/v2/network_trunk.py +65 -42
- openstackclient/network/v2/port.py +38 -20
- openstackclient/network/v2/router.py +19 -8
- openstackclient/network/v2/security_group.py +52 -7
- openstackclient/network/v2/security_group_rule.py +27 -4
- openstackclient/network/v2/subnet.py +17 -18
- openstackclient/network/v2/subnet_pool.py +11 -9
- openstackclient/network/v2/taas/__init__.py +0 -0
- openstackclient/network/v2/taas/tap_flow.py +245 -0
- openstackclient/network/v2/taas/tap_mirror.py +237 -0
- openstackclient/network/v2/taas/tap_service.py +211 -0
- openstackclient/object/v1/account.py +1 -1
- openstackclient/object/v1/container.py +1 -1
- openstackclient/object/v1/object.py +1 -1
- openstackclient/shell.py +18 -8
- 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/identity/v3/test_catalog.py +42 -23
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_image.py +36 -14
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- 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/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +2 -3
- openstackclient/tests/unit/common/test_module.py +14 -7
- openstackclient/tests/unit/common/test_quota.py +20 -0
- openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
- openstackclient/tests/unit/compute/v2/test_console.py +1 -4
- openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
- openstackclient/tests/unit/compute/v2/test_server.py +406 -81
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
- openstackclient/tests/unit/compute/v2/test_service.py +1 -3
- openstackclient/tests/unit/fakes.py +35 -134
- openstackclient/tests/unit/identity/test_common.py +100 -0
- openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
- openstackclient/tests/unit/identity/v3/fakes.py +10 -2
- openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
- openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
- openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +4 -2
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +31 -54
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
- openstackclient/tests/unit/identity/v3/test_role.py +3 -90
- openstackclient/tests/unit/identity/v3/test_user.py +7 -51
- openstackclient/tests/unit/image/v1/test_image.py +47 -0
- openstackclient/tests/unit/image/v2/test_image.py +190 -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/test_common.py +9 -13
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
- openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
- openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
- openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
- openstackclient/tests/unit/network/v2/test_network.py +41 -37
- openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
- openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
- openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
- openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
- openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
- openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
- openstackclient/tests/unit/network/v2/test_port.py +113 -84
- openstackclient/tests/unit/network/v2/test_router.py +104 -126
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
- openstackclient/tests/unit/volume/test_find_resource.py +4 -13
- openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
- openstackclient/volume/client.py +7 -17
- openstackclient/volume/v2/backup_record.py +1 -1
- openstackclient/volume/v2/consistency_group.py +1 -1
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
- openstackclient/volume/v2/qos_specs.py +1 -1
- openstackclient/volume/v2/service.py +2 -2
- openstackclient/volume/v2/volume.py +80 -54
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +5 -3
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_transfer_request.py +1 -1
- openstackclient/volume/v2/volume_type.py +11 -6
- openstackclient/volume/v3/block_storage_cleanup.py +1 -1
- openstackclient/volume/v3/block_storage_cluster.py +1 -1
- openstackclient/volume/v3/block_storage_log_level.py +1 -1
- openstackclient/volume/v3/block_storage_manage.py +1 -1
- openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
- openstackclient/volume/v3/service.py +2 -2
- openstackclient/volume/v3/volume.py +104 -77
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +18 -3
- openstackclient/volume/v3/volume_group.py +2 -2
- openstackclient/volume/v3/volume_group_snapshot.py +1 -1
- openstackclient/volume/v3/volume_group_type.py +1 -1
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +2 -2
- openstackclient/volume/v3/volume_transfer_request.py +1 -1
- openstackclient/volume/v3/volume_type.py +15 -9
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_logs.py +0 -221
- python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -822,6 +822,8 @@ class TestImageList(TestImage):
|
|
|
822
822
|
'Visibility',
|
|
823
823
|
'Protected',
|
|
824
824
|
'Project',
|
|
825
|
+
'Hash Algorithm',
|
|
826
|
+
'Hash Value',
|
|
825
827
|
'Tags',
|
|
826
828
|
)
|
|
827
829
|
|
|
@@ -830,14 +832,16 @@ class TestImageList(TestImage):
|
|
|
830
832
|
(
|
|
831
833
|
self._image.id,
|
|
832
834
|
self._image.name,
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
835
|
+
self._image.disk_format,
|
|
836
|
+
self._image.container_format,
|
|
837
|
+
self._image.size,
|
|
838
|
+
self._image.checksum,
|
|
839
|
+
self._image.status,
|
|
838
840
|
self._image.visibility,
|
|
839
841
|
self._image.is_protected,
|
|
840
842
|
self._image.owner_id,
|
|
843
|
+
self._image.hash_algo,
|
|
844
|
+
self._image.hash_value,
|
|
841
845
|
format_columns.ListColumn(self._image.tags),
|
|
842
846
|
),
|
|
843
847
|
)
|
|
@@ -1291,6 +1295,117 @@ class TestImageSet(TestImage):
|
|
|
1291
1295
|
# the 'update membership' route.
|
|
1292
1296
|
self.image_client.update_image.assert_called_with(self._image.id)
|
|
1293
1297
|
|
|
1298
|
+
def test_image_set_membership_accept_with_project_no_owner_change(self):
|
|
1299
|
+
"""Test that --project with --accept doesn't change image owner."""
|
|
1300
|
+
membership = image_fakes.create_one_image_member(
|
|
1301
|
+
attrs={
|
|
1302
|
+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
|
|
1303
|
+
'member_id': self.project.id,
|
|
1304
|
+
}
|
|
1305
|
+
)
|
|
1306
|
+
self.image_client.update_member.return_value = membership
|
|
1307
|
+
|
|
1308
|
+
arglist = [
|
|
1309
|
+
'--project',
|
|
1310
|
+
self.project.name,
|
|
1311
|
+
'--accept',
|
|
1312
|
+
self._image.id,
|
|
1313
|
+
]
|
|
1314
|
+
verifylist = [
|
|
1315
|
+
('project', self.project.name),
|
|
1316
|
+
('membership', 'accepted'),
|
|
1317
|
+
('image', self._image.id),
|
|
1318
|
+
]
|
|
1319
|
+
|
|
1320
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1321
|
+
self.cmd.take_action(parsed_args)
|
|
1322
|
+
|
|
1323
|
+
self.image_client.update_member.assert_called_once_with(
|
|
1324
|
+
image=self._image.id,
|
|
1325
|
+
member=self.project.id,
|
|
1326
|
+
status='accepted',
|
|
1327
|
+
)
|
|
1328
|
+
|
|
1329
|
+
self.image_client.update_image.assert_called()
|
|
1330
|
+
call_args = self.image_client.update_image.call_args
|
|
1331
|
+
if call_args:
|
|
1332
|
+
args, kwargs = call_args
|
|
1333
|
+
self.assertNotIn('owner_id', kwargs)
|
|
1334
|
+
|
|
1335
|
+
def test_image_set_membership_reject_with_project_no_owner_change(self):
|
|
1336
|
+
"""Test that --project with --reject doesn't change image owner."""
|
|
1337
|
+
membership = image_fakes.create_one_image_member(
|
|
1338
|
+
attrs={
|
|
1339
|
+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
|
|
1340
|
+
'member_id': self.project.id,
|
|
1341
|
+
}
|
|
1342
|
+
)
|
|
1343
|
+
self.image_client.update_member.return_value = membership
|
|
1344
|
+
|
|
1345
|
+
arglist = [
|
|
1346
|
+
'--project',
|
|
1347
|
+
self.project.name,
|
|
1348
|
+
'--reject',
|
|
1349
|
+
self._image.id,
|
|
1350
|
+
]
|
|
1351
|
+
verifylist = [
|
|
1352
|
+
('project', self.project.name),
|
|
1353
|
+
('membership', 'rejected'),
|
|
1354
|
+
('image', self._image.id),
|
|
1355
|
+
]
|
|
1356
|
+
|
|
1357
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1358
|
+
self.cmd.take_action(parsed_args)
|
|
1359
|
+
|
|
1360
|
+
self.image_client.update_member.assert_called_once_with(
|
|
1361
|
+
image=self._image.id,
|
|
1362
|
+
member=self.project.id,
|
|
1363
|
+
status='rejected',
|
|
1364
|
+
)
|
|
1365
|
+
|
|
1366
|
+
self.image_client.update_image.assert_called()
|
|
1367
|
+
call_args = self.image_client.update_image.call_args
|
|
1368
|
+
if call_args:
|
|
1369
|
+
args, kwargs = call_args
|
|
1370
|
+
self.assertNotIn('owner_id', kwargs)
|
|
1371
|
+
|
|
1372
|
+
def test_image_set_membership_pending_with_project_no_owner_change(self):
|
|
1373
|
+
"""Test that --project with --pending doesn't change image owner."""
|
|
1374
|
+
membership = image_fakes.create_one_image_member(
|
|
1375
|
+
attrs={
|
|
1376
|
+
'image_id': '0f41529e-7c12-4de8-be2d-181abb825b3c',
|
|
1377
|
+
'member_id': self.project.id,
|
|
1378
|
+
}
|
|
1379
|
+
)
|
|
1380
|
+
self.image_client.update_member.return_value = membership
|
|
1381
|
+
|
|
1382
|
+
arglist = [
|
|
1383
|
+
'--project',
|
|
1384
|
+
self.project.name,
|
|
1385
|
+
'--pending',
|
|
1386
|
+
self._image.id,
|
|
1387
|
+
]
|
|
1388
|
+
verifylist = [
|
|
1389
|
+
('project', self.project.name),
|
|
1390
|
+
('membership', 'pending'),
|
|
1391
|
+
('image', self._image.id),
|
|
1392
|
+
]
|
|
1393
|
+
|
|
1394
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1395
|
+
self.cmd.take_action(parsed_args)
|
|
1396
|
+
|
|
1397
|
+
self.image_client.update_member.assert_called_once_with(
|
|
1398
|
+
image=self._image.id,
|
|
1399
|
+
member=self.project.id,
|
|
1400
|
+
status='pending',
|
|
1401
|
+
)
|
|
1402
|
+
|
|
1403
|
+
self.image_client.update_image.assert_called()
|
|
1404
|
+
call_args = self.image_client.update_image.call_args
|
|
1405
|
+
if call_args:
|
|
1406
|
+
args, kwargs = call_args
|
|
1407
|
+
self.assertNotIn('owner_id', kwargs)
|
|
1408
|
+
|
|
1294
1409
|
def test_image_set_options(self):
|
|
1295
1410
|
arglist = [
|
|
1296
1411
|
'--name',
|
|
@@ -1356,15 +1471,17 @@ class TestImageSet(TestImage):
|
|
|
1356
1471
|
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
1357
1472
|
)
|
|
1358
1473
|
|
|
1359
|
-
def
|
|
1474
|
+
def test_image_set_bools_true(self):
|
|
1360
1475
|
arglist = [
|
|
1361
1476
|
'--protected',
|
|
1362
1477
|
'--private',
|
|
1478
|
+
'--hidden',
|
|
1363
1479
|
'graven',
|
|
1364
1480
|
]
|
|
1365
1481
|
verifylist = [
|
|
1366
1482
|
('is_protected', True),
|
|
1367
1483
|
('visibility', 'private'),
|
|
1484
|
+
('is_hidden', True),
|
|
1368
1485
|
('image', 'graven'),
|
|
1369
1486
|
]
|
|
1370
1487
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -1374,6 +1491,7 @@ class TestImageSet(TestImage):
|
|
|
1374
1491
|
kwargs = {
|
|
1375
1492
|
'is_protected': True,
|
|
1376
1493
|
'visibility': 'private',
|
|
1494
|
+
'is_hidden': True,
|
|
1377
1495
|
}
|
|
1378
1496
|
# ImageManager.update(image, **kwargs)
|
|
1379
1497
|
self.image_client.update_image.assert_called_with(
|
|
@@ -1381,15 +1499,17 @@ class TestImageSet(TestImage):
|
|
|
1381
1499
|
)
|
|
1382
1500
|
self.assertIsNone(result)
|
|
1383
1501
|
|
|
1384
|
-
def
|
|
1502
|
+
def test_image_set_bools_false(self):
|
|
1385
1503
|
arglist = [
|
|
1386
1504
|
'--unprotected',
|
|
1387
1505
|
'--public',
|
|
1506
|
+
'--unhidden',
|
|
1388
1507
|
'graven',
|
|
1389
1508
|
]
|
|
1390
1509
|
verifylist = [
|
|
1391
1510
|
('is_protected', False),
|
|
1392
1511
|
('visibility', 'public'),
|
|
1512
|
+
('is_hidden', False),
|
|
1393
1513
|
('image', 'graven'),
|
|
1394
1514
|
]
|
|
1395
1515
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -1399,6 +1519,7 @@ class TestImageSet(TestImage):
|
|
|
1399
1519
|
kwargs = {
|
|
1400
1520
|
'is_protected': False,
|
|
1401
1521
|
'visibility': 'public',
|
|
1522
|
+
'is_hidden': False,
|
|
1402
1523
|
}
|
|
1403
1524
|
# ImageManager.update(image, **kwargs)
|
|
1404
1525
|
self.image_client.update_image.assert_called_with(
|
|
@@ -1779,6 +1900,7 @@ class TestImageUnset(TestImage):
|
|
|
1779
1900
|
attrs['hw_rng_model'] = 'virtio'
|
|
1780
1901
|
attrs['prop'] = 'test'
|
|
1781
1902
|
attrs['prop2'] = 'fake'
|
|
1903
|
+
attrs['os_secure_boot'] = 'required'
|
|
1782
1904
|
self.image = image_fakes.create_one_image(attrs)
|
|
1783
1905
|
|
|
1784
1906
|
self.image_client.find_image.return_value = self.image
|
|
@@ -1822,11 +1944,18 @@ class TestImageUnset(TestImage):
|
|
|
1822
1944
|
'hw_rng_model',
|
|
1823
1945
|
'--property',
|
|
1824
1946
|
'prop',
|
|
1947
|
+
'--property',
|
|
1948
|
+
'os_secure_boot',
|
|
1825
1949
|
self.image.id,
|
|
1826
1950
|
]
|
|
1827
1951
|
|
|
1952
|
+
# openstacksdk translates 'os_secure_boot' property to
|
|
1953
|
+
# 'needs_secure_boot' Image attribute. This is true for
|
|
1954
|
+
# all IMAGE_ATTRIBUTES_CUSTOM_NAMES keys
|
|
1955
|
+
self.assertEqual(self.image.needs_secure_boot, 'required')
|
|
1956
|
+
self.assertFalse(hasattr(self.image, 'os_secure_boot'))
|
|
1828
1957
|
verifylist = [
|
|
1829
|
-
('properties', ['hw_rng_model', 'prop']),
|
|
1958
|
+
('properties', ['hw_rng_model', 'prop', 'os_secure_boot']),
|
|
1830
1959
|
('image', self.image.id),
|
|
1831
1960
|
]
|
|
1832
1961
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -2039,6 +2168,36 @@ class TestImageImport(TestImage):
|
|
|
2039
2168
|
|
|
2040
2169
|
self.image_client.import_image.assert_not_called()
|
|
2041
2170
|
|
|
2171
|
+
def test_import_image__web_download_invalid_url(self):
|
|
2172
|
+
arglist = [
|
|
2173
|
+
self.image.name,
|
|
2174
|
+
'--method',
|
|
2175
|
+
'web-download',
|
|
2176
|
+
'--uri',
|
|
2177
|
+
'invalid:1234',
|
|
2178
|
+
]
|
|
2179
|
+
|
|
2180
|
+
verifylist = [
|
|
2181
|
+
('image', self.image.name),
|
|
2182
|
+
('import_method', 'web-download'),
|
|
2183
|
+
('uri', 'invalid:1234'),
|
|
2184
|
+
]
|
|
2185
|
+
|
|
2186
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
2187
|
+
|
|
2188
|
+
exc = self.assertRaises(
|
|
2189
|
+
exceptions.CommandError,
|
|
2190
|
+
self.cmd.take_action,
|
|
2191
|
+
parsed_args,
|
|
2192
|
+
)
|
|
2193
|
+
|
|
2194
|
+
self.assertIn(
|
|
2195
|
+
"'invalid:1234' is not a valid url",
|
|
2196
|
+
str(exc),
|
|
2197
|
+
)
|
|
2198
|
+
|
|
2199
|
+
self.image_client.import_image.assert_not_called()
|
|
2200
|
+
|
|
2042
2201
|
def test_import_image__web_download_invalid_image_state(self):
|
|
2043
2202
|
self.image.status = 'uploading' # != 'queued'
|
|
2044
2203
|
arglist = [
|
|
@@ -2190,7 +2349,29 @@ class TestImageSave(TestImage):
|
|
|
2190
2349
|
self.cmd.take_action(parsed_args)
|
|
2191
2350
|
|
|
2192
2351
|
self.image_client.download_image.assert_called_once_with(
|
|
2193
|
-
self.image.id,
|
|
2352
|
+
self.image.id, output='/path/to/file', stream=True, chunk_size=1024
|
|
2353
|
+
)
|
|
2354
|
+
|
|
2355
|
+
def test_save_data_with_chunk_size(self):
|
|
2356
|
+
arglist = [
|
|
2357
|
+
'--file',
|
|
2358
|
+
'/path/to/file',
|
|
2359
|
+
'--chunk-size',
|
|
2360
|
+
'2048',
|
|
2361
|
+
self.image.id,
|
|
2362
|
+
]
|
|
2363
|
+
|
|
2364
|
+
verifylist = [
|
|
2365
|
+
('filename', '/path/to/file'),
|
|
2366
|
+
('chunk_size', 2048),
|
|
2367
|
+
('image', self.image.id),
|
|
2368
|
+
]
|
|
2369
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
2370
|
+
|
|
2371
|
+
self.cmd.take_action(parsed_args)
|
|
2372
|
+
|
|
2373
|
+
self.image_client.download_image.assert_called_once_with(
|
|
2374
|
+
self.image.id, output='/path/to/file', stream=True, chunk_size=2048
|
|
2194
2375
|
)
|
|
2195
2376
|
|
|
2196
2377
|
|
|
@@ -113,6 +113,7 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
|
|
|
113
113
|
super().setUp()
|
|
114
114
|
|
|
115
115
|
self.image_client.delete_metadef_object.return_value = None
|
|
116
|
+
self.image_client.delete_all_metadef_objects.return_value = None
|
|
116
117
|
self.cmd = metadef_objects.DeleteMetadefObject(self.app, None)
|
|
117
118
|
|
|
118
119
|
def test_object_delete(self):
|
|
@@ -126,8 +127,29 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
|
|
|
126
127
|
|
|
127
128
|
result = self.cmd.take_action(parsed_args)
|
|
128
129
|
|
|
130
|
+
self.image_client.delete_metadef_object.assert_called_once_with(
|
|
131
|
+
self.image_client.get_metadef_object(),
|
|
132
|
+
self._metadef_namespace.namespace,
|
|
133
|
+
)
|
|
134
|
+
self.image_client.delete_all_metadef_objects.assert_not_called()
|
|
129
135
|
self.assertIsNone(result)
|
|
130
136
|
|
|
137
|
+
def test_object_delete_all(self):
|
|
138
|
+
arglist = [
|
|
139
|
+
self._metadef_namespace.namespace,
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
verifylist = []
|
|
143
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
144
|
+
|
|
145
|
+
result = self.cmd.take_action(parsed_args)
|
|
146
|
+
|
|
147
|
+
self.assertIsNone(result)
|
|
148
|
+
self.image_client.delete_all_metadef_objects.assert_called_with(
|
|
149
|
+
self._metadef_namespace.namespace,
|
|
150
|
+
)
|
|
151
|
+
self.image_client.delete_metadef_object.assert_not_called()
|
|
152
|
+
|
|
131
153
|
|
|
132
154
|
class TestMetadefObjectList(fakes.TestImagev2):
|
|
133
155
|
_metadef_namespace = fakes.create_one_metadef_namespace()
|
|
@@ -91,6 +91,7 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
|
|
|
91
91
|
super().setUp()
|
|
92
92
|
|
|
93
93
|
self.cmd = metadef_properties.DeleteMetadefProperty(self.app, None)
|
|
94
|
+
self.image_client.delete_all_metadef_properties.return_value = None
|
|
94
95
|
|
|
95
96
|
def test_metadef_property_delete(self):
|
|
96
97
|
arglist = ['namespace', 'property']
|
|
@@ -100,6 +101,10 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
|
|
|
100
101
|
result = self.cmd.take_action(parsed_args)
|
|
101
102
|
|
|
102
103
|
self.assertIsNone(result)
|
|
104
|
+
self.image_client.delete_metadef_property.assert_called_with(
|
|
105
|
+
'property', 'namespace', ignore_missing=False
|
|
106
|
+
)
|
|
107
|
+
self.image_client.delete_all_metadef_properties.assert_not_called()
|
|
103
108
|
|
|
104
109
|
def test_metadef_property_delete_missing_arguments(self):
|
|
105
110
|
arglist = []
|
|
@@ -110,21 +115,13 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
|
|
|
110
115
|
arglist,
|
|
111
116
|
[],
|
|
112
117
|
)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
self.assertRaises(
|
|
116
|
-
tests_utils.ParserException,
|
|
117
|
-
self.check_parser,
|
|
118
|
-
self.cmd,
|
|
119
|
-
arglist,
|
|
120
|
-
[],
|
|
121
|
-
)
|
|
118
|
+
self.image_client.delete_all_metadef_properties.assert_not_called()
|
|
119
|
+
self.image_client.delete_metadef_property.assert_not_called()
|
|
122
120
|
|
|
123
121
|
def test_metadef_property_delete_exception(self):
|
|
124
122
|
arglist = ['namespace', 'property']
|
|
125
123
|
verifylist = []
|
|
126
124
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
127
|
-
|
|
128
125
|
self.image_client.delete_metadef_property.side_effect = (
|
|
129
126
|
sdk_exceptions.ResourceNotFound
|
|
130
127
|
)
|
|
@@ -132,6 +129,23 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
|
|
|
132
129
|
self.assertRaises(
|
|
133
130
|
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
134
131
|
)
|
|
132
|
+
self.image_client.delete_metadef_property.assert_called_with(
|
|
133
|
+
'property', 'namespace', ignore_missing=False
|
|
134
|
+
)
|
|
135
|
+
self.image_client.delete_all_metadef_properties.assert_not_called()
|
|
136
|
+
|
|
137
|
+
def test_metadef_property_delete_all(self):
|
|
138
|
+
arglist = ['namespace']
|
|
139
|
+
verifylist = []
|
|
140
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
141
|
+
|
|
142
|
+
result = self.cmd.take_action(parsed_args)
|
|
143
|
+
|
|
144
|
+
self.assertIsNone(result)
|
|
145
|
+
self.image_client.delete_all_metadef_properties.assert_called_with(
|
|
146
|
+
'namespace'
|
|
147
|
+
)
|
|
148
|
+
self.image_client.delete_metadef_property.assert_not_called()
|
|
135
149
|
|
|
136
150
|
|
|
137
151
|
class TestMetadefPropertyList(image_fakes.TestImagev2):
|
|
@@ -126,17 +126,13 @@ class TestNetworkAndCompute(utils.TestCommand):
|
|
|
126
126
|
# Create client mocks. Note that we intentionally do not use specced
|
|
127
127
|
# mocks since we want to test fake methods.
|
|
128
128
|
|
|
129
|
-
self.app.client_manager.network = mock.Mock()
|
|
130
|
-
self.network_client = self.app.client_manager.network
|
|
131
|
-
self.network_client.network_action =
|
|
132
|
-
return_value='take_action_network'
|
|
133
|
-
)
|
|
129
|
+
self.app.client_manager.network = mock.Mock() # noqa: O401
|
|
130
|
+
self.network_client = self.app.client_manager.network # noqa: O401
|
|
131
|
+
self.network_client.network_action.return_value = 'take_action_network'
|
|
134
132
|
|
|
135
|
-
self.app.client_manager.compute = mock.Mock()
|
|
136
|
-
self.compute_client = self.app.client_manager.compute
|
|
137
|
-
self.compute_client.compute_action =
|
|
138
|
-
return_value='take_action_compute'
|
|
139
|
-
)
|
|
133
|
+
self.app.client_manager.compute = mock.Mock() # noqa: O401
|
|
134
|
+
self.compute_client = self.app.client_manager.compute # noqa: O401
|
|
135
|
+
self.compute_client.compute_action.return_value = 'take_action_compute'
|
|
140
136
|
|
|
141
137
|
self.cmd = FakeNetworkAndComputeCommand(self.app, None)
|
|
142
138
|
|
|
@@ -205,9 +201,9 @@ class TestNeutronCommandWithExtraArgs(utils.TestCommand):
|
|
|
205
201
|
# Create client mocks. Note that we intentionally do not use specced
|
|
206
202
|
# mocks since we want to test fake methods.
|
|
207
203
|
|
|
208
|
-
self.app.client_manager.network = mock.Mock()
|
|
209
|
-
self.network_client = self.app.client_manager.network
|
|
210
|
-
self.network_client.test_create_action = mock.Mock()
|
|
204
|
+
self.app.client_manager.network = mock.Mock() # noqa: O401
|
|
205
|
+
self.network_client = self.app.client_manager.network # noqa: O401
|
|
206
|
+
self.network_client.test_create_action = mock.Mock() # noqa: O402
|
|
211
207
|
|
|
212
208
|
# Subclasses can override the command object to test.
|
|
213
209
|
self.cmd = FakeCreateNeutronCommandWithExtraArgs(self.app, None)
|
|
File without changes
|