python-openstackclient 7.0.0__py3-none-any.whl → 7.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. openstackclient/common/clientmanager.py +22 -30
  2. openstackclient/common/limits.py +3 -4
  3. openstackclient/common/quota.py +28 -23
  4. openstackclient/compute/v2/aggregate.py +29 -23
  5. openstackclient/compute/v2/hypervisor.py +5 -3
  6. openstackclient/compute/v2/server.py +4 -3
  7. openstackclient/identity/v3/application_credential.py +17 -17
  8. openstackclient/identity/v3/service.py +5 -5
  9. openstackclient/releasenotes/notes/volume-backup-created-at-list-b49ec893ae1f6b0d.yaml +4 -0
  10. openstackclient/tests/functional/identity/v3/common.py +2 -2
  11. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  12. openstackclient/tests/functional/identity/v3/test_limit.py +2 -2
  13. openstackclient/tests/functional/identity/v3/test_registered_limit.py +1 -1
  14. openstackclient/tests/functional/identity/v3/test_service.py +3 -3
  15. openstackclient/tests/unit/compute/v2/test_aggregate.py +70 -42
  16. openstackclient/tests/unit/compute/v2/test_hypervisor.py +29 -3
  17. openstackclient/tests/unit/compute/v2/test_server.py +18 -57
  18. openstackclient/tests/unit/fakes.py +1 -1
  19. openstackclient/tests/unit/identity/v3/test_application_credential.py +17 -17
  20. openstackclient/tests/unit/identity/v3/test_service.py +6 -6
  21. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -0
  22. openstackclient/volume/v2/volume_backup.py +2 -0
  23. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/AUTHORS +2 -0
  24. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/METADATA +3 -2
  25. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/RECORD +30 -29
  26. python_openstackclient-7.1.0.dist-info/pbr.json +1 -0
  27. python_openstackclient-7.0.0.dist-info/pbr.json +0 -1
  28. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/LICENSE +0 -0
  29. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/WHEEL +0 -0
  30. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/entry_points.txt +0 -0
  31. {python_openstackclient-7.0.0.dist-info → python_openstackclient-7.1.0.dist-info}/top_level.txt +0 -0
@@ -116,7 +116,6 @@ class ClientManager(clientmanager.ClientManager):
116
116
 
117
117
  def is_network_endpoint_enabled(self):
118
118
  """Check if the network endpoint is enabled"""
119
-
120
119
  # NOTE(dtroyer): is_service_available() can also return None if
121
120
  # there is no Service Catalog, callers here are
122
121
  # not expecting that so fold None into True to
@@ -125,43 +124,37 @@ class ClientManager(clientmanager.ClientManager):
125
124
 
126
125
  def is_compute_endpoint_enabled(self):
127
126
  """Check if Compute endpoint is enabled"""
128
-
129
127
  return self.is_service_available('compute') is not False
130
128
 
131
- def is_volume_endpoint_enabled(self, volume_client):
129
+ # TODO(stephenfin): Drop volume_client argument in OSC 8.0 or later.
130
+ def is_volume_endpoint_enabled(self, volume_client=None):
132
131
  """Check if volume endpoint is enabled"""
133
- # NOTE(jcross): Cinder did some interesting things with their service
134
- # name so we need to figure out which version to look
135
- # for when calling is_service_available()
136
- endpoint_data = volume_client.get_endpoint_data()
137
- # Not sure how endpoint data stores the api version for v2 API,
138
- # for v3 it is a tuple (3, 0)
139
- if endpoint_data.api_version and isinstance(
140
- endpoint_data.api_version, tuple
141
- ):
142
- volume_version = endpoint_data.api_version[0]
143
- else:
144
- # Setting volume_version as 2 here if it doesn't satisfy the
145
- # conditions for version 3
146
- volume_version = 2
147
- if (
148
- self.is_service_available("volumev%s" % volume_version)
149
- is not False
150
- ):
151
- return True
152
- elif self.is_service_available('volume') is not False:
153
- return True
154
- else:
155
- return False
132
+ return (
133
+ self.is_service_available('volume') is not False
134
+ or self.is_service_available('volumev3') is not False
135
+ or self.is_service_available('volumev2') is not False
136
+ )
156
137
 
157
138
 
158
139
  # Plugin Support
159
140
 
160
141
 
142
+ def _on_load_failure_callback(
143
+ manager: stevedore.ExtensionManager,
144
+ ep: importlib.metadata.EntryPoint,
145
+ err: Exception,
146
+ ) -> None:
147
+ sys.stderr.write(
148
+ f"WARNING: Failed to import plugin {ep.group}:{ep.name}: {err}.\n"
149
+ )
150
+
151
+
161
152
  def get_plugin_modules(group):
162
153
  """Find plugin entry points"""
163
154
  mod_list = []
164
- mgr = stevedore.ExtensionManager(group)
155
+ mgr = stevedore.ExtensionManager(
156
+ group, on_load_failure_callback=_on_load_failure_callback
157
+ )
165
158
  for ep in mgr:
166
159
  LOG.debug('Found plugin %s', ep.name)
167
160
 
@@ -180,9 +173,8 @@ def get_plugin_modules(group):
180
173
  module = importlib.import_module(module_name)
181
174
  except Exception as err:
182
175
  sys.stderr.write(
183
- "WARNING: Failed to import plugin {}: {}.\n".format(
184
- ep.name, err
185
- )
176
+ f"WARNING: Failed to import plugin {ep.group}:{ep.name}: "
177
+ f"{err}.\n"
186
178
  )
187
179
  continue
188
180
 
@@ -101,9 +101,6 @@ class ShowLimits(command.Lister):
101
101
  return parser
102
102
 
103
103
  def take_action(self, parsed_args):
104
- compute_client = self.app.client_manager.sdk_connection.compute
105
- volume_client = self.app.client_manager.sdk_connection.volume
106
-
107
104
  project_id = None
108
105
  if parsed_args.project is not None:
109
106
  identity_client = self.app.client_manager.identity
@@ -125,11 +122,13 @@ class ShowLimits(command.Lister):
125
122
  volume_limits = None
126
123
 
127
124
  if self.app.client_manager.is_compute_endpoint_enabled():
125
+ compute_client = self.app.client_manager.sdk_connection.compute
128
126
  compute_limits = compute_client.get_limits(
129
127
  reserved=parsed_args.is_reserved, tenant_id=project_id
130
128
  )
131
129
 
132
- if self.app.client_manager.is_volume_endpoint_enabled(volume_client):
130
+ if self.app.client_manager.is_volume_endpoint_enabled():
131
+ volume_client = self.app.client_manager.sdk_connection.volume
133
132
  volume_limits = volume_client.get_limits(
134
133
  project_id=project_id,
135
134
  )
@@ -565,33 +565,42 @@ class SetQuota(common.NetDetectionMixin, command.Command):
565
565
  msg = _('--force cannot be used with --class or --default')
566
566
  raise exceptions.CommandError(msg)
567
567
 
568
- compute_client = self.app.client_manager.sdk_connection.compute
569
- volume_client = self.app.client_manager.sdk_connection.volume
570
-
571
568
  compute_kwargs = {}
572
- for k, v in COMPUTE_QUOTAS.items():
573
- value = getattr(parsed_args, k, None)
574
- if value is not None:
575
- compute_kwargs[k] = value
569
+ volume_kwargs = {}
570
+ network_kwargs = {}
576
571
 
577
- if compute_kwargs and parsed_args.force is True:
578
- compute_kwargs['force'] = parsed_args.force
572
+ if self.app.client_manager.is_compute_endpoint_enabled():
573
+ compute_client = self.app.client_manager.sdk_connection.compute
579
574
 
580
- volume_kwargs = {}
581
- for k, v in VOLUME_QUOTAS.items():
582
- value = getattr(parsed_args, k, None)
583
- if value is not None:
584
- if parsed_args.volume_type and k in IMPACT_VOLUME_TYPE_QUOTAS:
585
- k = k + '_%s' % parsed_args.volume_type
586
- volume_kwargs[k] = value
575
+ for k, v in COMPUTE_QUOTAS.items():
576
+ value = getattr(parsed_args, k, None)
577
+ if value is not None:
578
+ compute_kwargs[k] = value
579
+
580
+ if compute_kwargs and parsed_args.force is True:
581
+ compute_kwargs['force'] = parsed_args.force
582
+
583
+ if self.app.client_manager.is_volume_endpoint_enabled():
584
+ volume_client = self.app.client_manager.sdk_connection.volume
585
+
586
+ for k, v in VOLUME_QUOTAS.items():
587
+ value = getattr(parsed_args, k, None)
588
+ if value is not None:
589
+ if (
590
+ parsed_args.volume_type
591
+ and k in IMPACT_VOLUME_TYPE_QUOTAS
592
+ ):
593
+ k = k + '_%s' % parsed_args.volume_type
594
+ volume_kwargs[k] = value
587
595
 
588
- network_kwargs = {}
589
596
  if self.app.client_manager.is_network_endpoint_enabled():
597
+ network_client = self.app.client_manager.network
598
+
590
599
  for k, v in NETWORK_QUOTAS.items():
591
600
  value = getattr(parsed_args, k, None)
592
601
  if value is not None:
593
602
  network_kwargs[k] = value
594
- else:
603
+ elif self.app.client_manager.is_compute_endpoint_enabled():
595
604
  for k, v in NOVA_NETWORK_QUOTAS.items():
596
605
  value = getattr(parsed_args, k, None)
597
606
  if value is not None:
@@ -632,11 +641,7 @@ class SetQuota(common.NetDetectionMixin, command.Command):
632
641
  compute_client.update_quota_set(project, **compute_kwargs)
633
642
  if volume_kwargs:
634
643
  volume_client.update_quota_set(project, **volume_kwargs)
635
- if (
636
- network_kwargs
637
- and self.app.client_manager.is_network_endpoint_enabled()
638
- ):
639
- network_client = self.app.client_manager.network
644
+ if network_kwargs:
640
645
  network_client.update_quota(project, **network_kwargs)
641
646
 
642
647
 
@@ -192,40 +192,46 @@ class ListAggregate(command.Lister):
192
192
 
193
193
  aggregates = list(compute_client.aggregates())
194
194
 
195
+ if sdk_utils.supports_microversion(compute_client, '2.41'):
196
+ column_headers = ("ID", "UUID")
197
+ columns = ("id", "uuid")
198
+ else:
199
+ column_headers = ("ID",)
200
+ columns = ("id",)
201
+
202
+ column_headers += (
203
+ "Name",
204
+ "Availability Zone",
205
+ )
206
+ columns += (
207
+ "name",
208
+ "availability_zone",
209
+ )
210
+
195
211
  if parsed_args.long:
196
212
  # Remove availability_zone from metadata because Nova doesn't
197
213
  for aggregate in aggregates:
198
214
  if 'availability_zone' in aggregate.metadata:
199
215
  aggregate.metadata.pop('availability_zone')
200
- # This is the easiest way to change column headers
201
- column_headers = (
202
- "ID",
203
- "Name",
204
- "Availability Zone",
216
+
217
+ column_headers += (
205
218
  "Properties",
206
219
  "Hosts",
207
220
  )
208
- columns = (
209
- "ID",
210
- "Name",
211
- "Availability Zone",
212
- "Metadata",
213
- "Hosts",
214
- )
215
- else:
216
- column_headers = columns = (
217
- "ID",
218
- "Name",
219
- "Availability Zone",
221
+ columns += (
222
+ "metadata",
223
+ "hosts",
220
224
  )
221
225
 
222
- data = (
223
- utils.get_item_properties(
224
- s, columns, formatters=_aggregate_formatters
225
- )
226
- for s in aggregates
226
+ return (
227
+ column_headers,
228
+ (
229
+ utils.get_item_properties(
230
+ s, columns, formatters=_aggregate_formatters
231
+ )
232
+ for s in aggregates
233
+ ),
227
234
  )
228
- return (column_headers, data)
229
235
 
230
236
 
231
237
  class RemoveAggregateHost(command.ShowOne):
@@ -165,9 +165,11 @@ class ShowHypervisor(command.ShowOne):
165
165
 
166
166
  def take_action(self, parsed_args):
167
167
  compute_client = self.app.client_manager.sdk_connection.compute
168
- hypervisor = compute_client.find_hypervisor(
169
- parsed_args.hypervisor, ignore_missing=False
170
- ).copy()
168
+
169
+ hypervisor_id = compute_client.find_hypervisor(
170
+ parsed_args.hypervisor, ignore_missing=False, details=False
171
+ ).id
172
+ hypervisor = compute_client.get_hypervisor(hypervisor_id).copy()
171
173
 
172
174
  # Some of the properties in the hypervisor object need to be processed
173
175
  # before they get reported to the user. We spend this section
@@ -3587,6 +3587,9 @@ class RebuildServer(command.ShowOne):
3587
3587
  if parsed_args.name is not None:
3588
3588
  kwargs['name'] = parsed_args.name
3589
3589
 
3590
+ if parsed_args.password is not None:
3591
+ kwargs['admin_password'] = parsed_args.password
3592
+
3590
3593
  if parsed_args.preserve_ephemeral is not None:
3591
3594
  kwargs['preserve_ephemeral'] = parsed_args.preserve_ephemeral
3592
3595
 
@@ -3725,9 +3728,7 @@ class RebuildServer(command.ShowOne):
3725
3728
  msg = _("The server status is not ACTIVE, SHUTOFF or ERROR.")
3726
3729
  raise exceptions.CommandError(msg)
3727
3730
 
3728
- server = compute_client.rebuild_server(
3729
- server, image, admin_password=parsed_args.password, **kwargs
3730
- )
3731
+ server = compute_client.rebuild_server(server, image, **kwargs)
3731
3732
 
3732
3733
  if parsed_args.wait:
3733
3734
  if utils.wait_for_status(
@@ -186,15 +186,15 @@ class CreateApplicationCredential(command.ShowOne):
186
186
  application_credential['roles'] = msg
187
187
 
188
188
  columns = (
189
- 'ID',
190
- 'Name',
191
- 'Description',
192
- 'Project ID',
193
- 'Roles',
194
- 'Unrestricted',
195
- 'Access Rules',
196
- 'Expires At',
197
- 'Secret',
189
+ 'id',
190
+ 'name',
191
+ 'description',
192
+ 'project_id',
193
+ 'roles',
194
+ 'unrestricted',
195
+ 'access_rules',
196
+ 'expires_at',
197
+ 'secret',
198
198
  )
199
199
  return (
200
200
  columns,
@@ -337,14 +337,14 @@ class ShowApplicationCredential(command.ShowOne):
337
337
  app_cred['roles'] = msg
338
338
 
339
339
  columns = (
340
- 'ID',
341
- 'Name',
342
- 'Description',
343
- 'Project ID',
344
- 'Roles',
345
- 'Unrestricted',
346
- 'Access Rules',
347
- 'Expires At',
340
+ 'id',
341
+ 'name',
342
+ 'description',
343
+ 'project_id',
344
+ 'roles',
345
+ 'unrestricted',
346
+ 'access_rules',
347
+ 'expires_at',
348
348
  )
349
349
  return (
350
350
  columns,
@@ -37,11 +37,11 @@ def _format_service(service):
37
37
  'description',
38
38
  )
39
39
  column_headers = (
40
- 'ID',
41
- 'Name',
42
- 'Type',
43
- 'Enabled',
44
- 'Description',
40
+ 'id',
41
+ 'name',
42
+ 'type',
43
+ 'enabled',
44
+ 'description',
45
45
  )
46
46
 
47
47
  return (
@@ -0,0 +1,4 @@
1
+ ---
2
+ features:
3
+ - |
4
+ Listing volume backups now shows the created_at column.
@@ -48,7 +48,7 @@ class IdentityTests(base.TestCase):
48
48
  'parent_id',
49
49
  ]
50
50
  ROLE_FIELDS = ['id', 'name', 'domain_id', 'description']
51
- SERVICE_FIELDS = ['ID', 'Enabled', 'Name', 'Type', 'Description']
51
+ SERVICE_FIELDS = ['id', 'enabled', 'name', 'type', 'description']
52
52
  REGION_FIELDS = ['description', 'enabled', 'parent_region', 'region']
53
53
  ENDPOINT_FIELDS = [
54
54
  'id',
@@ -376,7 +376,7 @@ class IdentityTests(base.TestCase):
376
376
  if add_clean_up:
377
377
  service = self.parse_show_as_object(raw_output)
378
378
  self.addCleanup(
379
- self.openstack, 'service delete %s' % service['ID']
379
+ self.openstack, 'service delete %s' % service['id']
380
380
  )
381
381
  items = self.parse_show(raw_output)
382
382
  self.assert_show_fields(items, self.SERVICE_FIELDS)
@@ -21,13 +21,13 @@ from openstackclient.tests.functional.identity.v3 import common
21
21
 
22
22
  class ApplicationCredentialTests(common.IdentityTests):
23
23
  APPLICATION_CREDENTIAL_FIELDS = [
24
- 'ID',
25
- 'Name',
26
- 'Project ID',
27
- 'Description',
28
- 'Roles',
29
- 'Expires At',
30
- 'Unrestricted',
24
+ 'id',
25
+ 'name',
26
+ 'project_id',
27
+ 'description',
28
+ 'roles',
29
+ 'expires_at',
30
+ 'unrestricted',
31
31
  ]
32
32
  APPLICATION_CREDENTIAL_LIST_HEADERS = [
33
33
  'ID',
@@ -32,7 +32,7 @@ class LimitTestCase(common.IdentityTests):
32
32
 
33
33
  raw_output = self.openstack('service show %s' % service_id)
34
34
  items = self.parse_show(raw_output)
35
- service_name = self._extract_value_from_items('Name', items)
35
+ service_name = self._extract_value_from_items('name', items)
36
36
 
37
37
  project_name = self._create_dummy_project()
38
38
  raw_output = self.openstack('project show %s' % project_name)
@@ -73,7 +73,7 @@ class LimitTestCase(common.IdentityTests):
73
73
 
74
74
  raw_output = self.openstack('service show %s' % service_id)
75
75
  items = self.parse_show(raw_output)
76
- service_name = self._extract_value_from_items('Name', items)
76
+ service_name = self._extract_value_from_items('name', items)
77
77
 
78
78
  project_name = self._create_dummy_project()
79
79
 
@@ -29,7 +29,7 @@ class RegisteredLimitTestCase(common.IdentityTests):
29
29
  'service show' ' %(service_name)s' % {'service_name': service_name}
30
30
  )
31
31
  service_items = self.parse_show(raw_output)
32
- service_id = self._extract_value_from_items('ID', service_items)
32
+ service_id = self._extract_value_from_items('id', service_items)
33
33
 
34
34
  raw_output = self.openstack(
35
35
  'registered limit create'
@@ -61,9 +61,9 @@ class ServiceTests(common.IdentityTests):
61
61
  raw_output = self.openstack('service show %s' % new_service_name)
62
62
  # assert service details
63
63
  service = self.parse_show_as_object(raw_output)
64
- self.assertEqual(new_service_type, service['Type'])
65
- self.assertEqual(new_service_name, service['Name'])
66
- self.assertEqual(new_service_description, service['Description'])
64
+ self.assertEqual(new_service_type, service['type'])
65
+ self.assertEqual(new_service_name, service['name'])
66
+ self.assertEqual(new_service_description, service['description'])
67
67
 
68
68
  def test_service_show(self):
69
69
  service_name = self._create_dummy_service()
@@ -227,44 +227,6 @@ class TestAggregateDelete(TestAggregate):
227
227
 
228
228
 
229
229
  class TestAggregateList(TestAggregate):
230
- list_columns = (
231
- "ID",
232
- "Name",
233
- "Availability Zone",
234
- )
235
-
236
- list_columns_long = (
237
- "ID",
238
- "Name",
239
- "Availability Zone",
240
- "Properties",
241
- "Hosts",
242
- )
243
-
244
- list_data = (
245
- (
246
- TestAggregate.fake_ag.id,
247
- TestAggregate.fake_ag.name,
248
- TestAggregate.fake_ag.availability_zone,
249
- ),
250
- )
251
-
252
- list_data_long = (
253
- (
254
- TestAggregate.fake_ag.id,
255
- TestAggregate.fake_ag.name,
256
- TestAggregate.fake_ag.availability_zone,
257
- format_columns.DictColumn(
258
- {
259
- key: value
260
- for key, value in TestAggregate.fake_ag.metadata.items()
261
- if key != 'availability_zone'
262
- }
263
- ),
264
- format_columns.ListColumn(TestAggregate.fake_ag.hosts),
265
- ),
266
- )
267
-
268
230
  def setUp(self):
269
231
  super().setUp()
270
232
 
@@ -272,13 +234,54 @@ class TestAggregateList(TestAggregate):
272
234
  self.cmd = aggregate.ListAggregate(self.app, None)
273
235
 
274
236
  def test_aggregate_list(self):
237
+ self.set_compute_api_version('2.41')
238
+
239
+ parsed_args = self.check_parser(self.cmd, [], [])
240
+ columns, data = self.cmd.take_action(parsed_args)
241
+
242
+ expected_columns = (
243
+ "ID",
244
+ "UUID",
245
+ "Name",
246
+ "Availability Zone",
247
+ )
248
+ expected_data = (
249
+ (
250
+ self.fake_ag.id,
251
+ self.fake_ag.uuid,
252
+ self.fake_ag.name,
253
+ self.fake_ag.availability_zone,
254
+ ),
255
+ )
256
+
257
+ self.assertEqual(expected_columns, columns)
258
+ self.assertCountEqual(expected_data, tuple(data))
259
+
260
+ def test_aggregate_list_pre_v241(self):
261
+ self.set_compute_api_version('2.40')
262
+
275
263
  parsed_args = self.check_parser(self.cmd, [], [])
276
264
  columns, data = self.cmd.take_action(parsed_args)
277
265
 
278
- self.assertEqual(self.list_columns, columns)
279
- self.assertCountEqual(self.list_data, tuple(data))
266
+ expected_columns = (
267
+ "ID",
268
+ "Name",
269
+ "Availability Zone",
270
+ )
271
+ expected_data = (
272
+ (
273
+ self.fake_ag.id,
274
+ self.fake_ag.name,
275
+ self.fake_ag.availability_zone,
276
+ ),
277
+ )
278
+
279
+ self.assertEqual(expected_columns, columns)
280
+ self.assertCountEqual(expected_data, tuple(data))
280
281
 
281
282
  def test_aggregate_list_with_long(self):
283
+ self.set_compute_api_version('2.41')
284
+
282
285
  arglist = [
283
286
  '--long',
284
287
  ]
@@ -288,8 +291,33 @@ class TestAggregateList(TestAggregate):
288
291
  parsed_args = self.check_parser(self.cmd, arglist, vertifylist)
289
292
  columns, data = self.cmd.take_action(parsed_args)
290
293
 
291
- self.assertEqual(self.list_columns_long, columns)
292
- self.assertCountEqual(self.list_data_long, tuple(data))
294
+ expected_columns = (
295
+ "ID",
296
+ "UUID",
297
+ "Name",
298
+ "Availability Zone",
299
+ "Properties",
300
+ "Hosts",
301
+ )
302
+ expected_data = (
303
+ (
304
+ self.fake_ag.id,
305
+ self.fake_ag.uuid,
306
+ self.fake_ag.name,
307
+ self.fake_ag.availability_zone,
308
+ format_columns.DictColumn(
309
+ {
310
+ key: value
311
+ for key, value in self.fake_ag.metadata.items()
312
+ if key != 'availability_zone'
313
+ }
314
+ ),
315
+ format_columns.ListColumn(self.fake_ag.hosts),
316
+ ),
317
+ )
318
+
319
+ self.assertEqual(expected_columns, columns)
320
+ self.assertCountEqual(expected_data, tuple(data))
293
321
 
294
322
 
295
323
  class TestAggregateRemoveHost(TestAggregate):
@@ -296,13 +296,11 @@ class TestHypervisorShow(compute_fakes.TestComputev2):
296
296
  }
297
297
  )
298
298
 
299
- # Return value of compute_client.find_hypervisor
300
299
  self.compute_sdk_client.find_hypervisor.return_value = self.hypervisor
300
+ self.compute_sdk_client.get_hypervisor.return_value = self.hypervisor
301
301
 
302
- # Return value of compute_client.aggregates()
303
302
  self.compute_sdk_client.aggregates.return_value = []
304
303
 
305
- # Return value of compute_client.get_hypervisor_uptime()
306
304
  uptime_info = {
307
305
  'status': self.hypervisor.status,
308
306
  'state': self.hypervisor.state,
@@ -429,6 +427,13 @@ class TestHypervisorShow(compute_fakes.TestComputev2):
429
427
  self.assertEqual(self.columns_v288, columns)
430
428
  self.assertCountEqual(self.data_v288, data)
431
429
 
430
+ self.compute_sdk_client.find_hypervisor.assert_called_once_with(
431
+ self.hypervisor.name, ignore_missing=False, details=False
432
+ )
433
+ self.compute_sdk_client.get_hypervisor.assert_called_once_with(
434
+ self.hypervisor.id
435
+ )
436
+
432
437
  def test_hypervisor_show_pre_v288(self):
433
438
  self.set_compute_api_version('2.87')
434
439
 
@@ -448,6 +453,13 @@ class TestHypervisorShow(compute_fakes.TestComputev2):
448
453
  self.assertEqual(self.columns, columns)
449
454
  self.assertCountEqual(self.data, data)
450
455
 
456
+ self.compute_sdk_client.find_hypervisor.assert_called_once_with(
457
+ self.hypervisor.name, ignore_missing=False, details=False
458
+ )
459
+ self.compute_sdk_client.get_hypervisor.assert_called_once_with(
460
+ self.hypervisor.id
461
+ )
462
+
451
463
  def test_hypervisor_show_pre_v228(self):
452
464
  self.set_compute_api_version('2.27')
453
465
 
@@ -472,6 +484,13 @@ class TestHypervisorShow(compute_fakes.TestComputev2):
472
484
  self.assertEqual(self.columns, columns)
473
485
  self.assertCountEqual(self.data, data)
474
486
 
487
+ self.compute_sdk_client.find_hypervisor.assert_called_once_with(
488
+ self.hypervisor.name, ignore_missing=False, details=False
489
+ )
490
+ self.compute_sdk_client.get_hypervisor.assert_called_once_with(
491
+ self.hypervisor.id
492
+ )
493
+
475
494
  def test_hypervisor_show_uptime_not_implemented(self):
476
495
  self.set_compute_api_version('2.87')
477
496
 
@@ -543,3 +562,10 @@ class TestHypervisorShow(compute_fakes.TestComputev2):
543
562
 
544
563
  self.assertEqual(expected_columns, columns)
545
564
  self.assertCountEqual(expected_data, data)
565
+
566
+ self.compute_sdk_client.find_hypervisor.assert_called_once_with(
567
+ self.hypervisor.name, ignore_missing=False, details=False
568
+ )
569
+ self.compute_sdk_client.get_hypervisor.assert_called_once_with(
570
+ self.hypervisor.id
571
+ )
@@ -6146,7 +6146,7 @@ class TestServerRebuild(TestServer):
6146
6146
  )
6147
6147
  self.image_client.get_image.assert_called_with(self.image.id)
6148
6148
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6149
- self.server, image, admin_password=None
6149
+ self.server, image
6150
6150
  )
6151
6151
 
6152
6152
  def test_rebuild_with_current_image(self):
@@ -6167,7 +6167,7 @@ class TestServerRebuild(TestServer):
6167
6167
  [mock.call(self.image.id), mock.call(self.image.id)]
6168
6168
  )
6169
6169
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6170
- self.server, self.image, admin_password=None
6170
+ self.server, self.image
6171
6171
  )
6172
6172
 
6173
6173
  def test_rebuild_with_volume_backed_server_no_image(self):
@@ -6211,7 +6211,7 @@ class TestServerRebuild(TestServer):
6211
6211
  [mock.call(self.image.id), mock.call(self.image.id)]
6212
6212
  )
6213
6213
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6214
- self.server, self.image, admin_password=None, name=name
6214
+ self.server, self.image, name=name
6215
6215
  )
6216
6216
 
6217
6217
  def test_rebuild_with_preserve_ephemeral(self):
@@ -6235,10 +6235,7 @@ class TestServerRebuild(TestServer):
6235
6235
  [mock.call(self.image.id), mock.call(self.image.id)]
6236
6236
  )
6237
6237
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6238
- self.server,
6239
- self.image,
6240
- admin_password=None,
6241
- preserve_ephemeral=True,
6238
+ self.server, self.image, preserve_ephemeral=True
6242
6239
  )
6243
6240
 
6244
6241
  def test_rebuild_with_no_preserve_ephemeral(self):
@@ -6263,10 +6260,7 @@ class TestServerRebuild(TestServer):
6263
6260
  [mock.call(self.image.id), mock.call(self.image.id)]
6264
6261
  )
6265
6262
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6266
- self.server,
6267
- self.image,
6268
- admin_password=None,
6269
- preserve_ephemeral=False,
6263
+ self.server, self.image, preserve_ephemeral=False
6270
6264
  )
6271
6265
 
6272
6266
  def test_rebuild_with_password(self):
@@ -6308,10 +6302,7 @@ class TestServerRebuild(TestServer):
6308
6302
  [mock.call(self.image.id), mock.call(self.image.id)]
6309
6303
  )
6310
6304
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6311
- self.server,
6312
- self.image,
6313
- admin_password=None,
6314
- description=description,
6305
+ self.server, self.image, description=description
6315
6306
  )
6316
6307
 
6317
6308
  def test_rebuild_with_description_pre_v219(self):
@@ -6348,9 +6339,7 @@ class TestServerRebuild(TestServer):
6348
6339
  [mock.call(self.image.id), mock.call(self.image.id)]
6349
6340
  )
6350
6341
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6351
- self.server,
6352
- self.image,
6353
- admin_password=None,
6342
+ self.server, self.image
6354
6343
  )
6355
6344
 
6356
6345
  mock_wait_for_status.assert_called_once_with(
@@ -6382,9 +6371,7 @@ class TestServerRebuild(TestServer):
6382
6371
  self.image_client.find_image.assert_not_called()
6383
6372
  self.image_client.get_image.assert_called_once_with(self.image.id)
6384
6373
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6385
- self.server,
6386
- self.image,
6387
- admin_password=None,
6374
+ self.server, self.image
6388
6375
  )
6389
6376
 
6390
6377
  mock_wait_for_status.assert_called_once_with(
@@ -6417,9 +6404,7 @@ class TestServerRebuild(TestServer):
6417
6404
  [mock.call(self.image.id), mock.call(self.image.id)]
6418
6405
  )
6419
6406
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6420
- self.server,
6421
- self.image,
6422
- admin_password=None,
6407
+ self.server, self.image
6423
6408
  )
6424
6409
 
6425
6410
  mock_wait_for_status.assert_called_once_with(
@@ -6452,9 +6437,7 @@ class TestServerRebuild(TestServer):
6452
6437
  [mock.call(self.image.id), mock.call(self.image.id)]
6453
6438
  )
6454
6439
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6455
- self.server,
6456
- self.image,
6457
- admin_password=None,
6440
+ self.server, self.image
6458
6441
  )
6459
6442
 
6460
6443
  mock_wait_for_status.assert_called_once_with(
@@ -6510,10 +6493,7 @@ class TestServerRebuild(TestServer):
6510
6493
  [mock.call(self.image.id), mock.call(self.image.id)]
6511
6494
  )
6512
6495
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6513
- self.server,
6514
- self.image,
6515
- admin_password=None,
6516
- metadata=expected_properties,
6496
+ self.server, self.image, metadata=expected_properties
6517
6497
  )
6518
6498
 
6519
6499
  def test_rebuild_with_keypair_name(self):
@@ -6541,10 +6521,7 @@ class TestServerRebuild(TestServer):
6541
6521
  [mock.call(self.image.id), mock.call(self.image.id)]
6542
6522
  )
6543
6523
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6544
- self.server,
6545
- self.image,
6546
- admin_password=None,
6547
- key_name=self.server.key_name,
6524
+ self.server, self.image, key_name=self.server.key_name
6548
6525
  )
6549
6526
 
6550
6527
  def test_rebuild_with_keypair_name_pre_v254(self):
@@ -6589,10 +6566,7 @@ class TestServerRebuild(TestServer):
6589
6566
  [mock.call(self.image.id), mock.call(self.image.id)]
6590
6567
  )
6591
6568
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6592
- self.server,
6593
- self.image,
6594
- admin_password=None,
6595
- key_name=None,
6569
+ self.server, self.image, key_name=None
6596
6570
  )
6597
6571
 
6598
6572
  def test_rebuild_with_keypair_name_and_unset(self):
@@ -6649,7 +6623,6 @@ class TestServerRebuild(TestServer):
6649
6623
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6650
6624
  self.server,
6651
6625
  self.image,
6652
- admin_password=None,
6653
6626
  user_data=base64.b64encode(user_data).decode('utf-8'),
6654
6627
  )
6655
6628
 
@@ -6695,10 +6668,7 @@ class TestServerRebuild(TestServer):
6695
6668
  [mock.call(self.image.id), mock.call(self.image.id)]
6696
6669
  )
6697
6670
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6698
- self.server,
6699
- self.image,
6700
- admin_password=None,
6701
- user_data=None,
6671
+ self.server, self.image, user_data=None
6702
6672
  )
6703
6673
 
6704
6674
  def test_rebuild_with_no_user_data_pre_v254(self):
@@ -6759,10 +6729,7 @@ class TestServerRebuild(TestServer):
6759
6729
  [mock.call(self.image.id), mock.call(self.image.id)]
6760
6730
  )
6761
6731
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6762
- self.server,
6763
- self.image,
6764
- admin_password=None,
6765
- trusted_image_certificates=['foo', 'bar'],
6732
+ self.server, self.image, trusted_image_certificates=['foo', 'bar']
6766
6733
  )
6767
6734
 
6768
6735
  def test_rebuild_with_trusted_image_cert_pre_v263(self):
@@ -6808,10 +6775,7 @@ class TestServerRebuild(TestServer):
6808
6775
  [mock.call(self.image.id), mock.call(self.image.id)]
6809
6776
  )
6810
6777
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6811
- self.server,
6812
- self.image,
6813
- admin_password=None,
6814
- trusted_image_certificates=None,
6778
+ self.server, self.image, trusted_image_certificates=None
6815
6779
  )
6816
6780
 
6817
6781
  def test_rebuild_with_no_trusted_image_cert_pre_v263(self):
@@ -6855,10 +6819,7 @@ class TestServerRebuild(TestServer):
6855
6819
  [mock.call(self.image.id), mock.call(self.image.id)]
6856
6820
  )
6857
6821
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6858
- self.server,
6859
- self.image,
6860
- admin_password=None,
6861
- hostname='new-hostname',
6822
+ self.server, self.image, hostname='new-hostname'
6862
6823
  )
6863
6824
 
6864
6825
  def test_rebuild_with_hostname_pre_v290(self):
@@ -6920,7 +6881,7 @@ class TestServerRebuildVolumeBacked(TestServer):
6920
6881
  )
6921
6882
  self.image_client.get_image.assert_not_called()
6922
6883
  self.compute_sdk_client.rebuild_server.assert_called_once_with(
6923
- self.server, self.new_image, admin_password=None
6884
+ self.server, self.new_image
6924
6885
  )
6925
6886
 
6926
6887
  def test_rebuild_with_no_reimage_boot_volume(self):
@@ -154,7 +154,7 @@ class FakeClientManager:
154
154
  def is_compute_endpoint_enabled(self):
155
155
  return self.compute_endpoint_enabled
156
156
 
157
- def is_volume_endpoint_enabled(self, client):
157
+ def is_volume_endpoint_enabled(self, client=None):
158
158
  return self.volume_endpoint_enabled
159
159
 
160
160
 
@@ -31,15 +31,15 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
31
31
 
32
32
  class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
33
33
  columns = (
34
- 'ID',
35
- 'Name',
36
- 'Description',
37
- 'Project ID',
38
- 'Roles',
39
- 'Unrestricted',
40
- 'Access Rules',
41
- 'Expires At',
42
- 'Secret',
34
+ 'id',
35
+ 'name',
36
+ 'description',
37
+ 'project_id',
38
+ 'roles',
39
+ 'unrestricted',
40
+ 'access_rules',
41
+ 'expires_at',
42
+ 'secret',
43
43
  )
44
44
 
45
45
  def setUp(self):
@@ -413,14 +413,14 @@ class TestApplicationCredentialShow(identity_fakes.TestIdentityv3):
413
413
  )
414
414
 
415
415
  collist = (
416
- 'ID',
417
- 'Name',
418
- 'Description',
419
- 'Project ID',
420
- 'Roles',
421
- 'Unrestricted',
422
- 'Access Rules',
423
- 'Expires At',
416
+ 'id',
417
+ 'name',
418
+ 'description',
419
+ 'project_id',
420
+ 'roles',
421
+ 'unrestricted',
422
+ 'access_rules',
423
+ 'expires_at',
424
424
  )
425
425
  self.assertEqual(collist, columns)
426
426
  datalist = (
@@ -24,11 +24,11 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
24
24
 
25
25
  class TestServiceCreate(identity_fakes.TestIdentityv3):
26
26
  columns = (
27
- 'ID',
28
- 'Name',
29
- 'Type',
30
- 'Enabled',
31
- 'Description',
27
+ 'id',
28
+ 'name',
29
+ 'type',
30
+ 'enabled',
31
+ 'description',
32
32
  )
33
33
 
34
34
  def setUp(self):
@@ -455,7 +455,7 @@ class TestServiceShow(identity_fakes.TestIdentityv3):
455
455
  self.service.name, ignore_missing=False
456
456
  )
457
457
 
458
- collist = ('ID', 'Name', 'Type', 'Enabled', 'Description')
458
+ collist = ('id', 'name', 'type', 'enabled', 'description')
459
459
  self.assertEqual(collist, columns)
460
460
  datalist = (
461
461
  self.service.id,
@@ -235,6 +235,7 @@ class TestBackupList(volume_fakes.TestVolume):
235
235
  'Status',
236
236
  'Size',
237
237
  'Incremental',
238
+ 'Created At',
238
239
  )
239
240
  columns_long = columns + (
240
241
  'Availability Zone',
@@ -252,6 +253,7 @@ class TestBackupList(volume_fakes.TestVolume):
252
253
  b.status,
253
254
  b.size,
254
255
  b.is_incremental,
256
+ b.created_at,
255
257
  )
256
258
  )
257
259
  data_long = []
@@ -264,6 +266,7 @@ class TestBackupList(volume_fakes.TestVolume):
264
266
  b.status,
265
267
  b.size,
266
268
  b.is_incremental,
269
+ b.created_at,
267
270
  b.availability_zone,
268
271
  volume_backup.VolumeIdColumn(b.volume_id),
269
272
  b.container,
@@ -247,6 +247,7 @@ class ListVolumeBackup(command.Lister):
247
247
  'status',
248
248
  'size',
249
249
  'is_incremental',
250
+ 'created_at',
250
251
  )
251
252
  column_headers = (
252
253
  'ID',
@@ -255,6 +256,7 @@ class ListVolumeBackup(command.Lister):
255
256
  'Status',
256
257
  'Size',
257
258
  'Incremental',
259
+ 'Created At',
258
260
  )
259
261
  if parsed_args.long:
260
262
  columns += ('availability_zone', 'volume_id', 'container')
@@ -211,6 +211,7 @@ Jirayut Nimsaeng <wingth@gmail.com>
211
211
  Jiri Podivin <jpodivin@redhat.com>
212
212
  Joe Gordon <joe.gordon0@gmail.com>
213
213
  Joe Wigglesworth <wiggles@ca.ibm.com>
214
+ Joel Capitao <jcapitao@redhat.com>
214
215
  Johannes Kulik <johannes.kulik@sap.com>
215
216
  John Dennis <jdennis@redhat.com>
216
217
  John Keenleyside <keenley@ca.ibm.com>
@@ -399,6 +400,7 @@ Thomas Goirand <zigo@debian.org>
399
400
  Thrivikram Mudunuri <mthrivikram+opendev@gmail.com>
400
401
  Tim Bishop <tim@bishnet.net>
401
402
  Tim Burke <tim.burke@gmail.com>
403
+ Tobias Urdin <tobias.urdin@binero.com>
402
404
  Tom Cocozzello <tjcocozz@us.ibm.com>
403
405
  Tom Jose Kalapura <tomjosekal@gmail.com>
404
406
  Tom Stappaerts <tom.stappaerts@nuagenetworks.net>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-openstackclient
3
- Version: 7.0.0
3
+ Version: 7.1.0
4
4
  Summary: OpenStack Command-line Client
5
5
  Home-page: https://docs.openstack.org/python-openstackclient/latest/
6
6
  Author: OpenStack
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.8
18
18
  Classifier: Programming Language :: Python :: 3.9
19
19
  Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
21
22
  Requires-Python: >=3.8
22
23
  Requires-Dist: cliff (>=3.5.0)
23
24
  Requires-Dist: cryptography (>=2.7)
@@ -28,7 +29,7 @@ Requires-Dist: oslo.i18n (>=3.15.3)
28
29
  Requires-Dist: pbr (!=2.1.0,>=2.0.0)
29
30
  Requires-Dist: python-cinderclient (>=3.3.0)
30
31
  Requires-Dist: python-keystoneclient (>=3.22.0)
31
- Requires-Dist: requests (>=2.14.2)
32
+ Requires-Dist: requests (>=2.27.0)
32
33
  Requires-Dist: stevedore (>=2.0.1)
33
34
 
34
35
  ========================
@@ -9,28 +9,28 @@ openstackclient/api/image_v2.py,sha256=GSM09toS6rcLzbtyhKl_FvQ7UeWJ3EcvSNBdVIk9r
9
9
  openstackclient/api/object_store_v1.py,sha256=366WuIuu7iXH4r-vdZTWSiopGj8P4MmMa8NePcvh5qk,18183
10
10
  openstackclient/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  openstackclient/common/availability_zone.py,sha256=2TvrpkRQmMHffRZu1x71NFu0tQQNTuo0Voi0er_OvZc,6497
12
- openstackclient/common/clientmanager.py,sha256=OCRHHtPcvvbx2WSz5LbXLWXk2QNCM5ccIaZaamc-deg,7509
12
+ openstackclient/common/clientmanager.py,sha256=dGkJZwEuDmEFIuLyCesCRfEEUHPX5KqxOYvdwtyq1xk,7124
13
13
  openstackclient/common/configuration.py,sha256=kfi4Ph1hEO0z8uJD8d9OuQz2C70Yi7U8pzbc3Tq88lU,2339
14
14
  openstackclient/common/extension.py,sha256=4YK8HjwNtd7fIOzcQ-7PDjIwuF331T924vUcSkzK5pI,5332
15
- openstackclient/common/limits.py,sha256=eDoCj-fDkswUbHUeUQ9OaEXof1nKHGz4cjV_sDSSoW0,5668
15
+ openstackclient/common/limits.py,sha256=pCNLq4A1vKxsN27f1G0Qot4gNi-L0z4p7UdGkfx712w,5662
16
16
  openstackclient/common/module.py,sha256=biNzeW2KWcaagpvidvNvQuj4JNk1wjXxBnW99tu_nNk,4277
17
17
  openstackclient/common/pagination.py,sha256=ZmEFXprCbSKDtURJTyp5pfe97JuZYKth0MAkEXxrFFU,2728
18
18
  openstackclient/common/progressbar.py,sha256=-Xlth1FbiqZg1j3-zX6DIEp29mD76z2ozxiOybx8K-g,2427
19
19
  openstackclient/common/project_cleanup.py,sha256=f77yjCfhMh_XY2C-riwvbvh3jrMPx_4EzgHflkG8efk,5206
20
- openstackclient/common/quota.py,sha256=Xs3u7p1e8xRoah5r0ZZJ8xCo0r80lYrES-lsqrdHnVY,28139
20
+ openstackclient/common/quota.py,sha256=w17mvV7YE9V2kBZ-oX47cbh3iKP77g1cu7STD5NpswM,28361
21
21
  openstackclient/common/versions.py,sha256=yiH0xhCFKpFcZrA0tWz99-eXJ44PEAyH4qZy9Fu9uwk,3838
22
22
  openstackclient/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  openstackclient/compute/client.py,sha256=xntJEyxt_h5s2cI132cDFCOIxrJCu07WbtFLwp3R5dI,1533
24
24
  openstackclient/compute/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  openstackclient/compute/v2/agent.py,sha256=L7JgK6mQvnQC76NMcE6mvFjSZ7vuc3tv0u2EUZtTHqs,7567
26
- openstackclient/compute/v2/aggregate.py,sha256=xFgL-Ei_I-vN4nona1hEccrOZzWy_GHQrwre1QFwZ5k,14061
26
+ openstackclient/compute/v2/aggregate.py,sha256=Pn3eSbmIITBUBTezCTbJw0vf7fTKdK92ld110cFyKV8,14125
27
27
  openstackclient/compute/v2/console.py,sha256=JqKGCemI-Pafyec_Xt2MlGtSFG14hjqYyraHGd58OLo,4517
28
28
  openstackclient/compute/v2/flavor.py,sha256=K2uYFLde8aegXEPZZyykYt7hnkd_hy652RPqrBD5iaw,20334
29
29
  openstackclient/compute/v2/host.py,sha256=1Ow4eJu9HPz-SC0u_eXJskUXaGoyW7X1O2yZIf43lkQ,4993
30
- openstackclient/compute/v2/hypervisor.py,sha256=zVgepsQd7Sv_OoNrqKrOAhnGwSbyLK-o5urawTO7zZk,8720
30
+ openstackclient/compute/v2/hypervisor.py,sha256=xkSLqZjaJnVABAKh9ANF9zqy67WaEJeD9NiVL3Frqko,8808
31
31
  openstackclient/compute/v2/hypervisor_stats.py,sha256=Y2Jkkleha8PXnM2VQ2MJtjKxHKchGRyEqmILfPj-Wgw,2161
32
32
  openstackclient/compute/v2/keypair.py,sha256=yM30AVsMmPP1SAqD8_nKXNkeB9WLyL6sd18AjeYIuhM,15730
33
- openstackclient/compute/v2/server.py,sha256=5Fw8_YiEl8MbXrtcq8DQjJ9pV3rMQLJPCG3G7pzbu38,187147
33
+ openstackclient/compute/v2/server.py,sha256=EkT8zn_4T-k0xakTci3fdsir-03LTBR8CCB25ukhlv8,187194
34
34
  openstackclient/compute/v2/server_backup.py,sha256=GVf_T5iHt0po1vYDDQgUQ_fN3AisHvKozEXY37voWkc,4119
35
35
  openstackclient/compute/v2/server_event.py,sha256=vLtu_LBJ99Fgfj9oRBCVATalRMyqBd3CUjHToVfQB48,10055
36
36
  openstackclient/compute/v2/server_group.py,sha256=s9CjDnmjNUk03VUdAkOn5QHMoSCHV8dtvuLe05ER4Rg,8674
@@ -54,7 +54,7 @@ openstackclient/identity/v2_0/token.py,sha256=2iHBAfzYv4oaKGEyFF2qx_w6NTTHD6H2a5
54
54
  openstackclient/identity/v2_0/user.py,sha256=TwStNcUM05ErA5eIJTbiN4MMrSnwgKTWB6KvTz2BOT0,13405
55
55
  openstackclient/identity/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  openstackclient/identity/v3/access_rule.py,sha256=-rMfstku8tVdgdFvrJngO44A9mCpcwWggBIQqn-pbbk,3950
57
- openstackclient/identity/v3/application_credential.py,sha256=KXj-PqwiZNTDBzv-bwxEK4wdeRVoqu4Bp4tzXoVgDpI,11232
57
+ openstackclient/identity/v3/application_credential.py,sha256=vCa4hAt7AhVtyZV1Ed_F3BuMtRK5JIxEzyRwXk-hJXA,11232
58
58
  openstackclient/identity/v3/catalog.py,sha256=49jDO5w8AqGgQxRppYmfi8R6P0Es7tnIraQzzFmYFAc,3300
59
59
  openstackclient/identity/v3/consumer.py,sha256=Fk1-wyUoTA638zHKf5KwTP4Os-RYctmBYkyen7fasIk,4845
60
60
  openstackclient/identity/v3/credential.py,sha256=oLDES-pRGs2ViHB-gLTPDiUOYFasXECzW3quko9hOgI,7535
@@ -74,7 +74,7 @@ openstackclient/identity/v3/region.py,sha256=jcImUh-kZromTAtXd8aF7kfKBqBwfknP2I5
74
74
  openstackclient/identity/v3/registered_limit.py,sha256=mbV4Ci7kNPMbveHg6QQztYISiXcm3VwBv3xR2D-aKvw,11389
75
75
  openstackclient/identity/v3/role.py,sha256=dmuW5j4T9zmNBHuGkIIcolx5aoDmyFGshGSfOZ2swEY,14205
76
76
  openstackclient/identity/v3/role_assignment.py,sha256=7caVScsft9Z3kwl3DvWLyXiAD9f9fX_1V6JUTGWe_fs,7366
77
- openstackclient/identity/v3/service.py,sha256=Rj_kxOfka6FfDxPdmn__T7nk2yFbxTAUcy9esGOG48Y,7406
77
+ openstackclient/identity/v3/service.py,sha256=Ix_FjH2KezZuyiTmkHYzVDVQTzZFEoTtftJ-2HPQvxE,7406
78
78
  openstackclient/identity/v3/service_provider.py,sha256=g-gs09bFJertKjbfFp2ZKPjXtPfNcecBlHWkArGLkvw,7410
79
79
  openstackclient/identity/v3/tag.py,sha256=dcVDheoWxdkwsZYvyJSpzIF2EGpqZtaE0h7x2halscc,3972
80
80
  openstackclient/identity/v3/token.py,sha256=dXP7iRYZRROw3k8knao6NteZeP67mVGCc2Y9jMHudnQ,7399
@@ -139,6 +139,7 @@ openstackclient/object/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
139
139
  openstackclient/object/v1/account.py,sha256=iYlobVY7d2NtHoonV4K0viZL-IugidICJY5Cs4BDjgo,2480
140
140
  openstackclient/object/v1/container.py,sha256=kZEejtOydgr0TXP6HkAPwxedGhSTALQ1114fpfZK63A,8379
141
141
  openstackclient/object/v1/object.py,sha256=mHHrmKyVWAJj4KqzWGxWL8uD9BKS6jKFpeiPxoqpAQw,9892
142
+ openstackclient/releasenotes/notes/volume-backup-created-at-list-b49ec893ae1f6b0d.yaml,sha256=CCWSMDHSjODcYQ_9boYiged6cUsk0sr6KJ9XgRmTAO8,80
142
143
  openstackclient/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
144
  openstackclient/tests/functional/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
145
  openstackclient/tests/functional/base.py,sha256=tLl4vsAXfsXcE5s3n9vOyRvjeh3MpIvyOUAA6mhNg3E,6825
@@ -173,20 +174,20 @@ openstackclient/tests/functional/identity/v2/test_service.py,sha256=Qh-j-e4Vbz1s
173
174
  openstackclient/tests/functional/identity/v2/test_token.py,sha256=GvFmahWvmiAjfdk8Dvx7NgOtrVxSLZCpTNoA_02J9ns,955
174
175
  openstackclient/tests/functional/identity/v2/test_user.py,sha256=mmYHqW0M2sLxl1jG9zk0AgqmgQSkpuDQp6XYfAGyzKs,2437
175
176
  openstackclient/tests/functional/identity/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
- openstackclient/tests/functional/identity/v3/common.py,sha256=GN4ci8TErUwP9ymteNi48V4eJJavEZNggac7IjtodZY,17441
177
- openstackclient/tests/functional/identity/v3/test_application_credential.py,sha256=ZeSU9aUN3sZY7-b4vih0j9eKlFdup7cVH9jZM8KdRUE,6271
177
+ openstackclient/tests/functional/identity/v3/common.py,sha256=WqJ-M1nUyq-oN0pUOSSEGrPEjPkrlp5JQae64QyO18M,17441
178
+ openstackclient/tests/functional/identity/v3/test_application_credential.py,sha256=5XQmyuLkz8nAidnIey4zQnHrKqORApQ_lG9gX8z9Rw4,6271
178
179
  openstackclient/tests/functional/identity/v3/test_catalog.py,sha256=_asG1pSb1XWMeaVgEz56T6zVS4ijpEfqarmbrmfVFRo,2136
179
180
  openstackclient/tests/functional/identity/v3/test_domain.py,sha256=RB2C3v2F1-d97Azc6AAt-mviHgDyYd4q78RIVHkL-eU,3011
180
181
  openstackclient/tests/functional/identity/v3/test_endpoint.py,sha256=Y3YM2ok44ePSSj-PrV7Cwt8j3vGFge8_nR9qICynz1M,4551
181
182
  openstackclient/tests/functional/identity/v3/test_group.py,sha256=TQth53OA4e-OdJJTs78vJPwmjmb1Lv9Po_Q2Ng89ltA,6983
182
183
  openstackclient/tests/functional/identity/v3/test_idp.py,sha256=ozVjwZMwH72G0XUecdebp4rh8JBbNuPrinlcvojBrzE,2752
183
- openstackclient/tests/functional/identity/v3/test_limit.py,sha256=cWkvPhndLSeSOo2KNE_sIg6QBrE7PGWETlaMQFg9z0A,7725
184
+ openstackclient/tests/functional/identity/v3/test_limit.py,sha256=G_NERL53KiqrTxNzHGg7Vg9y6rqSuXVaE32-1Pa3SLg,7725
184
185
  openstackclient/tests/functional/identity/v3/test_project.py,sha256=OAMPn5wIvBnrbA-9mWhc-_pknLLa4DwVZ26gI4-co4s,4939
185
186
  openstackclient/tests/functional/identity/v3/test_region.py,sha256=oLiOiwmjlOVXXcTTzzaavFX__xr4bD4Kk6arS_YSiIw,3054
186
- openstackclient/tests/functional/identity/v3/test_registered_limit.py,sha256=HYZfaQ2LU-G139RBurq9y33OCqhl-P2SronAwVYNNzE,7324
187
+ openstackclient/tests/functional/identity/v3/test_registered_limit.py,sha256=gz2IV8DEDIwYLo4U0aUrAAELm24wvfQF8oGqpa6bsx0,7324
187
188
  openstackclient/tests/functional/identity/v3/test_role.py,sha256=uKrrnOz5e29trlCmKFxzp0itcBjj2RzhBk_YSA15M4M,6810
188
189
  openstackclient/tests/functional/identity/v3/test_role_assignment.py,sha256=tuy09HSCbN2mLWJXK6IK6iDJB3jJRF4tQ5lgJ4rOSKw,7467
189
- openstackclient/tests/functional/identity/v3/test_service.py,sha256=QQW0MPKETXMxJEOzD-f8IZOEn0x3YddryhjV2esPEpM,3006
190
+ openstackclient/tests/functional/identity/v3/test_service.py,sha256=s1x_ec7aa09Qmit9CCJzudvb7tIicexEQPXhffnbsSQ,3006
190
191
  openstackclient/tests/functional/identity/v3/test_service_provider.py,sha256=jEicf7KYCDLrVHjsKObG0-bhhmfQARePeaP4ecWdARY,2727
191
192
  openstackclient/tests/functional/identity/v3/test_token.py,sha256=QAj3Cfrs3axBZJMb99I2NPXT_5dKrawgaf1L_uweeic,864
192
193
  openstackclient/tests/functional/identity/v3/test_user.py,sha256=FfnYauR6KOvOR9mWOKV1QqZLRj1sfK20ZYCuDLQOrRw,4273
@@ -260,7 +261,7 @@ openstackclient/tests/functional/volume/v3/test_volume.py,sha256=yke-BoQxxqe0ns8
260
261
  openstackclient/tests/functional/volume/v3/test_volume_snapshot.py,sha256=qEfqZ6xk8py--i_WHD1FGbQ8K_YWTJOxsbcy3LvRgFE,7694
261
262
  openstackclient/tests/functional/volume/v3/test_volume_type.py,sha256=F_lg7aKRozEzJVfAOg6PEKbXCLI8W0XqjLltaxq-KgY,9134
262
263
  openstackclient/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
263
- openstackclient/tests/unit/fakes.py,sha256=JOdhzckgMMVfajhUaBiCS9gwCf_laPFKV2zQ2sluv4Y,7170
264
+ openstackclient/tests/unit/fakes.py,sha256=hidhxfAcISrytCtb3o7ymwJC5J1jedxXLpl9jvGMDbY,7175
264
265
  openstackclient/tests/unit/test_shell.py,sha256=uEbLuSUyOkMLD7NySaEe56AomueSjoVQJVk3OgbhQP8,12992
265
266
  openstackclient/tests/unit/utils.py,sha256=A-lzFGlK42RBT1G9x1jg21xtkxpyEb9W6JSscmvIhts,3150
266
267
  openstackclient/tests/unit/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -286,14 +287,14 @@ openstackclient/tests/unit/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
286
287
  openstackclient/tests/unit/compute/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
288
  openstackclient/tests/unit/compute/v2/fakes.py,sha256=vKNIBhrofQaXE526ntcJGQEsDf--9Duo0OLFASlPQ-k,39549
288
289
  openstackclient/tests/unit/compute/v2/test_agent.py,sha256=1kBJY0RCYnraI8sFqP7BFUqnp_aC9j0Gk4o_Bi3Rlkw,11103
289
- openstackclient/tests/unit/compute/v2/test_aggregate.py,sha256=A2UV7xWPRRqZhZuSRk8Tfqjbrovk1Lz5oCfWMFYEitA,21394
290
+ openstackclient/tests/unit/compute/v2/test_aggregate.py,sha256=FbjISS9ZDj8Cmfwtc8tNYWipwmAGukasJYAnf7tS3vo,22260
290
291
  openstackclient/tests/unit/compute/v2/test_console.py,sha256=LBg25s289JIeCBo3TjOMm_40OfGniLrJ7KOBpjAWRHY,7559
291
292
  openstackclient/tests/unit/compute/v2/test_flavor.py,sha256=Z3K71hKNLeVFe2O54w3z7Af2vr1LJBzaSYgnd0zGczE,38468
292
293
  openstackclient/tests/unit/compute/v2/test_host.py,sha256=AAcIxoGpVdy1qOkV3lPFyDhfgjpEGFHf4FgyxNNkC80,6829
293
- openstackclient/tests/unit/compute/v2/test_hypervisor.py,sha256=QaMcrfBURNRBrqSFShWOBCB3gmjHy8GoYZX8QeDEUtM,16420
294
+ openstackclient/tests/unit/compute/v2/test_hypervisor.py,sha256=t_Xv7uh4dzv6G-gOG3Eoy7l516cHOwy1xeiBgIyaUKc,17390
294
295
  openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py,sha256=1z8Jhx_CBoN-cu4im3MQc-YPAZlRQfu--3c9UAUmMG4,3020
295
296
  openstackclient/tests/unit/compute/v2/test_keypair.py,sha256=ASoemn6bN_tEKZlHRbhUpjPNydPaqMA22jn6fyAcwGs,25067
296
- openstackclient/tests/unit/compute/v2/test_server.py,sha256=MY29vHjMAQ2-UMeU69ma6qqb3e8OBEshSytx6CH6zN0,311756
297
+ openstackclient/tests/unit/compute/v2/test_server.py,sha256=dKjLdYre-cEiQ5MQ38pTQC3XuJCmtpu6u-fIhINujHQ,310875
297
298
  openstackclient/tests/unit/compute/v2/test_server_backup.py,sha256=MW2UQQ32cE403Bmihp7s_MYVhVV4NrkwfDdaZ-y5Wu4,7503
298
299
  openstackclient/tests/unit/compute/v2/test_server_event.py,sha256=aZhLD_RgcNDUdCgwVJmpolQlabVWxlrp5edSZBanR_Q,12504
299
300
  openstackclient/tests/unit/compute/v2/test_server_group.py,sha256=Ul0SQ_cIq4mW7TIsm6mDRtCOlboNyy6lClP1Oy3NPAE,14934
@@ -316,7 +317,7 @@ openstackclient/tests/unit/identity/v2_0/test_user.py,sha256=o1cRNZkZrzDmM-F7Wdf
316
317
  openstackclient/tests/unit/identity/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
317
318
  openstackclient/tests/unit/identity/v3/fakes.py,sha256=uf9RtQ1uC6tnyikzLb3F-MWe7ET7iGOk5YsTpICs4X8,35414
318
319
  openstackclient/tests/unit/identity/v3/test_access_rule.py,sha256=OTC64IjUMEPQjrucHGoubDkzsX-DnkVsBRqsLTL-1B4,5514
319
- openstackclient/tests/unit/identity/v3/test_application_credential.py,sha256=TvOyQy5EallR19po4s84nJgTG9PKTY3FjlCti8jIy_o,14851
320
+ openstackclient/tests/unit/identity/v3/test_application_credential.py,sha256=o-1WAPU5PQ7xtNGj01zEpt2icB8sGXqCqXR0bG8IXaM,14851
320
321
  openstackclient/tests/unit/identity/v3/test_catalog.py,sha256=W47EwtllLFrFUe6An3rIRPplf5-Svw9bPkLtf_yjwtc,4916
321
322
  openstackclient/tests/unit/identity/v3/test_consumer.py,sha256=QcoK9U_Ce1XQMBRqhY2OJouPQXji0huykhehwM6kHlI,6693
322
323
  openstackclient/tests/unit/identity/v3/test_credential.py,sha256=AE3j1Rgz1KRl_qmOj8dJKYRFkk5Sa3y18PQCDX_aHN4,11555
@@ -335,7 +336,7 @@ openstackclient/tests/unit/identity/v3/test_region.py,sha256=SN7wLeta1wgFjul3_NG
335
336
  openstackclient/tests/unit/identity/v3/test_registered_limit.py,sha256=8-Og3hgz2q8i7W1TSFmnRp9MqYzVY1H4SjnOrLVPWKo,17554
336
337
  openstackclient/tests/unit/identity/v3/test_role.py,sha256=pYwuSFEg99MHk1mTKQ0l9XzdER0m2T9YjZHMDxfTvFk,51986
337
338
  openstackclient/tests/unit/identity/v3/test_role_assignment.py,sha256=mHki0zb-hAB3mbVTa0nr3cmVsHEcoop282IwwbIEtgQ,27161
338
- openstackclient/tests/unit/identity/v3/test_service.py,sha256=4dt8FmD4Hii3QA1nnpZuoin0P7LZvaVlwPGJKCmPl54,15124
339
+ openstackclient/tests/unit/identity/v3/test_service.py,sha256=tyi-I26tyoO-WdFHe8zogh-8LsrzSfFJaI2E8ntVGHY,15124
339
340
  openstackclient/tests/unit/identity/v3/test_service_provider.py,sha256=JkO4dBQLGGdJS9etWJzj0wswGmdAAtrCOmfC1hEYzSs,13189
340
341
  openstackclient/tests/unit/identity/v3/test_token.py,sha256=k9Ij_BbGTx9KG6Wf7NiO_th-N7cxGWnIWQMWIlDsGXg,4556
341
342
  openstackclient/tests/unit/identity/v3/test_trust.py,sha256=ox7NuX5Suxrg7wu_06xsUXsnsASex54-RE-Jj0vtF40,13081
@@ -429,7 +430,7 @@ openstackclient/tests/unit/volume/v2/test_qos_specs.py,sha256=sjo12UPafhLgnsIlCq
429
430
  openstackclient/tests/unit/volume/v2/test_service.py,sha256=NZ_UnVxWAu8vBLyFVx9RMQ8tV4OTPKyWDDfo8UWCu7s,9338
430
431
  openstackclient/tests/unit/volume/v2/test_volume.py,sha256=KB9bXggDrPjQLXztYiCTIbGFGQFq7IIoSezkfTv_XnE,55787
431
432
  openstackclient/tests/unit/volume/v2/test_volume_backend.py,sha256=gzcYBpBDauA2KYP77Axcli_ceJF43Dx214f33XTdzEU,4891
432
- openstackclient/tests/unit/volume/v2/test_volume_backup.py,sha256=FXS1ilfxFTgqRHrloXwrSK2dTPr8b6vFH2QoJweCFSk,17408
433
+ openstackclient/tests/unit/volume/v2/test_volume_backup.py,sha256=K81Y2VvFsB4zecXI642IMrG4Uqb5apqC_RYHsCTEru8,17490
433
434
  openstackclient/tests/unit/volume/v2/test_volume_host.py,sha256=aML52GOoFwMD_9thRCZe_R0hF3GnJZCn1x9v9WqaHwY,3568
434
435
  openstackclient/tests/unit/volume/v2/test_volume_snapshot.py,sha256=1thLj9snU-bYqnJlBXvsDs6uoc9Gzn79guZDEnxC6zA,23911
435
436
  openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py,sha256=xC3LS-LT4ypi_vWbb1CexCi_cgd5LP9OBfv-KqURhk4,11682
@@ -470,7 +471,7 @@ openstackclient/volume/v2/qos_specs.py,sha256=MZOjzJiTKZRjYc_dySguC5_dEkZdbrgVPS
470
471
  openstackclient/volume/v2/service.py,sha256=r8sbZJVxvAI-q7cBJyOpQ6a9QtdQxNQ5J5LITT0XSKY,4206
471
472
  openstackclient/volume/v2/volume.py,sha256=oNjgCA-xG8vnT7kMBLYgCuQpEgfqNQO8tQz1IWkG8fM,33558
472
473
  openstackclient/volume/v2/volume_backend.py,sha256=6WPQPtW6cxoFCgVURVZ7USBQQvFBl78-gIV0JL0lDpo,3516
473
- openstackclient/volume/v2/volume_backup.py,sha256=J_VmQcGiwgoVu5wVlsqZsLD8uKJw-PR2Pj3U45z-gnw,14272
474
+ openstackclient/volume/v2/volume_backup.py,sha256=z5a2iD5cu6xZ3W1SlH0eeX7rz8aM2svFr-R1AfsSoPc,14324
474
475
  openstackclient/volume/v2/volume_host.py,sha256=TkHnW8O2311H7xG2zuzeuC256cmZgEoMNmZTOG4bOl4,2525
475
476
  openstackclient/volume/v2/volume_snapshot.py,sha256=sWEyYUtukCK5zbVaB7pry0K0BhxEhOlI37-VhbOkc6E,16869
476
477
  openstackclient/volume/v2/volume_transfer_request.py,sha256=q9IAnGNTWAZAxNkbXPS0XkLkqmHQS9zrMgOCYAB8zzI,6345
@@ -492,11 +493,11 @@ openstackclient/volume/v3/volume_message.py,sha256=HBBxPEcYoNqGjEbzGIEnIJ1XTcQ2K
492
493
  openstackclient/volume/v3/volume_snapshot.py,sha256=pZ4q_qCwqh4jaGhX28G59wsWDmEc3uXdbpeD176osZg,3186
493
494
  openstackclient/volume/v3/volume_transfer_request.py,sha256=PthOJV2m-pTV1njFzwTpaekXZkET1c6alIJrpuN7R6Q,7530
494
495
  openstackclient/volume/v3/volume_type.py,sha256=DF2MVoW2mIk0ABDLZD8D2sb8JlR7-rRjA4qCnBHRe6o,34039
495
- python_openstackclient-7.0.0.dist-info/AUTHORS,sha256=3D_BsD6fYQqTpXmfLPoDt1YwAMCbKnZsSJw6KU451ik,21276
496
- python_openstackclient-7.0.0.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
497
- python_openstackclient-7.0.0.dist-info/METADATA,sha256=DZlItUP5IRMHCCrEDi1BO89KIXat3PrGQoL2fHZO7s0,6530
498
- python_openstackclient-7.0.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
499
- python_openstackclient-7.0.0.dist-info/entry_points.txt,sha256=9kVhKTeyLPfkXDMI_ALqXvz0zSJEqibJLHHsOdmtT3c,53261
500
- python_openstackclient-7.0.0.dist-info/pbr.json,sha256=dUGNXixqAkq3QOVWwEloKg7psiPxXEmIwNJunb5pv6c,47
501
- python_openstackclient-7.0.0.dist-info/top_level.txt,sha256=htg7z9oZgysRuVUHn-m1Bk6XLGOeV65nMbZX9H8qhs0,16
502
- python_openstackclient-7.0.0.dist-info/RECORD,,
496
+ python_openstackclient-7.1.0.dist-info/AUTHORS,sha256=Vgw1ms3_hpd_hOim1rujxA7kD3bb6nNXPGXNW4113VQ,21350
497
+ python_openstackclient-7.1.0.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
498
+ python_openstackclient-7.1.0.dist-info/METADATA,sha256=OpCUK5wbD-7XoqfA1TM5IJaZ7v3f4IuXocJ3bZlj4-A,6581
499
+ python_openstackclient-7.1.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
500
+ python_openstackclient-7.1.0.dist-info/entry_points.txt,sha256=9kVhKTeyLPfkXDMI_ALqXvz0zSJEqibJLHHsOdmtT3c,53261
501
+ python_openstackclient-7.1.0.dist-info/pbr.json,sha256=OgCiC4UZUINTCkDTaCc8ySqOiFiUy8M2O02FPBLJd4s,47
502
+ python_openstackclient-7.1.0.dist-info/top_level.txt,sha256=htg7z9oZgysRuVUHn-m1Bk6XLGOeV65nMbZX9H8qhs0,16
503
+ python_openstackclient-7.1.0.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"git_version": "73e9dd19", "is_release": true}
@@ -1 +0,0 @@
1
- {"git_version": "a59262e4", "is_release": true}