62: Определение подходящего сетевого интервейса по имеющемуся ipv4
This commit is contained in:
parent
ee5314fec9
commit
241d737f9a
5 changed files with 72 additions and 5 deletions
48
SWSCloudNode/network.py
Normal file
48
SWSCloudNode/network.py
Normal 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']
|
|
@ -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()
|
||||||
|
|
|
@ -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
11
extra/supervisor.conf
Normal 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
|
2
setup.py
2
setup.py
|
@ -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=[
|
||||||
|
|
Loading…
Add table
Reference in a new issue