Network manager refactoring

Part 2.

1. Removed unused code and models.
2. Network parameters update code is moved from models to network manager.

Implements: blueprint nailgun-network-manager-refactoring

Change-Id: I59f1fd5472a63283a94ea769d4292bd8b65159a9
This commit is contained in:
Aleksey Kasatkin 2013-11-27 19:14:09 +02:00
parent 31d1fc555e
commit 15994fe653
9 changed files with 102 additions and 216 deletions

View File

@ -27,9 +27,7 @@ from nailgun.api.handlers.base import content_json
from nailgun.api.handlers.base import JSONHandler
from nailgun.api.handlers.tasks import TaskHandler
from nailgun.api.models import Cluster
from nailgun.api.models import NetworkConfiguration
from nailgun.api.models import NetworkGroup
from nailgun.api.models import NeutronNetworkConfiguration
from nailgun.api.models import Task
from nailgun.api.serializers.network_configuration \
@ -44,6 +42,8 @@ from nailgun.api.validators.network \
from nailgun.db import db
from nailgun.errors import errors
from nailgun.logger import logger
from nailgun.network.neutron import NeutronManager
from nailgun.network.nova_network import NovaNetworkManager
from nailgun.task.helpers import TaskHelper
from nailgun.task.manager import CheckNetworksTaskManager
from nailgun.task.manager import VerifyNetworksTaskManager
@ -150,7 +150,7 @@ class NovaNetworkConfigurationHandler(JSONHandler):
json.dumps(data)
)
NetworkConfiguration.update(cluster, data)
NovaNetworkManager.update(cluster, data)
except web.webapi.badrequest as exc:
TaskHelper.set_error(task.uuid, exc.data)
logger.error(traceback.format_exc())
@ -210,7 +210,7 @@ class NeutronNetworkConfigurationHandler(JSONHandler):
cluster_id=cluster_id
)
NeutronNetworkConfiguration.update(cluster, data)
NeutronManager.update(cluster, data)
except Exception as exc:
TaskHelper.set_error(task.uuid, exc)
logger.error(traceback.format_exc())

View File

@ -34,13 +34,9 @@ from nailgun.api.models.network import NetworkGroup
from nailgun.api.models.network import IPAddr
from nailgun.api.models.network import IPAddrRange
from nailgun.api.models.network import Vlan
from nailgun.api.models.network import NetworkConfiguration
from nailgun.api.models.network import L2Topology
from nailgun.api.models.network import L2Connection
from nailgun.api.models.network import AllowedNetworks
from nailgun.api.models.network import NetworkAssignment
from nailgun.api.models.neutron import NeutronNetworkConfiguration
from nailgun.api.models.neutron import NeutronConfig
from nailgun.api.models.notification import Notification

View File

@ -23,7 +23,6 @@ from sqlalchemy import Unicode
from sqlalchemy.orm import relationship, backref
from nailgun.api.models.base import Base
from nailgun.db import db
class IPAddr(Base):
@ -118,89 +117,6 @@ class NetworkGroup(Base):
return vlans
class NetworkConfiguration(object):
@classmethod
def update(cls, cluster, network_configuration):
from nailgun.network.manager import NetworkManager
network_manager = NetworkManager
if 'net_manager' in network_configuration:
setattr(
cluster,
'net_manager',
network_configuration['net_manager']
)
if 'dns_nameservers' in network_configuration:
setattr(
cluster,
'dns_nameservers',
network_configuration['dns_nameservers']['nameservers']
)
if 'networks' in network_configuration:
for ng in network_configuration['networks']:
if ng['id'] == network_manager.get_admin_network_group_id():
continue
ng_db = db().query(NetworkGroup).get(ng['id'])
for key, value in ng.iteritems():
if key == "ip_ranges":
cls._set_ip_ranges(ng['id'], value)
else:
if key == 'cidr' and \
not ng['name'] in ('public', 'floating'):
network_manager.update_range_mask_from_cidr(
ng_db, value)
setattr(ng_db, key, value)
network_manager.create_networks(ng_db)
ng_db.cluster.add_pending_changes('networks')
@classmethod
def _set_ip_ranges(cls, network_group_id, ip_ranges):
# deleting old ip ranges
db().query(IPAddrRange).filter_by(
network_group_id=network_group_id).delete()
for r in ip_ranges:
new_ip_range = IPAddrRange(
first=r[0],
last=r[1],
network_group_id=network_group_id)
db().add(new_ip_range)
db().commit()
class L2Topology(Base):
__tablename__ = 'l2_topologies'
id = Column(Integer, primary_key=True)
network_id = Column(
Integer,
ForeignKey('network_groups.id', ondelete="CASCADE"),
nullable=False
)
class L2Connection(Base):
__tablename__ = 'l2_connections'
id = Column(Integer, primary_key=True)
topology_id = Column(
Integer,
ForeignKey('l2_topologies.id', ondelete="CASCADE"),
nullable=False
)
interface_id = Column(
Integer,
# If interface is removed we should somehow remove
# all L2Topologes which include this interface.
ForeignKey('node_nic_interfaces.id', ondelete="CASCADE"),
nullable=False
)
class AllowedNetworks(Base):
__tablename__ = 'allowed_networks'
id = Column(Integer, primary_key=True)

View File

@ -21,60 +21,6 @@ from sqlalchemy import Integer
from nailgun.api.models.base import Base
from nailgun.api.models.fields import JSON
from nailgun.api.models.network import NetworkConfiguration
from nailgun.api.models.network import NetworkGroup
from nailgun.db import db
class NeutronNetworkConfiguration(NetworkConfiguration):
@classmethod
def update(cls, cluster, network_configuration):
from nailgun.network.neutron import NetworkManager
network_manager = NetworkManager
if 'networks' in network_configuration:
for ng in network_configuration['networks']:
if ng['id'] == network_manager.get_admin_network_group_id():
continue
ng_db = db().query(NetworkGroup).get(ng['id'])
for key, value in ng.iteritems():
if key == "ip_ranges":
cls._set_ip_ranges(ng['id'], value)
else:
if key == 'cidr' and \
ng['name'] not in ('private', 'public'):
network_manager.update_range_mask_from_cidr(
ng_db, value)
setattr(ng_db, key, value)
if ng['name'] == 'public':
cls.update_cidr_from_gw_mask(ng_db, ng)
#TODO(NAME) get rid of unmanaged parameters in request
if 'neutron_parameters' in network_configuration:
pre_nets = network_configuration[
'neutron_parameters']['predefined_networks']
pre_nets['net04_ext']['L3']['gateway'] = ng['gateway']
if ng['name'] != 'private':
network_manager.create_networks(ng_db)
ng_db.cluster.add_pending_changes('networks')
if 'neutron_parameters' in network_configuration:
for key, value in network_configuration['neutron_parameters'] \
.items():
setattr(cluster.neutron_config, key, value)
db().add(cluster.neutron_config)
db().commit()
@classmethod
def update_cidr_from_gw_mask(cls, ng_db, ng):
if ng.get('gateway') and ng.get('netmask'):
from nailgun.network.checker import calc_cidr_from_gw_mask
cidr = calc_cidr_from_gw_mask({'gateway': ng['gateway'],
'netmask': ng['netmask']})
if cidr:
ng_db.cidr = str(cidr)
class NeutronConfig(Base):

View File

@ -88,9 +88,6 @@ class NeutronNetworkConfigurationSerializer(NetworkConfigurationSerializer):
net_manager.get_admin_network_group()
)
)
# result['networks'] = [cls.serialize_network_group(ng)
# for ng in cluster.network_groups
# if ng.name != 'private']
if cluster.is_ha_mode:
nw_metadata = cluster.release.networks_metadata["neutron"]

View File

@ -437,33 +437,6 @@ class NetworkManager(object):
raise errors.OutOfIPs()
return free_ips
@classmethod
def _get_free_ips_from_range(cls, iterable, num=1):
"""Method for receiving free IP addresses from range.
:param iterable: Iterable object with IP addresses.
:type iterable: iterable
:param num: Number of IP addresses to return.
:type num: int
:returns: List of free IP addresses from given range.
:raises: errors.OutOfIPs
"""
free_ips = []
for chunk in cls._chunked_range(iterable):
from_range = set(chunk)
diff = from_range - set(
[i.ip_addr for i in db().query(IPAddr).
filter(IPAddr.ip_addr.in_(from_range))]
)
while len(free_ips) < num:
try:
free_ips.append(diff.pop())
except KeyError:
break
if len(free_ips) == num:
return free_ips
raise errors.OutOfIPs()
@classmethod
def _get_ips_except_admin(cls, node_id=None,
network_id=None, joined=False):
@ -907,44 +880,6 @@ class NetworkManager(object):
"""
return range1.first <= range2.last and range2.first <= range1.last
@classmethod
def get_min_max_addr(cls, range_object):
"""takes object which implicitly has IP range
and returns min and max address as tuple of two IPAddress elements
:range_object IPNetwork, IPRange: - object with ip range
:return (IPAddress, IPAddress):
"""
if isinstance(range_object, IPRange):
return map(
IPAddress,
str(range_object).split('-')
)
else:
prefix_length = range_object.prefixlen
bin_addr = range_object.ip.bits().replace('.', '')
min_max_bin_addr = [bin_addr[0:prefix_length] +
x * (32 - prefix_length) for x in ('0', '1')]
return map(
cls.bin_to_ip_addr,
min_max_bin_addr
)
@classmethod
def bin_to_ip_addr(cls, bin):
"""converts string of 32 digits to IP address
:bin str: is binary representation of IP address, must be 32 character
long with ones and zeros (ex: '00101100110011000011001100110011' )
:returns IPAddress: returns object of IPAddress class
"""
return IPAddress('.'.join(
map(
lambda x: str(int(''.join(x), 2)),
zip(*[iter(bin)] * 8)
)
))
@classmethod
def get_node_interface_by_netname(cls, node_id, netname):
return db().query(NodeNICInterface).join(
@ -954,3 +889,26 @@ class NetworkManager(object):
).filter(
NodeNICInterface.node_id == node_id
).first()
@classmethod
def _set_ip_ranges(cls, network_group_id, ip_ranges):
# deleting old ip ranges
db().query(IPAddrRange).filter_by(
network_group_id=network_group_id).delete()
for r in ip_ranges:
new_ip_range = IPAddrRange(
first=r[0],
last=r[1],
network_group_id=network_group_id)
db().add(new_ip_range)
db().commit()
@classmethod
def update_cidr_from_gw_mask(cls, ng_db, ng):
if ng.get('gateway') and ng.get('netmask'):
from nailgun.network.checker import calc_cidr_from_gw_mask
cidr = calc_cidr_from_gw_mask({'gateway': ng['gateway'],
'netmask': ng['netmask']})
if cidr:
ng_db.cidr = str(cidr)

View File

@ -352,3 +352,40 @@ class NeutronManager(NetworkManager):
)
db().add(private_network_group)
db().commit()
@classmethod
def update(cls, cluster, network_configuration):
if 'networks' in network_configuration:
for ng in network_configuration['networks']:
if ng['id'] == cls.get_admin_network_group_id():
continue
ng_db = db().query(NetworkGroup).get(ng['id'])
for key, value in ng.iteritems():
if key == "ip_ranges":
cls._set_ip_ranges(ng['id'], value)
else:
if key == 'cidr' and \
ng['name'] not in ('private', 'public'):
cls.update_range_mask_from_cidr(ng_db, value)
setattr(ng_db, key, value)
if ng['name'] == 'public':
cls.update_cidr_from_gw_mask(ng_db, ng)
#TODO(NAME) get rid of unmanaged parameters in request
if 'neutron_parameters' in network_configuration:
pre_nets = network_configuration[
'neutron_parameters']['predefined_networks']
pre_nets['net04_ext']['L3']['gateway'] = ng['gateway']
if ng['name'] != 'private':
cls.create_networks(ng_db)
ng_db.cluster.add_pending_changes('networks')
if 'neutron_parameters' in network_configuration:
for key, value in network_configuration['neutron_parameters'] \
.items():
setattr(cluster.neutron_config, key, value)
db().add(cluster.neutron_config)
db().commit()

View File

@ -153,3 +153,39 @@ class NovaNetworkManager(NetworkManager):
if nic == node.admin_interface:
ngs.append(cls.get_admin_network_group())
return ngs
@classmethod
def update(cls, cluster, network_configuration):
if 'net_manager' in network_configuration:
setattr(
cluster,
'net_manager',
network_configuration['net_manager']
)
if 'dns_nameservers' in network_configuration:
setattr(
cluster,
'dns_nameservers',
network_configuration['dns_nameservers']['nameservers']
)
if 'networks' in network_configuration:
for ng in network_configuration['networks']:
if ng['id'] == cls.get_admin_network_group_id():
continue
ng_db = db().query(NetworkGroup).get(ng['id'])
for key, value in ng.iteritems():
if key == "ip_ranges":
cls._set_ip_ranges(ng['id'], value)
else:
if key == 'cidr' and \
not ng['name'] in ('public', 'floating'):
cls.update_range_mask_from_cidr(
ng_db, value)
setattr(ng_db, key, value)
cls.create_networks(ng_db)
ng_db.cluster.add_pending_changes('networks')

View File

@ -21,9 +21,9 @@ from sqlalchemy.sql import not_
from nailgun.api.models import Cluster
from nailgun.api.models import Network
from nailgun.api.models import NetworkConfiguration
from nailgun.api.models import NetworkGroup
from nailgun.api.models import Release
from nailgun.network.nova_network import NovaNetworkManager
from nailgun.test.base import BaseIntegrationTest
from nailgun.test.base import reverse
@ -75,7 +75,7 @@ class TestHandlers(BaseIntegrationTest):
name="management",
cluster_id=clstr.id
).first()
NetworkConfiguration.update(
NovaNetworkManager.update(
clstr,
{
"networks": [