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
@@ -13,89 +13,81 @@
13
13
 
14
14
  from unittest.mock import call
15
15
 
16
+ from openstack.block_storage.v2 import backup as _backup
17
+ from openstack.block_storage.v2 import snapshot as _snapshot
18
+ from openstack.block_storage.v2 import volume as _volume
19
+ from openstack import exceptions as sdk_exceptions
20
+ from openstack.test import fakes as sdk_fakes
16
21
  from osc_lib import exceptions
17
22
 
18
23
  from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
19
24
  from openstackclient.volume.v2 import volume_backup
20
25
 
21
26
 
22
- class TestBackupLegacy(volume_fakes.TestVolume):
23
- def setUp(self):
24
- super().setUp()
25
-
26
- self.backups_mock = self.volume_client.backups
27
- self.backups_mock.reset_mock()
28
- self.volumes_mock = self.volume_client.volumes
29
- self.volumes_mock.reset_mock()
30
- self.snapshots_mock = self.volume_client.volume_snapshots
31
- self.snapshots_mock.reset_mock()
32
- self.restores_mock = self.volume_client.restores
33
- self.restores_mock.reset_mock()
34
-
35
-
36
27
  class TestBackupCreate(volume_fakes.TestVolume):
37
- volume = volume_fakes.create_one_volume()
38
- snapshot = volume_fakes.create_one_snapshot()
39
- new_backup = volume_fakes.create_one_backup(
40
- attrs={'volume_id': volume.id, 'snapshot_id': snapshot.id}
41
- )
42
-
43
28
  columns = (
44
29
  'id',
45
30
  'name',
46
31
  'volume_id',
47
32
  )
48
- data = (
49
- new_backup.id,
50
- new_backup.name,
51
- new_backup.volume_id,
52
- )
53
33
 
54
34
  def setUp(self):
55
35
  super().setUp()
56
36
 
37
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
57
38
  self.volume_sdk_client.find_volume.return_value = self.volume
39
+ self.snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
58
40
  self.volume_sdk_client.find_snapshot.return_value = self.snapshot
59
- self.volume_sdk_client.create_backup.return_value = self.new_backup
41
+ self.backup = sdk_fakes.generate_fake_resource(
42
+ _backup.Backup,
43
+ volume_id=self.volume.id,
44
+ snapshot_id=self.snapshot.id,
45
+ )
46
+ self.volume_sdk_client.create_backup.return_value = self.backup
47
+
48
+ self.data = (
49
+ self.backup.id,
50
+ self.backup.name,
51
+ self.backup.volume_id,
52
+ )
60
53
 
61
- # Get the command object to test
62
54
  self.cmd = volume_backup.CreateVolumeBackup(self.app, None)
63
55
 
64
56
  def test_backup_create(self):
65
57
  arglist = [
66
58
  "--name",
67
- self.new_backup.name,
59
+ self.backup.name,
68
60
  "--description",
69
- self.new_backup.description,
61
+ self.backup.description,
70
62
  "--container",
71
- self.new_backup.container,
63
+ self.backup.container,
72
64
  "--force",
73
65
  "--incremental",
74
66
  "--snapshot",
75
- self.new_backup.snapshot_id,
76
- self.new_backup.volume_id,
67
+ self.backup.snapshot_id,
68
+ self.backup.volume_id,
77
69
  ]
78
70
  verifylist = [
79
- ("name", self.new_backup.name),
80
- ("description", self.new_backup.description),
81
- ("container", self.new_backup.container),
71
+ ("name", self.backup.name),
72
+ ("description", self.backup.description),
73
+ ("container", self.backup.container),
82
74
  ("force", True),
83
75
  ("incremental", True),
84
- ("snapshot", self.new_backup.snapshot_id),
85
- ("volume", self.new_backup.volume_id),
76
+ ("snapshot", self.backup.snapshot_id),
77
+ ("volume", self.backup.volume_id),
86
78
  ]
87
79
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
88
80
 
89
81
  columns, data = self.cmd.take_action(parsed_args)
90
82
 
91
83
  self.volume_sdk_client.create_backup.assert_called_with(
92
- volume_id=self.new_backup.volume_id,
93
- container=self.new_backup.container,
94
- name=self.new_backup.name,
95
- description=self.new_backup.description,
84
+ volume_id=self.backup.volume_id,
85
+ container=self.backup.container,
86
+ name=self.backup.name,
87
+ description=self.backup.description,
96
88
  force=True,
97
89
  is_incremental=True,
98
- snapshot_id=self.new_backup.snapshot_id,
90
+ snapshot_id=self.backup.snapshot_id,
99
91
  )
100
92
  self.assertEqual(self.columns, columns)
101
93
  self.assertEqual(self.data, data)
@@ -103,25 +95,25 @@ class TestBackupCreate(volume_fakes.TestVolume):
103
95
  def test_backup_create_without_name(self):
104
96
  arglist = [
105
97
  "--description",
106
- self.new_backup.description,
98
+ self.backup.description,
107
99
  "--container",
108
- self.new_backup.container,
109
- self.new_backup.volume_id,
100
+ self.backup.container,
101
+ self.backup.volume_id,
110
102
  ]
111
103
  verifylist = [
112
- ("description", self.new_backup.description),
113
- ("container", self.new_backup.container),
114
- ("volume", self.new_backup.volume_id),
104
+ ("description", self.backup.description),
105
+ ("container", self.backup.container),
106
+ ("volume", self.backup.volume_id),
115
107
  ]
116
108
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
117
109
 
118
110
  columns, data = self.cmd.take_action(parsed_args)
119
111
 
120
112
  self.volume_sdk_client.create_backup.assert_called_with(
121
- volume_id=self.new_backup.volume_id,
122
- container=self.new_backup.container,
113
+ volume_id=self.backup.volume_id,
114
+ container=self.backup.container,
123
115
  name=None,
124
- description=self.new_backup.description,
116
+ description=self.backup.description,
125
117
  force=False,
126
118
  is_incremental=False,
127
119
  )
@@ -130,17 +122,13 @@ class TestBackupCreate(volume_fakes.TestVolume):
130
122
 
131
123
 
132
124
  class TestBackupDelete(volume_fakes.TestVolume):
133
- backups = volume_fakes.create_backups(count=2)
134
-
135
125
  def setUp(self):
136
126
  super().setUp()
137
127
 
138
- self.volume_sdk_client.find_backup = volume_fakes.get_backups(
139
- self.backups
140
- )
128
+ self.backups = list(sdk_fakes.generate_fake_resources(_backup.Backup))
129
+ self.volume_sdk_client.find_backup.side_effect = self.backups
141
130
  self.volume_sdk_client.delete_backup.return_value = None
142
131
 
143
- # Get the command object to mock
144
132
  self.cmd = volume_backup.DeleteVolumeBackup(self.app, None)
145
133
 
146
134
  def test_backup_delete(self):
@@ -223,11 +211,6 @@ class TestBackupDelete(volume_fakes.TestVolume):
223
211
 
224
212
 
225
213
  class TestBackupList(volume_fakes.TestVolume):
226
- volume = volume_fakes.create_one_volume()
227
- backups = volume_fakes.create_backups(
228
- attrs={'volume_id': volume.name}, count=3
229
- )
230
-
231
214
  columns = (
232
215
  'ID',
233
216
  'Name',
@@ -243,45 +226,51 @@ class TestBackupList(volume_fakes.TestVolume):
243
226
  'Container',
244
227
  )
245
228
 
246
- data = []
247
- for b in backups:
248
- data.append(
249
- (
250
- b.id,
251
- b.name,
252
- b.description,
253
- b.status,
254
- b.size,
255
- b.is_incremental,
256
- b.created_at,
257
- )
258
- )
259
- data_long = []
260
- for b in backups:
261
- data_long.append(
262
- (
263
- b.id,
264
- b.name,
265
- b.description,
266
- b.status,
267
- b.size,
268
- b.is_incremental,
269
- b.created_at,
270
- b.availability_zone,
271
- volume_backup.VolumeIdColumn(b.volume_id),
272
- b.container,
273
- )
274
- )
275
-
276
229
  def setUp(self):
277
230
  super().setUp()
278
231
 
232
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
233
+ self.volume_sdk_client.find_volume.return_value = self.volume
279
234
  self.volume_sdk_client.volumes.return_value = [self.volume]
235
+ self.backups = list(
236
+ sdk_fakes.generate_fake_resources(
237
+ _backup.Backup,
238
+ attrs={'volume_id': self.volume.id},
239
+ )
240
+ )
280
241
  self.volume_sdk_client.backups.return_value = self.backups
281
- self.volume_sdk_client.find_volume.return_value = self.volume
282
242
  self.volume_sdk_client.find_backup.return_value = self.backups[0]
283
243
 
284
- # Get the command to test
244
+ self.data = []
245
+ for b in self.backups:
246
+ self.data.append(
247
+ (
248
+ b.id,
249
+ b.name,
250
+ b.description,
251
+ b.status,
252
+ b.size,
253
+ b.is_incremental,
254
+ b.created_at,
255
+ )
256
+ )
257
+ self.data_long = []
258
+ for b in self.backups:
259
+ self.data_long.append(
260
+ (
261
+ b.id,
262
+ b.name,
263
+ b.description,
264
+ b.status,
265
+ b.size,
266
+ b.is_incremental,
267
+ b.created_at,
268
+ b.availability_zone,
269
+ volume_backup.VolumeIdColumn(b.volume_id),
270
+ b.container,
271
+ )
272
+ )
273
+
285
274
  self.cmd = volume_backup.ListVolumeBackup(self.app, None)
286
275
 
287
276
  def test_backup_list_without_options(self):
@@ -359,35 +348,33 @@ class TestBackupList(volume_fakes.TestVolume):
359
348
 
360
349
 
361
350
  class TestBackupRestore(volume_fakes.TestVolume):
362
- volume = volume_fakes.create_one_volume()
363
- backup = volume_fakes.create_one_backup(
364
- attrs={'volume_id': volume.id},
365
- )
366
-
367
351
  columns = (
368
352
  "id",
369
353
  "volume_id",
370
354
  "volume_name",
371
355
  )
372
356
 
373
- data = (
374
- backup.id,
375
- volume.id,
376
- volume.name,
377
- )
378
-
379
357
  def setUp(self):
380
358
  super().setUp()
381
359
 
382
- self.volume_sdk_client.find_backup.return_value = self.backup
360
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
383
361
  self.volume_sdk_client.find_volume.return_value = self.volume
362
+ self.backup = sdk_fakes.generate_fake_resource(
363
+ _backup.Backup, volume_id=self.volume.id
364
+ )
365
+ self.volume_sdk_client.find_backup.return_value = self.backup
384
366
  self.volume_sdk_client.restore_backup.return_value = {
385
367
  'id': self.backup['id'],
386
368
  'volume_id': self.volume['id'],
387
369
  'volume_name': self.volume['name'],
388
370
  }
389
371
 
390
- # Get the command object to mock
372
+ self.data = (
373
+ self.backup.id,
374
+ self.volume.id,
375
+ self.volume.name,
376
+ )
377
+
391
378
  self.cmd = volume_backup.RestoreVolumeBackup(self.app, None)
392
379
 
393
380
  def test_backup_restore(self):
@@ -476,17 +463,15 @@ class TestBackupRestore(volume_fakes.TestVolume):
476
463
  )
477
464
 
478
465
 
479
- class TestBackupSet(TestBackupLegacy):
480
- backup = volume_fakes.create_one_backup(
481
- attrs={'metadata': {'wow': 'cool'}},
482
- )
483
-
466
+ class TestBackupSet(volume_fakes.TestVolume):
484
467
  def setUp(self):
485
468
  super().setUp()
486
469
 
487
- self.backups_mock.get.return_value = self.backup
470
+ self.backup = sdk_fakes.generate_fake_resource(
471
+ _backup.Backup, metadata={'wow': 'cool'}
472
+ )
473
+ self.volume_sdk_client.find_backup.return_value = self.backup
488
474
 
489
- # Get the command object to test
490
475
  self.cmd = volume_backup.SetVolumeBackup(self.app, None)
491
476
 
492
477
  def test_backup_set_state(self):
@@ -496,32 +481,38 @@ class TestBackupSet(TestBackupLegacy):
496
481
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
497
482
 
498
483
  result = self.cmd.take_action(parsed_args)
499
- self.backups_mock.reset_state.assert_called_once_with(
500
- self.backup.id, 'error'
501
- )
502
484
  self.assertIsNone(result)
503
485
 
486
+ self.volume_sdk_client.find_backup.assert_called_with(
487
+ self.backup.id, ignore_missing=False
488
+ )
489
+ self.volume_sdk_client.reset_backup_status.assert_called_with(
490
+ self.backup, status='error'
491
+ )
492
+
504
493
  def test_backup_set_state_failed(self):
505
- self.backups_mock.reset_state.side_effect = exceptions.CommandError()
494
+ self.volume_sdk_client.reset_backup_status.side_effect = (
495
+ sdk_exceptions.NotFoundException('foo')
496
+ )
497
+
506
498
  arglist = ['--state', 'error', self.backup.id]
507
499
  verifylist = [('state', 'error'), ('backup', self.backup.id)]
508
500
 
509
501
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
510
- try:
511
- self.cmd.take_action(parsed_args)
512
- self.fail('CommandError should be raised.')
513
- except exceptions.CommandError as e:
514
- self.assertEqual(
515
- 'One or more of the set operations failed', str(e)
516
- )
517
- self.backups_mock.reset_state.assert_called_with(
518
- self.backup.id, 'error'
502
+ exc = self.assertRaises(
503
+ exceptions.CommandError, self.cmd.take_action, parsed_args
504
+ )
505
+ self.assertEqual('One or more of the set operations failed', str(exc))
506
+
507
+ self.volume_sdk_client.find_backup.assert_called_with(
508
+ self.backup.id, ignore_missing=False
509
+ )
510
+ self.volume_sdk_client.reset_backup_status.assert_called_with(
511
+ self.backup, status='error'
519
512
  )
520
513
 
521
514
 
522
515
  class TestBackupShow(volume_fakes.TestVolume):
523
- backup = volume_fakes.create_one_backup()
524
-
525
516
  columns = (
526
517
  "availability_zone",
527
518
  "container",
@@ -540,30 +531,32 @@ class TestBackupShow(volume_fakes.TestVolume):
540
531
  "updated_at",
541
532
  "volume_id",
542
533
  )
543
- data = (
544
- backup.availability_zone,
545
- backup.container,
546
- backup.created_at,
547
- backup.data_timestamp,
548
- backup.description,
549
- backup.fail_reason,
550
- backup.has_dependent_backups,
551
- backup.id,
552
- backup.is_incremental,
553
- backup.name,
554
- backup.object_count,
555
- backup.size,
556
- backup.snapshot_id,
557
- backup.status,
558
- backup.updated_at,
559
- backup.volume_id,
560
- )
561
534
 
562
535
  def setUp(self):
563
536
  super().setUp()
564
537
 
538
+ self.backup = sdk_fakes.generate_fake_resource(_backup.Backup)
565
539
  self.volume_sdk_client.find_backup.return_value = self.backup
566
- # Get the command object to test
540
+
541
+ self.data = (
542
+ self.backup.availability_zone,
543
+ self.backup.container,
544
+ self.backup.created_at,
545
+ self.backup.data_timestamp,
546
+ self.backup.description,
547
+ self.backup.fail_reason,
548
+ self.backup.has_dependent_backups,
549
+ self.backup.id,
550
+ self.backup.is_incremental,
551
+ self.backup.name,
552
+ self.backup.object_count,
553
+ self.backup.size,
554
+ self.backup.snapshot_id,
555
+ self.backup.status,
556
+ self.backup.updated_at,
557
+ self.backup.volume_id,
558
+ )
559
+
567
560
  self.cmd = volume_backup.ShowVolumeBackup(self.app, None)
568
561
 
569
562
  def test_backup_show(self):