From 9108fcb7bb1fa10ffce2fd787278802ee3f3354c Mon Sep 17 00:00:00 2001 From: Saravanan KR Date: Sat, 30 Jul 2016 15:22:57 +0530 Subject: Add support for OVS DPDK Bond Add functionality to os-net-config to allow DPDK bonding of interfaces, and implement support for parameters to be passed by TripleO Heat Templates. Implements: blueprint tripleo-ovs-dpdk Depends-On: Id4a23ced28b92a642c180a35c55080e5f4e2e05d Change-Id: If1c91402d2d393140dc1b4a678e68a1bcdbe81e4 --- os_net_config/objects.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'os_net_config/objects.py') diff --git a/os_net_config/objects.py b/os_net_config/objects.py index 725df38..154dccf 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -64,6 +64,8 @@ def object_from_json(json): return IbInterface.from_json(json) elif obj_type == "ovs_dpdk_port": return OvsDpdkPort.from_json(json) + elif obj_type == "ovs_dpdk_bond": + return OvsDpdkBond.from_json(json) def _get_required_field(json, name, object_name): @@ -457,7 +459,8 @@ class OvsUserBridge(_BaseOpts): for member in self.members: member.bridge_name = name if not isinstance(member, OvsTunnel) and \ - not isinstance(member, OvsDpdkPort): + not isinstance(member, OvsDpdkPort) and \ + not isinstance(member, OvsDpdkBond): member.ovs_port = True if member.primary: if self.primary_interface_name: @@ -1005,3 +1008,68 @@ class OvsDpdkPort(_BaseOpts): opts = _BaseOpts.base_opts_from_json(json) return OvsDpdkPort(name, *opts, members=members, driver=driver, ovs_options=ovs_options, ovs_extra=ovs_extra) + + +class OvsDpdkBond(_BaseOpts): + """Base class for OVS DPDK bonds.""" + + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=None, primary=False, members=None, + ovs_options=None, ovs_extra=None, nic_mapping=None, + persist_mapping=False, defroute=True, dhclient_args=None, + dns_servers=None): + super(OvsDpdkBond, self).__init__(name, use_dhcp, use_dhcpv6, + addresses, routes, mtu, primary, + nic_mapping, persist_mapping, + defroute, dhclient_args, dns_servers) + self.members = members or [] + self.ovs_options = ovs_options + self.ovs_extra = ovs_extra or [] + + for member in self.members: + if member.primary: + if self.primary_interface_name: + msg = 'Only one primary interface allowed per bond (dpdk).' + raise InvalidConfigException(msg) + if member.primary_interface_name: + self.primary_interface_name = member.primary_interface_name + else: + self.primary_interface_name = member.name + if not self.primary_interface_name: + bond_members = list(self.members) + bond_members.sort(key=lambda x: x.name) + self.primary_interface_name = bond_members[0].name + + @staticmethod + def from_json(json): + name = _get_required_field(json, 'name', 'OvsDpdkBond') + (use_dhcp, use_dhcpv6, addresses, routes, mtu, nic_mapping, + persist_mapping, defroute, dhclient_args, + dns_servers) = _BaseOpts.base_opts_from_json( + json, include_primary=False) + ovs_options = json.get('ovs_options') + ovs_extra = json.get('ovs_extra', []) + members = [] + + # members + members_json = json.get('members') + if members_json: + if isinstance(members_json, list): + for member in members_json: + obj = object_from_json(member) + if isinstance(obj, OvsDpdkPort): + members.append(obj) + else: + msg = 'Membrs must be of type ovs_dpdk_port' + raise InvalidConfigException(msg) + else: + msg = 'Members must be a list.' + raise InvalidConfigException(msg) + + return OvsDpdkBond(name, use_dhcp=use_dhcp, use_dhcpv6=use_dhcpv6, + addresses=addresses, routes=routes, mtu=mtu, + members=members, ovs_options=ovs_options, + ovs_extra=ovs_extra, nic_mapping=nic_mapping, + persist_mapping=persist_mapping, + defroute=defroute, dhclient_args=dhclient_args, + dns_servers=dns_servers) -- cgit 1.2.3-korg