def setupNetworks(networks, bondings, options): """Add/Edit/Remove configuration for networks and bondings. Params: networks - dict of key=network, value=attributes where 'attributes' is a dict with the following optional items: vlan=<id> bonding="<name>" | nic="<name>" (bonding and nics are mutually exclusive) ipaddr="<ipv4>" netmask="<ipv4>" gateway="<ipv4>" bootproto="..." ipv6addr="<ipv6>[/<prefixlen>]" ipv6gateway="<ipv6>" ipv6autoconf="0|1" dhcpv6="0|1" defaultRoute=True|False switch="legacy|..." (other options will be passed to the config file AS-IS) -- OR -- remove=True (other attributes can't be specified) bondings - dict of key=bonding, value=attributes where 'attributes' is a dict with the following optional items: nics=["<nic1>" , "<nic2>", ...] options="<bonding-options>" switch="legacy|..." -- OR -- remove=True (other attributes can't be specified) options - dict of options, such as: connectivityCheck=0|1 connectivityTimeout=<int> _inRollback=True|False Notes: When you edit a network that is attached to a bonding, it's not necessary to re-specify the bonding (you need only to note the attachment in the network's attributes). Similarly, if you edit a bonding, it's not necessary to specify its networks. """ logging.debug('Setting up network according to configuration: ' 'networks:%r, bondings:%r, options:%r' % (networks, bondings, options)) try: _setup_networks(networks, bondings, options) except: # TODO: it might be useful to pass failure description in 'response' # field network_config_dict = { 'request': {'networks': dict(networks), 'bondings': dict(bondings), 'options': dict(options)}} hooks.after_network_setup_fail(network_config_dict) raise else: hooks.after_network_setup( _build_setup_hook_dict(networks, bondings, options))
def setupNetworks(networks, bondings, options): """Add/Edit/Remove configuration for networks and bondings. Params: networks - dict of key=network, value=attributes where 'attributes' is a dict with the following optional items: vlan=<id> bonding="<name>" | nic="<name>" (bonding and nics are mutually exclusive) ipaddr="<ipv4>" netmask="<ipv4>" | prefix=<prefixlen> gateway="<ipv4>" bootproto="..." ipv6addr="<ipv6>[/<prefixlen>]" ipv6gateway="<ipv6>" ipv6autoconf="0|1" dhcpv6="0|1" defaultRoute=True|False nameservers=[<dns1>, <dns2> ...]" switch="legacy|..." (other options will be passed to the config file AS-IS) -- OR -- remove=True (other attributes can't be specified) bondings - dict of key=bonding, value=attributes where 'attributes' is a dict with the following optional items: nics=["<nic1>" , "<nic2>", ...] options="<bonding-options>" switch="legacy|..." -- OR -- remove=True (other attributes can't be specified) options - dict of options, such as: connectivityCheck=0|1 connectivityTimeout=<int> _inRollback=True|False Notes: When you edit a network that is attached to a bonding, it's not necessary to re-specify the bonding (you need only to note the attachment in the network's attributes). Similarly, if you edit a bonding, it's not necessary to specify its networks. """ logging.debug('Setting up network according to configuration: ' 'networks:%r, bondings:%r, options:%r' % (networks, bondings, options)) try: canonicalize_networks(networks) canonicalize_bondings(bondings) logging.debug('Validating configuration') validator.validate(networks, bondings) running_config = netconfpersistence.RunningConfig() if netswitch.configurator.switch_type_change_needed( networks, bondings, running_config): _change_switch_type(networks, bondings, options, running_config) else: _setup_networks(networks, bondings, options) except: # TODO: it might be useful to pass failure description in 'response' # field network_config_dict = { 'request': { 'networks': dict(networks), 'bondings': dict(bondings), 'options': dict(options) } } hooks.after_network_setup_fail(network_config_dict) raise else: hooks.after_network_setup( _build_setup_hook_dict(networks, bondings, options))
def setupNetworks(networks, bondings, options): """Add/Edit/Remove configuration for networks and bondings. Params: networks - dict of key=network, value=attributes where 'attributes' is a dict with the following optional items: vlan=<id> bonding="<name>" | nic="<name>" (bonding and nics are mutually exclusive) ipaddr="<ipv4>" netmask="<ipv4>" gateway="<ipv4>" bootproto="..." ipv6addr="<ipv6>[/<prefixlen>]" ipv6gateway="<ipv6>" ipv6autoconf="0|1" dhcpv6="0|1" defaultRoute=True|False (other options will be passed to the config file AS-IS) -- OR -- remove=True (other attributes can't be specified) bondings - dict of key=bonding, value=attributes where 'attributes' is a dict with the following optional items: nics=["<nic1>" , "<nic2>", ...] options="<bonding-options>" -- OR -- remove=True (other attributes can't be specified) options - dict of options, such as: connectivityCheck=0|1 connectivityTimeout=<int> _inRollback=True|False Notes: When you edit a network that is attached to a bonding, it's not necessary to re-specify the bonding (you need only to note the attachment in the network's attributes). Similarly, if you edit a bonding, it's not necessary to specify its networks. """ logger = logging.getLogger("setupNetworks") logger.debug("Setting up network according to configuration: " "networks:%r, bondings:%r, options:%r" % (networks, bondings, options)) canonicalize_networks(networks) # TODO: Add canonicalize_bondings(bondings) logging.debug("Validating configuration") legacy_switch.validateNetworkSetup(networks, bondings) bondings, networks, options = _apply_hook(bondings, networks, options) libvirt_nets = netinfo_networks() _netinfo = CachingNetInfo(_netinfo=netinfo_get( libvirtNets2vdsm(libvirt_nets))) logger.debug("Applying...") in_rollback = options.get('_inRollback', False) with legacy_switch.ConfiguratorClass(in_rollback) as configurator: # from this point forward, any exception thrown will be handled by # Configurator.__exit__. legacy_switch.remove_networks(networks, bondings, configurator, _netinfo, libvirt_nets, logger) legacy_switch.bonds_setup(bondings, configurator, _netinfo, in_rollback, logger) legacy_switch.add_missing_networks(configurator, networks, bondings, logger, _netinfo) _check_connectivity(networks, bondings, options, logger) hooks.after_network_setup(_buildSetupHookDict(networks, bondings, options))
def setupNetworks(networks, bondings, options): """Add/Edit/Remove configuration for networks and bondings. Params: networks - dict of key=network, value=attributes where 'attributes' is a dict with the following optional items: vlan=<id> bonding="<name>" | nic="<name>" (bonding and nics are mutually exclusive) ipaddr="<ipv4>" netmask="<ipv4>" gateway="<ipv4>" bootproto="..." ipv6addr="<ipv6>[/<prefixlen>]" ipv6gateway="<ipv6>" ipv6autoconf="0|1" dhcpv6="0|1" defaultRoute=True|False (other options will be passed to the config file AS-IS) -- OR -- remove=True (other attributes can't be specified) bondings - dict of key=bonding, value=attributes where 'attributes' is a dict with the following optional items: nics=["<nic1>" , "<nic2>", ...] options="<bonding-options>" -- OR -- remove=True (other attributes can't be specified) options - dict of options, such as: connectivityCheck=0|1 connectivityTimeout=<int> _inRollback=True|False Notes: When you edit a network that is attached to a bonding, it's not necessary to re-specify the bonding (you need only to note the attachment in the network's attributes). Similarly, if you edit a bonding, it's not necessary to specify its networks. """ logger = logging.getLogger("setupNetworks") logger.debug("Setting up network according to configuration: " "networks:%r, bondings:%r, options:%r" % (networks, bondings, options)) canonize_networks(networks) # TODO: Add canonize_bondings(bondings) logging.debug("Validating configuration") _validateNetworkSetup(networks, bondings) bondings, networks, options = _apply_hook(bondings, networks, options) libvirt_nets = netinfo_networks() _netinfo = CachingNetInfo(_netinfo=netinfo_get( libvirtNets2vdsm(libvirt_nets))) connectivity_check_networks = set() logger.debug("Applying...") in_rollback = options.get('_inRollback', False) kernel_config = kernelconfig.KernelConfig(_netinfo) normalized_config = kernelconfig.normalize( netconfpersistence.BaseConfig(networks, bondings)) with ConfiguratorClass(in_rollback) as configurator: # from this point forward, any exception thrown will be handled by # Configurator.__exit__. # Remove edited networks and networks with 'remove' attribute for network, attrs in networks.items(): if network in _netinfo.networks: logger.debug("Removing network %r", network) keep_bridge = _should_keep_bridge( network_attrs=normalized_config.networks[network], currently_bridged=_netinfo.networks[network]['bridged'], net_kernel_config=kernel_config.networks[network] ) _delNetwork(network, configurator, implicitBonding=False, _netinfo=_netinfo, keep_bridge=keep_bridge) _netinfo.del_network(network) _netinfo.updateDevices() elif network in libvirt_nets: # If the network was not in _netinfo but is in the networks # returned by libvirt, it means that we are dealing with # a broken network. logger.debug('Removing broken network %r', network) _delBrokenNetwork(network, libvirt_nets[network], configurator=configurator) _netinfo.updateDevices() elif 'remove' in attrs: raise ConfigNetworkError(ne.ERR_BAD_BRIDGE, "Cannot delete " "network %r: It doesn't exist in the " "system" % network) else: connectivity_check_networks.add(network) _bonds_setup(bondings, configurator, _netinfo, in_rollback, logger) _add_missing_networks(configurator, networks, bondings, logger, _netinfo) _check_connectivity(connectivity_check_networks, networks, bondings, options, logger) hooks.after_network_setup(_buildSetupHookDict(networks, bondings, options))
def setupNetworks(networks, bondings, **options): """Add/Edit/Remove configuration for networks and bondings. Params: networks - dict of key=network, value=attributes where 'attributes' is a dict with the following optional items: vlan=<id> bonding="<name>" | nic="<name>" (bonding and nics are mutually exclusive) ipaddr="<ipv4>" netmask="<ipv4>" gateway="<ipv4>" bootproto="..." ipv6addr="<ipv6>[/<prefixlen>]" ipv6gateway="<ipv6>" ipv6autoconf="0|1" dhcpv6="0|1" defaultRoute=True|False (other options will be passed to the config file AS-IS) -- OR -- remove=True (other attributes can't be specified) bondings - dict of key=bonding, value=attributes where 'attributes' is a dict with the following optional items: nics=["<nic1>" , "<nic2>", ...] options="<bonding-options>" -- OR -- remove=True (other attributes can't be specified) options - dict of options, such as: connectivityCheck=0|1 connectivityTimeout=<int> _inRollback=True|False Notes: When you edit a network that is attached to a bonding, it's not necessary to re-specify the bonding (you need only to note the attachment in the network's attributes). Similarly, if you edit a bonding, it's not necessary to specify its networks. """ logger = logging.getLogger("setupNetworks") logger.debug("Setting up network according to configuration: " "networks:%r, bondings:%r, options:%r" % (networks, bondings, options)) _canonize_networks(networks) # TODO: Add _canonize_bondings(bondings) logging.debug("Validating configuration") _validateNetworkSetup(networks, bondings) bondings, networks, options = _apply_hook(bondings, networks, options) libvirt_nets = netinfo_networks() _netinfo = CachingNetInfo(_netinfo=netinfo_get( libvirtNets2vdsm(libvirt_nets))) connectivity_check_networks = set() logger.debug("Applying...") in_rollback = options.get('_inRollback', False) kernel_config = kernelconfig.KernelConfig(_netinfo) normalized_config = kernelconfig.normalize( netconfpersistence.BaseConfig(networks, bondings)) with ConfiguratorClass(in_rollback) as configurator: # Remove edited networks and networks with 'remove' attribute for network, attrs in networks.items(): if network in _netinfo.networks: logger.debug("Removing network %r", network) keep_bridge = _should_keep_bridge( network_attrs=normalized_config.networks[network], currently_bridged=_netinfo.networks[network]['bridged'], net_kernel_config=kernel_config.networks[network] ) _delNetwork(network, configurator=configurator, implicitBonding=False, _netinfo=_netinfo, keep_bridge=keep_bridge) _netinfo.del_network(network) _netinfo.updateDevices() elif network in libvirt_nets: # If the network was not in _netinfo but is in the networks # returned by libvirt, it means that we are dealing with # a broken network. logger.debug('Removing broken network %r', network) _delBrokenNetwork(network, libvirt_nets[network], configurator=configurator) _netinfo.updateDevices() elif 'remove' in attrs: raise ConfigNetworkError(ne.ERR_BAD_BRIDGE, "Cannot delete " "network %r: It doesn't exist in the " "system" % network) else: connectivity_check_networks.add(network) _handleBondings(bondings, configurator, in_rollback) _add_missing_networks(configurator, networks, bondings, logger, _netinfo) _check_connectivity(connectivity_check_networks, networks, bondings, options, logger) hooks.after_network_setup(_buildSetupHookDict(networks, bondings, options))