diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsProcess.py b/systemvm/patches/debian/config/opt/cloud/bin/CsProcess.py deleted file mode 100644 index 2ed94c8bf39..00000000000 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsProcess.py +++ /dev/null @@ -1,27 +0,0 @@ -import os -import re -import CsHelper -import logging - -class CsProcess(object): - """ Manipulate processes """ - - def __init__(self, search): - self.search = search - - def start(self, thru, background = ''): - #if(background): - #cmd = cmd + " &" - logging.info("Started %s", " ".join(self.search)) - os.system("%s %s %s" % (thru, " ".join(self.search), background)) - - def find(self): - self.pid = [] - for i in CsHelper.execute("ps aux"): - items = len(self.search) - proc = re.split("\s+", i)[items*-1:] - matches = len([m for m in proc if m in self.search]) - if matches == items: - self.pid.append(re.split("\s+", i)[1]) - return len(self.pid) > 0 - diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsRule.py b/systemvm/patches/debian/config/opt/cloud/bin/CsRule.py deleted file mode 100644 index e1fe17162ef..00000000000 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsRule.py +++ /dev/null @@ -1,26 +0,0 @@ -import CsHelper -import logging - -class CsRule: - """ Manage iprules - Supported Types: - fwmark - """ - - def __init__(self, dev): - self.dev = dev - self.tableNo = dev[3] - self.table = "Table_%s" % (dev) - - def addMark(self): - if not self.findMark(): - cmd = "ip rule add fwmark %s table %s" % (self.tableNo, self.table) - CsHelper.execute(cmd) - logging.info("Added fwmark rule for %s" % (self.table)) - - def findMark(self): - srch = "from all fwmark 0x%s lookup %s" % (self.tableNo, self.table) - for i in CsHelper.execute("ip rule show"): - if srch in i.strip(): - return True - return False diff --git a/systemvm/patches/debian/config/opt/cloud/bin/configure.py b/systemvm/patches/debian/config/opt/cloud/bin/configure.py index aee91bd7fc6..e86bb197579 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/configure.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/configure.py @@ -20,7 +20,6 @@ import sys import os from merge import dataBag -from CsDatabag import CsDataBag, CsCmdLine from pprint import pprint import subprocess import logging @@ -38,7 +37,16 @@ from CsFile import CsFile from CsAddress import CsAddress, CsInterface, CsDevice, CsIP from CsApp import CsApache, CsPasswdSvc, CsDnsmasq from CsRoute import CsRoute +from fcntl import flock, LOCK_EX, LOCK_UN +from cs.CsDatabag import CsDataBag, CsCmdLine +import cs.CsHelper +from cs.CsNetfilter import CsNetfilters +from cs.CsDhcp import CsDhcp +from cs.CsRedundant import * +from cs.CsFile import CsFile +from cs.CsAddress import CsAddress +from cs.CsApp import CsApache, CsPasswdSvc, CsDnsmasq class CsPassword(CsDataBag): """ @@ -445,40 +453,42 @@ class CsForwardingRules(CsDataBag): self.fw.append(["nat","front","-A PREROUTING -d %s/32 -j DNAT --to-destination %s" % ( rule["public_ip"], rule["internal_ip"]) ]) self.fw.append(["nat","front","-A POSTROUTING -o %s -s %s/32 -j SNAT --to-source %s" % ( device, rule["internal_ip"], rule["public_ip"]) ]) + def main(argv): - fw = [] - logging.basicConfig(filename='/var/log/cloud.log', - level=logging.DEBUG, - format='%(asctime)s %(message)s') - - cl = CsCmdLine("cmdline", fw) - address = CsAddress("ips", fw) + config = CsConfig(False) + logging.basicConfig(filename= config.get_logger(), + level=config.get_level(), + format=config.get_format()) + config.set_cl() + cl = config.get_cmdline() + + address = CsAddress("ips", config) address.compare() address.process() - password = CsPassword("vmpassword", fw) + password = CsPassword("vmpassword", config) password.process() - metadata = CsVmMetadata('vmdata', fw) + metadata = CsVmMetadata('vmdata', config) metadata.process() - acls = CsAcl('networkacl', fw) + acls = CsAcl('networkacl', config) acls.process() - fwd = CsForwardingRules("forwardingrules", fw) + fwd = CsForwardingRules("forwardingrules", config) fwd.process() - vpns = CsSite2SiteVpn("site2sitevpn", fw) + vpns = CsSite2SiteVpn("site2sitevpn", config) vpns.process() - red = CsRedundant(cl, address) + red = CsRedundant(config, address) red.set() nf = CsNetfilters() - nf.compare(fw) + nf.compare(config.get_fw()) - dh = CsDataBag("dhcpentry", fw) - dhcp = CsDhcp(dh.get_bag(), cl) + dh = CsDataBag("dhcpentry") + dhcp = CsDhcp(dh.get_bag(), config.get_cmdline()) if __name__ == "__main__": main(sys.argv) diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsAddress.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsAddress.py similarity index 89% rename from systemvm/patches/debian/config/opt/cloud/bin/CsAddress.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsAddress.py index b767e3ebb24..c552f40ff5d 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsAddress.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsAddress.py @@ -24,11 +24,13 @@ import subprocess from CsRoute import CsRoute from CsRule import CsRule +VRRP_TYPES = [ 'guest', 'public' ] + class CsAddress(CsDataBag): def compare(self): - for dev in CsDevice('', self.fw).list(): - ip = CsIP(dev, self.fw) + for dev in CsDevice('', self.config).list(): + ip = CsIP(dev, self.config) ip.compare(self.dbag) def get_ips(self): @@ -44,7 +46,7 @@ class CsAddress(CsDataBag): """ Returns if the ip needs to be managed by keepalived or not """ - if "nw_type" in o and o['nw_type'] in [ 'guest' ]: + if "nw_type" in o and o['nw_type'] in VRRP_TYPES: return True return False @@ -61,7 +63,7 @@ class CsAddress(CsDataBag): for dev in self.dbag: if dev == "id": continue - ip = CsIP(dev, self.fw) + ip = CsIP(dev, self.config) addcnt = 0 for address in self.dbag[dev]: if not address["nw_type"] == "control": @@ -72,7 +74,7 @@ class CsAddress(CsDataBag): ip.post_configure() else: logging.info("Address %s on device %s not configured", ip.ip(), dev) - if CsDevice(dev, self.fw).waitfordevice(): + if CsDevice(dev, self.config).waitfordevice(): ip.configure() # This could go one level up but the ip type is stored in the # ip address object and not in the device object @@ -132,7 +134,7 @@ class CsInterface: """ Returns if the ip needs to be managed by keepalived or not """ - if "nw_type" in self.address and self.address['nw_type'] in [ 'guest' ]: + if "nw_type" in self.address and self.address['nw_type'] in VRRP_TYPES: return True return False @@ -146,7 +148,7 @@ class CsInterface: class CsDevice: """ Configure Network Devices """ - def __init__(self, dev, fw): + def __init__(self, dev, config): self.devlist = [] self.dev = dev self.buildlist() @@ -155,7 +157,8 @@ class CsDevice: if dev != '': self.tableNo = dev[3] self.table = "Table_%s" % dev - self.fw = fw + self.fw = config.get_fw() + self.cl = config.get_cmdline() def configure_rp(self): """ @@ -191,26 +194,18 @@ class CsDevice: def list(self): return self.devlist - def setUp(self): - """ Ensure device is up """ - cmd = "ip link show %s | grep 'state DOWN'" % self.dev - for i in CsHelper.execute(cmd): - if " DOWN " in i: - cmd2 = "ip link set %s up" % self.dev - CsHelper.execute(cmd2) - cmd = "-A PREROUTING -i %s -m state --state NEW -j CONNMARK --set-xmark 0x%s/0xffffffff" % \ - (self.dev, self.dev[3]) - self.fw.append(["mangle", "", cmd]) class CsIP: - def __init__(self, dev, fw): + def __init__(self, dev, config): self.dev = dev self.iplist = {} self.address = {} self.list() - self.fw = fw + self.fw = config.get_fw() + self.cl = config.get_cmdline() + self.config = config def setAddress(self, address): self.address = address @@ -230,11 +225,28 @@ class CsIP: route = CsRoute(self.dev) route.routeTable() CsRule(self.dev).addMark() - CsDevice(self.dev, self.fw).setUp() + self.check_is_up() + self.set_mark() self.arpPing() CsRpsrfs(self.dev).enable() self.post_config_change("add") + def check_is_up(self): + """ Ensure device is up """ + cmd = "ip link show %s | grep 'state DOWN'" % self.getDevice() + for i in CsHelper.execute(cmd): + if " DOWN " in i: + cmd2 = "ip link set %s up" % self.getDevice() +# Do not change the state of ips on a master redundant router that are managed by vrrp + if self.cl.is_master() or \ + not self.needs_vrrp(): + CsHelper.execute(cmd2) + + def set_mark(self): + cmd = "-A PREROUTING -i %s -m state --state NEW -j CONNMARK --set-xmark 0x%s/0xffffffff" % \ + (self.getDevice(), self.getDevice()[3]) + self.fw.append(["mangle", "", cmd]) + def get_type(self): """ Return the type of the IP guest @@ -260,7 +272,7 @@ class CsIP: # On deletion nw_type will no longer be known if self.get_type() in [ "guest" ]: devChain = "ACL_INBOUND_%s" % (self.dev) - CsDevice(self.dev, self.fw).configure_rp() + CsDevice(self.dev, self.config).configure_rp() self.fw.append(["nat", "front", "-A POSTROUTING -s %s -o %s -j SNAT --to-source %s" % \ @@ -283,14 +295,11 @@ class CsIP: pwdsvc = CsPasswdSvc(self).setup() elif self.get_type() == "public": if self.address["source_nat"] == True: - cmdline = CsDataBag("cmdline", self.fw) - dbag = cmdline.get_bag() - type = dbag["config"]["type"] - if type == "vpcrouter": - vpccidr = dbag["config"]["vpccidr"] + if self.cl.get_type() == "vpcrouter": + vpccidr = self.cl.get_vpccidr() self.fw.append(["filter", "", "-A FORWARD -s %s ! -d %s -j ACCEPT" % (vpccidr, vpccidr)]) self.fw.append(["nat","","-A POSTROUTING -j SNAT -o %s --to-source %s" % (self.dev, self.address['public_ip'])]) - elif type == "router": + elif self.cl.get_type() == "router": logging.error("Not able to setup sourcenat for a regular router yet") else: logging.error("Unable to process source nat configuration for router of type %s" % type) @@ -309,6 +318,14 @@ class CsIP: return True return False + def needs_vrrp(self): + """ + Returns if the ip needs to be managed by keepalived or not + """ + if "nw_type" in self.address and self.address['nw_type'] in VRRP_TYPES: + return True + return False + def ip(self): return str(self.address['cidr']) diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsApp.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsApp.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsApp.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsApp.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsConfig.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsConfig.py new file mode 100644 index 00000000000..5568eb289c0 --- /dev/null +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsConfig.py @@ -0,0 +1,51 @@ +# -- coding: utf-8 -- +# 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 CsDatabag import CsCmdLine +import logging + +class CsConfig(object): + """ + A class to cache all the stuff that the other classes need + """ + __LOG_FILE = "/var/log/cloud.log" + __LOG_LEVEL = "DEBUG" + __LOG_FORMAT = "%(asctime)s %(levelname)-8s %(message)s" + + def __init__(self, load = False): + if load: + self.cl = self_set_cl() + self.fw = [] + + def set_cl(self): + self.cl = CsCmdLine("cmdline") + + def get_cmdline(self): + return self.cl + + def get_fw(self): + return self.fw + + def get_logger(self): + return self.__LOG_FILE + + def get_level(self): + return self.__LOG_LEVEL + + def get_format(self): + return self.__LOG_FORMAT diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsDatabag.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDatabag.py similarity index 76% rename from systemvm/patches/debian/config/opt/cloud/bin/CsDatabag.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsDatabag.py index 224d2875e22..230b623ea09 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsDatabag.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDatabag.py @@ -19,13 +19,16 @@ from merge import dataBag class CsDataBag(object): - def __init__(self, key, fw = None): + def __init__(self, key, config = None): self.data = {} self.db = dataBag() self.db.setKey(key) self.db.load() self.dbag = self.db.getDataBag() - self.fw = fw + if config: + self.fw = config.get_fw() + self.cl = config.get_cmdline() + self.config = config def dump(self): print self.dbag @@ -45,6 +48,7 @@ class CsDataBag(object): class CsCmdLine(CsDataBag): """ Get cmdline config parameters """ + def is_redundant(self): if "redundant_router" in self.dbag['config']: return self.dbag['config']['redundant_router'] == "true" @@ -62,3 +66,16 @@ class CsCmdLine(CsDataBag): else: return "unknown" + def get_vpccidr(self): + if "vpccidr" in self.dbag['config']: + return self.dbag['config']['vpccidr'] + else: + return "unknown" + + def is_master(self): + if not self.is_redundant(): + return False + if "redundant_master" in self.dbag['config']: + return self.dbag['config']['redundant_master'] == "true" + return False + diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsDhcp.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsDhcp.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsDhcp.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsFile.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsFile.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsFile.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsFile.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsGuestNetwork.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsGuestNetwork.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsGuestNetwork.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsGuestNetwork.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsHelper.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsHelper.py similarity index 85% rename from systemvm/patches/debian/config/opt/cloud/bin/CsHelper.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsHelper.py index 0b8d56a8abd..46f4c31b358 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsHelper.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsHelper.py @@ -1,3 +1,20 @@ +# -- coding: utf-8 -- +# 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. """ General helper functions for use in the configuation process diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsNetfilter.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsNetfilter.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsNetfilter.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsNetfilter.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsProcess.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsProcess.py new file mode 100644 index 00000000000..ed274324cda --- /dev/null +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsProcess.py @@ -0,0 +1,44 @@ +# -- coding: utf-8 -- +# 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. +import os +import re +import CsHelper +import logging + +class CsProcess(object): + """ Manipulate processes """ + + def __init__(self, search): + self.search = search + + def start(self, thru, background = ''): + #if(background): + #cmd = cmd + " &" + logging.info("Started %s", " ".join(self.search)) + os.system("%s %s %s" % (thru, " ".join(self.search), background)) + + def find(self): + self.pid = [] + for i in CsHelper.execute("ps aux"): + items = len(self.search) + proc = re.split("\s+", i)[items*-1:] + matches = len([m for m in proc if m in self.search]) + if matches == items: + self.pid.append(re.split("\s+", i)[1]) + return len(self.pid) > 0 + diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsRedundant.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRedundant.py similarity index 76% rename from systemvm/patches/debian/config/opt/cloud/bin/CsRedundant.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsRedundant.py index 980fa807cce..4bdde9760e6 100644 --- a/systemvm/patches/debian/config/opt/cloud/bin/CsRedundant.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRedundant.py @@ -37,6 +37,7 @@ from CsDatabag import CsDataBag, CsCmdLine import logging import CsHelper from CsFile import CsFile +from CsConfig import CsConfig class CsRedundant(object): @@ -55,8 +56,8 @@ class CsRedundant(object): CONNTRACKD_CONFIG = "/etc/conntrackd/conntrackd.conf" - def __init__(self, cl, address): - self.cl = cl + def __init__(self, config, address): + self.cl = config.get_cmdline() self.address = address def set(self): @@ -119,11 +120,53 @@ class CsRedundant(object): cron.add("*/1 * * * * root $SHELL %s/check_heartbeat.sh 2>&1 > /dev/null" % self.CS_ROUTER_DIR, -1) cron.commit() + def set_fault(self): + """ Set fault mode on this router """ + if not self.cl.is_redundant(): + logging.error("Set fault called on non-redundant router") + return + logging.info("Router switched to fault mode") + ads = [o for o in self.address.get_ips() if o.needs_vrrp()] + for o in ads: + CsHelper.execute("ifconfig %s down" % o.get_device()) + cmd = "%s -C %s" % (self.CONNTRACKD_BIN, self.CONNTRACKD_CONFIG) + CsHelper.execute("%s -s" % cmd) + CsHelper.service("ipsec", "stop") + CsHelper.service("xl2tpd", "stop") + CsHelper.service("cloud-passwd-srvr", "stop") + CsHelper.service("dnsmasq", "stop") + cl.dbag['config']['redundant_master'] = "false" + cl.save() + + def set_backup(self): + """ Set the current router to backup """ + if not self.cl.is_redundant(): + logging.error("Set backup called on non-redundant router") + return + if not self.cl.is_master(): + logging.error("Set backup called on node that is already backup") + return + logging.info("Router switched to backup mode") + ads = [o for o in self.address.get_ips() if o.needs_vrrp()] + for o in ads: + CsHelper.execute("ifconfig %s down" % o.get_device()) + cmd = "%s -C %s" % (self.CONNTRACKD_BIN, self.CONNTRACKD_CONFIG) + CsHelper.execute("%s -d" % cmd) + CsHelper.service("ipsec", "stop") + CsHelper.service("xl2tpd", "stop") + CsHelper.service("cloud-passwd-srvr", "stop") + CsHelper.service("dnsmasq", "stop") + self.cl.dbag['config']['redundant_master'] = "false" + self.cl.save() + def set_master(self): - """ - This will enable all the public ips on the router - It is part of the process that sets the current router to master - """ + """ Set the current router to master """ + if not self.cl.is_redundant(): + logging.error("Set master called on non-redundant router") + return + if self.cl.is_master(): + logging.error("Set master called on master node") + return ads = [o for o in self.address.get_ips() if o.needs_vrrp()] for o in ads: CsHelper.execute("ifconfig %s down" % o.get_device()) @@ -140,6 +183,9 @@ class CsRedundant(object): CsHelper.service("xl2tpd", "restart") CsHelper.service("cloud-passwd-srvr", "restart") CsHelper.service("dnsmasq", "restart") + self.cl.dbag['config']['redundant_master'] = "true" + self.cl.save() + logging.info("Router switched to master mode") def _collect_ignore_ips(self): """ diff --git a/systemvm/patches/debian/config/opt/cloud/bin/CsRoute.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRoute.py similarity index 100% rename from systemvm/patches/debian/config/opt/cloud/bin/CsRoute.py rename to systemvm/patches/debian/config/opt/cloud/bin/cs/CsRoute.py diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRule.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRule.py new file mode 100644 index 00000000000..62cfdf172b7 --- /dev/null +++ b/systemvm/patches/debian/config/opt/cloud/bin/cs/CsRule.py @@ -0,0 +1,40 @@ +# -- coding: utf-8 -- +# 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. +class CsRule: + """ Manage iprules + Supported Types: + fwmark + """ + + def __init__(self, dev): + self.dev = dev + self.tableNo = dev[3] + self.table = "Table_%s" % (dev) + + def addMark(self): + if not self.findMark(): + cmd = "ip rule add fwmark %s table %s" % (self.tableNo, self.table) + CsHelper.execute(cmd) + logging.info("Added fwmark rule for %s" % (self.table)) + + def findMark(self): + srch = "from all fwmark 0x%s lookup %s" % (self.tableNo, self.table) + for i in CsHelper.execute("ip rule show"): + if srch in i.strip(): + return True + return False diff --git a/systemvm/patches/debian/config/opt/cloud/bin/cs/__init__.py b/systemvm/patches/debian/config/opt/cloud/bin/cs/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/systemvm/patches/debian/config/opt/cloud/bin/master.py b/systemvm/patches/debian/config/opt/cloud/bin/master.py index e89a5ef1c44..01cebadce68 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/master.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/master.py @@ -17,11 +17,36 @@ # specific language governing permissions and limitations # under the License. -from CsRedundant import CsRedundant -from CsDatabag import CsCmdLine -from CsAddress import CsAddress +from cs.CsRedundant import CsRedundant +from cs.CsDatabag import CsCmdLine +from cs.CsAddress import CsAddress +from cs.CsConfig import CsConfig +from optparse import OptionParser + +parser = OptionParser() +parser.add_option("-m", "--master", + action="store_true", default=False, dest="master", + help="Set router master") +parser.add_option("-b", "--backup", + action="store_true", default=False, dest="backup", + help="Set router backup") +parser.add_option("-f", "--fault", + action="store_true", default=False, dest="fault", + help="Notify Fault") +(options, args) = parser.parse_args() + +config = CsConfig(False) +logging.basicConfig(filename= config.get_logger(), + level=config.get_level(), + format=config.get_format()) +config.set_cl() +cl = CsCmdLine("cmdline", config) -cl = CsCmdLine("cmdline") address = CsAddress("ips") -red = CsRedundant(cl, address) -red.set_master() +red = CsRedundant(config, address) + +if options.master: + red.set_master() + +if options.backup: + red.set_backup() diff --git a/systemvm/patches/debian/config/opt/cloud/bin/set_redundant.py b/systemvm/patches/debian/config/opt/cloud/bin/set_redundant.py index 1b97e0ad4a6..b2d6db88010 100755 --- a/systemvm/patches/debian/config/opt/cloud/bin/set_redundant.py +++ b/systemvm/patches/debian/config/opt/cloud/bin/set_redundant.py @@ -19,8 +19,9 @@ # This file is used by the tests to switch the redundancy status -from CsDatabag import CsCmdLine +from cs.CsConfig import CsConfig from optparse import OptionParser +import logging parser = OptionParser() parser.add_option("-e", "--enable", @@ -32,10 +33,15 @@ parser.add_option("-d", "--disable", (options, args) = parser.parse_args() -cl = CsCmdLine("cmdline") -if options.enable: - cl.dbag['config']['redundant_router'] = "true" -if options.disable: - cl.dbag['config']['redundant_router'] = "false" +config = CsConfig(False) +logging.basicConfig(filename= config.get_logger(), + level=config.get_level(), + format=config.get_format()) +config.set_cl() -cl.save() +if options.enable: + config.get_cmdline().dbag['config']['redundant_router'] = "true" +if options.disable: + config.get_cmdline().dbag['config']['redundant_router'] = "false" + +config.get_cmdline().save() diff --git a/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ b/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ index ac9f1780365..1e75070ca9c 100644 --- a/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ +++ b/systemvm/patches/debian/config/opt/cloud/templates/keepalived.conf.templ @@ -51,7 +51,7 @@ vrrp_instance inside_network { heartbeat } - notify_master "/opt/cloud/bin/master.py" - notify_backup "[RROUTER_BIN_PATH]/backup.sh" - notify_fault "[RROUTER_BIN_PATH]/fault.sh" + notify_master "/opt/cloud/bin/master.py --master" + notify_backup "/opt/cloud/bin/master.py --backup" + notify_fault "/opt/cloud/bin/master.py --fault" }