os-vif 3.6.0__py3-none-any.whl → 3.7.1__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.
@@ -1,12 +1,10 @@
1
- Metadata-Version: 2.1
2
- Name: os-vif
3
- Version: 3.6.0
1
+ Metadata-Version: 2.4
2
+ Name: os_vif
3
+ Version: 3.7.1
4
4
  Summary: A library for plugging and unplugging virtual interfaces in OpenStack.
5
5
  Home-page: https://docs.openstack.org/os-vif/latest/
6
6
  Author: OpenStack
7
7
  Author-email: openstack-discuss@lists.openstack.org
8
- License: UNKNOWN
9
- Platform: UNKNOWN
10
8
  Classifier: Environment :: OpenStack
11
9
  Classifier: Intended Audience :: Information Technology
12
10
  Classifier: Intended Audience :: System Administrators
@@ -21,19 +19,31 @@ Classifier: Programming Language :: Python :: 3.10
21
19
  Classifier: Programming Language :: Python :: 3.11
22
20
  Classifier: Programming Language :: Python :: Implementation :: CPython
23
21
  Requires-Python: >=3.8
24
- Requires-Dist: debtcollector (>=1.19.0)
25
- Requires-Dist: oslo.concurrency (>=3.20.0)
26
- Requires-Dist: oslo.config (>=5.1.0)
27
- Requires-Dist: oslo.i18n (>=3.15.3)
28
- Requires-Dist: oslo.log (>=3.30.0)
29
- Requires-Dist: oslo.privsep (>=1.23.0)
30
- Requires-Dist: oslo.serialization (!=2.19.1,>=2.18.0)
31
- Requires-Dist: oslo.utils (>=2.0.0)
32
- Requires-Dist: oslo.versionedobjects (>=1.28.0)
33
- Requires-Dist: ovsdbapp (>=0.12.1)
34
- Requires-Dist: pbr (!=2.1.0,>=2.0.0)
35
- Requires-Dist: stevedore (>=1.20.0)
36
- Requires-Dist: pyroute2 (>=0.5.2) ; (sys_platform!='win32')
22
+ License-File: LICENSE
23
+ License-File: AUTHORS
24
+ Requires-Dist: pbr>=3.0.0
25
+ Requires-Dist: oslo.concurrency>=3.20.0
26
+ Requires-Dist: oslo.config>=5.1.0
27
+ Requires-Dist: oslo.log>=3.30.0
28
+ Requires-Dist: oslo.i18n>=3.15.3
29
+ Requires-Dist: oslo.privsep>=1.23.0
30
+ Requires-Dist: oslo.serialization>=2.20.0
31
+ Requires-Dist: oslo.utils>=2.0.0
32
+ Requires-Dist: oslo.versionedobjects>=1.28.0
33
+ Requires-Dist: ovsdbapp>=0.12.1
34
+ Requires-Dist: stevedore>=1.20.0
35
+ Requires-Dist: debtcollector>=1.19.0
36
+ Requires-Dist: pyroute2>=0.5.2; sys_platform != "win32"
37
+ Dynamic: author
38
+ Dynamic: author-email
39
+ Dynamic: classifier
40
+ Dynamic: description
41
+ Dynamic: home-page
42
+ Dynamic: license-file
43
+ Dynamic: provides-extra
44
+ Dynamic: requires-dist
45
+ Dynamic: requires-python
46
+ Dynamic: summary
37
47
 
38
48
  ========================
39
49
  Team and repository tags
@@ -64,5 +74,3 @@ A library for plugging and unplugging virtual interfaces in OpenStack.
64
74
  * Bugs: https://bugs.launchpad.net/os-vif
65
75
  * Release Notes: https://docs.openstack.org/releasenotes/os-vif
66
76
 
67
-
68
-
@@ -46,6 +46,8 @@ os_vif/tests/unit/internal/ip/linux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
46
46
  os_vif/tests/unit/internal/ip/linux/test_impl_pyroute2.py,sha256=MbsDkFkVSmx3mqteP7GW3ruy6ehvBCiQorkdWJjE5Qk,7364
47
47
  os_vif/tests/unit/internal/ip/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
48
  os_vif/tests/unit/internal/ip/windows/test_impl_netifaces.py,sha256=fs1DI706OXTWGr4C8_UtbBEvxwImv3klrxmuktUYol8,1992
49
+ os_vif-3.7.1.dist-info/licenses/AUTHORS,sha256=iB34YU9dzlY73v6RpPbu5FylPpid9dwICx0Ec_5en9U,3287
50
+ os_vif-3.7.1.dist-info/licenses/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
49
51
  vif_plug_linux_bridge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
52
  vif_plug_linux_bridge/constants.py,sha256=NC8n4uOMFCYrhq0sM1ZeGBKo-Gs4OMR60cYP47wMRCk,602
51
53
  vif_plug_linux_bridge/iptables.py,sha256=q4LmAMMzg-r9IgDNTu3jCLjNDM8b0JbGo-qmiA2B-JE,20641
@@ -65,29 +67,27 @@ vif_plug_ovs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
67
  vif_plug_ovs/constants.py,sha256=P1ngaAA2MioPrSr58JtiDA8rxkl3thttgOvabEyZGIM,944
66
68
  vif_plug_ovs/exception.py,sha256=ZiECZVvjCFTVXhuii3uhJn4lZvozKRxziedZB3R9JNo,1328
67
69
  vif_plug_ovs/linux_net.py,sha256=nr2dNOECVZtiHSIQHFb5iRVyh7cfLPiIm4VEg3frgDE,14289
68
- vif_plug_ovs/ovs.py,sha256=hAkt-8CbpYuGcfUjb3NKjm41J5MniAQupVl6IsB5p7Q,24166
70
+ vif_plug_ovs/ovs.py,sha256=85uBn0t3WieE2u9ccwFWJjpZOSiPPp73E0sRBQBvv8E,24317
69
71
  vif_plug_ovs/privsep.py,sha256=nPQUkYgjbSjaHMuu40fZArRnf8RBiR73l4YpDF1K1yQ,1100
70
72
  vif_plug_ovs/ovsdb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
73
  vif_plug_ovs/ovsdb/api.py,sha256=_jHR8xokDAPI8sw3IEWuT3hObJuskqVzeVMDaWRbIq0,1293
72
74
  vif_plug_ovs/ovsdb/impl_idl.py,sha256=DR1aHN8riBpZyNePwpvT9PRYbf9vLk4lRJ9VHRVq_to,3028
73
75
  vif_plug_ovs/ovsdb/impl_vsctl.py,sha256=MSf8JMrMqrwt5vH8KTsThjdnsttJEYJikIcJ12CTz8c,14437
74
- vif_plug_ovs/ovsdb/ovsdb_lib.py,sha256=UfVJG8PtIp2ps51JXp3El9rUgtfR12Mp5dna6_i-20M,10599
76
+ vif_plug_ovs/ovsdb/ovsdb_lib.py,sha256=buXkRZaAUOsXDqic748ealJ_SfTYjw9teQaZqyMIBkI,11722
75
77
  vif_plug_ovs/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
78
  vif_plug_ovs/tests/functional/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
79
  vif_plug_ovs/tests/functional/base.py,sha256=9EDYKUqsoqVgrYmljb6fZvGmIruL2zNJdIHlEZ9kzu8,1872
78
- vif_plug_ovs/tests/functional/test_plugin.py,sha256=40gbf5bvxgauHf3U3oT9xeIOcZ3r8-fFRyHOrhWbZVo,6648
80
+ vif_plug_ovs/tests/functional/test_plugin.py,sha256=1zVCielOSCKjn6NMMYfxEp1t-nmTUHGciPZeJghZd8c,10447
79
81
  vif_plug_ovs/tests/functional/ovsdb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
82
  vif_plug_ovs/tests/functional/ovsdb/test_ovsdb_lib.py,sha256=oB06rO9KgezJ5fe4kxsKANkC6b7sqKkzSyO2_M-Q8gw,13513
81
83
  vif_plug_ovs/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
84
  vif_plug_ovs/tests/unit/test_linux_net.py,sha256=B3buNpn9EKZQPio5rNrIma_E5MUL9vBspdg5EqZ3RHk,17532
83
- vif_plug_ovs/tests/unit/test_plugin.py,sha256=-RmB-IGzaFaFmg-sNLupFd0sHwdRQ6IoGpgWFNdmv8k,33303
85
+ vif_plug_ovs/tests/unit/test_plugin.py,sha256=lOiFMyqekVbluqGqhmjYSHCxterahuoZdBpyXXk5LbM,33399
84
86
  vif_plug_ovs/tests/unit/ovsdb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- vif_plug_ovs/tests/unit/ovsdb/test_ovsdb_lib.py,sha256=rNPmkH_xkGCrRDeUV_xQEAJ6A7sOH-sEGXvPYju1zwk,10705
86
- os_vif-3.6.0.dist-info/AUTHORS,sha256=kZdfNnkbapBsRD4W-nOGD5iPcwn83A2tZvVbRJxItcA,3215
87
- os_vif-3.6.0.dist-info/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
88
- os_vif-3.6.0.dist-info/METADATA,sha256=MOdEAtvggkUGcZo32mn7UHrDYi0DA8XMLPuZGHJKP8U,2373
89
- os_vif-3.6.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
90
- os_vif-3.6.0.dist-info/entry_points.txt,sha256=UhIaj_WPv49yG316SjjDuMlSqGvym-_TVYEn5JKlEaQ,207
91
- os_vif-3.6.0.dist-info/pbr.json,sha256=TVSvqWNQsJPvKIABFcZfEquQmNtHSbUpbb3JmAZ21LM,46
92
- os_vif-3.6.0.dist-info/top_level.txt,sha256=ULBxtkTk3bkfzCSYJjifWehfjJdMODVzC6SX5l_CNKo,56
93
- os_vif-3.6.0.dist-info/RECORD,,
87
+ vif_plug_ovs/tests/unit/ovsdb/test_ovsdb_lib.py,sha256=n62yhno9fqBq9Ei5syWvItPVtV9jNR0UC-zpsq4zikc,11122
88
+ os_vif-3.7.1.dist-info/METADATA,sha256=u3pFp8PD2mlO7Vauoq31f2Kg9sOaj2PrzgYIxNchXxs,2532
89
+ os_vif-3.7.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
90
+ os_vif-3.7.1.dist-info/entry_points.txt,sha256=BU9WplZnF_bjwT4SQP5n1mKu2f0R5xXBOznXP1GygHM,206
91
+ os_vif-3.7.1.dist-info/pbr.json,sha256=5ZzZvG2ZD7Z-ZPsharg9Qbcjqn66ehiCDFYmPejQI6A,46
92
+ os_vif-3.7.1.dist-info/top_level.txt,sha256=ULBxtkTk3bkfzCSYJjifWehfjJdMODVzC6SX5l_CNKo,56
93
+ os_vif-3.7.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.34.2)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -5,4 +5,3 @@ ovs = vif_plug_ovs.ovs:OvsPlugin
5
5
 
6
6
  [oslo.config.opts]
7
7
  os_vif = os_vif.opts:list_plugins_opts
8
-
@@ -2,6 +2,7 @@ Adrian Chiris <adrianc@mellanox.com>
2
2
  Alin Balutoiu <abalutoiu@cloudbasesolutions.com>
3
3
  Andreas Jaeger <aj@suse.com>
4
4
  Balazs Gibizer <gibi@redhat.com>
5
+ Bence Romsics <bence.romsics@gmail.com>
5
6
  Brian Haley <brian.haley@hpe.com>
6
7
  Cao Xuan Hoang <hoangcx@vn.fujitsu.com>
7
8
  Carlos Goncalves <cgoncalves@redhat.com>
@@ -67,6 +68,7 @@ YAMAMOTO Takashi <yamamoto@midokura.com>
67
68
  ZhijunWei <wzj334965317@outlook.com>
68
69
  blue55 <yllan@fiberhome.com>
69
70
  caoyuan <cao.yuan@99cloud.net>
71
+ elajkat <lajos.katona@est.tech>
70
72
  ericxiett <eric_xiett@163.com>
71
73
  gecong1973 <ge.cong@zte.com.cn>
72
74
  jacky06 <zhang.min@99cloud.net>
@@ -0,0 +1 @@
1
+ {"git_version": "a19f532", "is_release": true}
vif_plug_ovs/ovs.py CHANGED
@@ -37,6 +37,10 @@ from vif_plug_ovs.ovsdb import ovsdb_lib
37
37
  LOG = logging.getLogger(__name__)
38
38
 
39
39
 
40
+ def is_trunk_bridge(bridge_name):
41
+ return bridge_name.startswith(constants.TRUNK_BR_PREFIX)
42
+
43
+
40
44
  class OvsPlugin(plugin.PluginBase):
41
45
  """An OVS plugin that can setup VIFs in many ways
42
46
 
@@ -208,8 +212,12 @@ class OvsPlugin(plugin.PluginBase):
208
212
  # bound the interface in the vif binding details so isolation
209
213
  # can be enabled automatically in the future.
210
214
  bridge = kwargs.pop('bridge', vif.network.bridge)
211
- if self._isolate_vif(vif_name, bridge):
215
+ # See bug #2069543.
216
+ if (self._isolate_vif(vif_name, bridge) and
217
+ not is_trunk_bridge(bridge)):
212
218
  kwargs['tag'] = constants.DEAD_VLAN
219
+ kwargs['vlan_mode'] = 'trunk'
220
+ kwargs['trunks'] = constants.DEAD_VLAN
213
221
  qos_type = self._get_qos_type(vif)
214
222
  if qos_type is not None:
215
223
  # NOTE(sean-k-mooney): If the port is not already created
@@ -406,11 +414,8 @@ class OvsPlugin(plugin.PluginBase):
406
414
  vif=vif,
407
415
  err="This vif type is not supported by this plugin")
408
416
 
409
- def _is_trunk_bridge(self, bridge_name):
410
- return bridge_name.startswith(constants.TRUNK_BR_PREFIX)
411
-
412
417
  def _delete_bridge_if_trunk(self, vif):
413
- if self._is_trunk_bridge(vif.network.bridge):
418
+ if is_trunk_bridge(vif.network.bridge):
414
419
  self.ovsdb.delete_ovs_bridge(vif.network.bridge)
415
420
 
416
421
  def _unplug_vhostuser(self, vif, instance_info):
@@ -17,6 +17,7 @@ from oslo_log import log as logging
17
17
 
18
18
  from vif_plug_ovs import constants
19
19
  from vif_plug_ovs import linux_net
20
+ from vif_plug_ovs import ovs
20
21
  from vif_plug_ovs.ovsdb import api as ovsdb_api
21
22
 
22
23
 
@@ -145,7 +146,7 @@ class BaseOVS(object):
145
146
  self, bridge, dev, iface_id, mac, instance_id,
146
147
  mtu=None, interface_type=None, vhost_server_path=None,
147
148
  tag=None, pf_pci=None, vf_num=None, set_ids=True, datapath_type=None,
148
- qos_type=None
149
+ qos_type=None, vlan_mode=None, trunks=None
149
150
  ):
150
151
  """Create OVS port
151
152
 
@@ -173,6 +174,21 @@ class BaseOVS(object):
173
174
  'iface-status': 'active',
174
175
  'attached-mac': mac,
175
176
  'vm-uuid': instance_id}
177
+
178
+ # Note(lajoskatona): Neutron fills external_ids for trunk, see:
179
+ # https://opendev.org/openstack/neutron/src/commit/
180
+ # 1bc4b526e9c743423069ab4cf6ef3883d5e48217/neutron/services/trunk/
181
+ # drivers/openvswitch/agent/ovsdb_handler.py#L418
182
+ # The following keys are added there: bridge_name, trunk_id and
183
+ # subport_ids. These values are used during the cleanup after the
184
+ # deletion of the trunk. It can happen that Neutron can't fill these
185
+ # fields.
186
+ # In os-vif when the plug happens we can use the same transaction to
187
+ # add bridge_name to external_ids in case of it is a trunk.
188
+ # By this Neutron can do the cleanup of trunk related interfaces.
189
+ if ovs.is_trunk_bridge(bridge):
190
+ external_ids['bridge_name'] = bridge
191
+
176
192
  col_values = [('external_ids', external_ids)] if set_ids else []
177
193
  if interface_type:
178
194
  col_values.append(('type', interface_type))
@@ -210,6 +226,11 @@ class BaseOVS(object):
210
226
  txn.add(self.ovsdb.add_port(bridge, dev))
211
227
  if tag:
212
228
  txn.add(self.ovsdb.db_set('Port', dev, ('tag', tag)))
229
+ if vlan_mode:
230
+ txn.add(self.ovsdb.db_set('Port', dev,
231
+ ('vlan_mode', vlan_mode)))
232
+ if trunks:
233
+ txn.add(self.ovsdb.db_set('Port', dev, ('trunks', trunks)))
213
234
  if qid:
214
235
  txn.add(self.ovsdb.db_set('Port', dev, ('qos', qid)))
215
236
  if col_values:
@@ -12,6 +12,8 @@
12
12
 
13
13
  import testscenarios
14
14
  import time
15
+ from unittest import mock
16
+ import uuid
15
17
 
16
18
  from oslo_concurrency import processutils
17
19
  from oslo_config import cfg
@@ -183,3 +185,98 @@ class TestOVSPlugin(testscenarios.WithScenarios,
183
185
  self._check_parameter(
184
186
  'QoS', str(qos_uuid), 'type', None
185
187
  )
188
+
189
+ def test_plug_br_int_isolate_vif_dead_vlan(self):
190
+ with mock.patch.object(self.plugin.config, 'isolate_vif', True):
191
+ network = objects.network.Network(
192
+ id='5449523c-3a08-11ef-86d6-17149687aa4d',
193
+ bridge='br-5449523c',
194
+ subnets=self.subnets,
195
+ vlan=99)
196
+ vif = objects.vif.VIFOpenVSwitch(
197
+ id='85cb9bc6-3a08-11ef-b2d4-9b7c38edd677',
198
+ address='ca:fe:de:ad:be:ef',
199
+ network=network,
200
+ port_profile=self.profile_ovs_system,
201
+ vif_name="port-85cb9bc6")
202
+ self.plugin.plug(vif, self.instance)
203
+ self.addCleanup(self._del_bridge, 'br-5449523c')
204
+ self._check_parameter('Port', vif.vif_name, 'tag', 4095)
205
+
206
+ def test_plug_trunk_bridge_ignores_isolate_vif(self):
207
+ with mock.patch.object(self.plugin.config, 'isolate_vif', True):
208
+ network = objects.network.Network(
209
+ id='ef98b384-3a0f-11ef-9009-47345fca266f',
210
+ bridge='tbr-ef98b384',
211
+ subnets=self.subnets,
212
+ vlan=99)
213
+ vif = objects.vif.VIFOpenVSwitch(
214
+ id='631f52bc-3a07-11ef-a006-1319ef9d6edd',
215
+ address='ca:fe:de:ad:be:ef',
216
+ network=network,
217
+ port_profile=self.profile_ovs_system,
218
+ vif_name='port-631f52bc')
219
+ self.plugin.plug(vif, self.instance)
220
+ self.addCleanup(self._del_bridge, 'tbr-ef98b384')
221
+ self._check_parameter('Port', vif.vif_name, 'tag', [])
222
+
223
+ def test_plug_trunk_bridge_fills_bridge_name(self):
224
+ mac = 'ca:fe:de:ad:be:ef'
225
+ iface_id = str(uuid.uuid4())
226
+ vif_name = 'port-%s' % iface_id[:8]
227
+ trunk_id = str(uuid.uuid4())
228
+ bridge_name = 'tbr-%s' % trunk_id[:8]
229
+
230
+ network = objects.network.Network(
231
+ id=trunk_id,
232
+ bridge=bridge_name,
233
+ subnets=self.subnets,
234
+ vlan=99)
235
+ vif = objects.vif.VIFOpenVSwitch(
236
+ id=iface_id,
237
+ address=mac,
238
+ network=network,
239
+ port_profile=self.profile_ovs_system,
240
+ vif_name=vif_name)
241
+ self.plugin.plug(vif, self.instance)
242
+ self.addCleanup(self._del_bridge, bridge_name)
243
+ expected_external_ids = {
244
+ 'attached-mac': mac,
245
+ 'bridge_name': bridge_name,
246
+ 'iface-id': self.profile_ovs.interface_id,
247
+ 'iface-status': 'active',
248
+ 'vm-uuid': self.instance.uuid,
249
+ }
250
+
251
+ self._check_parameter('Interface', vif.vif_name,
252
+ 'external_ids', expected_external_ids)
253
+
254
+ def test_plug_non_trunk_leave_bridge_name_empty(self):
255
+ mac = 'ca:fe:de:ad:be:ef'
256
+ iface_id = str(uuid.uuid4())
257
+ vif_name = 'port-%s' % iface_id[:8]
258
+ bridge_name = 'br-something'
259
+
260
+ network = objects.network.Network(
261
+ id=str(uuid.uuid4()),
262
+ bridge=bridge_name,
263
+ subnets=self.subnets,
264
+ vlan=99)
265
+ vif = objects.vif.VIFOpenVSwitch(
266
+ id=iface_id,
267
+ address=mac,
268
+ network=network,
269
+ port_profile=self.profile_ovs_system,
270
+ vif_name=vif_name)
271
+ self.plugin.plug(vif, self.instance)
272
+ self.addCleanup(self._del_bridge, bridge_name)
273
+ # bridge_name is filled only in case of trunk plug
274
+ expected_external_ids = {
275
+ 'attached-mac': mac,
276
+ 'iface-id': self.profile_ovs.interface_id,
277
+ 'iface-status': 'active',
278
+ 'vm-uuid': self.instance.uuid,
279
+ }
280
+
281
+ self._check_parameter('Interface', vif.vif_name,
282
+ 'external_ids', expected_external_ids)
@@ -99,19 +99,22 @@ class BaseOVSTest(testtools.TestCase):
99
99
  )
100
100
  mock_set_mtu_request.assert_not_called()
101
101
 
102
- def test_create_ovs_vif_port(self):
102
+ def _test_create_ovs_vif_port(self, bridge_name='bridge',
103
+ check_br_name=False):
103
104
  iface_id = 'iface_id'
104
105
  mac = 'ca:fe:ca:fe:ca:fe'
105
106
  instance_id = uuidutils.generate_uuid()
106
107
  interface_type = constants.OVS_VHOSTUSER_INTERFACE_TYPE
107
108
  vhost_server_path = '/fake/path'
108
109
  device = 'device'
109
- bridge = 'bridge'
110
+ bridge = bridge_name
110
111
  mtu = 1500
111
112
  external_ids = {'iface-id': iface_id,
112
113
  'iface-status': 'active',
113
114
  'attached-mac': mac,
114
115
  'vm-uuid': instance_id}
116
+ if check_br_name:
117
+ external_ids['bridge_name'] = bridge_name
115
118
  values = [('external_ids', external_ids),
116
119
  ('type', interface_type),
117
120
  ('options', {'vhost-server-path': vhost_server_path})
@@ -138,6 +141,13 @@ class BaseOVSTest(testtools.TestCase):
138
141
  ]
139
142
  )
140
143
 
144
+ def test_create_ovs_vif_port(self):
145
+ self._test_create_ovs_vif_port()
146
+
147
+ def test_create_ovs_vif_port_for_trunk(self):
148
+ self._test_create_ovs_vif_port(bridge_name='tbr-12345',
149
+ check_br_name=True)
150
+
141
151
  def test_create_ovs_vif_port_type_dpdk(self):
142
152
  iface_id = 'iface_id'
143
153
  mac = 'ca:fe:ca:fe:ca:fe'
@@ -219,7 +219,10 @@ class PluginTest(testtools.TestCase):
219
219
  self.vif_ovs.address, self.instance.uuid,
220
220
  mtu=plugin.config.network_device_mtu,
221
221
  interface_type=constants.OVS_VHOSTUSER_INTERFACE_TYPE,
222
- tag=constants.DEAD_VLAN)
222
+ tag=constants.DEAD_VLAN,
223
+ vlan_mode='trunk',
224
+ trunks=constants.DEAD_VLAN
225
+ )
223
226
 
224
227
  @mock.patch.object(ovsdb_lib.BaseOVS, 'create_ovs_vif_port')
225
228
  @mock.patch.object(ovsdb_lib.BaseOVS, 'port_exists')
@@ -1 +0,0 @@
1
- {"git_version": "c65922f", "is_release": true}