python-openstackclient 8.2.0__py3-none-any.whl → 9.0.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 (233) hide show
  1. openstackclient/api/object_store_v1.py +4 -1
  2. openstackclient/command.py +27 -0
  3. openstackclient/common/availability_zone.py +1 -1
  4. openstackclient/common/clientmanager.py +59 -21
  5. openstackclient/common/configuration.py +1 -1
  6. openstackclient/common/extension.py +1 -1
  7. openstackclient/common/limits.py +1 -1
  8. openstackclient/common/module.py +5 -3
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +54 -23
  11. openstackclient/common/versions.py +1 -2
  12. openstackclient/compute/v2/agent.py +1 -1
  13. openstackclient/compute/v2/aggregate.py +6 -5
  14. openstackclient/compute/v2/console.py +5 -3
  15. openstackclient/compute/v2/console_connection.py +1 -1
  16. openstackclient/compute/v2/flavor.py +1 -1
  17. openstackclient/compute/v2/host.py +1 -1
  18. openstackclient/compute/v2/hypervisor.py +1 -1
  19. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  20. openstackclient/compute/v2/keypair.py +1 -1
  21. openstackclient/compute/v2/server.py +78 -29
  22. openstackclient/compute/v2/server_backup.py +1 -1
  23. openstackclient/compute/v2/server_event.py +1 -1
  24. openstackclient/compute/v2/server_group.py +4 -2
  25. openstackclient/compute/v2/server_image.py +1 -1
  26. openstackclient/compute/v2/server_migration.py +1 -1
  27. openstackclient/compute/v2/server_volume.py +1 -1
  28. openstackclient/compute/v2/service.py +1 -1
  29. openstackclient/compute/v2/usage.py +6 -4
  30. openstackclient/identity/common.py +33 -1
  31. openstackclient/identity/v2_0/catalog.py +3 -2
  32. openstackclient/identity/v2_0/ec2creds.py +1 -1
  33. openstackclient/identity/v2_0/endpoint.py +1 -1
  34. openstackclient/identity/v2_0/project.py +17 -7
  35. openstackclient/identity/v2_0/role.py +1 -1
  36. openstackclient/identity/v2_0/role_assignment.py +3 -3
  37. openstackclient/identity/v2_0/service.py +4 -2
  38. openstackclient/identity/v2_0/token.py +1 -1
  39. openstackclient/identity/v2_0/user.py +2 -2
  40. openstackclient/identity/v3/access_rule.py +16 -4
  41. openstackclient/identity/v3/application_credential.py +30 -10
  42. openstackclient/identity/v3/catalog.py +3 -3
  43. openstackclient/identity/v3/consumer.py +1 -1
  44. openstackclient/identity/v3/credential.py +1 -1
  45. openstackclient/identity/v3/domain.py +10 -4
  46. openstackclient/identity/v3/ec2creds.py +1 -1
  47. openstackclient/identity/v3/endpoint.py +33 -12
  48. openstackclient/identity/v3/endpoint_group.py +1 -1
  49. openstackclient/identity/v3/federation_protocol.py +40 -41
  50. openstackclient/identity/v3/group.py +11 -5
  51. openstackclient/identity/v3/identity_provider.py +12 -10
  52. openstackclient/identity/v3/implied_role.py +1 -1
  53. openstackclient/identity/v3/limit.py +86 -85
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +191 -115
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +97 -109
  59. openstackclient/identity/v3/role.py +20 -39
  60. openstackclient/identity/v3/role_assignment.py +12 -23
  61. openstackclient/identity/v3/service.py +1 -1
  62. openstackclient/identity/v3/service_provider.py +1 -1
  63. openstackclient/identity/v3/tag.py +1 -11
  64. openstackclient/identity/v3/token.py +3 -2
  65. openstackclient/identity/v3/trust.py +4 -2
  66. openstackclient/identity/v3/unscoped_saml.py +1 -1
  67. openstackclient/identity/v3/user.py +22 -13
  68. openstackclient/image/v1/image.py +19 -16
  69. openstackclient/image/v2/cache.py +1 -1
  70. openstackclient/image/v2/image.py +16 -12
  71. openstackclient/image/v2/info.py +1 -1
  72. openstackclient/image/v2/metadef_namespaces.py +1 -1
  73. openstackclient/image/v2/metadef_objects.py +1 -1
  74. openstackclient/image/v2/metadef_properties.py +3 -2
  75. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  76. openstackclient/image/v2/metadef_resource_types.py +1 -1
  77. openstackclient/image/v2/task.py +1 -1
  78. openstackclient/network/common.py +10 -9
  79. openstackclient/network/v2/address_group.py +4 -3
  80. openstackclient/network/v2/address_scope.py +8 -6
  81. openstackclient/network/v2/default_security_group_rule.py +9 -8
  82. openstackclient/network/v2/floating_ip.py +16 -9
  83. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  84. openstackclient/network/v2/ip_availability.py +7 -4
  85. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  86. openstackclient/network/v2/local_ip.py +13 -7
  87. openstackclient/network/v2/local_ip_association.py +7 -4
  88. openstackclient/network/v2/ndp_proxy.py +13 -6
  89. openstackclient/network/v2/network.py +33 -16
  90. openstackclient/network/v2/network_agent.py +5 -5
  91. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  92. openstackclient/network/v2/network_flavor.py +1 -1
  93. openstackclient/network/v2/network_flavor_profile.py +1 -1
  94. openstackclient/network/v2/network_meter.py +1 -1
  95. openstackclient/network/v2/network_meter_rule.py +1 -1
  96. openstackclient/network/v2/network_qos_policy.py +7 -5
  97. openstackclient/network/v2/network_qos_rule.py +1 -1
  98. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  99. openstackclient/network/v2/network_rbac.py +8 -5
  100. openstackclient/network/v2/network_segment.py +2 -2
  101. openstackclient/network/v2/network_segment_range.py +13 -6
  102. openstackclient/network/v2/network_service_provider.py +1 -1
  103. openstackclient/network/v2/network_trunk.py +65 -42
  104. openstackclient/network/v2/port.py +22 -20
  105. openstackclient/network/v2/router.py +19 -8
  106. openstackclient/network/v2/security_group.py +10 -6
  107. openstackclient/network/v2/security_group_rule.py +11 -5
  108. openstackclient/network/v2/subnet.py +17 -18
  109. openstackclient/network/v2/subnet_pool.py +11 -9
  110. openstackclient/network/v2/taas/__init__.py +0 -0
  111. openstackclient/network/v2/taas/tap_flow.py +245 -0
  112. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  113. openstackclient/network/v2/taas/tap_service.py +211 -0
  114. openstackclient/object/v1/account.py +1 -1
  115. openstackclient/object/v1/container.py +1 -1
  116. openstackclient/object/v1/object.py +1 -1
  117. openstackclient/shell.py +18 -8
  118. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  119. openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
  120. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  121. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  122. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  123. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  124. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
  125. openstackclient/tests/unit/common/test_command.py +1 -1
  126. openstackclient/tests/unit/common/test_extension.py +2 -3
  127. openstackclient/tests/unit/common/test_module.py +14 -7
  128. openstackclient/tests/unit/common/test_quota.py +79 -0
  129. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  130. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  131. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  133. openstackclient/tests/unit/compute/v2/test_server.py +370 -38
  134. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  135. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  136. openstackclient/tests/unit/fakes.py +35 -134
  137. openstackclient/tests/unit/identity/test_common.py +100 -0
  138. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  139. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  140. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  141. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  142. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  144. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  145. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  146. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  147. openstackclient/tests/unit/identity/v3/test_project.py +832 -513
  148. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  149. openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
  150. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  151. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  152. openstackclient/tests/unit/image/v2/test_image.py +116 -5
  153. openstackclient/tests/unit/network/test_common.py +9 -13
  154. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  155. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  156. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  157. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  158. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  159. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  160. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  161. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  162. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  163. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  164. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  165. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  166. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  167. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  168. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  169. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  170. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  171. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  172. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  173. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  174. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  175. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  176. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  177. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  178. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  179. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  180. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  181. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  182. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  183. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  184. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  185. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  186. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  187. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  188. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  189. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  190. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  191. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  192. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  193. openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
  194. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  195. openstackclient/volume/client.py +7 -17
  196. openstackclient/volume/v2/backup_record.py +1 -1
  197. openstackclient/volume/v2/consistency_group.py +9 -9
  198. openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
  199. openstackclient/volume/v2/qos_specs.py +3 -3
  200. openstackclient/volume/v2/service.py +1 -1
  201. openstackclient/volume/v2/volume.py +14 -7
  202. openstackclient/volume/v2/volume_backend.py +1 -1
  203. openstackclient/volume/v2/volume_backup.py +7 -5
  204. openstackclient/volume/v2/volume_host.py +1 -2
  205. openstackclient/volume/v2/volume_snapshot.py +4 -4
  206. openstackclient/volume/v2/volume_transfer_request.py +3 -3
  207. openstackclient/volume/v2/volume_type.py +16 -11
  208. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  209. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  210. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  211. openstackclient/volume/v3/block_storage_manage.py +1 -1
  212. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  213. openstackclient/volume/v3/service.py +1 -1
  214. openstackclient/volume/v3/volume.py +16 -9
  215. openstackclient/volume/v3/volume_attachment.py +6 -5
  216. openstackclient/volume/v3/volume_backup.py +20 -5
  217. openstackclient/volume/v3/volume_group.py +1 -1
  218. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  219. openstackclient/volume/v3/volume_group_type.py +1 -1
  220. openstackclient/volume/v3/volume_message.py +1 -1
  221. openstackclient/volume/v3/volume_snapshot.py +4 -4
  222. openstackclient/volume/v3/volume_transfer_request.py +3 -3
  223. openstackclient/volume/v3/volume_type.py +20 -14
  224. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
  227. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
  228. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
  229. python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
  230. openstackclient/tests/unit/common/test_logs.py +0 -221
  231. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  232. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
  233. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,276 @@
1
+ # All Rights Reserved 2020
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
+ import copy
16
+ import operator
17
+ import uuid
18
+
19
+ from openstack.network.v2 import tap_flow as _tap_flow
20
+ from openstack.network.v2 import tap_service as _tap_service
21
+ from openstack.test import fakes as sdk_fakes
22
+ from osc_lib import utils as osc_utils
23
+ from osc_lib.utils import columns as column_util
24
+
25
+ from openstackclient.network.v2.taas import tap_flow as osc_tap_flow
26
+ from openstackclient.network.v2.taas import tap_service as osc_tap_service
27
+ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
28
+
29
+
30
+ columns_long = tuple(
31
+ col
32
+ for col, _, listing_mode in osc_tap_flow._attr_map
33
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
34
+ )
35
+ headers_long = tuple(
36
+ head
37
+ for _, head, listing_mode in osc_tap_flow._attr_map
38
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
39
+ )
40
+ sorted_attr_map = sorted(osc_tap_flow._attr_map, key=operator.itemgetter(1))
41
+ sorted_columns = tuple(col for col, _, _ in sorted_attr_map)
42
+ sorted_headers = tuple(head for _, head, _ in sorted_attr_map)
43
+
44
+
45
+ def _get_data(attrs, columns=sorted_columns):
46
+ return osc_utils.get_dict_properties(attrs, columns)
47
+
48
+
49
+ class TestCreateTapFlow(network_fakes.TestNetworkV2):
50
+ columns = (
51
+ 'description',
52
+ 'direction',
53
+ 'id',
54
+ 'name',
55
+ 'project_id',
56
+ 'source_port',
57
+ 'status',
58
+ 'tap_service_id',
59
+ )
60
+
61
+ def setUp(self):
62
+ super().setUp()
63
+ self.cmd = osc_tap_flow.CreateTapFlow(self.app, None)
64
+
65
+ def test_create_tap_flow(self):
66
+ """Test Create Tap Flow."""
67
+ fake_tap_service = sdk_fakes.generate_fake_resource(
68
+ _tap_service.TapService
69
+ )
70
+ port_id = str(uuid.uuid4())
71
+ fake_port = network_fakes.create_one_port(attrs={'id': port_id})
72
+ fake_tap_flow = sdk_fakes.generate_fake_resource(
73
+ _tap_flow.TapFlow,
74
+ **{
75
+ 'source_port': port_id,
76
+ 'tap_service_id': fake_tap_service['id'],
77
+ 'direction': 'BOTH',
78
+ },
79
+ )
80
+ self.app.client_manager.network.create_tap_flow.return_value = (
81
+ fake_tap_flow
82
+ )
83
+ self.app.client_manager.network.find_port.return_value = fake_port
84
+ self.app.client_manager.network.find_tap_service.return_value = (
85
+ fake_tap_service
86
+ )
87
+ arg_list = [
88
+ '--name',
89
+ fake_tap_flow['name'],
90
+ '--port',
91
+ fake_tap_flow['source_port'],
92
+ '--tap-service',
93
+ fake_tap_flow['tap_service_id'],
94
+ '--direction',
95
+ fake_tap_flow['direction'],
96
+ ]
97
+
98
+ verify_list = [
99
+ ('name', fake_tap_flow['name']),
100
+ ('port', fake_tap_flow['source_port']),
101
+ ('tap_service', fake_tap_flow['tap_service_id']),
102
+ ]
103
+
104
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
105
+ columns, data = self.cmd.take_action(parsed_args)
106
+ mock_create_t_f = self.app.client_manager.network.create_tap_flow
107
+ mock_create_t_f.assert_called_once_with(
108
+ **{
109
+ 'name': fake_tap_flow['name'],
110
+ 'source_port': fake_tap_flow['source_port'],
111
+ 'tap_service_id': fake_tap_flow['tap_service_id'],
112
+ 'direction': fake_tap_flow['direction'],
113
+ }
114
+ )
115
+ self.assertEqual(self.columns, columns)
116
+ fake_data = _get_data(
117
+ fake_tap_flow, osc_tap_service._get_columns(fake_tap_flow)[1]
118
+ )
119
+ self.assertEqual(fake_data, data)
120
+
121
+
122
+ class TestListTapFlow(network_fakes.TestNetworkV2):
123
+ def setUp(self):
124
+ super().setUp()
125
+ self.cmd = osc_tap_flow.ListTapFlow(self.app, None)
126
+
127
+ def test_list_tap_flows(self):
128
+ """Test List Tap Flow."""
129
+ fake_tap_flows = list(
130
+ sdk_fakes.generate_fake_resources(_tap_flow.TapFlow, count=2)
131
+ )
132
+ self.app.client_manager.network.tap_flows.return_value = fake_tap_flows
133
+ arg_list = []
134
+ verify_list = []
135
+
136
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
137
+
138
+ headers, data = self.cmd.take_action(parsed_args)
139
+
140
+ self.app.client_manager.network.tap_flows.assert_called_once()
141
+ self.assertEqual(headers, list(headers_long))
142
+ self.assertCountEqual(
143
+ list(data),
144
+ [
145
+ _get_data(fake_tap_flow, columns_long)
146
+ for fake_tap_flow in fake_tap_flows
147
+ ],
148
+ )
149
+
150
+
151
+ class TestDeleteTapFlow(network_fakes.TestNetworkV2):
152
+ def setUp(self):
153
+ super().setUp()
154
+ self.app.client_manager.network.find_tap_flow.side_effect = (
155
+ lambda name_or_id, ignore_missing: _tap_flow.TapFlow(id=name_or_id)
156
+ )
157
+ self.cmd = osc_tap_flow.DeleteTapFlow(self.app, None)
158
+
159
+ def test_delete_tap_flow(self):
160
+ """Test Delete tap flow."""
161
+
162
+ fake_tap_flow = sdk_fakes.generate_fake_resource(_tap_flow.TapFlow)
163
+ arg_list = [
164
+ fake_tap_flow['id'],
165
+ ]
166
+ verify_list = [
167
+ (osc_tap_flow.TAP_FLOW, [fake_tap_flow['id']]),
168
+ ]
169
+
170
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
171
+
172
+ result = self.cmd.take_action(parsed_args)
173
+
174
+ mock_delete_tap_flow = self.app.client_manager.network.delete_tap_flow
175
+ mock_delete_tap_flow.assert_called_once_with(fake_tap_flow['id'])
176
+ self.assertIsNone(result)
177
+
178
+
179
+ class TestShowTapFlow(network_fakes.TestNetworkV2):
180
+ columns = (
181
+ 'description',
182
+ 'direction',
183
+ 'id',
184
+ 'name',
185
+ 'project_id',
186
+ 'source_port',
187
+ 'status',
188
+ 'tap_service_id',
189
+ )
190
+
191
+ def setUp(self):
192
+ super().setUp()
193
+ self.app.client_manager.network.find_tap_flow.side_effect = (
194
+ lambda name_or_id, ignore_missing: _tap_flow.TapFlow(id=name_or_id)
195
+ )
196
+ self.cmd = osc_tap_flow.ShowTapFlow(self.app, None)
197
+
198
+ def test_show_tap_flow(self):
199
+ """Test Show tap flow."""
200
+ fake_tap_flow = sdk_fakes.generate_fake_resource(_tap_flow.TapFlow)
201
+ self.app.client_manager.network.get_tap_flow.return_value = (
202
+ fake_tap_flow
203
+ )
204
+ arg_list = [
205
+ fake_tap_flow['id'],
206
+ ]
207
+ verify_list = [
208
+ (osc_tap_flow.TAP_FLOW, fake_tap_flow['id']),
209
+ ]
210
+
211
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
212
+
213
+ headers, data = self.cmd.take_action(parsed_args)
214
+
215
+ self.app.client_manager.network.get_tap_flow.assert_called_once_with(
216
+ fake_tap_flow['id']
217
+ )
218
+ self.assertEqual(self.columns, headers)
219
+ fake_data = _get_data(
220
+ fake_tap_flow, osc_tap_service._get_columns(fake_tap_flow)[1]
221
+ )
222
+ self.assertEqual(fake_data, data)
223
+
224
+
225
+ class TestUpdateTapFlow(network_fakes.TestNetworkV2):
226
+ _new_name = 'new_name'
227
+
228
+ # NOTE(mtomaska): The Resource class from which TapFlow inherits from
229
+ # returns duplicate `ID and `Name` keys.
230
+ columns = (
231
+ 'Direction',
232
+ 'ID',
233
+ 'ID',
234
+ 'Name',
235
+ 'Name',
236
+ 'Status',
237
+ 'Tenant',
238
+ 'description',
239
+ 'location',
240
+ 'project_id',
241
+ 'source_port',
242
+ 'tap_service_id',
243
+ )
244
+
245
+ def setUp(self):
246
+ super().setUp()
247
+ self.cmd = osc_tap_flow.UpdateTapFlow(self.app, None)
248
+ self.app.client_manager.network.find_tap_flow.side_effect = (
249
+ lambda name_or_id, ignore_missing: _tap_flow.TapFlow(id=name_or_id)
250
+ )
251
+
252
+ def test_update_tap_flow(self):
253
+ """Test update tap service"""
254
+ fake_tap_flow = sdk_fakes.generate_fake_resource(_tap_flow.TapFlow)
255
+ new_tap_flow = copy.deepcopy(fake_tap_flow)
256
+ new_tap_flow['name'] = self._new_name
257
+
258
+ self.app.client_manager.network.update_tap_flow.return_value = (
259
+ new_tap_flow
260
+ )
261
+
262
+ arg_list = [
263
+ fake_tap_flow['id'],
264
+ '--name',
265
+ self._new_name,
266
+ ]
267
+ verify_list = [('name', self._new_name)]
268
+
269
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
270
+ columns, data = self.cmd.take_action(parsed_args)
271
+ attrs = {'name': self._new_name}
272
+
273
+ mock_update_t_f = self.app.client_manager.network.update_tap_flow
274
+ mock_update_t_f.assert_called_once_with(new_tap_flow['id'], **attrs)
275
+ self.assertEqual(self.columns, columns)
276
+ self.assertEqual(_get_data(new_tap_flow, self.columns), data)
@@ -0,0 +1,288 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
2
+ # not use this file except in compliance with the License. You may obtain
3
+ # a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ # License for the specific language governing permissions and limitations
11
+ # under the License.
12
+
13
+ import copy
14
+ import operator
15
+ import uuid
16
+
17
+ from openstack.network.v2 import tap_mirror
18
+ from openstack.test import fakes as sdk_fakes
19
+ from osc_lib import utils as osc_utils
20
+ from osc_lib.utils import columns as column_util
21
+
22
+ from openstackclient.network.v2.taas import tap_mirror as osc_tap_mirror
23
+ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
24
+
25
+
26
+ columns_long = tuple(
27
+ col
28
+ for col, _, listing_mode in osc_tap_mirror._attr_map
29
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
30
+ )
31
+ headers_long = tuple(
32
+ head
33
+ for _, head, listing_mode in osc_tap_mirror._attr_map
34
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
35
+ )
36
+ sorted_attr_map = sorted(osc_tap_mirror._attr_map, key=operator.itemgetter(1))
37
+ sorted_columns = tuple(col for col, _, _ in sorted_attr_map)
38
+ sorted_headers = tuple(head for _, head, _ in sorted_attr_map)
39
+
40
+
41
+ def _get_data(attrs, columns=sorted_columns):
42
+ return osc_utils.get_dict_properties(attrs, columns)
43
+
44
+
45
+ class TestCreateTapMirror(network_fakes.TestNetworkV2):
46
+ columns = (
47
+ 'description',
48
+ 'directions',
49
+ 'id',
50
+ 'mirror_type',
51
+ 'name',
52
+ 'port_id',
53
+ 'project_id',
54
+ 'remote_ip',
55
+ )
56
+
57
+ def setUp(self):
58
+ super().setUp()
59
+ self.cmd = osc_tap_mirror.CreateTapMirror(self.app, None)
60
+
61
+ def test_create_tap_mirror(self):
62
+ port_id = str(uuid.uuid4())
63
+ fake_port = network_fakes.create_one_port(attrs={'id': port_id})
64
+ fake_tap_mirror = sdk_fakes.generate_fake_resource(
65
+ tap_mirror.TapMirror, **{'port_id': port_id, 'directions': 'IN=99'}
66
+ )
67
+ self.app.client_manager.network.create_tap_mirror.return_value = (
68
+ fake_tap_mirror
69
+ )
70
+ self.app.client_manager.network.find_port.return_value = fake_port
71
+ self.app.client_manager.network.find_tap_mirror.side_effect = (
72
+ lambda _, name_or_id: {'id': name_or_id}
73
+ )
74
+ arg_list = [
75
+ '--name',
76
+ fake_tap_mirror['name'],
77
+ '--port',
78
+ fake_tap_mirror['port_id'],
79
+ '--directions',
80
+ fake_tap_mirror['directions'],
81
+ '--remote-ip',
82
+ fake_tap_mirror['remote_ip'],
83
+ '--mirror-type',
84
+ fake_tap_mirror['mirror_type'],
85
+ ]
86
+
87
+ verify_directions = fake_tap_mirror['directions'].split('=')
88
+ verify_directions_dict = {verify_directions[0]: verify_directions[1]}
89
+
90
+ verify_list = [
91
+ ('name', fake_tap_mirror['name']),
92
+ ('port_id', fake_tap_mirror['port_id']),
93
+ ('directions', verify_directions_dict),
94
+ ('remote_ip', fake_tap_mirror['remote_ip']),
95
+ ('mirror_type', fake_tap_mirror['mirror_type']),
96
+ ]
97
+
98
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
99
+ self.app.client_manager.network.find_tap_mirror.return_value = (
100
+ fake_tap_mirror
101
+ )
102
+
103
+ columns, data = self.cmd.take_action(parsed_args)
104
+ create_tap_m_mock = self.app.client_manager.network.create_tap_mirror
105
+ create_tap_m_mock.assert_called_once_with(
106
+ **{
107
+ 'name': fake_tap_mirror['name'],
108
+ 'port_id': fake_tap_mirror['port_id'],
109
+ 'directions': verify_directions_dict,
110
+ 'remote_ip': fake_tap_mirror['remote_ip'],
111
+ 'mirror_type': fake_tap_mirror['mirror_type'],
112
+ }
113
+ )
114
+ self.assertEqual(self.columns, columns)
115
+ fake_data = _get_data(
116
+ fake_tap_mirror, osc_tap_mirror._get_columns(fake_tap_mirror)[1]
117
+ )
118
+ self.assertEqual(fake_data, data)
119
+
120
+
121
+ class TestListTapMirror(network_fakes.TestNetworkV2):
122
+ def setUp(self):
123
+ super().setUp()
124
+ self.cmd = osc_tap_mirror.ListTapMirror(self.app, None)
125
+
126
+ def test_list_tap_mirror(self):
127
+ """Test List Tap Mirror."""
128
+ fake_tap_mirrors = list(
129
+ sdk_fakes.generate_fake_resources(tap_mirror.TapMirror, count=4)
130
+ )
131
+ self.app.client_manager.network.tap_mirrors.return_value = (
132
+ fake_tap_mirrors
133
+ )
134
+
135
+ arg_list = []
136
+ verify_list = []
137
+
138
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
139
+
140
+ headers, data = self.cmd.take_action(parsed_args)
141
+
142
+ self.app.client_manager.network.tap_mirrors.assert_called_once()
143
+ self.assertEqual(headers, list(headers_long))
144
+ self.assertCountEqual(
145
+ list(data),
146
+ [
147
+ _get_data(fake_tap_mirror, columns_long)
148
+ for fake_tap_mirror in fake_tap_mirrors
149
+ ],
150
+ )
151
+
152
+
153
+ class TestDeleteTapMirror(network_fakes.TestNetworkV2):
154
+ def setUp(self):
155
+ super().setUp()
156
+ self.app.client_manager.network.find_tap_mirror.side_effect = (
157
+ lambda name_or_id, ignore_missing: tap_mirror.TapMirror(
158
+ id=name_or_id
159
+ )
160
+ )
161
+ self.cmd = osc_tap_mirror.DeleteTapMirror(self.app, None)
162
+
163
+ def test_delete_tap_mirror(self):
164
+ """Test Delete Tap Mirror."""
165
+
166
+ fake_tap_mirror = sdk_fakes.generate_fake_resource(
167
+ tap_mirror.TapMirror
168
+ )
169
+
170
+ arg_list = [
171
+ fake_tap_mirror['id'],
172
+ ]
173
+ verify_list = [
174
+ (osc_tap_mirror.TAP_MIRROR, [fake_tap_mirror['id']]),
175
+ ]
176
+
177
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
178
+ result = self.cmd.take_action(parsed_args)
179
+
180
+ mock_delete_tap_m = self.app.client_manager.network.delete_tap_mirror
181
+ mock_delete_tap_m.assert_called_once_with(fake_tap_mirror['id'])
182
+ self.assertIsNone(result)
183
+
184
+
185
+ class TestShowTapMirror(network_fakes.TestNetworkV2):
186
+ columns = (
187
+ 'description',
188
+ 'directions',
189
+ 'id',
190
+ 'mirror_type',
191
+ 'name',
192
+ 'port_id',
193
+ 'project_id',
194
+ 'remote_ip',
195
+ )
196
+
197
+ def setUp(self):
198
+ super().setUp()
199
+ self.app.client_manager.network.find_tap_mirror.side_effect = (
200
+ lambda name_or_id, ignore_missing: tap_mirror.TapMirror(
201
+ id=name_or_id
202
+ )
203
+ )
204
+ self.cmd = osc_tap_mirror.ShowTapMirror(self.app, None)
205
+
206
+ def test_show_tap_mirror(self):
207
+ """Test Show Tap Mirror."""
208
+
209
+ fake_tap_mirror = sdk_fakes.generate_fake_resource(
210
+ tap_mirror.TapMirror
211
+ )
212
+ self.app.client_manager.network.get_tap_mirror.return_value = (
213
+ fake_tap_mirror
214
+ )
215
+ arg_list = [
216
+ fake_tap_mirror['id'],
217
+ ]
218
+ verify_list = [
219
+ (osc_tap_mirror.TAP_MIRROR, fake_tap_mirror['id']),
220
+ ]
221
+
222
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
223
+
224
+ headers, data = self.cmd.take_action(parsed_args)
225
+
226
+ mock_get_tap_m = self.app.client_manager.network.get_tap_mirror
227
+ mock_get_tap_m.assert_called_once_with(fake_tap_mirror['id'])
228
+ self.assertEqual(self.columns, headers)
229
+ fake_data = _get_data(
230
+ fake_tap_mirror, osc_tap_mirror._get_columns(fake_tap_mirror)[1]
231
+ )
232
+ self.assertEqual(fake_data, data)
233
+
234
+
235
+ class TestUpdateTapMirror(network_fakes.TestNetworkV2):
236
+ _new_name = 'new_name'
237
+ columns = (
238
+ 'description',
239
+ 'directions',
240
+ 'id',
241
+ 'mirror_type',
242
+ 'name',
243
+ 'port_id',
244
+ 'project_id',
245
+ 'remote_ip',
246
+ )
247
+
248
+ def setUp(self):
249
+ super().setUp()
250
+ self.cmd = osc_tap_mirror.UpdateTapMirror(self.app, None)
251
+ self.app.client_manager.network.find_tap_mirror.side_effect = (
252
+ lambda name_or_id, ignore_missing: tap_mirror.TapMirror(
253
+ id=name_or_id
254
+ )
255
+ )
256
+
257
+ def test_update_tap_mirror(self):
258
+ """Test update Tap Mirror"""
259
+ fake_tap_mirror = sdk_fakes.generate_fake_resource(
260
+ tap_mirror.TapMirror
261
+ )
262
+ new_tap_mirror = copy.deepcopy(fake_tap_mirror)
263
+ new_tap_mirror['name'] = self._new_name
264
+
265
+ self.app.client_manager.network.update_tap_mirror.return_value = (
266
+ new_tap_mirror
267
+ )
268
+
269
+ arg_list = [
270
+ fake_tap_mirror['id'],
271
+ '--name',
272
+ self._new_name,
273
+ ]
274
+ verify_list = [('name', self._new_name)]
275
+
276
+ parsed_args = self.check_parser(self.cmd, arg_list, verify_list)
277
+ columns, data = self.cmd.take_action(parsed_args)
278
+ attrs = {'name': self._new_name}
279
+
280
+ mock_update_tap_m = self.app.client_manager.network.update_tap_mirror
281
+ mock_update_tap_m.assert_called_once_with(
282
+ fake_tap_mirror['id'], **attrs
283
+ )
284
+ self.assertEqual(self.columns, columns)
285
+ fake_data = _get_data(
286
+ new_tap_mirror, osc_tap_mirror._get_columns(new_tap_mirror)[1]
287
+ )
288
+ self.assertEqual(fake_data, data)