nova.network.linux_net refactor
The nova.network.linux_net module that is responsible for a number of networking aspects of Nova is quite large and not very flexible in terms of code maintainance and portability, so it could have a refactor. Blueprint: linux-net-refactor Change-Id: I3c98445349bc82f63913bff90d2baf868c3f7007
This commit is contained in:
242
specs/liberty/approved/linux_net_refactor.rst
Normal file
242
specs/liberty/approved/linux_net_refactor.rst
Normal file
@@ -0,0 +1,242 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==========================================
|
||||
nova.network.linux_net refactor
|
||||
==========================================
|
||||
|
||||
https://blueprints.launchpad.net/nova/+spec/linux-net-refactor
|
||||
|
||||
The nova.network.linux_net module that is responsible for a number
|
||||
of networking aspects of Nova is quite large and not very flexible
|
||||
in terms of code maintainance and portability, so it could have a refactor.
|
||||
|
||||
In addition to this, improving flexibility of the linux_net.py module
|
||||
will be a huge step forward towards FreeBSD host support, see the mailing
|
||||
list discussion for details [1].
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, nova.network.linux_net is responsible for a number of different
|
||||
things:
|
||||
|
||||
* Network interface management (the code to manipulate bridges,
|
||||
adding/removing interfaces etc)
|
||||
* Firewall/Iptables management
|
||||
* dnsmasq management
|
||||
|
||||
The linux_net.py file is almost 2k lines long, that's not critically large,
|
||||
but could be smaller.
|
||||
|
||||
Some parts of it is flexible and allows overriding classes, for example
|
||||
linuxnet_interface_driver. Some parts are not, for example IptablesManager.
|
||||
Even for classes that allow overriding, there are consumers that use it
|
||||
directly, for example virt.libvirt.vif uses LinuxBridgeInterfaceDriver
|
||||
directly.
|
||||
|
||||
Also, there are some relatively similar blocks that do the same thing and
|
||||
could be grouped into functions, for example, LinuxBridgeInterfaceDriver and
|
||||
NeutronLinuxBridgeInterfaceDriver use almost identical code for bridge
|
||||
creation.
|
||||
|
||||
It would be good to improve code maintainability, readability and portability
|
||||
by refactoring the linux_net.py module.
|
||||
|
||||
Use Cases
|
||||
----------
|
||||
|
||||
The only type of audience that would benefit from this change is developers
|
||||
who work with linux_net.py and ones who are looking into extending Nova
|
||||
with new mechanisms for interface management, firewalling and related.
|
||||
|
||||
Project Priority
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
The proposed appoach would be:
|
||||
|
||||
Currently the usage of linux_net in libvirt.vif looks this way:
|
||||
|
||||
* The following methods are used:
|
||||
- create_tap_dev()
|
||||
- create_ovs_vif_port()
|
||||
- create_ivs_vif_port()
|
||||
- device_exists()
|
||||
- delete_net_dev()
|
||||
|
||||
* Usage of linux_net.LinuxBridgeInterfaceDriver methods:
|
||||
- ensure_vlan_bridge()
|
||||
- ensure_bridge()
|
||||
|
||||
|
||||
One could notice this interface is pretty complex and actually
|
||||
it is responsible for two things at the same time:
|
||||
|
||||
* Providing a Nova network API logic
|
||||
* Providing helpers for OS-level network device management
|
||||
|
||||
In order to make it more portable the proposal is to split out
|
||||
the OS-level helpers into its own entity and allow custom
|
||||
implementations for specific platform.
|
||||
|
||||
For example, it would look this way::
|
||||
|
||||
|
||||
"""
|
||||
nova.network.netdev module
|
||||
"""
|
||||
|
||||
def get_driver():
|
||||
"Method returning platfrom specific implementation"
|
||||
if our_os == "Linux":
|
||||
return LinuxNetDevDriver
|
||||
else
|
||||
# not implemented
|
||||
|
||||
# network device helpers
|
||||
def create_bridge(brname):
|
||||
return get_driver().create_bridge(brname)
|
||||
|
||||
# other methods go here
|
||||
|
||||
"""
|
||||
nova.network.netdev.driver
|
||||
"""
|
||||
|
||||
class NetDevDriver(object):
|
||||
"""A class that defines an interface for
|
||||
OS-level network device manipulation"""
|
||||
|
||||
def create_bridge(self, brname):
|
||||
raise NotImplementedError
|
||||
|
||||
# other methods go here
|
||||
|
||||
|
||||
"""
|
||||
nova.netowrk.netdev.linux
|
||||
"""
|
||||
|
||||
class LinuxNetDevDriver(NetDevDriver):
|
||||
"""A class that implements NetDevDriver
|
||||
interface for Linux"""
|
||||
|
||||
def create_bridge(self, brname):
|
||||
# Linux impl goes here
|
||||
|
||||
# other methods
|
||||
|
||||
|
||||
The plan is:
|
||||
|
||||
- Move out helper functions from linux_net to netdev
|
||||
- Convert consumers of these helper functions from linux_net
|
||||
to use the new netdev helpers
|
||||
- Drop the old implementation of helpers from linux_net
|
||||
- Move out Iptables related classes to its own module firewall
|
||||
and allow to override with actual class to be used so it was
|
||||
possible to use other firewall packages
|
||||
- Move out dnsmasq related code to its own module dhcp
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
As the new option will be introduced that allows to specify
|
||||
the firewall class to use, deployers will be able to integrate
|
||||
third party firewalling packages. As this option will default
|
||||
to IptablesManager, there would be no changes to current deployments.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
Developers will have a more readable, maintainable and extendible linux_net.py
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
novel
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Refactor the interface management code
|
||||
* Split out the firewalling code
|
||||
* Split out the dnsmasq management code
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit tests will be updated accordingly.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
None
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
[1]: http://lists.openstack.org/pipermail/openstack-dev/2015-June/066342.html
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
.. list-table:: Revisions
|
||||
:header-rows: 1
|
||||
|
||||
* - Release Name
|
||||
- Description
|
||||
* - Liberty
|
||||
- Introduced
|
||||
Reference in New Issue
Block a user