CLOUDSTACK-2327: make cloud-setup-agent ovs aware

Ovs brcompat will be obsolete, so if network.bridge.type was
set to openvswitch, we'll use ovs command explicitly.

Signed-off-by: Hiroaki KAWAI <kawai@stratosphere.co.jp>
This commit is contained in:
Hiroaki KAWAI 2013-05-23 20:15:35 +09:00
parent 6758d727a4
commit a16b707250
4 changed files with 70 additions and 17 deletions

View File

@ -95,6 +95,9 @@ if __name__ == '__main__':
parser.add_option("--prvNic", dest="prvNic", help="Private traffic interface") parser.add_option("--prvNic", dest="prvNic", help="Private traffic interface")
parser.add_option("--guestNic", dest="guestNic", help="Guest traffic interface") parser.add_option("--guestNic", dest="guestNic", help="Guest traffic interface")
old_config = configFileOps("@AGENTSYSCONFDIR@/agent.properties")
glbEnv.bridgeType = old_config.getEntry("network.bridge.type").lower()
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
if options.auto is None: if options.auto is None:
userInputs = getUserInputs() userInputs = getUserInputs()
@ -104,7 +107,7 @@ if __name__ == '__main__':
glbEnv.pod = userInputs[3] glbEnv.pod = userInputs[3]
glbEnv.cluster = userInputs[4] glbEnv.cluster = userInputs[4]
#generate UUID #generate UUID
glbEnv.uuid = configFileOps("@AGENTSYSCONFDIR@/agent.properties").getEntry("guid") glbEnv.uuid = old_config.getEntry("guid")
if glbEnv.uuid == "": if glbEnv.uuid == "":
glbEnv.uuid = bash("uuidgen").getStdout() glbEnv.uuid = bash("uuidgen").getStdout()
else: else:

View File

@ -40,3 +40,5 @@ class globalEnv:
self.privateNet = "cloudbr0" self.privateNet = "cloudbr0"
#distribution #distribution
self.distribution = None self.distribution = None
# bridgeType
self.bridgeType = "native"

View File

@ -19,6 +19,7 @@ from cloudException import CloudRuntimeException, CloudInternalException
import logging import logging
import os import os
import re import re
import subprocess
class networkConfig: class networkConfig:
class devInfo: class devInfo:
@ -85,15 +86,22 @@ class networkConfig:
@staticmethod @staticmethod
def isNetworkDev(devName): def isNetworkDev(devName):
return os.path.exists("/sys/class/net/%s"%devName) return os.path.exists("/sys/class/net/%s" % devName)
@staticmethod @staticmethod
def isBridgePort(devName): def isBridgePort(devName):
return os.path.exists("/sys/class/net/%s/brport"%devName) return os.path.exists("/sys/class/net/%s/brport" % devName)
@staticmethod @staticmethod
def isBridge(devName): def isBridge(devName):
return os.path.exists("/sys/class/net/%s/bridge"%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 @staticmethod
def getBridge(devName): def getBridge(devName):

View File

@ -94,8 +94,10 @@ class networkConfigBase:
if not self.netcfg.isNetworkDev(br): if not self.netcfg.isNetworkDev(br):
logging.debug("%s is not a network device, is it down?"%br) logging.debug("%s is not a network device, is it down?"%br)
return False return False
if not self.netcfg.isBridge(br): if self.syscfg.env.bridgeType == "openvswitch" and not self.netcfg.isOvsBridge(br):
raise CloudInternalException("%s is not a bridge"%br) raise CloudInternalException("%s is not an openvswitch bridge" % br)
if self.syscfg.env.bridgeType == "native" and not self.netcfg.isBridge(br):
raise CloudInternalException("%s is not a bridge" % br)
preCfged = True preCfged = True
return preCfged return preCfged
@ -153,11 +155,28 @@ class networkConfigUbuntu(serviceCfgBase, networkConfigBase):
match = re.match("^ *iface %s.*"%dev.name, line) match = re.match("^ *iface %s.*"%dev.name, line)
if match is not None: if match is not None:
dev.method = self.getNetworkMethod(match.group(0)) dev.method = self.getNetworkMethod(match.group(0))
cfo = configFileOps(self.netCfgFile, self)
if self.syscfg.env.bridgeType == "openvswitch":
bridgeCfg = "\n".join(("",
"iface {device} inet manual",
" ovs_type OVSPort",
" ovs_bridge {bridge}",
"",
"auto {bridge}",
"allow-ovs {bridge}",
"iface {bridge} inet {device_method}",
" ovs_type OVSBridge",
" ovs_ports {device}",
"")).format(bridge=br, device=dev.name, device_method=dev.method)
cfo.replace_line("^ *auto %s.*" % dev.name,
"allow-{bridge} {device}".format(bridge=br, device=dev.name))
elif self.syscfg.env.bridgeType == "native":
bridgeCfg = "\niface %s inet manual\n \ bridgeCfg = "\niface %s inet manual\n \
auto %s\n \ auto %s\n \
iface %s inet %s\n \ iface %s inet %s\n \
bridge_ports %s\n"%(dev.name, br, br, dev.method, dev.name) bridge_ports %s\n"%(dev.name, br, br, dev.method, dev.name)
cfo = configFileOps(self.netCfgFile, self) else:
raise CloudInternalException("Unknown network.bridge.type %s" % self.syscfg.env.bridgeType)
cfo.replace_line("^ *iface %s.*"%dev.name, bridgeCfg) cfo.replace_line("^ *iface %s.*"%dev.name, bridgeCfg)
def addDev(self, br, dev): def addDev(self, br, dev):
@ -193,8 +212,9 @@ class networkConfigUbuntu(serviceCfgBase, networkConfigBase):
self.syscfg.svo.stopService("network-manager") self.syscfg.svo.stopService("network-manager")
self.syscfg.svo.disableService("network-manager") self.syscfg.svo.disableService("network-manager")
if not bash("ifup %s"%self.brName).isSuccess(): ifup_op = bash("ifup %s"%self.brName)
raise CloudInternalException("Can't start network:%s"%self.brName, bash.getErrMsg(self)) if not ifup_op.isSuccess():
raise CloudInternalException("Can't start network:%s %s" % (self.brName, ifup_op.getErrMsg()))
self.syscfg.env.nics.append(self.brName) self.syscfg.env.nics.append(self.brName)
self.syscfg.env.nics.append(self.brName) self.syscfg.env.nics.append(self.brName)
@ -222,8 +242,8 @@ class networkConfigRedhat(serviceCfgBase, networkConfigBase):
networkConfigBase.__init__(self, syscfg) networkConfigBase.__init__(self, syscfg)
def writeToCfgFile(self, brName, dev): def writeToCfgFile(self, brName, dev):
self.devCfgFile = "/etc/sysconfig/network-scripts/ifcfg-%s"%dev.name self.devCfgFile = "/etc/sysconfig/network-scripts/ifcfg-%s" % dev.name
self.brCfgFile = "/etc/sysconfig/network-scripts/ifcfg-%s"%brName self.brCfgFile = "/etc/sysconfig/network-scripts/ifcfg-%s" % brName
isDevExist = os.path.exists(self.devCfgFile) isDevExist = os.path.exists(self.devCfgFile)
isBrExist = os.path.exists(self.brCfgFile) isBrExist = os.path.exists(self.brCfgFile)
@ -241,7 +261,7 @@ class networkConfigRedhat(serviceCfgBase, networkConfigBase):
def addBridge(self, brName, dev): def addBridge(self, brName, dev):
bash("ifdown %s"%dev.name) bash("ifdown %s" % dev.name)
if not os.path.exists(self.brCfgFile): if not os.path.exists(self.brCfgFile):
shutil.copy(self.devCfgFile, self.brCfgFile) shutil.copy(self.devCfgFile, self.brCfgFile)
@ -250,14 +270,34 @@ class networkConfigRedhat(serviceCfgBase, networkConfigBase):
cfo = configFileOps(self.devCfgFile, self) cfo = configFileOps(self.devCfgFile, self)
cfo.addEntry("NM_CONTROLLED", "no") cfo.addEntry("NM_CONTROLLED", "no")
cfo.addEntry("ONBOOT", "yes") cfo.addEntry("ONBOOT", "yes")
if self.syscfg.env.bridgeType == "openvswitch":
if cfo.getEntry("IPADDR"):
cfo.rmEntry("IPADDR", cfo.getEntry("IPADDR"))
cfo.addEntry("DEVICETYPE", "ovs")
cfo.addEntry("TYPE", "OVSPort")
cfo.addEntry("OVS_BRIDGE", brName)
elif self.syscfg.env.bridgeType == "native":
cfo.addEntry("BRIDGE", brName) cfo.addEntry("BRIDGE", brName)
else:
raise CloudInternalException("Unknown network.bridge.type %s" % self.syscfg.env.bridgeType)
cfo.save() cfo.save()
cfo = configFileOps(self.brCfgFile, self) cfo = configFileOps(self.brCfgFile, self)
cfo.addEntry("NM_CONTROLLED", "no") cfo.addEntry("NM_CONTROLLED", "no")
cfo.addEntry("ONBOOT", "yes") cfo.addEntry("ONBOOT", "yes")
cfo.addEntry("DEVICE", brName) cfo.addEntry("DEVICE", brName)
if self.syscfg.env.bridgeType == "openvswitch":
if cfo.getEntry("HWADDR"):
cfo.rmEntry("HWADDR", cfo.getEntry("HWADDR"))
if cfo.getEntry("UUID"):
cfo.rmEntry("UUID", cfo.getEntry("UUID"))
cfo.addEntry("STP", "yes")
cfo.addEntry("DEVICETYPE", "ovs")
cfo.addEntry("TYPE", "OVSBridge")
elif self.syscfg.env.bridgeType == "native":
cfo.addEntry("TYPE", "Bridge") cfo.addEntry("TYPE", "Bridge")
else:
raise CloudInternalException("Unknown network.bridge.type %s" % self.syscfg.env.bridgeType)
cfo.save() cfo.save()
def config(self): def config(self):