| 44 | |
| 45 | |
| 46 | class CsRedundant(object): |
| 47 | |
| 48 | CS_RAMDISK_DIR = "/ramdisk" |
| 49 | CS_PRIO_UP = 1 |
| 50 | CS_PRIO_DOWN = -1 |
| 51 | CS_ROUTER_DIR = "%s/rrouter" % CS_RAMDISK_DIR |
| 52 | CS_TEMPLATES = [ |
| 53 | "heartbeat.sh.templ", "check_heartbeat.sh.templ", |
| 54 | "arping_gateways.sh.templ" |
| 55 | ] |
| 56 | CS_TEMPLATES_DIR = "/opt/cloud/templates" |
| 57 | CONNTRACKD_BIN = "/usr/sbin/conntrackd" |
| 58 | CONNTRACKD_KEEPALIVED_CONFLOCK = "/var/lock/conntrack.lock" |
| 59 | CONNTRACKD_CONF = "/etc/conntrackd/conntrackd.conf" |
| 60 | RROUTER_LOG = "/var/log/cloud.log" |
| 61 | KEEPALIVED_CONF = "/etc/keepalived/keepalived.conf" |
| 62 | |
| 63 | def __init__(self, config): |
| 64 | self.cl = config.cmdline() |
| 65 | self.address = config.address() |
| 66 | self.config = config |
| 67 | |
| 68 | def set(self): |
| 69 | logging.debug("Router redundancy status is %s", self.cl.is_redundant()) |
| 70 | if self.cl.is_redundant(): |
| 71 | self._redundant_on() |
| 72 | else: |
| 73 | self._redundant_off() |
| 74 | |
| 75 | def _redundant_off(self): |
| 76 | CsHelper.service("conntrackd", "stop") |
| 77 | CsHelper.service("keepalived", "stop") |
| 78 | CsHelper.umount_tmpfs(self.CS_RAMDISK_DIR) |
| 79 | CsHelper.rmdir(self.CS_RAMDISK_DIR) |
| 80 | CsHelper.rm(self.CONNTRACKD_CONF) |
| 81 | CsHelper.rm(self.KEEPALIVED_CONF) |
| 82 | |
| 83 | def _redundant_on(self): |
| 84 | guest = self.address.get_guest_if() |
| 85 | |
| 86 | # No redundancy if there is no guest network |
| 87 | if guest is None: |
| 88 | self.set_backup(restart_conntrackd=False) |
| 89 | self._redundant_off() |
| 90 | return |
| 91 | |
| 92 | interfaces = [interface for interface in self.address.get_interfaces() if interface.is_guest()] |
| 93 | isDeviceReady = False |
| 94 | dev = '' |
| 95 | for interface in interfaces: |
| 96 | if dev == interface.get_device(): |
| 97 | continue |
| 98 | dev = interface.get_device() |
| 99 | logging.info("Wait for devices to be configured so we can start keepalived") |
| 100 | devConfigured = CsDevice(dev, self.config).waitfordevice() |
| 101 | if devConfigured: |
| 102 | command = "ip link show %s | grep 'state UP'" % dev |
| 103 | devUp = CsHelper.execute(command) |
no outgoing calls