diff options
Diffstat (limited to 'os_net_config/objects.py')
-rw-r--r-- | os_net_config/objects.py | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/os_net_config/objects.py b/os_net_config/objects.py index 3c67ada..8d52e73 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -25,6 +25,8 @@ logger = logging.getLogger(__name__) _MAPPED_NICS = None +DEFAULT_OVS_BRIDGE_FAIL_MODE = 'standalone' + class InvalidConfigException(ValueError): pass @@ -131,20 +133,29 @@ def _mapped_nics(nic_mapping=None): return _MAPPED_NICS +def format_ovs_extra(obj, templates): + """Map OVS object properties into a string to be used for ovs_extra.""" + + return [t.format(name=obj.name) for t in templates or []] + + class Route(object): """Base class for network routes.""" - def __init__(self, next_hop, ip_netmask="", default=False): + def __init__(self, next_hop, ip_netmask="", default=False, + route_options=""): self.next_hop = next_hop self.ip_netmask = ip_netmask self.default = default + self.route_options = route_options @staticmethod def from_json(json): next_hop = _get_required_field(json, 'next_hop', 'Route') ip_netmask = json.get('ip_netmask', "") + route_options = json.get('route_options', "") default = strutils.bool_from_string(str(json.get('default', False))) - return Route(next_hop, ip_netmask, default) + return Route(next_hop, ip_netmask, default, route_options) class Address(object): @@ -276,7 +287,7 @@ class Interface(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, routes=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None): + dns_servers=None, ethtool_opts=None): addresses = addresses or [] routes = routes or [] dns_servers = dns_servers or [] @@ -284,12 +295,14 @@ class Interface(_BaseOpts): routes, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers) + self.ethtool_opts = ethtool_opts @staticmethod def from_json(json): name = _get_required_field(json, 'name', 'Interface') opts = _BaseOpts.base_opts_from_json(json) - return Interface(name, *opts) + ethtool_opts = json.get('ethtool_opts', None) + return Interface(name, *opts, ethtool_opts=ethtool_opts) class Vlan(_BaseOpts): @@ -386,11 +399,11 @@ class OvsBridge(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, routes=None, mtu=None, members=None, ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, - defroute=True, dhclient_args=None, dns_servers=None): + defroute=True, dhclient_args=None, dns_servers=None, + fail_mode=None): addresses = addresses or [] routes = routes or [] members = members or [] - ovs_extra = ovs_extra or [] dns_servers = dns_servers or [] super(OvsBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, False, nic_mapping, @@ -398,7 +411,10 @@ class OvsBridge(_BaseOpts): dhclient_args, dns_servers) self.members = members self.ovs_options = ovs_options - self.ovs_extra = ovs_extra + ovs_extra = ovs_extra or [] + if fail_mode: + ovs_extra.append('set bridge {name} fail_mode=%s' % fail_mode) + self.ovs_extra = format_ovs_extra(self, ovs_extra) for member in self.members: member.bridge_name = name if not isinstance(member, OvsTunnel): @@ -420,7 +436,8 @@ class OvsBridge(_BaseOpts): 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', []) + ovs_extra = json.get('ovs_extra') + fail_mode = json.get('ovs_fail_mode', DEFAULT_OVS_BRIDGE_FAIL_MODE) members = [] # members @@ -438,7 +455,8 @@ class OvsBridge(_BaseOpts): 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) + dhclient_args=dhclient_args, dns_servers=dns_servers, + fail_mode=fail_mode) class OvsUserBridge(_BaseOpts): @@ -447,7 +465,8 @@ class OvsUserBridge(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, routes=None, mtu=None, members=None, ovs_options=None, ovs_extra=None, nic_mapping=None, persist_mapping=False, - defroute=True, dhclient_args=None, dns_servers=None): + defroute=True, dhclient_args=None, dns_servers=None, + fail_mode=None): super(OvsUserBridge, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, False, nic_mapping, persist_mapping, @@ -455,7 +474,10 @@ class OvsUserBridge(_BaseOpts): dns_servers) self.members = members or [] self.ovs_options = ovs_options - self.ovs_extra = ovs_extra or [] + ovs_extra = ovs_extra or [] + if fail_mode: + ovs_extra.append('set bridge {name} fail_mode=%s' % fail_mode) + self.ovs_extra = format_ovs_extra(self, ovs_extra) for member in self.members: member.bridge_name = name if not isinstance(member, OvsTunnel) and \ @@ -479,7 +501,8 @@ class OvsUserBridge(_BaseOpts): 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', []) + ovs_extra = json.get('ovs_extra') + fail_mode = json.get('ovs_fail_mode', DEFAULT_OVS_BRIDGE_FAIL_MODE) members = [] # members @@ -498,7 +521,7 @@ class OvsUserBridge(_BaseOpts): ovs_extra=ovs_extra, nic_mapping=nic_mapping, persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, - dns_servers=dns_servers) + dns_servers=dns_servers, fail_mode=fail_mode) class LinuxBridge(_BaseOpts): @@ -803,7 +826,6 @@ class OvsBond(_BaseOpts): addresses = addresses or [] routes = routes or [] members = members or [] - ovs_extra = ovs_extra or [] dns_servers = dns_servers or [] super(OvsBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, @@ -811,7 +833,7 @@ class OvsBond(_BaseOpts): dns_servers) self.members = members self.ovs_options = ovs_options - self.ovs_extra = ovs_extra + self.ovs_extra = format_ovs_extra(self, ovs_extra) for member in self.members: if member.primary: if self.primary_interface_name: @@ -865,7 +887,6 @@ class OvsTunnel(_BaseOpts): ovs_extra=None): addresses = addresses or [] routes = routes or [] - ovs_extra = ovs_extra or [] dns_servers = dns_servers or [] super(OvsTunnel, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, @@ -873,7 +894,7 @@ class OvsTunnel(_BaseOpts): dhclient_args, dns_servers) self.tunnel_type = tunnel_type self.ovs_options = ovs_options or [] - self.ovs_extra = ovs_extra or [] + self.ovs_extra = format_ovs_extra(self, ovs_extra) @staticmethod def from_json(json): @@ -897,7 +918,6 @@ class OvsPatchPort(_BaseOpts): ovs_options=None, ovs_extra=None): addresses = addresses or [] routes = routes or [] - ovs_extra = ovs_extra or [] dns_servers = dns_servers or [] super(OvsPatchPort, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, @@ -907,7 +927,7 @@ class OvsPatchPort(_BaseOpts): self.bridge_name = bridge_name self.peer = peer self.ovs_options = ovs_options or [] - self.ovs_extra = ovs_extra or [] + self.ovs_extra = format_ovs_extra(self, ovs_extra) @staticmethod def from_json(json): @@ -928,7 +948,7 @@ class IbInterface(_BaseOpts): def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, routes=None, mtu=None, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, - dns_servers=None): + dns_servers=None, ethtool_opts=None): addresses = addresses or [] routes = routes or [] dns_servers = dns_servers or [] @@ -936,12 +956,14 @@ class IbInterface(_BaseOpts): addresses, routes, mtu, primary, nic_mapping, persist_mapping, defroute, dhclient_args, dns_servers) + self.ethtool_opts = ethtool_opts @staticmethod def from_json(json): name = _get_required_field(json, 'name', 'IbInterface') + ethtool_opts = json.get('ethtool_opts', None) opts = _BaseOpts.base_opts_from_json(json) - return IbInterface(name, *opts) + return IbInterface(name, *opts, ethtool_opts=ethtool_opts) class OvsDpdkPort(_BaseOpts): @@ -960,7 +982,7 @@ class OvsDpdkPort(_BaseOpts): dns_servers) self.members = members or [] self.ovs_options = ovs_options or [] - self.ovs_extra = ovs_extra or [] + self.ovs_extra = format_ovs_extra(self, ovs_extra) self.driver = driver @staticmethod @@ -1017,7 +1039,7 @@ class OvsDpdkBond(_BaseOpts): defroute, dhclient_args, dns_servers) self.members = members or [] self.ovs_options = ovs_options - self.ovs_extra = ovs_extra or [] + self.ovs_extra = format_ovs_extra(self, ovs_extra) for member in self.members: if member.primary: |