Esempio n. 1
0
    def startip_cmd(self):
        if which("ifconfig") and self.alias:
            if ':' in self.addr:
                cmd = [
                    'ifconfig', self.ipdev, 'inet6', 'add',
                    '/'.join([self.addr, to_cidr(self.mask)])
                ]
            else:
                cmd = [
                    'ifconfig', self.stacked_dev, self.addr, 'netmask',
                    to_dotted(self.mask), 'up'
                ]
        else:
            cmd = [
                rcEnv.syspaths.ip, "addr", "add",
                '/'.join([self.addr, to_cidr(self.mask)]), "dev", self.ipdev
            ]

        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # ip activation may still be incomplete
        # wait for activation, to avoid startapp scripts to fail binding their listeners
        for i in range(5, 0, -1):
            if check_ping(self.addr, timeout=1, count=1):
                return ret, out, err
        self.log.error("timed out waiting for ip activation")
        raise ex.excError
Esempio n. 2
0
 def is_up(self):
     cmd = [rcEnv.syspaths.ipadm, "show-addr", "-p", "-o", "STATE,ADDR", self.ipdev+'/'+self.ipdevExt]
     out, err, ret = justcall(cmd)
     if ret != 0:
         # normal down state
         return False
     try:
         state, addr = out.strip("\n").split(":")
     except ValueError:
         self.status_log(out)
         return False
     if state != "ok":
         self.status_log("state: %s" % state)
         return False
     try:
         _addr, _mask = addr.split("/")
     except ValueError:
         self.status_log(out)
         return False
     if _addr != self.addr:
         self.status_log("wrong addr: %s" % addr)
         return False
     if self.mask is None:
         self.status_log("netmask not specified nor guessable")
     elif _mask != to_cidr(self.mask):
         self.status_log("wrong mask: %s, expected %s" % (_mask, to_cidr(self.mask)))
         return True
     return True
Esempio n. 3
0
 def _is_up(self, ifconfig):
     intf = ifconfig.has_param("ipaddr", self.addr)
     if intf is not None:
         if isinstance(intf.ipaddr, list):
             idx = intf.ipaddr.index(self.addr)
             current_mask = to_cidr(intf.mask[idx])
         else:
             current_mask = to_cidr(intf.mask)
         if self.mask is None:
             self.status_log("netmask is not set nor guessable")
         elif current_mask != to_cidr(self.mask):
             self.status_log("current mask %s, expected %s" %
                             (current_mask, to_cidr(self.mask)))
         ref_dev = intf.name.split(":")[0]
         if self.type == "ip" and ref_dev != self.ipdev:
             self.status_log("current dev %s, expected %s" %
                             (ref_dev, self.ipdev))
         return True
     intf = ifconfig.has_param("ip6addr", self.addr)
     if intf is not None:
         if isinstance(intf.ip6addr, list):
             idx = intf.ip6addr.index(self.addr)
             current_mask = to_cidr(intf.ip6mask[idx])
         else:
             current_mask = to_cidr(intf.ip6mask)
         if current_mask != to_cidr(self.mask):
             self.status_log("current mask %s, expected %s" %
                             (current_mask, to_cidr(self.mask)))
         ref_dev = intf.name.split(":")[0]
         if self.type == "ip" and ref_dev != self.ipdev:
             self.status_log("current dev %s, expected %s" %
                             (ref_dev, self.ipdev))
         return True
     return False
Esempio n. 4
0
 def set_label(self):
     """
     Set the resource label property.
     """
     try:
          self.get_mask()
     except ex.excError:
          pass
     self.label = "netns %s %s/%s %s@%s" % (self.mode, self.ipname, to_cidr(self.mask), self.ipdev, self.container_rid)
Esempio n. 5
0
 def startip_cmd(self):
     if ':' in self.addr:
         cmd = ['ifconfig', self.ipdev, 'inet6', 'up']
         (ret, out, err) = self.vcall(cmd)
         if ret != 0:
             raise ex.excError
         cmd = ['ifconfig', self.stacked_dev, 'inet6', self.addr+'/'+to_cidr(self.mask), 'up']
     else:
         cmd = ['ifconfig', self.stacked_dev, self.addr, 'netmask', to_dotted(self.mask), 'up']
     return self.vcall(cmd)
Esempio n. 6
0
 def startip_cmd(self):
     if ':' in self.addr:
         cmd = [
             'ifconfig', self.ipdev, 'inet6',
             '/'.join([self.addr, to_cidr(self.mask)]), 'add'
         ]
     else:
         cmd = [
             'ifconfig', self.ipdev, 'inet', self.addr, 'netmask',
             '0xffffffff', 'add'
         ]
     return self.vcall(cmd)
Esempio n. 7
0
 def startip_cmd(self):
     if ':' in self.addr:
         cmd = [
             'ifconfig', self.ipdev, 'inet6', 'alias',
             '/'.join([self.addr, to_cidr(self.mask)])
         ]
     else:
         cmd = [
             'ifconfig', self.ipdev, self.addr, 'netmask',
             to_dotted(self.mask), 'alias'
         ]
     return self.vcall(cmd)
Esempio n. 8
0
 def stopip_cmd(self):
     if which("ifconfig") and self.alias:
         if ':' in self.addr:
             cmd = [
                 'ifconfig', self.ipdev, 'inet6', 'del',
                 '/'.join([self.addr, to_cidr(self.mask)])
             ]
         else:
             if self.stacked_dev is None:
                 return 1, "", "no stacked dev found"
             if ":" in self.stacked_dev:
                 cmd = ['ifconfig', self.stacked_dev, 'down']
             else:
                 cmd = [
                     rcEnv.syspaths.ip, "addr", "del",
                     '/'.join([self.addr,
                               to_cidr(self.mask)]), "dev", self.ipdev
                 ]
     else:
         cmd = [
             rcEnv.syspaths.ip, "addr", "del",
             '/'.join([self.addr, to_cidr(self.mask)]), "dev", self.ipdev
         ]
     return self.vcall(cmd)
Esempio n. 9
0
 def set_label(self):
     """
     Set the resource label property.
     """
     try:
          self.get_mask()
     except ex.excError:
          pass
     try:
         self.getaddr()
         addr = self.addr
     except ex.excError:
         addr = self.ipname
     self.label = "%s/%s %s/%s" % (addr, to_cidr(self.mask), self.ipdev, self.ipdevExt)
     if self.ipname != addr:
         self.label += " " + self.ipname
Esempio n. 10
0
 def _info(self):
     """
     Contribute resource key/val pairs to the service's resinfo.
     """
     if self.ipname is None:
         return []
     try:
         self.getaddr()
     except ex.excError:
         pass
     data = [
         ["ipaddr", self.addr],
         ["ipname", self.ipname],
         ["ipdev", self.ipdev],
         ["gateway", str(self.gateway)],
     ]
     if self.mask is not None:
         data.append(["mask", str(to_cidr(self.mask))])
     return data
Esempio n. 11
0
    def _status_info(self):
        """
        Contribute resource key/val pairs to the resource info.
        """
        data = {}
        try:
            self.getaddr()
        except ex.excError:
            pass

        try:
            data["ipaddr"] = self.addr
        except:
            pass

        if self.ipdev:
            data["ipdev"] = self.ipdev
        if self.gateway:
            data["gateway"] = self.gateway
        if self.mask is not None:
            data["mask"] = to_cidr(self.mask)
        if self.expose:
            data["expose"] = self.expose
        return data
Esempio n. 12
0
 def startip_cmd(self):
     if not which(rcEnv.syspaths.ipadm):
         raise ex.excError("crossbow ips are not supported on this system")
     if self.mask is None:
         raise ex.excError("netmask not specified nor guessable")
     self.wait_net_smf()
     ret, out, err = (0, '', '')
     cmd = [rcEnv.syspaths.ipadm, 'show-if', '-p', '-o', 'state', self.stacked_dev]
     _out, err, ret = justcall(cmd)
     _out = _out.strip().split("\n")
     if len(_out) == 0:
         cmd=[rcEnv.syspaths.ipadm, 'create-ip', '-t', self.stacked_dev ]
         r, o, e = self.vcall(cmd)
     cmd=[rcEnv.syspaths.ipadm, 'create-addr', '-t', '-T', 'static', '-a', self.addr+"/"+to_cidr(self.mask), self.stacked_dev+'/'+self.ipdevExt]
     r, o, e = self.vcall(cmd)
     if r != 0:
         cmd=[rcEnv.syspaths.ipadm, 'show-if' ]
         self.vcall(cmd)
         raise ex.excError("Interface %s is not up. ipadm cannot create-addr over it. Retrying..." % self.stacked_dev)
     ret += r
     out += o
     err += e
     if self.gateway is not None:
         cmd=['route', '-q', 'add', 'default', self.gateway]
         r, o, e = self.call(cmd, info=True, outlog=False, errlog=False)
         ret += r
     return ret, out, err
Esempio n. 13
0
    def startip_cmd_shared_ovs(self):
        nspid = self.get_nspid()
        tmp_guest_dev = "v%spg%s" % (self.guest_dev, nspid)
        tmp_local_dev = "v%spl%s" % (self.guest_dev, nspid)
        mtu = self.ip_get_mtu()

        if not which("ovs-vsctl"):
            raise Exception("ovs-vsctl must be installed")

        # create peer devs
        cmd = [rcEnv.syspaths.ip, "link", "add", "name", tmp_local_dev, "mtu", mtu, "type", "veth", "peer", "name", tmp_guest_dev, "mtu", mtu]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        cmd = ["ovs-vsctl", "--may-exist", "add-port", self.ipdev, tmp_local_dev, "vlan_mode=%s" % self.vlan_mode]
        if self.vlan_tag is not None:
            cmd += ["tag=%s" % self.vlan_tag]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "up"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # assign the interface to the container namespace
        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # rename the tmp guest dev
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # plumb ip
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", self.addr+"/"+to_cidr(self.mask), "dev", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # setup default route
        self.ip_setup_route()

        return 0, "", ""
Esempio n. 14
0
    def startip_cmd_shared_bridge(self):
        nspid = self.get_nspid()
        tmp_guest_dev = "v%spg%s" % (self.guest_dev, nspid)
        tmp_local_dev = "v%spl%s" % (self.guest_dev, nspid)
        mtu = self.ip_get_mtu()

        # create peer devs
        cmd = [rcEnv.syspaths.ip, "link", "add", "name", tmp_local_dev, "mtu", mtu, "type", "veth", "peer", "name", tmp_guest_dev, "mtu", mtu]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # activate the parent dev
        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "master", self.ipdev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err
        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_local_dev, "up"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # assign the macvlan interface to the container namespace
        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # rename the tmp guest dev
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # set the mac addr
        self.set_macaddr()

        # plumb ip
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", self.addr+"/"+to_cidr(self.mask), "dev", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # setup default route
        self.ip_setup_route()

        return 0, "", ""
Esempio n. 15
0
    def startip_cmd_shared_macvlan(self):
        nspid = self.get_nspid()

        tmp_guest_dev = "ph%s%s" % (nspid, self.guest_dev)
        mtu = self.ip_get_mtu()

        # create a macvlan interface
        cmd = [rcEnv.syspaths.ip, "link", "add", "link", self.ipdev, "dev", tmp_guest_dev, "mtu", mtu, "type", "macvlan", "mode", "bridge"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # activate the parent dev
        cmd = [rcEnv.syspaths.ip, "link", "set", self.ipdev, "up"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # assign the macvlan interface to the container namespace
        cmd = [rcEnv.syspaths.ip, "link", "set", tmp_guest_dev, "netns", nspid]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # rename the tmp guest dev
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", tmp_guest_dev, "name", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # set the mac addr
        self.set_macaddr()

        # plumb the ip
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", "%s/%s" % (self.addr, to_cidr(self.mask)), "dev", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # setup default route
        self.ip_setup_route()

        return 0, "", ""
Esempio n. 16
0
    def startip_cmd_dedicated(self):
        # assign interface to the nspid
        nspid = self.get_nspid()
        if nspid is None:
            raise ex.excError("could not determine nspid")
        cmd = [rcEnv.syspaths.ip, "link", "set", self.ipdev, "netns", nspid, "name", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # plumb the ip
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "add", "%s/%s" % (self.addr, to_cidr(self.mask)), "dev", self.final_guest_dev]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # activate
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", self.final_guest_dev, "up"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # add default route
        if self.gateway:
            cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "add", "default", "via", self.gateway, "dev", self.final_guest_dev]
            ret, out, err = self.vcall(cmd)
            if ret != 0:
                return ret, out, err

        # announce
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns] + rcEnv.python_cmd + [os.path.join(rcEnv.paths.pathlib, "arp.py"), self.final_guest_dev, self.addr]
        self.log.info(" ".join(cmd))
        out, err, ret = justcall(cmd)

        return 0, "", ""
Esempio n. 17
0
    def ip_setup_route(self):
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "set", self.final_guest_dev, "up"]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "list", "default"]
        ret, out, err = self.call(cmd, errlog=False)
        if out.startswith("default via"):
            pass
        elif out.startswith("default dev") and not self.gateway:
            pass
        elif self.gateway:
            cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "replace", "default", "via", self.gateway]
            ret, out, err = self.vcall(cmd)
            if ret != 0:
                return ret, out, err
        else:
            cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "replace", "default", "dev", self.final_guest_dev]
            ret, out, err = self.vcall(cmd)
            if ret != 0:
                return ret, out, err

        if self.del_net_route and self.network:
            cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "route", "del", self.network+"/"+to_cidr(self.mask), "dev", self.final_guest_dev]
            ret, out, err = self.vcall(cmd)
            if ret != 0:
                return ret, out, err

        # announce
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns] + rcEnv.python_cmd + [os.path.join(rcEnv.paths.pathlib, "arp.py"), self.final_guest_dev, self.addr]
        self.log.info(" ".join(cmd))
        out, err, ret = justcall(cmd)
Esempio n. 18
0
    def stopip_cmd(self):
        intf = self.get_docker_interface()
        if intf is None:
            raise ex.excContinueAction("can't find on which interface %s is plumbed in container %s" % (self.addr, self.container_id()))
        if self.mask is None:
            raise ex.excContinueAction("netmask is not set")
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "addr", "del", self.addr+"/"+to_cidr(self.mask), "dev", intf]
        ret, out, err = self.vcall(cmd)
        cmd = [rcEnv.syspaths.nsenter, "--net="+self.netns, "ip", "link", "del", "dev", intf]
        ret, out, err = self.vcall(cmd)

        if self.mode == "ovs":
            self.log.info("ovs mode")
            ret, out, err = self.stopip_cmd_shared_ovs()

        self.unset_lazy("netns")
        return ret, out, err