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:
parent
31d1fc555e
commit
15994fe653
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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": [
|
||||
|
|
Loading…
Reference in New Issue