python-openstackclient 8.0.0__py3-none-any.whl → 8.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 (85) hide show
  1. openstackclient/compute/client.py +5 -0
  2. openstackclient/compute/v2/console.py +7 -0
  3. openstackclient/compute/v2/console_connection.py +48 -0
  4. openstackclient/compute/v2/keypair.py +10 -3
  5. openstackclient/compute/v2/server.py +75 -10
  6. openstackclient/compute/v2/server_event.py +1 -1
  7. openstackclient/identity/common.py +79 -0
  8. openstackclient/identity/v3/application_credential.py +2 -2
  9. openstackclient/identity/v3/domain.py +62 -43
  10. openstackclient/identity/v3/group.py +113 -68
  11. openstackclient/identity/v3/project.py +17 -0
  12. openstackclient/identity/v3/user.py +38 -5
  13. openstackclient/image/client.py +5 -0
  14. openstackclient/image/v2/image.py +11 -11
  15. openstackclient/network/client.py +0 -6
  16. openstackclient/network/v2/floating_ip.py +58 -29
  17. openstackclient/network/v2/network_qos_rule.py +3 -11
  18. openstackclient/network/v2/router.py +1 -1
  19. openstackclient/network/v2/security_group.py +5 -4
  20. openstackclient/network/v2/security_group_rule.py +1 -1
  21. openstackclient/shell.py +1 -1
  22. openstackclient/tests/functional/base.py +5 -1
  23. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  24. openstackclient/tests/unit/compute/v2/fakes.py +81 -305
  25. openstackclient/tests/unit/compute/v2/test_console.py +18 -1
  26. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  27. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -1
  28. openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
  29. openstackclient/tests/unit/compute/v2/test_server.py +169 -46
  30. openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
  31. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  32. openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
  33. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  34. openstackclient/tests/unit/identity/v3/test_application_credential.py +47 -25
  35. openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
  36. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  37. openstackclient/tests/unit/identity/v3/test_project.py +16 -0
  38. openstackclient/tests/unit/identity/v3/test_user.py +86 -6
  39. openstackclient/tests/unit/image/v1/test_image.py +8 -9
  40. openstackclient/tests/unit/image/v2/test_image.py +49 -49
  41. openstackclient/tests/unit/network/v2/fakes.py +405 -485
  42. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
  43. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  44. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
  45. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  46. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  47. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  48. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  49. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  50. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  51. openstackclient/tests/unit/network/v2/test_port.py +17 -17
  52. openstackclient/tests/unit/network/v2/test_router.py +73 -57
  53. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
  54. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
  55. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
  56. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  57. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  58. openstackclient/tests/unit/volume/v2/test_volume.py +108 -105
  59. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  60. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  61. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  62. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  63. openstackclient/tests/unit/volume/v3/test_volume.py +130 -119
  64. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  65. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  66. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
  67. openstackclient/volume/v2/service.py +41 -38
  68. openstackclient/volume/v2/volume.py +63 -37
  69. openstackclient/volume/v2/volume_backup.py +9 -3
  70. openstackclient/volume/v2/volume_snapshot.py +121 -84
  71. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  72. openstackclient/volume/v3/service.py +105 -14
  73. openstackclient/volume/v3/volume.py +200 -39
  74. openstackclient/volume/v3/volume_backup.py +24 -19
  75. openstackclient/volume/v3/volume_snapshot.py +485 -10
  76. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +8 -0
  77. python_openstackclient-8.1.0.dist-info/METADATA +264 -0
  78. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +83 -81
  79. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -6
  80. python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
  81. python_openstackclient-8.0.0.dist-info/METADATA +0 -166
  82. python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
  83. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
  84. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +0 -0
  85. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
@@ -73,7 +73,7 @@ ACTION_SHOW = 'get'
73
73
 
74
74
 
75
75
  def _get_columns(item):
76
- hidden_columns = ['location', 'tenant_id']
76
+ hidden_columns = ['location', 'name', 'tenant_id']
77
77
  return utils.get_osc_show_columns_for_sdk_resource(
78
78
  item, {}, hidden_columns
79
79
  )
@@ -148,14 +148,6 @@ def _get_attrs(network_client, parsed_args, is_create=False):
148
148
  return attrs
149
149
 
150
150
 
151
- def _get_item_properties(item, fields):
152
- """Return a tuple containing the item properties."""
153
- row = []
154
- for field in fields:
155
- row.append(item.get(field, ''))
156
- return tuple(row)
157
-
158
-
159
151
  def _rule_action_call(client, action, rule_type):
160
152
  rule_type = rule_type.replace('-', '_')
161
153
  func_name = f'{action}_qos_{rule_type}_rule'
@@ -357,10 +349,10 @@ class ListNetworkQosRule(command.Lister):
357
349
  qos = client.find_qos_policy(
358
350
  parsed_args.qos_policy, ignore_missing=False
359
351
  )
360
- data = qos.rules
352
+
361
353
  return (
362
354
  column_headers,
363
- (_get_item_properties(s, columns) for s in data),
355
+ (utils.get_dict_properties(s, columns) for s in qos.rules),
364
356
  )
365
357
 
366
358
 
@@ -76,7 +76,7 @@ def _get_columns(item):
76
76
  }
77
77
  if hasattr(item, 'interfaces_info'):
78
78
  column_map['interfaces_info'] = 'interfaces_info'
79
- invisible_columns = ['location']
79
+ invisible_columns = ['location', 'tenant_id']
80
80
  if item.is_ha is None:
81
81
  invisible_columns.append('is_ha')
82
82
  column_map.pop('is_ha')
@@ -89,9 +89,8 @@ def _get_columns(item):
89
89
  # We still support Nova managed security groups, where we have tenant_id.
90
90
  column_map = {
91
91
  'security_group_rules': 'rules',
92
- 'tenant_id': 'project_id',
93
92
  }
94
- hidden_columns = ['location']
93
+ hidden_columns = ['location', 'tenant_id']
95
94
  return utils.get_osc_show_columns_for_sdk_resource(
96
95
  item, column_map, hidden_columns
97
96
  )
@@ -186,7 +185,8 @@ class CreateSecurityGroup(
186
185
  parsed_args.name,
187
186
  description,
188
187
  )
189
- display_columns, property_columns = _get_columns(obj)
188
+ display_columns = ('description', 'id', 'name', 'project_id', 'rules')
189
+ property_columns = ('description', 'id', 'name', 'tenant_id', 'rules')
190
190
  data = utils.get_dict_properties(
191
191
  obj, property_columns, formatters=_formatters_compute
192
192
  )
@@ -420,7 +420,8 @@ class ShowSecurityGroup(common.NetworkAndComputeShowOne):
420
420
 
421
421
  def take_action_compute(self, client, parsed_args):
422
422
  obj = compute_v2.find_security_group(client, parsed_args.group)
423
- display_columns, property_columns = _get_columns(obj)
423
+ display_columns = ('description', 'id', 'name', 'project_id', 'rules')
424
+ property_columns = ('description', 'id', 'name', 'tenant_id', 'rules')
424
425
  data = utils.get_dict_properties(
425
426
  obj, property_columns, formatters=_formatters_compute
426
427
  )
@@ -30,7 +30,7 @@ LOG = logging.getLogger(__name__)
30
30
 
31
31
 
32
32
  def _get_columns(item):
33
- hidden_columns = ['location', 'tenant_id']
33
+ hidden_columns = ['location', 'name', 'tenant_id', 'tags']
34
34
  return utils.get_osc_show_columns_for_sdk_resource(
35
35
  item, {}, hidden_columns
36
36
  )
openstackclient/shell.py CHANGED
@@ -94,7 +94,7 @@ class OpenStackShell(shell.OpenStackShell):
94
94
  # instead.
95
95
  mod_versions = getattr(mod, 'API_VERSIONS', None)
96
96
  if mod_versions is not None and not isinstance(
97
- mod_versions, (dict, tuple)
97
+ mod_versions, dict | tuple
98
98
  ):
99
99
  raise TypeError(
100
100
  f'Plugin {mod} has incompatible API_VERSIONS. '
@@ -97,7 +97,11 @@ class TestCase(testtools.TestCase):
97
97
  )
98
98
 
99
99
  if parse_output:
100
- return json.loads(output)
100
+ try:
101
+ return json.loads(output)
102
+ except json.JSONDecodeError:
103
+ print(f'failed to decode: {output}')
104
+ raise
101
105
  else:
102
106
  return output
103
107
 
@@ -21,12 +21,18 @@ from openstackclient.tests.functional import base
21
21
  class KeypairBase(base.TestCase):
22
22
  """Methods for functional tests."""
23
23
 
24
- def keypair_create(self, name=data_utils.rand_uuid()):
24
+ def keypair_create(self, name=data_utils.rand_uuid(), user=None):
25
25
  """Create keypair and add cleanup."""
26
- raw_output = self.openstack('keypair create ' + name)
27
- self.addCleanup(self.keypair_delete, name, True)
26
+ cmd = 'keypair create ' + name
27
+ if user is not None:
28
+ cmd += ' --user ' + user
29
+ raw_output = self.openstack(cmd)
30
+ self.addCleanup(
31
+ self.keypair_delete, name, ignore_exceptions=True, user=user
32
+ )
28
33
  if not raw_output:
29
34
  self.fail('Keypair has not been created!')
35
+ return name
30
36
 
31
37
  def keypair_list(self, params=''):
32
38
  """Return dictionary with list of keypairs."""
@@ -34,10 +40,13 @@ class KeypairBase(base.TestCase):
34
40
  keypairs = self.parse_show_as_object(raw_output)
35
41
  return keypairs
36
42
 
37
- def keypair_delete(self, name, ignore_exceptions=False):
43
+ def keypair_delete(self, name, ignore_exceptions=False, user=None):
38
44
  """Try to delete keypair by name."""
39
45
  try:
40
- self.openstack('keypair delete ' + name)
46
+ cmd = 'keypair delete ' + name
47
+ if user is not None:
48
+ cmd += ' --user ' + user
49
+ self.openstack(cmd)
41
50
  except exceptions.CommandFailed:
42
51
  if not ignore_exceptions:
43
52
  raise
@@ -200,3 +209,30 @@ class KeypairTests(KeypairBase):
200
209
  items = self.parse_listing(raw_output)
201
210
  self.assert_table_structure(items, HEADERS)
202
211
  self.assertInOutput(self.KPName, raw_output)
212
+
213
+ def test_keypair_list_by_project(self):
214
+ """Test keypair list by project.
215
+
216
+ Test steps:
217
+ 1) Create keypair for admin project in setUp
218
+ 2) Create a new project
219
+ 3) Create a new user
220
+ 4) Associate the new user with the new project
221
+ 5) Create keypair for the new user
222
+ 6) List keypairs by the new project
223
+ 7) Check that only the keypair from step 5 is returned
224
+ """
225
+ project_name = data_utils.rand_name('TestProject')
226
+ self.openstack(f'project create {project_name}')
227
+ self.addCleanup(self.openstack, f'project delete {project_name}')
228
+ user_name = data_utils.rand_name('TestUser')
229
+ self.openstack(f'user create {user_name}')
230
+ self.addCleanup(self.openstack, f'user delete {user_name}')
231
+ self.openstack(
232
+ f'role add --user {user_name} --project {project_name} member'
233
+ )
234
+ keypair_name = self.keypair_create(user=user_name)
235
+ raw_output = self.openstack(f'keypair list --project {project_name}')
236
+ items = self.parse_listing(raw_output)
237
+ self.assertEqual(1, len(items))
238
+ self.assertEqual(keypair_name, items[0]['Name'])