mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	(cherry picked from commit 0ef6084d2c838a78eda29d258b1af98df96451b3) Signed-off-by: Wei Zhou <w.zhou@leaseweb.com>
		
			
				
	
	
		
			165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Licensed to the Apache Software Foundation (ASF) under one
 | |
| # or more contributor license agreements.  See the NOTICE file
 | |
| # distributed with this work for additional information
 | |
| # regarding copyright ownership.  The ASF licenses this file
 | |
| # to you under the Apache License, Version 2.0 (the
 | |
| # "License"); you may not use this file except in compliance
 | |
| # with the License.  You may obtain a copy of the License at
 | |
| # 
 | |
| #   http://www.apache.org/licenses/LICENSE-2.0
 | |
| # 
 | |
| # Unless required by applicable law or agreed to in writing,
 | |
| # software distributed under the License is distributed on an
 | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | |
| # KIND, either express or implied.  See the License for the
 | |
| # specific language governing permissions and limitations
 | |
| # under the License.
 | |
| from utilities import bash
 | |
| from cloudException import CloudRuntimeException, CloudInternalException
 | |
| import logging
 | |
| import os
 | |
| import re
 | |
| import subprocess
 | |
| 
 | |
| class networkConfig:
 | |
|     class devInfo:
 | |
|         def __init__(self, macAddr, ipAddr, netmask, gateway, type, name):
 | |
|             self.name = name
 | |
|             self.macAdrr = macAddr
 | |
|             self.ipAddr = ipAddr
 | |
|             self.netmask = netmask
 | |
|             self.gateway = gateway
 | |
|             self.type = type
 | |
|             self.name = name
 | |
|             #dhcp or static
 | |
|             self.method = None 
 | |
|      
 | |
|     @staticmethod
 | |
|     def listNetworks():
 | |
|         devs = os.listdir("/sys/class/net/") 
 | |
|         devs = filter(networkConfig.isBridge, devs) 
 | |
|         return devs
 | |
|     @staticmethod
 | |
|     def getDefaultNetwork():
 | |
|         cmd = bash("route -n|awk \'/^0.0.0.0/ {print $2,$8}\'") 
 | |
|         if not cmd.isSuccess():
 | |
|             logging.debug("Failed to get default route")
 | |
|             raise CloudRuntimeException("Failed to get default route")
 | |
| 
 | |
|         result = cmd.getStdout().split(" ")
 | |
|         gateway = result[0]
 | |
|         dev = result[1]
 | |
| 
 | |
|         pdi = networkConfig.getDevInfo(dev)
 | |
|         logging.debug("Found default network device:%s"%pdi.name)
 | |
|         pdi.gateway = gateway
 | |
|         return pdi
 | |
| 
 | |
|     @staticmethod
 | |
|     def createBridge(dev, brName):
 | |
|         if not networkConfig.isBridgeSupported():
 | |
|             logging.debug("bridge is not supported")
 | |
|             return False
 | |
|         if networkConfig.isBridgeEnslavedWithDevices(brName):
 | |
|             logging.debug("bridge: %s has devices enslaved"%brName)
 | |
|             return False
 | |
| 
 | |
|         cmds = ""
 | |
|         if not networkConfig.isBridge(brName):
 | |
|             cmds = "brctl addbr %s ;"%brName
 | |
|     
 | |
|         cmds += "ifconfig %s up;"%brName
 | |
|         cmds += "brctl addif %s %s"%(brName, dev)
 | |
|         return bash(cmds).isSuccess()
 | |
| 
 | |
|     @staticmethod
 | |
|     def isBridgeEnslavedWithDevices(brName):
 | |
|         if not networkConfig.isBridge(brName):
 | |
|             return False        
 | |
| 
 | |
|         if not os.listdir("/sys/class/net/%s/brif"%brName):
 | |
|             return False           
 | |
| 
 | |
|         return True
 | |
| 
 | |
|     @staticmethod
 | |
|     def isBridgeSupported():
 | |
|         if os.path.exists("/proc/sys/net/bridge"):
 | |
|             return True
 | |
| 
 | |
|         return bash("modprobe -b bridge").isSucess()
 | |
| 
 | |
|     @staticmethod
 | |
|     def isNetworkDev(devName):
 | |
|         return os.path.exists("/sys/class/net/%s" % devName)
 | |
| 
 | |
|     @staticmethod
 | |
|     def isBridgePort(devName):
 | |
|         return os.path.exists("/sys/class/net/%s/brport" % devName)
 | |
|     
 | |
|     @staticmethod
 | |
|     def isBridge(devName):
 | |
|         return os.path.exists("/sys/class/net/%s/bridge" % devName)
 | |
| 
 | |
|     @staticmethod
 | |
|     def isOvsBridge(devName):
 | |
|         try:
 | |
|             return 0==subprocess.check_call(("ovs-vsctl", "br-exists", devName))
 | |
|         except subprocess.CalledProcessError:
 | |
|             return False
 | |
| 
 | |
|     @staticmethod
 | |
|     def getBridge(devName):
 | |
|         bridgeName = None
 | |
|         if os.path.exists("/sys/class/net/%s/brport/bridge"%devName):
 | |
|             realPath = os.path.realpath("/sys/class/net/%s/brport/bridge"%devName)
 | |
|             bridgeName = realPath.split("/")[-1] 
 | |
|         return bridgeName
 | |
| 
 | |
|     @staticmethod
 | |
|     def getEnslavedDev(br, brPort):
 | |
|         if not networkConfig.isBridgeEnslavedWithDevices(br):
 | |
|             return None
 | |
| 
 | |
|         for dev in os.listdir("/sys/class/net/%s/brif"%br):
 | |
|             br_port = int(file("/sys/class/net/%s/brif/%s/port_no"%(br,dev)).readline().strip("\n"), 16)
 | |
|             if br_port == brPort:
 | |
|                 return dev
 | |
| 
 | |
|         return None
 | |
|         
 | |
|     @staticmethod
 | |
|     def getDevInfo(dev):
 | |
|         if not networkConfig.isNetworkDev(dev):
 | |
|             logging.debug("dev: " + dev + " is not a network device")
 | |
|             raise CloudInternalException("dev: " + dev + " is not a network device")
 | |
| 
 | |
|         netmask = None
 | |
|         ipAddr = None
 | |
|         macAddr = None
 | |
| 
 | |
|         cmd = bash("ifconfig " + dev)
 | |
|         if not cmd.isSuccess():
 | |
|             logging.debug("Failed to get address from ifconfig")
 | |
|             raise CloudInternalException("Failed to get network info by ifconfig %s"%dev)
 | |
| 
 | |
|         for line in cmd.getLines():
 | |
|             if line.find("HWaddr") != -1:
 | |
|                 macAddr = line.split("HWaddr ")[1].strip(" ")
 | |
|             elif line.find("inet ") != -1:
 | |
|                 m = re.search("addr:(.*)\ *Bcast:(.*)\ *Mask:(.*)", line)
 | |
|                 if m is not None:
 | |
|                     ipAddr = m.group(1).rstrip(" ")
 | |
|                     netmask = m.group(3).rstrip(" ")
 | |
| 
 | |
|         if networkConfig.isBridgePort(dev):
 | |
|             type = "brport"
 | |
|         elif networkConfig.isBridge(dev):
 | |
|             type = "bridge"
 | |
|         else:
 | |
|             type = "dev"
 | |
| 
 | |
|         return networkConfig.devInfo(macAddr, ipAddr, netmask, None, type, dev)
 | |
| 
 | |
| 
 |