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.
Files changed (162) hide show
  1. openstackclient/common/availability_zone.py +4 -4
  2. openstackclient/common/pagination.py +82 -0
  3. openstackclient/compute/v2/flavor.py +2 -16
  4. openstackclient/compute/v2/hypervisor.py +2 -21
  5. openstackclient/compute/v2/keypair.py +2 -9
  6. openstackclient/compute/v2/server.py +220 -131
  7. openstackclient/compute/v2/server_event.py +30 -19
  8. openstackclient/compute/v2/server_group.py +2 -23
  9. openstackclient/compute/v2/server_migration.py +2 -22
  10. openstackclient/compute/v2/usage.py +4 -6
  11. openstackclient/identity/v3/mapping.py +25 -3
  12. openstackclient/identity/v3/policy.py +3 -1
  13. openstackclient/image/v2/cache.py +218 -0
  14. openstackclient/image/v2/image.py +40 -17
  15. openstackclient/image/v2/metadef_namespaces.py +25 -21
  16. openstackclient/image/v2/metadef_objects.py +189 -0
  17. openstackclient/image/v2/metadef_properties.py +284 -0
  18. openstackclient/network/utils.py +100 -0
  19. openstackclient/network/v2/default_security_group_rule.py +418 -0
  20. openstackclient/network/v2/local_ip_association.py +1 -1
  21. openstackclient/network/v2/ndp_proxy.py +7 -3
  22. openstackclient/network/v2/network.py +2 -2
  23. openstackclient/network/v2/port.py +65 -19
  24. openstackclient/network/v2/security_group_rule.py +18 -111
  25. openstackclient/network/v2/subnet.py +1 -0
  26. openstackclient/object/v1/container.py +2 -12
  27. openstackclient/object/v1/object.py +2 -11
  28. openstackclient/tests/functional/base.py +13 -6
  29. openstackclient/tests/functional/identity/v3/test_role.py +11 -3
  30. openstackclient/tests/functional/network/v2/common.py +7 -1
  31. openstackclient/tests/functional/network/v2/test_address_group.py +2 -4
  32. openstackclient/tests/functional/network/v2/test_address_scope.py +0 -6
  33. openstackclient/tests/functional/network/v2/test_default_security_group_rule.py +67 -0
  34. openstackclient/tests/functional/network/v2/test_floating_ip.py +3 -6
  35. openstackclient/tests/functional/network/v2/test_ip_availability.py +3 -8
  36. openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +3 -4
  37. openstackclient/tests/functional/network/v2/test_local_ip.py +2 -4
  38. openstackclient/tests/functional/network/v2/test_network.py +18 -17
  39. openstackclient/tests/functional/network/v2/test_network_agent.py +24 -21
  40. openstackclient/tests/functional/network/v2/test_network_flavor.py +0 -6
  41. openstackclient/tests/functional/network/v2/test_network_flavor_profile.py +0 -6
  42. openstackclient/tests/functional/network/v2/test_network_meter.py +6 -6
  43. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +7 -8
  44. openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +1 -3
  45. openstackclient/tests/functional/network/v2/test_network_qos_policy.py +4 -4
  46. openstackclient/tests/functional/network/v2/test_network_qos_rule.py +16 -20
  47. openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py +4 -4
  48. openstackclient/tests/functional/network/v2/test_network_rbac.py +1 -4
  49. openstackclient/tests/functional/network/v2/test_network_segment.py +7 -12
  50. openstackclient/tests/functional/network/v2/test_network_segment_range.py +3 -4
  51. openstackclient/tests/functional/network/v2/test_network_service_provider.py +2 -4
  52. openstackclient/tests/functional/network/v2/test_network_trunk.py +3 -3
  53. openstackclient/tests/functional/network/v2/test_port.py +2 -8
  54. openstackclient/tests/functional/network/v2/test_router.py +0 -6
  55. openstackclient/tests/functional/network/v2/test_security_group.py +1 -4
  56. openstackclient/tests/functional/network/v2/test_security_group_rule.py +1 -4
  57. openstackclient/tests/functional/network/v2/test_subnet.py +4 -22
  58. openstackclient/tests/functional/network/v2/test_subnet_pool.py +0 -6
  59. openstackclient/tests/unit/common/test_availability_zone.py +28 -30
  60. openstackclient/tests/unit/common/test_extension.py +1 -4
  61. openstackclient/tests/unit/common/test_limits.py +2 -4
  62. openstackclient/tests/unit/common/test_project_cleanup.py +3 -10
  63. openstackclient/tests/unit/common/test_quota.py +18 -24
  64. openstackclient/tests/unit/compute/v2/fakes.py +24 -11
  65. openstackclient/tests/unit/compute/v2/test_agent.py +1 -1
  66. openstackclient/tests/unit/compute/v2/test_aggregate.py +62 -72
  67. openstackclient/tests/unit/compute/v2/test_console.py +18 -30
  68. openstackclient/tests/unit/compute/v2/test_flavor.py +85 -89
  69. openstackclient/tests/unit/compute/v2/test_host.py +12 -19
  70. openstackclient/tests/unit/compute/v2/test_hypervisor.py +23 -25
  71. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -6
  72. openstackclient/tests/unit/compute/v2/test_keypair.py +25 -39
  73. openstackclient/tests/unit/compute/v2/test_server.py +316 -365
  74. openstackclient/tests/unit/compute/v2/test_server_backup.py +5 -17
  75. openstackclient/tests/unit/compute/v2/test_server_event.py +23 -25
  76. openstackclient/tests/unit/compute/v2/test_server_group.py +41 -33
  77. openstackclient/tests/unit/compute/v2/test_server_image.py +6 -18
  78. openstackclient/tests/unit/compute/v2/test_server_migration.py +45 -45
  79. openstackclient/tests/unit/compute/v2/test_server_volume.py +15 -31
  80. openstackclient/tests/unit/compute/v2/test_service.py +51 -56
  81. openstackclient/tests/unit/compute/v2/test_usage.py +10 -13
  82. openstackclient/tests/unit/fakes.py +4 -0
  83. openstackclient/tests/unit/identity/v3/test_mappings.py +9 -4
  84. openstackclient/tests/unit/identity/v3/test_trust.py +0 -2
  85. openstackclient/tests/unit/image/v1/fakes.py +2 -1
  86. openstackclient/tests/unit/image/v1/test_image.py +1 -1
  87. openstackclient/tests/unit/image/v2/fakes.py +82 -0
  88. openstackclient/tests/unit/image/v2/test_cache.py +214 -0
  89. openstackclient/tests/unit/image/v2/test_image.py +62 -4
  90. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +5 -19
  91. openstackclient/tests/unit/image/v2/test_metadef_objects.py +162 -0
  92. openstackclient/tests/unit/image/v2/test_metadef_properties.py +227 -0
  93. openstackclient/tests/unit/integ/cli/test_shell.py +0 -2
  94. openstackclient/tests/unit/network/test_common.py +3 -3
  95. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  96. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +1133 -0
  97. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +5 -13
  98. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -9
  99. openstackclient/tests/unit/network/v2/test_network.py +33 -0
  100. openstackclient/tests/unit/network/v2/test_network_compute.py +5 -11
  101. openstackclient/tests/unit/network/v2/test_network_trunk.py +6 -8
  102. openstackclient/tests/unit/network/v2/test_port.py +83 -38
  103. openstackclient/tests/unit/network/v2/test_security_group_compute.py +7 -15
  104. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +19 -27
  105. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +3 -6
  106. openstackclient/tests/unit/network/v2/test_subnet.py +92 -0
  107. openstackclient/tests/unit/network/v2/test_subnet_pool.py +11 -13
  108. openstackclient/tests/unit/test_shell.py +1 -7
  109. openstackclient/tests/unit/utils.py +10 -4
  110. openstackclient/tests/unit/volume/v1/fakes.py +7 -1
  111. openstackclient/tests/unit/volume/v1/test_qos_specs.py +2 -2
  112. openstackclient/tests/unit/volume/v1/test_service.py +1 -1
  113. openstackclient/tests/unit/volume/v1/test_transfer_request.py +2 -2
  114. openstackclient/tests/unit/volume/v1/test_type.py +2 -4
  115. openstackclient/tests/unit/volume/v1/test_volume.py +5 -7
  116. openstackclient/tests/unit/volume/v1/test_volume_backup.py +4 -4
  117. openstackclient/tests/unit/volume/v2/fakes.py +32 -12
  118. openstackclient/tests/unit/volume/v2/test_backup_record.py +1 -1
  119. openstackclient/tests/unit/volume/v2/test_consistency_group.py +4 -6
  120. openstackclient/tests/unit/volume/v2/test_consistency_group_snapshot.py +2 -4
  121. openstackclient/tests/unit/volume/v2/test_qos_specs.py +2 -2
  122. openstackclient/tests/unit/volume/v2/test_service.py +1 -1
  123. openstackclient/tests/unit/volume/v2/test_volume.py +78 -16
  124. openstackclient/tests/unit/volume/v2/test_volume_backend.py +10 -22
  125. openstackclient/tests/unit/volume/v2/test_volume_backup.py +76 -89
  126. openstackclient/tests/unit/volume/v2/test_volume_host.py +1 -1
  127. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +5 -7
  128. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +4 -8
  129. openstackclient/tests/unit/volume/v2/test_volume_type.py +164 -24
  130. openstackclient/tests/unit/volume/v3/fakes.py +91 -15
  131. openstackclient/tests/unit/volume/v3/test_block_storage_cleanup.py +3 -7
  132. openstackclient/tests/unit/volume/v3/test_block_storage_cluster.py +11 -31
  133. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +6 -16
  134. openstackclient/tests/unit/volume/v3/test_block_storage_manage.py +219 -157
  135. openstackclient/tests/unit/volume/v3/test_block_storage_resource_filter.py +32 -23
  136. openstackclient/tests/unit/volume/v3/test_volume.py +50 -48
  137. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +17 -47
  138. openstackclient/tests/unit/volume/v3/test_volume_group.py +23 -65
  139. openstackclient/tests/unit/volume/v3/test_volume_group_snapshot.py +88 -77
  140. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +14 -42
  141. openstackclient/tests/unit/volume/v3/test_volume_message.py +10 -28
  142. openstackclient/volume/v1/volume.py +2 -14
  143. openstackclient/volume/v2/volume.py +30 -15
  144. openstackclient/volume/v2/volume_backend.py +10 -18
  145. openstackclient/volume/v2/volume_backup.py +18 -15
  146. openstackclient/volume/v2/volume_snapshot.py +2 -12
  147. openstackclient/volume/v2/volume_type.py +211 -14
  148. openstackclient/volume/v3/block_storage_manage.py +72 -11
  149. openstackclient/volume/v3/block_storage_resource_filter.py +33 -11
  150. openstackclient/volume/v3/volume_attachment.py +2 -14
  151. openstackclient/volume/v3/volume_group_snapshot.py +27 -27
  152. openstackclient/volume/v3/volume_message.py +2 -13
  153. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/AUTHORS +11 -0
  154. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/METADATA +6 -5
  155. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/RECORD +160 -151
  156. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/entry_points.txt +23 -5
  157. python_openstackclient-6.5.0.dist-info/pbr.json +1 -0
  158. openstackclient/tests/unit/common/test_parseractions.py +0 -233
  159. python_openstackclient-6.3.0.dist-info/pbr.json +0 -1
  160. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/LICENSE +0 -0
  161. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/WHEEL +0 -0
  162. {python_openstackclient-6.3.0.dist-info → python_openstackclient-6.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,214 @@
1
+ # Copyright 2023 Red Hat.
2
+ # All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
5
+ # not use this file except in compliance with the License. You may obtain
6
+ # a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations
14
+ # under the License.
15
+
16
+ from unittest.mock import call
17
+
18
+ from openstack import exceptions as sdk_exceptions
19
+ from osc_lib import exceptions
20
+
21
+ from openstackclient.image.v2 import cache
22
+ from openstackclient.tests.unit.image.v2 import fakes
23
+
24
+
25
+ class TestCacheList(fakes.TestImagev2):
26
+ _cache = fakes.create_cache()
27
+ columns = [
28
+ "ID",
29
+ "State",
30
+ "Last Accessed (UTC)",
31
+ "Last Modified (UTC)",
32
+ "Size",
33
+ "Hits",
34
+ ]
35
+
36
+ cache_list = cache._format_image_cache(dict(fakes.create_cache()))
37
+ datalist = (
38
+ (
39
+ image['image_id'],
40
+ image['state'],
41
+ image['last_accessed'],
42
+ image['last_modified'],
43
+ image['size'],
44
+ image['hits'],
45
+ )
46
+ for image in cache_list
47
+ )
48
+
49
+ def setUp(self):
50
+ super().setUp()
51
+
52
+ # Get the command object to test
53
+ self.image_client.get_image_cache.return_value = self._cache
54
+ self.cmd = cache.ListCachedImage(self.app, None)
55
+
56
+ def test_image_cache_list(self):
57
+ arglist = []
58
+ parsed_args = self.check_parser(self.cmd, arglist, [])
59
+ columns, data = self.cmd.take_action(parsed_args)
60
+
61
+ self.image_client.get_image_cache.assert_called()
62
+ self.assertEqual(self.columns, columns)
63
+ self.assertEqual(tuple(self.datalist), tuple(data))
64
+
65
+
66
+ class TestQueueCache(fakes.TestImagev2):
67
+ def setUp(self):
68
+ super().setUp()
69
+
70
+ self.image_client.queue_image.return_value = None
71
+ self.cmd = cache.QueueCachedImage(self.app, None)
72
+
73
+ def test_cache_queue(self):
74
+ images = fakes.create_images(count=1)
75
+ arglist = [
76
+ images[0].id,
77
+ ]
78
+
79
+ verifylist = [
80
+ ('images', [images[0].id]),
81
+ ]
82
+
83
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
84
+
85
+ self.image_client.find_image.side_effect = images
86
+
87
+ self.cmd.take_action(parsed_args)
88
+
89
+ self.image_client.queue_image.assert_called_once_with(images[0].id)
90
+
91
+ def test_cache_queue_multiple_images(self):
92
+ images = fakes.create_images(count=3)
93
+ arglist = [i.id for i in images]
94
+
95
+ verifylist = [
96
+ ('images', arglist),
97
+ ]
98
+
99
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
100
+
101
+ self.image_client.find_image.side_effect = images
102
+
103
+ self.cmd.take_action(parsed_args)
104
+ calls = [call(i.id) for i in images]
105
+ self.image_client.queue_image.assert_has_calls(calls)
106
+
107
+
108
+ class TestCacheDelete(fakes.TestImagev2):
109
+ def setUp(self):
110
+ super().setUp()
111
+
112
+ self.image_client.cache_delete_image.return_value = None
113
+ self.cmd = cache.DeleteCachedImage(self.app, None)
114
+
115
+ def test_cache_delete(self):
116
+ images = fakes.create_images(count=1)
117
+ arglist = [
118
+ images[0].id,
119
+ ]
120
+
121
+ verifylist = [
122
+ ('images', [images[0].id]),
123
+ ]
124
+
125
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
126
+
127
+ self.image_client.find_image.side_effect = images
128
+
129
+ self.cmd.take_action(parsed_args)
130
+
131
+ self.image_client.find_image.assert_called_once_with(
132
+ images[0].id, ignore_missing=False
133
+ )
134
+ self.image_client.cache_delete_image.assert_called_once_with(
135
+ images[0].id
136
+ )
137
+
138
+ def test_cache_delete_multiple_images(self):
139
+ images = fakes.create_images(count=3)
140
+ arglist = [i.id for i in images]
141
+
142
+ verifylist = [
143
+ ('images', arglist),
144
+ ]
145
+
146
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
147
+
148
+ self.image_client.find_image.side_effect = images
149
+
150
+ self.cmd.take_action(parsed_args)
151
+ calls = [call(i.id) for i in images]
152
+ self.image_client.cache_delete_image.assert_has_calls(calls)
153
+
154
+ def test_cache_delete_multiple_images_exception(self):
155
+ images = fakes.create_images(count=2)
156
+ arglist = [
157
+ images[0].id,
158
+ images[1].id,
159
+ 'x-y-x',
160
+ ]
161
+ verifylist = [
162
+ ('images', arglist),
163
+ ]
164
+
165
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
166
+ ret_find = [images[0], images[1], sdk_exceptions.ResourceNotFound()]
167
+
168
+ self.image_client.find_image.side_effect = ret_find
169
+
170
+ self.assertRaises(
171
+ exceptions.CommandError, self.cmd.take_action, parsed_args
172
+ )
173
+ calls = [call(i.id) for i in images]
174
+ self.image_client.cache_delete_image.assert_has_calls(calls)
175
+
176
+
177
+ class TestCacheClear(fakes.TestImagev2):
178
+ def setUp(self):
179
+ super().setUp()
180
+
181
+ self.image_client.clear_cache.return_value = None
182
+ self.cmd = cache.ClearCachedImage(self.app, None)
183
+
184
+ def test_cache_clear_no_option(self):
185
+ arglist = []
186
+
187
+ verifylist = [('target', None)]
188
+
189
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
190
+ self.cmd.take_action(parsed_args)
191
+
192
+ self.assertIsNone(
193
+ self.image_client.clear_cache.assert_called_with(None)
194
+ )
195
+
196
+ def test_cache_clear_queue_option(self):
197
+ arglist = ['--queue']
198
+
199
+ verifylist = [('target', 'queue')]
200
+
201
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
202
+ self.cmd.take_action(parsed_args)
203
+
204
+ self.image_client.clear_cache.assert_called_once_with('queue')
205
+
206
+ def test_cache_clear_cache_option(self):
207
+ arglist = ['--cache']
208
+
209
+ verifylist = [('target', 'cache')]
210
+
211
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
212
+ self.cmd.take_action(parsed_args)
213
+
214
+ self.image_client.clear_cache.assert_called_once_with('cache')
@@ -37,7 +37,7 @@ class TestImage(image_fakes.TestImagev2, volume_fakes.TestVolume):
37
37
  self.project_mock.reset_mock()
38
38
  self.domain_mock = self.app.client_manager.identity.domains
39
39
  self.domain_mock.reset_mock()
40
- self.volumes_mock = self.app.client_manager.volume.volumes
40
+ self.volumes_mock = self.volume_client.volumes
41
41
  fake_body = {
42
42
  'os-volume_upload_image': {'volume_type': {'name': 'fake_type'}}
43
43
  }
@@ -369,9 +369,7 @@ class TestImageCreate(TestImage):
369
369
  @mock.patch('osc_lib.utils.find_resource')
370
370
  @mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
371
371
  def test_image_create_from_volume_v31(self, mock_get_data_f, mock_get_vol):
372
- self.app.client_manager.volume.api_version = api_versions.APIVersion(
373
- '3.1'
374
- )
372
+ self.volume_client.api_version = api_versions.APIVersion('3.1')
375
373
 
376
374
  fake_vol_id = 'fake-volume-id'
377
375
  mock_get_data_f.return_value = None
@@ -1095,6 +1093,66 @@ class TestRemoveProjectImage(TestImage):
1095
1093
  self.assertIsNone(result)
1096
1094
 
1097
1095
 
1096
+ class TestShowProjectImage(TestImage):
1097
+ _image = image_fakes.create_one_image()
1098
+ new_member = image_fakes.create_one_image_member(
1099
+ attrs={'image_id': _image.id, 'member_id': 'member1'}
1100
+ )
1101
+
1102
+ columns = (
1103
+ 'created_at',
1104
+ 'image_id',
1105
+ 'member_id',
1106
+ 'schema',
1107
+ 'status',
1108
+ 'updated_at',
1109
+ )
1110
+
1111
+ datalist = (
1112
+ new_member.created_at,
1113
+ _image.id,
1114
+ new_member.member_id,
1115
+ new_member.schema,
1116
+ new_member.status,
1117
+ new_member.updated_at,
1118
+ )
1119
+
1120
+ def setUp(self):
1121
+ super().setUp()
1122
+
1123
+ # This is the return value for utils.find_resource()
1124
+ self.image_client.find_image.return_value = self._image
1125
+
1126
+ self.image_client.get_member.return_value = self.new_member
1127
+ # Get the command object to test
1128
+ self.cmd = _image.ShowProjectImage(self.app, None)
1129
+
1130
+ def test_show_project_image(self):
1131
+ arglist = [
1132
+ self._image.id,
1133
+ 'member1',
1134
+ ]
1135
+ verifylist = [
1136
+ ('image', self._image.id),
1137
+ ('member', 'member1'),
1138
+ ]
1139
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1140
+
1141
+ columns, data = self.cmd.take_action(parsed_args)
1142
+
1143
+ self.image_client.find_image.assert_called_with(
1144
+ self._image.id, ignore_missing=False
1145
+ )
1146
+
1147
+ self.image_client.get_member.assert_called_with(
1148
+ member='member1',
1149
+ image=self._image.id,
1150
+ )
1151
+
1152
+ self.assertEqual(self.columns, columns)
1153
+ self.assertEqual(self.datalist, data)
1154
+
1155
+
1098
1156
  class TestImageSet(TestImage):
1099
1157
  project = identity_fakes.FakeProject.create_one_project()
1100
1158
  domain = identity_fakes.FakeDomain.create_one_domain()
@@ -21,30 +21,16 @@ class TestMetadefNamespaceCreate(image_fakes.TestImagev2):
21
21
 
22
22
  expected_columns = (
23
23
  'created_at',
24
- 'description',
25
24
  'display_name',
26
- 'id',
27
- 'is_protected',
28
- 'location',
29
- 'name',
30
25
  'namespace',
31
26
  'owner',
32
- 'resource_type_associations',
33
- 'updated_at',
34
27
  'visibility',
35
28
  )
36
29
  expected_data = (
37
30
  _metadef_namespace.created_at,
38
- _metadef_namespace.description,
39
31
  _metadef_namespace.display_name,
40
- _metadef_namespace.id,
41
- _metadef_namespace.is_protected,
42
- _metadef_namespace.location,
43
- _metadef_namespace.name,
44
32
  _metadef_namespace.namespace,
45
33
  _metadef_namespace.owner,
46
- _metadef_namespace.resource_type_associations,
47
- _metadef_namespace.updated_at,
48
34
  _metadef_namespace.visibility,
49
35
  )
50
36
 
@@ -54,7 +40,7 @@ class TestMetadefNamespaceCreate(image_fakes.TestImagev2):
54
40
  self.image_client.create_metadef_namespace.return_value = (
55
41
  self._metadef_namespace
56
42
  )
57
- self.cmd = metadef_namespaces.CreateMetadefNameSpace(self.app, None)
43
+ self.cmd = metadef_namespaces.CreateMetadefNamespace(self.app, None)
58
44
  self.datalist = self._metadef_namespace
59
45
 
60
46
  def test_namespace_create(self):
@@ -78,7 +64,7 @@ class TestMetadefNamespaceDelete(image_fakes.TestImagev2):
78
64
  self.image_client.delete_metadef_namespace.return_value = (
79
65
  self._metadef_namespace
80
66
  )
81
- self.cmd = metadef_namespaces.DeleteMetadefNameSpace(self.app, None)
67
+ self.cmd = metadef_namespaces.DeleteMetadefNamespace(self.app, None)
82
68
  self.datalist = self._metadef_namespace
83
69
 
84
70
  def test_namespace_create(self):
@@ -111,7 +97,7 @@ class TestMetadefNamespaceList(image_fakes.TestImagev2):
111
97
  self.image_client.metadef_namespaces.return_value = iter(
112
98
  self._metadef_namespace
113
99
  )
114
- self.cmd = metadef_namespaces.ListMetadefNameSpaces(self.app, None)
100
+ self.cmd = metadef_namespaces.ListMetadefNamespace(self.app, None)
115
101
  self.datalist = self._metadef_namespace
116
102
 
117
103
  def test_namespace_list_no_options(self):
@@ -136,7 +122,7 @@ class TestMetadefNamespaceSet(image_fakes.TestImagev2):
136
122
  self.image_client.update_metadef_namespace.return_value = (
137
123
  self._metadef_namespace
138
124
  )
139
- self.cmd = metadef_namespaces.SetMetadefNameSpace(self.app, None)
125
+ self.cmd = metadef_namespaces.SetMetadefNamespace(self.app, None)
140
126
  self.datalist = self._metadef_namespace
141
127
 
142
128
  def test_namespace_set_no_options(self):
@@ -176,7 +162,7 @@ class TestMetadefNamespaceShow(image_fakes.TestImagev2):
176
162
  self.image_client.get_metadef_namespace.return_value = (
177
163
  self._metadef_namespace
178
164
  )
179
- self.cmd = metadef_namespaces.ShowMetadefNameSpace(self.app, None)
165
+ self.cmd = metadef_namespaces.ShowMetadefNamespace(self.app, None)
180
166
 
181
167
  def test_namespace_show_no_options(self):
182
168
  arglist = [self._metadef_namespace.namespace]
@@ -0,0 +1,162 @@
1
+ # Copyright 2023 Red Hat
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
+ # not use this file except in compliance with the License. You may obtain
5
+ # a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations
13
+ # under the License.
14
+
15
+ from openstackclient.image.v2 import metadef_objects
16
+ from openstackclient.tests.unit.image.v2 import fakes
17
+
18
+
19
+ class TestMetadefObjectsCreate(fakes.TestImagev2):
20
+ _metadef_namespace = fakes.create_one_metadef_namespace()
21
+ _metadef_objects = fakes.create_one_metadef_object()
22
+
23
+ expected_columns = (
24
+ 'created_at',
25
+ 'description',
26
+ 'name',
27
+ 'namespace_name',
28
+ 'properties',
29
+ 'required',
30
+ 'updated_at',
31
+ )
32
+ expected_data = (
33
+ _metadef_objects.created_at,
34
+ _metadef_objects.description,
35
+ _metadef_objects.name,
36
+ _metadef_objects.namespace_name,
37
+ _metadef_objects.properties,
38
+ _metadef_objects.required,
39
+ _metadef_objects.updated_at,
40
+ )
41
+
42
+ def setUp(self):
43
+ super().setUp()
44
+ self.image_client.create_metadef_object.return_value = (
45
+ self._metadef_objects
46
+ )
47
+ self.cmd = metadef_objects.CreateMetadefObjects(self.app, None)
48
+
49
+ def test_namespace_create(self):
50
+ arglist = [
51
+ '--namespace',
52
+ self._metadef_namespace.namespace,
53
+ self._metadef_objects.name,
54
+ ]
55
+ verifylist = []
56
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
57
+ columns, data = self.cmd.take_action(parsed_args)
58
+ self.assertEqual(self.expected_columns, columns)
59
+ self.assertEqual(self.expected_data, data)
60
+
61
+
62
+ class TestMetadefObjectsShow(fakes.TestImagev2):
63
+ _metadef_namespace = fakes.create_one_metadef_namespace()
64
+ _metadef_objects = fakes.create_one_metadef_object()
65
+
66
+ expected_columns = (
67
+ 'created_at',
68
+ 'description',
69
+ 'name',
70
+ 'namespace_name',
71
+ 'properties',
72
+ 'required',
73
+ 'updated_at',
74
+ )
75
+ expected_data = (
76
+ _metadef_objects.created_at,
77
+ _metadef_objects.description,
78
+ _metadef_objects.name,
79
+ _metadef_objects.namespace_name,
80
+ _metadef_objects.properties,
81
+ _metadef_objects.required,
82
+ _metadef_objects.updated_at,
83
+ )
84
+
85
+ def setUp(self):
86
+ super().setUp()
87
+
88
+ self.image_client.get_metadef_object.return_value = (
89
+ self._metadef_objects
90
+ )
91
+ self.cmd = metadef_objects.ShowMetadefObjects(self.app, None)
92
+
93
+ def test_object_show(self):
94
+ arglist = [
95
+ self._metadef_namespace.namespace,
96
+ self._metadef_objects.name,
97
+ ]
98
+ verifylist = []
99
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
100
+ columns, data = self.cmd.take_action(parsed_args)
101
+
102
+ self.assertEqual(self.expected_columns, columns)
103
+ self.assertEqual(self.expected_data, data)
104
+
105
+
106
+ class TestMetadefObjectDelete(fakes.TestImagev2):
107
+ _metadef_namespace = fakes.create_one_metadef_namespace()
108
+ _metadef_objects = fakes.create_one_metadef_object()
109
+
110
+ def setUp(self):
111
+ super().setUp()
112
+
113
+ self.image_client.delete_metadef_object.return_value = None
114
+ self.cmd = metadef_objects.DeleteMetadefObject(self.app, None)
115
+
116
+ def test_object_delete(self):
117
+ arglist = [
118
+ self._metadef_namespace.namespace,
119
+ self._metadef_objects.name,
120
+ ]
121
+
122
+ verifylist = []
123
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
124
+
125
+ result = self.cmd.take_action(parsed_args)
126
+
127
+ self.assertIsNone(result)
128
+
129
+
130
+ class TestMetadefObjectList(fakes.TestImagev2):
131
+ _metadef_namespace = fakes.create_one_metadef_namespace()
132
+ _metadef_objects = [fakes.create_one_metadef_object()]
133
+ columns = ['name', 'description']
134
+
135
+ datalist = []
136
+
137
+ def setUp(self):
138
+ super().setUp()
139
+
140
+ self.image_client.metadef_objects.side_effect = [
141
+ self._metadef_objects,
142
+ [],
143
+ ]
144
+
145
+ # Get the command object to test
146
+ self.image_client.metadef_objects.return_value = iter(
147
+ self._metadef_objects
148
+ )
149
+ self.cmd = metadef_objects.ListMetadefObjects(self.app, None)
150
+ self.datalist = self._metadef_objects
151
+
152
+ def test_metadef_objects_list(self):
153
+ arglist = [self._metadef_namespace.namespace]
154
+ parsed_args = self.check_parser(self.cmd, arglist, [])
155
+
156
+ # In base command class Lister in cliff, abstract method take_action()
157
+ # returns a tuple containing the column names and an iterable
158
+ # containing the data to be listed.
159
+ columns, data = self.cmd.take_action(parsed_args)
160
+
161
+ self.assertEqual(self.columns, columns)
162
+ self.assertEqual(getattr(self.datalist[0], 'name'), next(data)[0])