62: Определение подходящего сетевого интервейса по имеющемуся ipv4

This commit is contained in:
Vyacheslav Anzhiganov 2016-06-02 03:29:36 +03:00
parent ee5314fec9
commit 241d737f9a
5 changed files with 72 additions and 5 deletions

48
SWSCloudNode/network.py Normal file
View file

@ -0,0 +1,48 @@
# coding: utf-8
import re
import os
from netaddr import *
class Detect(object):
def __init__(self):
self.iplist = list()
def list_bridges(self):
return os.popen('ifconfig').read()
def detect(self, ip_for_vm):
ip4vm = IPAddress(ip_for_vm)
c = list()
for paragraph in self.list_bridges().split('\n\n'):
# ma = re.compile("(br\d+).*HWaddr ([^ ]+).*addr:([^ ]+).*Mask:([^ ]+)", re.MULTILINE | re.DOTALL)
ma = re.compile("(virbr\d+|br\d+|br\d:\d+) .*HWaddr ([^ ]+).*addr:([^ ]+).*Mask:([^ ]+)", re.MULTILINE | re.DOTALL)
result = ma.match(paragraph)
if result:
vlan = result.group(1).rstrip()
mac = result.group(2).rstrip()
ip = result.group(3).rstrip()
mask = result.group(4).rstrip()
# inrange
ip.split('.')
m = mac.split(':')
mac = m[0] + m[1] + "." + m[2] + m[3] + "." + m[4] + m[5]
# print "vlan:", vlan
# print "ip:",ip
# print "mac:", mac
ipn = IPNetwork(ip, mask)
c.append(dict(interface=vlan, ip=ip, mask=mask, mac=mac, valid=True if ip4vm in ipn else False))
return c
def get_suitable_interface(self, ip):
for interface in self.detect(ip):
if interface['valid']:
return interface['interface']

View file

@ -26,8 +26,8 @@ if os.path.exists(settings_file):
sys.exit() sys.exit()
else: else:
if settings.get('node', 'interface') not in os.listdir('/sys/class/net/'): if settings.get('node', 'interface') not in os.listdir('/sys/class/net/'):
logging.error('Interface not found: %s' % settings.get('node', 'interface')) logging.warning('Interface not found: %s' % settings.get('node', 'interface'))
sys.exit() # sys.exit()
if not settings.has_option('node', 'sleep'): if not settings.has_option('node', 'sleep'):
logging.error("No option 'sleep' in section: 'node'") logging.error("No option 'sleep' in section: 'node'")
sys.exit() sys.exit()

View file

@ -4,6 +4,7 @@
import time import time
from SWSCloudNode.settings import settings from SWSCloudNode.settings import settings
from SWSCloudNode.logger import logging from SWSCloudNode.logger import logging
from SWSCloudNode.network import Detect
from SWSCloudNode import Node from SWSCloudNode import Node
from SWSCloudNode import Tasks from SWSCloudNode import Tasks
from SWSCloudNode import lxc, qemu from SWSCloudNode import lxc, qemu
@ -55,7 +56,10 @@ while True:
ipv6['ipv6'] = task['plain']['ipv6'] ipv6['ipv6'] = task['plain']['ipv6']
ipv6['ipv6_gateway'] = task['plain']['ipv6_gateway'] ipv6['ipv6_gateway'] = task['plain']['ipv6_gateway']
nodeclient.container_config_create(container_id, settings.get('node', 'interface'), ipv4, ipv6) # автоматически определяем подходящий сетевой интерфейс исходя из имеющегося ipv4
interface = Detect().get_suitable_interface(ipv4)
# interface = settings.get('node', 'interface')
nodeclient.container_config_create(container_id, interface, ipv4, ipv6)
container_config_file = '/var/lib/gocloud/node/configs/%s.config' % container_id container_config_file = '/var/lib/gocloud/node/configs/%s.config' % container_id
@ -137,10 +141,14 @@ while True:
# TODO: if container doesn't exists then complete task and report about this fact # TODO: if container doesn't exists then complete task and report about this fact
p = task['plain'] p = task['plain']
try: try:
# автоматически определяем подходящий сетевой интерфейс исходя из имеющегося ipv4
interface = Detect().get_suitable_interface(p['ipv4'])
# interface = settings.get('node', 'interface')
qemu.QEMU().create( qemu.QEMU().create(
p['cores'], p['memory'], p['storage'], p['swap'], p['hostname'], p['cores'], p['memory'], p['storage'], p['swap'], p['hostname'],
p['ipv4'], p['ipv4_gateway'], p['dns1'], p['dns2'], p['password'], p['ipv4'], p['ipv4_gateway'], p['dns1'], p['dns2'], p['password'],
p['os_name'], p['os_suite'], settings.get('node', 'interface'), p['os_name'], p['os_suite'], interface,
p['vm_id'], p['vm_id'],
p['ssh_key'], p['ssh_key'],
) )

11
extra/supervisor.conf Normal file
View file

@ -0,0 +1,11 @@
[program:cloudnode]
user=root
group=root
command=/usr/local/bin/cloud_node_agent.py
autostart=true
autorestart=true
startsecs=1
startretries=777
exitcodes=0,2
stopsignal=TERM
stopwaitsecs=1

View file

@ -4,7 +4,7 @@ from setuptools import setup
setup( setup(
name='SWSCloudNode', name='SWSCloudNode',
version='3.1.0', version='3.1.1',
author='Vyacheslav Anzhiganov', author='Vyacheslav Anzhiganov',
author_email='vanzhiganov@ya.ru', author_email='vanzhiganov@ya.ru',
packages=[ packages=[