Merge "Sample templates for linux_bond, ovs_bond, dpdkbond using VFs"
This commit is contained in:
commit
2ed98a57bc
|
@ -5,7 +5,14 @@
|
|||
"name": "p2p1",
|
||||
"numvfs": 10,
|
||||
"use_dhcp": false,
|
||||
"promisc": on
|
||||
"promisc": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_pf",
|
||||
"name": "p2p2",
|
||||
"numvfs": 10,
|
||||
"use_dhcp": false,
|
||||
"promisc": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
|
@ -21,7 +28,7 @@
|
|||
"spoofcheck": true,
|
||||
"macaddr": "00:78:90:80:cc:30",
|
||||
"trust": true,
|
||||
"state": auto,
|
||||
"state": "auto",
|
||||
"promisc": false
|
||||
},
|
||||
{
|
||||
|
@ -35,11 +42,75 @@
|
|||
"device": "p2p1",
|
||||
"promisc": true,
|
||||
"vlan_id": 116,
|
||||
"qos": 2,
|
||||
"qos": 3,
|
||||
"spoofcheck": false
|
||||
}
|
||||
],
|
||||
"use_dhcp": true
|
||||
},
|
||||
{
|
||||
"type": "ovs_bridge",
|
||||
"name": "br-bond",
|
||||
"use_dhcp": true,
|
||||
"members": [
|
||||
{
|
||||
"type": "ovs_bond",
|
||||
"name": "bond_vf",
|
||||
"ovs_options": "bond_mode=active-backup",
|
||||
"members": [
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p1",
|
||||
"vfid": 2,
|
||||
"vlan_id": 112,
|
||||
"qos": 4,
|
||||
"primary": true,
|
||||
"trust": true,
|
||||
"promisc": true,
|
||||
"spoofcheck": false
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p2",
|
||||
"vfid": 2,
|
||||
"vlan_id": 112,
|
||||
"qos": 4,
|
||||
"trust": true,
|
||||
"promisc": true,
|
||||
"spoofcheck": false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "linux_bond",
|
||||
"name": "bond_lnx",
|
||||
"use_dhcp": true,
|
||||
"bonding_options": "mode=active-backup",
|
||||
"members": [
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p1",
|
||||
"vfid": 3,
|
||||
"vlan_id": 113,
|
||||
"qos": 5,
|
||||
"spoofcheck": true,
|
||||
"trust": true,
|
||||
"promisc": false,
|
||||
"primary": true,
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p2",
|
||||
"vfid": 3,
|
||||
"vlan_id": 113,
|
||||
"qos": 5,
|
||||
"spoofcheck": true,
|
||||
"trust": true,
|
||||
"promisc": false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
network_config:
|
||||
# sriov_pf type shall be used to configure the PF's of NICs.
|
||||
# The numvfs configured for the PF's shall be set on the sriov_numvfs of the
|
||||
|
@ -14,9 +12,15 @@ network_config:
|
|||
# Dont set the IP address on the PF
|
||||
use_dhcp: false
|
||||
# Allow all the traffic received. It might be needed when one of its VF
|
||||
# is attached to a ovs bridge
|
||||
promisc: on
|
||||
# is attached to a ovs bridge. Default: true
|
||||
promisc: true
|
||||
|
||||
-
|
||||
type: sriov_pf
|
||||
name: p2p2
|
||||
numvfs: 10
|
||||
use_dhcp: false
|
||||
promisc: true
|
||||
# sriov_vf type shall be used to configure the VF's of NICs.
|
||||
# It requires the PF devices to be configured via sriov_pf types
|
||||
# "name" parameter is not required for VF's. It'll be derived from the VF id
|
||||
|
@ -43,12 +47,12 @@ network_config:
|
|||
# MAC spoofing is a method of altering the MAC address
|
||||
# The MAC address anti-spoofing when enabled protects from malicious MAC
|
||||
# address spoofing. It should be disabled for 802.3ad bonds.
|
||||
spoofcheck: on
|
||||
spoofcheck: true
|
||||
# Change the MAC address of the VF.
|
||||
macaddr: 00:78:90:80:cc:30
|
||||
# Enabling trust (true) for VF allows enabling multicast/promiscuous mode
|
||||
# on the VF. The default value is off.
|
||||
trust: on
|
||||
# on the VF. The default value is false.
|
||||
trust: true
|
||||
# Link state seen by the VF
|
||||
# - auto: a reflection of the PF link state (default)
|
||||
# - enable: lets the VF to communicate with other VFs on this host even
|
||||
|
@ -60,8 +64,8 @@ network_config:
|
|||
# traffic received in the physical port. Note that all traffic that has
|
||||
# destination mac that does not match any of the VFs/PF MAC addresses is
|
||||
# referred to as unmatched traffic.
|
||||
# The default value is off. Requires the enabling of trust mode
|
||||
promisc: off
|
||||
# The default value is false. Requires the enabling of trust mode
|
||||
promisc: false
|
||||
# Attach a SR-IOV VF to a ovs bridge
|
||||
- type: ovs_bridge
|
||||
name: br-vfs
|
||||
|
@ -77,9 +81,67 @@ network_config:
|
|||
vlan_id: 116
|
||||
# Optional field, but requires vlan_id
|
||||
qos: 3
|
||||
# Set trust to 'on' when attaching to ovs_bridge
|
||||
trust: on
|
||||
# Set promisc to 'on' when attaching to ovs_bridge
|
||||
promisc: on
|
||||
# Set spoofcheck to 'off' when attaching to ovs_bridge
|
||||
spoofcheck: off
|
||||
# For OVS Bridge, the default value is true (recommended)
|
||||
trust: true
|
||||
# For OVS Bridge, the default value is true (recommended)
|
||||
promisc: true
|
||||
# For OVS Bridge, the default value is false (recommended)
|
||||
spoofcheck: false
|
||||
- type: ovs_bridge
|
||||
name: br-bond
|
||||
use_dhcp: true
|
||||
members:
|
||||
-
|
||||
type: ovs_bond
|
||||
name: bond_vf
|
||||
ovs_options: "bond_mode=active-backup"
|
||||
members:
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p1
|
||||
vfid: 2
|
||||
vlan_id: 112
|
||||
qos: 4
|
||||
primary: true
|
||||
# For OVS Bond, the default value is true (recommended)
|
||||
trust: true
|
||||
# For OVS Bond, the default value is true (recommended)
|
||||
promisc: true
|
||||
# For OVS Bond, the default value is false (recommended)
|
||||
spoofcheck: false
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p2
|
||||
vfid: 2
|
||||
vlan_id: 112
|
||||
qos: 4
|
||||
trust: true
|
||||
promisc: true
|
||||
spoofcheck: false
|
||||
- type: linux_bond
|
||||
name: bond_lnx
|
||||
use_dhcp: true
|
||||
bonding_options: "mode=active-backup"
|
||||
members:
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p1
|
||||
vfid: 3
|
||||
vlan_id: 113
|
||||
qos: 5
|
||||
# For linux_bond, the default value is true
|
||||
spoofcheck: true
|
||||
# For linux_bond, the default value is true
|
||||
trust: true
|
||||
# For linux_bond, the default value is false
|
||||
promisc: false
|
||||
primary: true
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p2
|
||||
vfid: 3
|
||||
vlan_id: 113
|
||||
qos: 5
|
||||
spoofcheck: true
|
||||
trust: true
|
||||
promisc: false
|
||||
|
|
|
@ -5,7 +5,14 @@
|
|||
"name": "p2p1",
|
||||
"numvfs": 10,
|
||||
"use_dhcp": false,
|
||||
"promisc": on
|
||||
"promisc": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_pf",
|
||||
"name": "p2p2",
|
||||
"numvfs": 10,
|
||||
"use_dhcp": false,
|
||||
"promisc": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
|
@ -21,7 +28,7 @@
|
|||
"spoofcheck": true,
|
||||
"macaddr": "00:78:90:80:cc:30",
|
||||
"trust": true,
|
||||
"state": auto,
|
||||
"state": "auto",
|
||||
"promisc": false
|
||||
},
|
||||
{
|
||||
|
@ -35,7 +42,7 @@
|
|||
"members": [
|
||||
{
|
||||
"device": "p5p2",
|
||||
"qos": 2,
|
||||
"qos": 3,
|
||||
"spoofcheck": false,
|
||||
"trust": true,
|
||||
"type": "sriov_vf",
|
||||
|
@ -46,6 +53,50 @@
|
|||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
"type": "ovs_user_bridge",
|
||||
"name": "br-bond",
|
||||
"members": [
|
||||
{
|
||||
"type" : "ovs_dpdk_bond",
|
||||
"name" : "dpdkbond1",
|
||||
"ovs_options": "bond_mode=active-backup",
|
||||
"members": [
|
||||
{
|
||||
"type" : "ovs_dpdk_port",
|
||||
"name" : "dpdk2",
|
||||
"members": [
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p1",
|
||||
"vfid": 4,
|
||||
"vlan_id": 114,
|
||||
"spoofcheck": false,
|
||||
"trust": true,
|
||||
"qos": 6
|
||||
}
|
||||
],
|
||||
"primary": true
|
||||
},
|
||||
{
|
||||
"type" : "ovs_dpdk_port",
|
||||
"name" : "dpdk3",
|
||||
"members": [
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "p2p2",
|
||||
"vfid": 4,
|
||||
"vlan_id": 114,
|
||||
"spoofcheck": false,
|
||||
"trust": true,
|
||||
"qos": 6
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -14,9 +14,14 @@ network_config:
|
|||
# Dont set the IP address on the PF
|
||||
use_dhcp: false
|
||||
# Allow all the traffic received. It might be needed when one of its VF
|
||||
# is attached to a ovs bridge
|
||||
promisc: on
|
||||
|
||||
# is attached to a ovs bridge. Default: true
|
||||
promisc: true
|
||||
-
|
||||
type: sriov_pf
|
||||
name: p2p2
|
||||
numvfs: 10
|
||||
use_dhcp: false
|
||||
promisc: true
|
||||
# sriov_vf type shall be used to configure the VF's of NICs.
|
||||
# It requires the PF devices to be configured via sriov_pf types
|
||||
# "name" parameter is not required for VF's. It'll be derived from the VF id
|
||||
|
@ -43,12 +48,12 @@ network_config:
|
|||
# MAC spoofing is a method of altering the MAC address
|
||||
# The MAC address anti-spoofing when enabled protects from malicious MAC
|
||||
# address spoofing. It should be disabled for 802.3ad bonds.
|
||||
spoofcheck: on
|
||||
spoofcheck: true
|
||||
# Change the MAC address of the VF.
|
||||
macaddr: 00:78:90:80:cc:30
|
||||
# Enabling trust (true) for VF allows enabling multicast/promiscuous mode
|
||||
# on the VF. The default value is off.
|
||||
trust: on
|
||||
# on the VF. The default value is false.
|
||||
trust: true
|
||||
# Link state seen by the VF
|
||||
# - auto: a reflection of the PF link state (default)
|
||||
# - enable: lets the VF to communicate with other VFs on this host even
|
||||
|
@ -60,8 +65,8 @@ network_config:
|
|||
# traffic received in the physical port. Note that all traffic that has
|
||||
# destination mac that does not match any of the VFs/PF MAC addresses is
|
||||
# referred to as unmatched traffic.
|
||||
# The default value is off. Requires the enabling of trust mode
|
||||
promisc: off
|
||||
# The default value is false. Requires the enabling of trust mode
|
||||
promisc: false
|
||||
# Attach a SR-IOV VF to a ovs user bridge
|
||||
- type: ovs_user_bridge
|
||||
name: br-vfs
|
||||
|
@ -80,8 +85,45 @@ network_config:
|
|||
vlan_id: 116
|
||||
# Optional field, but requires vlan_id
|
||||
qos: 3
|
||||
# Set trust to 'on' when attaching to ovs_user_bridge
|
||||
trust: on
|
||||
# Set spoofcheck to 'off' when attaching to ovs_user_bridge
|
||||
spoofcheck: off
|
||||
# Set trust to true when attaching to ovs_user_bridge
|
||||
trust: true
|
||||
# Set spoofcheck to false when attaching to ovs_user_bridge
|
||||
spoofcheck: false
|
||||
# Note: Do not set promisc mode.
|
||||
-
|
||||
type: ovs_user_bridge
|
||||
name: br-bond
|
||||
members:
|
||||
-
|
||||
type: ovs_dpdk_bond
|
||||
name: dpdkbond1
|
||||
ovs_options: "bond_mode=active-backup"
|
||||
members:
|
||||
-
|
||||
type: ovs_dpdk_port
|
||||
name: dpdk2
|
||||
members:
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p1
|
||||
vfid: 4
|
||||
vlan_id: 114
|
||||
qos: 6
|
||||
# Default/Recommended : false
|
||||
spoofcheck: false
|
||||
# Default/Recommended : true
|
||||
trust: true
|
||||
primary: true
|
||||
# Note: DO NOT SET promisc mode
|
||||
-
|
||||
type: ovs_dpdk_port
|
||||
name: dpdk3
|
||||
members:
|
||||
-
|
||||
type: sriov_vf
|
||||
device: p2p2
|
||||
vfid: 4
|
||||
vlan_id: 114
|
||||
qos: 6
|
||||
spoofcheck: false
|
||||
trust: true
|
||||
|
|
|
@ -557,6 +557,10 @@ class OvsBridge(_BaseOpts):
|
|||
logger.info("Trust is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.trust = "on"
|
||||
if iface.spoofcheck is None:
|
||||
logger.info("Spoofcheck is not set for VF %s:%d, defaulting to off"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.spoofcheck = "off"
|
||||
if iface.promisc is None:
|
||||
logger.info("Promisc is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
|
@ -889,6 +893,8 @@ class LinuxBond(_BaseOpts):
|
|||
self.members = members
|
||||
self.bonding_options = bonding_options
|
||||
for member in self.members:
|
||||
if isinstance(member, SriovVF):
|
||||
LinuxBond.update_vf_config(member)
|
||||
member.linux_bond_name = name
|
||||
if member.primary:
|
||||
if self.primary_interface_name:
|
||||
|
@ -899,6 +905,26 @@ class LinuxBond(_BaseOpts):
|
|||
else:
|
||||
self.primary_interface_name = member.name
|
||||
|
||||
@staticmethod
|
||||
def update_vf_config(iface):
|
||||
if iface.trust is None:
|
||||
logger.info("Trust is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.trust = 'on'
|
||||
if iface.spoofcheck is None:
|
||||
logger.info("Spoofcheck is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.spoofcheck = 'on'
|
||||
if iface.promisc is None:
|
||||
logger.info("Promisc is not set for VF %s:%d, defaulting to off"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.promisc = 'off'
|
||||
utils.update_sriov_vf_map(iface.device, iface.vfid, iface.name,
|
||||
vlan_id=iface.vlan_id, qos=iface.qos,
|
||||
spoofcheck=iface.spoofcheck,
|
||||
trust=iface.trust, state=iface.state,
|
||||
macaddr=iface.macaddr, promisc=iface.promisc)
|
||||
|
||||
@staticmethod
|
||||
def from_json(json):
|
||||
name = _get_required_field(json, 'name', 'LinuxBond')
|
||||
|
@ -942,6 +968,8 @@ class OvsBond(_BaseOpts):
|
|||
self.ovs_options = ovs_options
|
||||
self.ovs_extra = format_ovs_extra(self, ovs_extra)
|
||||
for member in self.members:
|
||||
if isinstance(member, SriovVF):
|
||||
OvsBond.update_vf_config(member)
|
||||
if member.primary:
|
||||
if self.primary_interface_name:
|
||||
msg = 'Only one primary interface allowed per bond.'
|
||||
|
@ -955,6 +983,26 @@ class OvsBond(_BaseOpts):
|
|||
bond_members.sort(key=lambda x: x.name)
|
||||
self.primary_interface_name = bond_members[0].name
|
||||
|
||||
@staticmethod
|
||||
def update_vf_config(iface):
|
||||
if iface.trust is None:
|
||||
logger.info("Trust is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.trust = "on"
|
||||
if iface.spoofcheck is None:
|
||||
logger.info("Spoofcheck is not set for VF %s:%d, defaulting to off"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.spoofcheck = "off"
|
||||
if iface.promisc is None:
|
||||
logger.info("Promisc is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.promisc = "on"
|
||||
utils.update_sriov_vf_map(iface.device, iface.vfid, iface.name,
|
||||
vlan_id=iface.vlan_id, qos=iface.qos,
|
||||
spoofcheck=iface.spoofcheck,
|
||||
trust=iface.trust, state=iface.state,
|
||||
macaddr=iface.macaddr, promisc=iface.promisc)
|
||||
|
||||
@staticmethod
|
||||
def from_json(json):
|
||||
name = _get_required_field(json, 'name', 'OvsBond')
|
||||
|
@ -1110,6 +1158,10 @@ class OvsDpdkPort(_BaseOpts):
|
|||
logger.info("Trust is not set for VF %s:%d, defaulting to on"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.trust = "on"
|
||||
if iface.spoofcheck is None:
|
||||
logger.info("Spoofcheck is not set for VF %s:%d, defaulting to off"
|
||||
% (iface.device, iface.vfid))
|
||||
iface.spoofcheck = "off"
|
||||
if iface.promisc is not None:
|
||||
logger.warning("Promisc can't be changed for ovs_dpdk_port")
|
||||
iface.promisc = None
|
||||
|
@ -1152,7 +1204,7 @@ class OvsDpdkPort(_BaseOpts):
|
|||
OvsDpdkPort.update_vf_config(iface)
|
||||
members.append(iface)
|
||||
else:
|
||||
msg = 'OVS DPDK Port should have only interface member'
|
||||
msg = 'Unsupported OVS DPDK Port member type'
|
||||
raise InvalidConfigException(msg)
|
||||
else:
|
||||
msg = 'OVS DPDK Port should have only one member'
|
||||
|
@ -1227,10 +1279,10 @@ class SriovVF(_BaseOpts):
|
|||
@staticmethod
|
||||
def get_on_off(config):
|
||||
rval = None
|
||||
if config:
|
||||
rval = "on"
|
||||
elif config is False:
|
||||
if config is False or config == "off":
|
||||
rval = "off"
|
||||
elif config is True or config == "on":
|
||||
rval = "on"
|
||||
return rval
|
||||
|
||||
@staticmethod
|
||||
|
@ -1282,15 +1334,22 @@ class SriovPF(_BaseOpts):
|
|||
self.name = name
|
||||
self.promisc = promisc
|
||||
|
||||
@staticmethod
|
||||
def get_on_off(config):
|
||||
rval = None
|
||||
if config is False or config == "off":
|
||||
rval = "off"
|
||||
elif config is True or config == "on":
|
||||
rval = "on"
|
||||
return rval
|
||||
|
||||
@staticmethod
|
||||
def from_json(json):
|
||||
name = _get_required_field(json, 'name', 'SriovPF')
|
||||
numvfs = _get_required_field(json, 'numvfs', 'SriovPF')
|
||||
promisc = json.get('promisc', None)
|
||||
if promisc is True:
|
||||
promisc = "on"
|
||||
elif promisc is False:
|
||||
promisc = "off"
|
||||
# SR-IOV PF - promisc: on (default)
|
||||
promisc = json.get('promisc', True)
|
||||
promisc = SriovPF.get_on_off(promisc)
|
||||
opts = _BaseOpts.base_opts_from_json(json)
|
||||
return SriovPF(name, numvfs, *opts, promisc=promisc)
|
||||
|
||||
|
|
|
@ -1004,6 +1004,7 @@ definitions:
|
|||
oneOf:
|
||||
- $ref: "#/definitions/interface"
|
||||
- $ref: "#/definitions/vlan"
|
||||
- $ref: "#/definitions/sriov_vf"
|
||||
bonding_options:
|
||||
$ref: "#/definitions/bonding_options"
|
||||
# common options:
|
||||
|
|
|
@ -23,6 +23,7 @@ import os_net_config
|
|||
from os_net_config import cli
|
||||
from os_net_config import sriov_config
|
||||
from os_net_config.tests import base
|
||||
from os_net_config import utils
|
||||
import six
|
||||
|
||||
|
||||
|
@ -210,26 +211,39 @@ class TestCli(base.TestCase):
|
|||
def test_sriov_noop_output(self):
|
||||
def test_get_vf_devname(device, vfid):
|
||||
return device + '_' + str(vfid)
|
||||
|
||||
def test_interface_mac(name):
|
||||
return 'AA:BB:CC:DD:EE:FF'
|
||||
|
||||
self.stub_out('os_net_config.utils.get_vf_devname',
|
||||
test_get_vf_devname)
|
||||
self.stub_out('os_net_config.utils.interface_mac',
|
||||
test_interface_mac)
|
||||
ivs_yaml = os.path.join(SAMPLE_BASE, 'sriov_pf.yaml')
|
||||
ivs_json = os.path.join(SAMPLE_BASE, 'sriov_pf.json')
|
||||
stdout_yaml, stderr = self.run_cli('ARG0 --provider=ifcfg --noop '
|
||||
'--exit-on-validation-errors '
|
||||
'-c %s' % ivs_yaml)
|
||||
self.assertEqual('', stderr)
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
sriov_config_yaml = yaml.load(contents)
|
||||
os.remove(sriov_config._SRIOV_CONFIG_FILE)
|
||||
stdout_json, stderr = self.run_cli('ARG0 --provider=ifcfg --noop '
|
||||
'--exit-on-validation-errors '
|
||||
'-c %s' % ivs_json)
|
||||
self.assertEqual('', stderr)
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
sriov_config_json = yaml.load(contents)
|
||||
sanity_devices = ['DEVICE=p2p1',
|
||||
'DEVICE=p2p1_5',
|
||||
'DEVICE=p2p1_1',
|
||||
'DEVICE=br-vfs',
|
||||
'DEVICE=br-bond',
|
||||
'TYPE=OVSBridge']
|
||||
for dev in sanity_devices:
|
||||
self.assertIn(dev, stdout_yaml)
|
||||
self.assertEqual(stdout_yaml, stdout_json)
|
||||
self.assertItemsEqual(sriov_config_yaml, sriov_config_json)
|
||||
|
||||
def test_sriov_vf_with_dpdk_noop_output(self):
|
||||
def test_get_vf_devname(device, vfid):
|
||||
|
@ -242,10 +256,15 @@ class TestCli(base.TestCase):
|
|||
'--exit-on-validation-errors '
|
||||
'-c %s' % ivs_yaml)
|
||||
self.assertEqual('', stderr)
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
sriov_config_yaml = yaml.load(contents)
|
||||
os.remove(sriov_config._SRIOV_CONFIG_FILE)
|
||||
stdout_json, stderr = self.run_cli('ARG0 --provider=ifcfg --noop '
|
||||
'--exit-on-validation-errors '
|
||||
'-c %s' % ivs_json)
|
||||
self.assertEqual('', stderr)
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
sriov_config_json = yaml.load(contents)
|
||||
sanity_devices = ['DEVICE=p2p1',
|
||||
'DEVICE=p2p1_5',
|
||||
'DEVICE=br-vfs',
|
||||
|
@ -255,6 +274,7 @@ class TestCli(base.TestCase):
|
|||
for dev in sanity_devices:
|
||||
self.assertIn(dev, stdout_yaml)
|
||||
self.assertEqual(stdout_yaml, stdout_json)
|
||||
self.assertItemsEqual(sriov_config_yaml, sriov_config_json)
|
||||
|
||||
def test_ovs_dpdk_bond_noop_output(self):
|
||||
ivs_yaml = os.path.join(SAMPLE_BASE, 'ovs_dpdk_bond.yaml')
|
||||
|
|
|
@ -377,8 +377,7 @@ class TestBridge(base.TestCase):
|
|||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"spoofcheck": false
|
||||
"qos": 1
|
||||
}]
|
||||
}
|
||||
"""
|
||||
|
@ -405,6 +404,118 @@ class TestBridge(base.TestCase):
|
|||
vf_map = yaml.load(contents) if contents else []
|
||||
self.assertListEqual(vf_final, vf_map)
|
||||
|
||||
def test_ovs_bond_with_vf_default(self):
|
||||
data = """{
|
||||
"type": "ovs_bridge",
|
||||
"name": "br-foo",
|
||||
"use_dhcp": true,
|
||||
"members": [{
|
||||
"type": "ovs_bond",
|
||||
"name": "bond1",
|
||||
"members": [{
|
||||
"type": "sriov_vf",
|
||||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"primary": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "em2",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1
|
||||
}
|
||||
]
|
||||
}]
|
||||
}
|
||||
"""
|
||||
vf_final = [{'device_type': 'vf', 'name': 'em1_1',
|
||||
'device': {'name': 'em1', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'off', 'trust': 'on',
|
||||
'promisc': 'on'},
|
||||
{'device_type': 'vf', 'name': 'em2_1',
|
||||
'device': {'name': 'em2', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'off', 'trust': 'on',
|
||||
'promisc': 'on'}]
|
||||
|
||||
def test_get_vf_devname(device, vfid):
|
||||
return device + '_' + str(vfid)
|
||||
self.stub_out('os_net_config.utils.get_vf_devname',
|
||||
test_get_vf_devname)
|
||||
|
||||
bridge = objects.object_from_json(json.loads(data))
|
||||
self.assertEqual("br-foo", bridge.name)
|
||||
self.assertTrue(bridge.use_dhcp)
|
||||
bond = bridge.members[0]
|
||||
interface1 = bond.members[0]
|
||||
interface2 = bond.members[1]
|
||||
self.assertEqual("em1", interface1.device)
|
||||
self.assertEqual("em2", interface2.device)
|
||||
self.assertEqual("br-foo", bond.bridge_name)
|
||||
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
vf_map = yaml.load(contents) if contents else []
|
||||
self.assertListEqual(vf_final, vf_map)
|
||||
|
||||
def test_ovs_bond_with_vf_custom(self):
|
||||
data = """{
|
||||
"type": "ovs_bridge",
|
||||
"name": "br-foo",
|
||||
"use_dhcp": true,
|
||||
"members": [{
|
||||
"type": "ovs_bond",
|
||||
"name": "bond1",
|
||||
"members": [{
|
||||
"type": "sriov_vf",
|
||||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"primary": true,
|
||||
"trust": false,
|
||||
"spoofcheck": true,
|
||||
"promisc": false
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "em2",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"trust": false,
|
||||
"spoofcheck": true,
|
||||
"promisc": false
|
||||
}
|
||||
]
|
||||
}]
|
||||
}
|
||||
"""
|
||||
vf_final = [{'device_type': 'vf', 'name': 'em1_1',
|
||||
'device': {'name': 'em1', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'on', 'trust': 'off',
|
||||
'promisc': 'off'},
|
||||
{'device_type': 'vf', 'name': 'em2_1',
|
||||
'device': {'name': 'em2', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'on', 'trust': 'off',
|
||||
'promisc': 'off'}]
|
||||
|
||||
def test_get_vf_devname(device, vfid):
|
||||
return device + '_' + str(vfid)
|
||||
self.stub_out('os_net_config.utils.get_vf_devname',
|
||||
test_get_vf_devname)
|
||||
|
||||
objects.object_from_json(json.loads(data))
|
||||
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
vf_map = yaml.load(contents) if contents else []
|
||||
self.assertListEqual(vf_final, vf_map)
|
||||
|
||||
def test_ovs_bridge_with_vf_param_provided(self):
|
||||
data = """{
|
||||
"type": "ovs_bridge",
|
||||
|
@ -459,8 +570,7 @@ class TestBridge(base.TestCase):
|
|||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"spoofcheck": false
|
||||
"qos": 1
|
||||
}
|
||||
]
|
||||
}]
|
||||
|
@ -921,6 +1031,21 @@ class TestLinuxTeam(base.TestCase):
|
|||
|
||||
class TestLinuxBond(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLinuxBond, self).setUp()
|
||||
rand = str(int(random.random() * 100000))
|
||||
sriov_config._SRIOV_CONFIG_FILE = '/tmp/sriov_config_' + rand + '.yaml'
|
||||
|
||||
def stub_is_ovs_installed():
|
||||
return True
|
||||
self.stub_out('os_net_config.utils.is_ovs_installed',
|
||||
stub_is_ovs_installed)
|
||||
|
||||
def tearDown(self):
|
||||
super(TestLinuxBond, self).tearDown()
|
||||
if os.path.isfile(sriov_config._SRIOV_CONFIG_FILE):
|
||||
os.remove(sriov_config._SRIOV_CONFIG_FILE)
|
||||
|
||||
def test_from_json_dhcp(self):
|
||||
data = """{
|
||||
"type": "linux_bond",
|
||||
|
@ -976,6 +1101,105 @@ class TestLinuxBond(base.TestCase):
|
|||
interface2 = bridge.members[1]
|
||||
self.assertEqual("em2", interface2.name)
|
||||
|
||||
def test_linux_bond_with_vf_default(self):
|
||||
data = """{
|
||||
"type": "linux_bond",
|
||||
"name": "bond1",
|
||||
"use_dhcp": true,
|
||||
"members": [{
|
||||
"type": "sriov_vf",
|
||||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"primary": true
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "em2",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1
|
||||
}]
|
||||
}
|
||||
"""
|
||||
vf_final = [{'device_type': 'vf', 'name': 'em1_1',
|
||||
'device': {'name': 'em1', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'on', 'trust': 'on',
|
||||
'promisc': 'off'},
|
||||
{'device_type': 'vf', 'name': 'em2_1',
|
||||
'device': {'name': 'em2', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'on', 'trust': 'on',
|
||||
'promisc': 'off'}]
|
||||
|
||||
def test_get_vf_devname(device, vfid):
|
||||
return device + '_' + str(vfid)
|
||||
self.stub_out('os_net_config.utils.get_vf_devname',
|
||||
test_get_vf_devname)
|
||||
|
||||
bond = objects.object_from_json(json.loads(data))
|
||||
self.assertEqual("bond1", bond.name)
|
||||
self.assertTrue(bond.use_dhcp)
|
||||
interface1 = bond.members[0]
|
||||
interface2 = bond.members[1]
|
||||
self.assertEqual("em1", interface1.device)
|
||||
self.assertEqual("em2", interface2.device)
|
||||
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
vf_map = yaml.load(contents) if contents else []
|
||||
self.assertListEqual(vf_final, vf_map)
|
||||
|
||||
def test_linux_bond_with_vf_param_provided(self):
|
||||
data = """{
|
||||
"type": "linux_bond",
|
||||
"name": "bond1",
|
||||
"use_dhcp": true,
|
||||
"members": [{
|
||||
"type": "sriov_vf",
|
||||
"device": "em1",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"trust": false,
|
||||
"spoofcheck": false,
|
||||
"promisc": false
|
||||
},
|
||||
{
|
||||
"type": "sriov_vf",
|
||||
"device": "em2",
|
||||
"vfid": 1,
|
||||
"vlan_id": 111,
|
||||
"qos": 1,
|
||||
"trust": false,
|
||||
"spoofcheck": false,
|
||||
"promisc": false
|
||||
}
|
||||
]
|
||||
}
|
||||
"""
|
||||
vf_final = [{'device_type': 'vf', 'name': 'em1_1',
|
||||
'device': {'name': 'em1', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'off', 'trust': 'off',
|
||||
'promisc': 'off'},
|
||||
{'device_type': 'vf', 'name': 'em2_1',
|
||||
'device': {'name': 'em2', 'vfid': 1},
|
||||
'vlan_id': 111, 'qos': 1,
|
||||
'spoofcheck': 'off', 'trust': 'off',
|
||||
'promisc': 'off'}]
|
||||
|
||||
def test_get_vf_devname(device, vfid):
|
||||
return device + '_' + str(vfid)
|
||||
self.stub_out('os_net_config.utils.get_vf_devname',
|
||||
test_get_vf_devname)
|
||||
|
||||
objects.object_from_json(json.loads(data))
|
||||
contents = utils.get_file_data(sriov_config._SRIOV_CONFIG_FILE)
|
||||
vf_map = yaml.load(contents) if contents else []
|
||||
self.assertListEqual(vf_final, vf_map)
|
||||
|
||||
|
||||
class TestOvsTunnel(base.TestCase):
|
||||
|
||||
|
@ -1476,7 +1700,7 @@ class TestSriovPF(base.TestCase):
|
|||
self.assertEqual("em4", pf.name)
|
||||
self.assertEqual(16, pf.numvfs)
|
||||
self.assertFalse(pf.use_dhcp)
|
||||
self.assertEqual(None, pf.promisc)
|
||||
self.assertEqual('on', pf.promisc)
|
||||
|
||||
|
||||
class TestSriovVF(base.TestCase):
|
||||
|
|
|
@ -82,7 +82,7 @@ def write_config(filename, data):
|
|||
def write_yaml_config(filepath, data):
|
||||
ensure_directory_presence(filepath)
|
||||
with open(filepath, 'w') as f:
|
||||
yaml.dump(data, f, default_flow_style=False)
|
||||
yaml.safe_dump(data, f, default_flow_style=False)
|
||||
|
||||
|
||||
def ensure_directory_presence(filepath):
|
||||
|
|
Loading…
Reference in New Issue