diff options
Diffstat (limited to 'os_net_config/objects.py')
-rw-r--r-- | os_net_config/objects.py | 197 |
1 files changed, 170 insertions, 27 deletions
diff --git a/os_net_config/objects.py b/os_net_config/objects.py index 6d0921f..dd8489e 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -40,6 +40,10 @@ def object_from_json(json): return OvsBridge.from_json(json) elif obj_type == "ovs_bond": return OvsBond.from_json(json) + elif obj_type == "linux_bond": + return LinuxBond.from_json(json) + elif obj_type == "linux_bridge": + return LinuxBridge.from_json(json) def _get_required_field(json, name, object_name): @@ -129,9 +133,13 @@ class Address(object): class _BaseOpts(object): """Base abstraction for logical port options.""" - def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], - routes=[], mtu=1500, primary=False, nic_mapping=None, - persist_mapping=False, defroute=True, dhclient_args=None): + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, primary=False, nic_mapping=None, + persist_mapping=False, defroute=True, dhclient_args=None, + dns_servers=None): + addresses = addresses or [] + routes = routes or [] + dns_servers = dns_servers or [] numbered_nic_names = _numbered_nics(nic_mapping) self.hwaddr = None self.hwname = None @@ -155,7 +163,9 @@ class _BaseOpts(object): self.primary = primary self.defroute = defroute self.dhclient_args = dhclient_args + self.dns_servers = dns_servers self.bridge_name = None # internal + self.linux_bridge_name = None # internal self.ovs_port = False # internal self.primary_interface_name = None # internal @@ -184,6 +194,7 @@ class _BaseOpts(object): True))) mtu = json.get('mtu', 1500) dhclient_args = json.get('dhclient_args') + dns_servers = json.get('dns_servers') primary = strutils.bool_from_string(str(json.get('primary', False))) addresses = [] routes = [] @@ -213,22 +224,28 @@ class _BaseOpts(object): if include_primary: return (use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, - nic_mapping, persist_mapping, defroute, dhclient_args) + nic_mapping, persist_mapping, defroute, dhclient_args, + dns_servers) else: return (use_dhcp, use_dhcpv6, addresses, routes, mtu, - nic_mapping, persist_mapping, defroute, dhclient_args) + nic_mapping, persist_mapping, defroute, dhclient_args, + dns_servers) class Interface(_BaseOpts): """Base class for network interfaces.""" - def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], - routes=[], mtu=1500, primary=False, nic_mapping=None, - persist_mapping=False, defroute=True, dhclient_args=None): + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, primary=False, nic_mapping=None, + persist_mapping=False, defroute=True, dhclient_args=None, + dns_servers=None): + addresses = addresses or [] + routes = routes or [] + dns_servers = dns_servers or [] super(Interface, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, persist_mapping, defroute, - dhclient_args) + dhclient_args, dns_servers) @staticmethod def from_json(json): @@ -245,13 +262,17 @@ class Vlan(_BaseOpts): """ def __init__(self, device, vlan_id, use_dhcp=False, use_dhcpv6=False, - addresses=[], routes=[], mtu=1500, primary=False, + addresses=None, routes=None, mtu=1500, primary=False, nic_mapping=None, persist_mapping=False, defroute=True, - dhclient_args=None): + dhclient_args=None, dns_servers=None): + addresses = addresses or [] + routes = routes or [] + dns_servers = dns_servers or [] name = 'vlan%i' % vlan_id super(Vlan, self).__init__(name, use_dhcp, use_dhcpv6, addresses, routes, mtu, primary, nic_mapping, - persist_mapping, defroute, dhclient_args) + persist_mapping, defroute, dhclient_args, + dns_servers) self.vlan_id = int(vlan_id) numbered_nic_names = _numbered_nics(nic_mapping) @@ -272,14 +293,19 @@ class Vlan(_BaseOpts): class OvsBridge(_BaseOpts): """Base class for OVS bridges.""" - def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], - routes=[], mtu=1500, members=[], ovs_options=None, - ovs_extra=[], nic_mapping=None, persist_mapping=False, - defroute=True, dhclient_args=None): + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, members=None, ovs_options=None, + ovs_extra=None, nic_mapping=None, persist_mapping=False, + defroute=True, dhclient_args=None, dns_servers=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, persist_mapping, defroute, - dhclient_args) + dhclient_args, dns_servers) self.members = members self.ovs_options = ovs_options self.ovs_extra = ovs_extra @@ -300,7 +326,7 @@ class OvsBridge(_BaseOpts): name = _get_required_field(json, 'name', 'OvsBridge') (use_dhcp, use_dhcpv6, addresses, routes, mtu, nic_mapping, persist_mapping, defroute, - dhclient_args) = _BaseOpts.base_opts_from_json( + 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', []) @@ -321,19 +347,136 @@ 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) + dhclient_args=dhclient_args, dns_servers=dns_servers) + + +class LinuxBridge(_BaseOpts): + """Base class for Linux bridges.""" + + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, members=None, nic_mapping=None, + persist_mapping=False, defroute=True, dhclient_args=None, + dns_servers=None): + addresses = addresses or [] + routes = routes or [] + members = members or [] + dns_servers = dns_servers or [] + super(LinuxBridge, self).__init__(name, use_dhcp, use_dhcpv6, + addresses, routes, mtu, False, + nic_mapping, persist_mapping, + defroute, dhclient_args, dns_servers) + self.members = members + for member in self.members: + member.linux_bridge_name = name + member.ovs_port = False + if member.primary: + if self.primary_interface_name: + msg = 'Only one primary interface allowed per bridge.' + raise InvalidConfigException(msg) + if member.primary_interface_name: + self.primary_interface_name = member.primary_interface_name + else: + self.primary_interface_name = member.name + + @staticmethod + def from_json(json): + name = _get_required_field(json, 'name', 'LinuxBridge') + (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) + members = [] + + # members + members_json = json.get('members') + if members_json: + if isinstance(members_json, list): + for member in members_json: + members.append(object_from_json(member)) + else: + msg = 'Members must be a list.' + raise InvalidConfigException(msg) + + return LinuxBridge(name, use_dhcp=use_dhcp, use_dhcpv6=use_dhcpv6, + addresses=addresses, routes=routes, mtu=mtu, + members=members, nic_mapping=nic_mapping, + persist_mapping=persist_mapping, defroute=defroute, + dhclient_args=dhclient_args, + dns_servers=dns_servers) + + +class LinuxBond(_BaseOpts): + """Base class for Linux bonds.""" + + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, primary=False, members=None, + bonding_options=None, nic_mapping=None, persist_mapping=False, + defroute=True, dhclient_args=None, dns_servers=None): + addresses = addresses or [] + routes = routes or [] + members = members or [] + dns_servers = dns_servers or [] + super(LinuxBond, self).__init__(name, use_dhcp, use_dhcpv6, addresses, + routes, mtu, primary, nic_mapping, + persist_mapping, defroute, + dhclient_args, dns_servers) + self.members = members + self.bonding_options = bonding_options + for member in self.members: + if member.primary: + if self.primary_interface_name: + msg = 'Only one primary interface allowed per bond.' + raise InvalidConfigException(msg) + if member.primary_interface_name: + self.primary_interface_name = member.primary_interface_name + else: + self.primary_interface_name = member.name + + @staticmethod + def from_json(json): + name = _get_required_field(json, 'name', 'LinuxBond') + (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) + bonding_options = json.get('bonding_options') + members = [] + + # members + members_json = json.get('members') + if members_json: + if isinstance(members_json, list): + for member in members_json: + members.append(object_from_json(member)) + else: + msg = 'Members must be a list.' + raise InvalidConfigException(msg) + + return LinuxBond(name, use_dhcp=use_dhcp, use_dhcpv6=use_dhcpv6, + addresses=addresses, routes=routes, mtu=mtu, + members=members, bonding_options=bonding_options, + nic_mapping=nic_mapping, + persist_mapping=persist_mapping, defroute=defroute, + dhclient_args=dhclient_args, dns_servers=dns_servers) class OvsBond(_BaseOpts): """Base class for OVS bonds.""" - def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=[], - routes=[], mtu=1500, primary=False, members=[], - ovs_options=None, ovs_extra=[], nic_mapping=None, - persist_mapping=False, defroute=True, dhclient_args=None): + def __init__(self, name, use_dhcp=False, use_dhcpv6=False, addresses=None, + routes=None, mtu=1500, primary=False, members=None, + ovs_options=None, ovs_extra=None, nic_mapping=None, + persist_mapping=False, defroute=True, dhclient_args=None, + dns_servers=None): + 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, - persist_mapping, defroute, dhclient_args) + persist_mapping, defroute, dhclient_args, + dns_servers) self.members = members self.ovs_options = ovs_options self.ovs_extra = ovs_extra @@ -355,8 +498,8 @@ class OvsBond(_BaseOpts): def from_json(json): name = _get_required_field(json, 'name', 'OvsBond') (use_dhcp, use_dhcpv6, addresses, routes, mtu, nic_mapping, - persist_mapping, defroute, - dhclient_args) = _BaseOpts.base_opts_from_json( + 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', []) @@ -377,4 +520,4 @@ class OvsBond(_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) + dhclient_args=dhclient_args, dns_servers=dns_servers) |