Пример #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.netmask)])
                ]
            else:
                cmd = [
                    'ifconfig', self.stacked_dev, self.addr, 'netmask',
                    to_dotted(self.netmask), 'up'
                ]
        else:
            cmd = [
                Env.syspaths.ip, "addr", "add",
                '/'.join([self.addr, to_cidr(self.netmask)]), "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 utilities.ping.check_ping(self.addr, timeout=1, count=1):
                return ret, out, err
        self.log.error("timed out waiting for ip activation")
        raise ex.Error
Пример #2
0
 def is_up(self):
     cmd = [
         Env.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.netmask is None:
         self.status_log("netmask not specified nor guessable")
     elif _mask != to_cidr(self.netmask):
         self.status_log("wrong netmask: %s, expected %s" %
                         (_mask, to_cidr(self.netmask)))
         return True
     return True
Пример #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.netmask is None:
             self.status_log("netmask is not set nor guessable")
         elif current_mask != to_cidr(self.netmask):
             self.status_log("current netmask %s, expected %s" %
                             (current_mask, to_cidr(self.netmask)))
         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.netmask):
             self.status_log("current netmask %s, expected %s" %
                             (current_mask, to_cidr(self.netmask)))
         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
Пример #4
0
    def get_sysidcfg_network_interfaces(self):
        network_interfaces = []
        for rid in self.get_encap_ip_rids():
            ipdev = self.get_encap_conf(rid, 'ipdev')
            try:
                default_route = self.get_encap_conf(rid, 'gateway')
            except (ex.RequiredOptNotFound, ex.OptNotFound):
                default_route = None

            try:
                netmask_conf = self.get_encap_conf(rid, 'netmask')
            except (ex.RequiredOptNotFound, ex.OptNotFound):
                netmask_conf = None
            if netmask_conf is None:
                netmask = None
            else:
                netmask = cidr_to_dotted(to_cidr(netmask_conf))
            ipname = self.get_encap_conf(rid, 'ipname')
            addr = getaddr(ipname, True)
            if len(network_interfaces) == 0:
                network_interface = "network_interface=PRIMARY {primary hostname=%s\n" % self.name
                network_interface += "    default_route=%s\n" % default_route
            else:
                network_interface = "network_interface=%s {\n" % ipdev
            network_interface += "    ip_address=%s\n" % addr
            if netmask:
                network_interface += "    netmask=%s\n" % netmask
            network_interface += "    protocol_ipv6=no}\n"
            network_interfaces.append(network_interface)
        return network_interfaces
Пример #5
0
    def get_install_ipv4_interfaces(self):
        """
         returns list of InstallIpv4Interface tha will be used to create sc_profile
        """
        from .configuration_profile import InstallIpv4Interface
        ipv4_interfaces = []
        for rid in self.get_encap_ip_rids():
            try:
                ipdevext = self.get_encap_conf(rid, 'ipdevext')
            except (ex.RequiredOptNotFound, ex.OptNotFound):
                ipdevext = 'v4'
            ipdev = self.get_encap_conf(rid, 'ipdev')
            ipv4_name = '%s/%s' % (ipdev, ipdevext)

            try:
                default_route = self.get_encap_conf(rid, 'gateway')
            except (ex.RequiredOptNotFound, ex.OptNotFound):
                default_route = None

            try:
                netmask = to_cidr(self.get_encap_conf(rid, 'netmask'))
            except (ex.RequiredOptNotFound, ex.OptNotFound):
                continue
            ipname = self.get_encap_conf(rid, 'ipname')
            addr = getaddr(ipname, True)
            ipv4_interface = InstallIpv4Interface(ipv4_name,
                                                  static_address='%s/%s' %
                                                  (addr, netmask),
                                                  address_type='static',
                                                  default_route=default_route,
                                                  id=len(ipv4_interfaces))
            ipv4_interfaces.append(ipv4_interface)
        return ipv4_interfaces
Пример #6
0
    def stopip_cmd(self):
        intf = self.get_docker_interface()
        if intf is None:
            raise ex.ContinueAction(
                "can't find on which interface %s is plumbed in container %s" %
                (self.addr, self.container_id()))
        if self.netmask is None:
            raise ex.ContinueAction("netmask is not set")
        cmd = [
            Env.syspaths.nsenter, "--net=" + self.netns, "ip", "addr", "del",
            self.addr + "/" + to_cidr(self.netmask), "dev", intf
        ]
        ret, out, err = self.vcall(cmd)
        cmd = [
            Env.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
Пример #7
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 = [
            Env.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 = [
            Env.syspaths.ip, "link", "set", tmp_local_dev, "master", self.ipdev
        ]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err
        cmd = [Env.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 = [Env.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 = [
            Env.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 = [
            Env.syspaths.nsenter, "--net=" + self.netns, "ip", "addr", "add",
            self.addr + "/" + to_cidr(self.netmask), "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, "", ""
Пример #8
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.Error
         cmd = ['ifconfig', self.stacked_dev, 'inet6', self.addr+'/'+to_cidr(self.netmask), 'up']
     else:
         cmd = ['ifconfig', self.stacked_dev, self.addr, 'netmask', to_dotted(self.netmask), 'up']
     return self.vcall(cmd)
Пример #9
0
 def set_label(self):
     """
     Set the resource label property.
     """
     try:
         self.get_mask()
     except ex.Error:
         pass
     self.label = "netns %s %s/%s %s@%s" % (self.mode, self.ipname,
                                            to_cidr(self.netmask),
                                            self.ipdev, self.container_rid)
Пример #10
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 = [
            Env.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 = [Env.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 = [Env.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 = [
            Env.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 = [
            Env.syspaths.nsenter, "--net=" + self.netns, "ip", "addr", "add",
            "%s/%s" % (self.addr, to_cidr(self.netmask)), "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, "", ""
Пример #11
0
    def ip_setup_route(self):
        cmd = [
            Env.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 = [
            Env.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 = [
                Env.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 = [
                Env.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 = [
                Env.syspaths.nsenter, "--net=" + self.netns, "ip", "route",
                "del", self.network + "/" + to_cidr(self.netmask), "dev",
                self.final_guest_dev
            ]
            ret, out, err = self.vcall(cmd)
            if ret != 0:
                return ret, out, err

        # announce
        cmd = [Env.syspaths.nsenter, "--net=" + self.netns
               ] + Env.python_cmd + [
                   os.path.join(Env.paths.pathlib, "utilities", "arp.py"),
                   self.final_guest_dev, self.addr
               ]
        self.log.info(" ".join(cmd))
        out, err, ret = justcall(cmd)
Пример #12
0
 def startip_cmd(self):
     if ':' in self.addr:
         cmd = [
             'ifconfig', self.ipdev, 'inet6',
             '/'.join([self.addr, to_cidr(self.netmask)]), 'add'
         ]
     else:
         cmd = [
             'ifconfig', self.ipdev, 'inet', self.addr, 'netmask',
             '0xffffffff', 'add'
         ]
     return self.vcall(cmd)
Пример #13
0
    def startip_cmd_dedicated(self):
        # assign interface to the nspid
        nspid = self.get_nspid()
        if nspid is None:
            raise ex.Error("could not determine nspid")
        cmd = [
            Env.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 = [
            Env.syspaths.nsenter, "--net=" + self.netns, "ip", "addr", "add",
            "%s/%s" % (self.addr, to_cidr(self.netmask)), "dev",
            self.final_guest_dev
        ]
        ret, out, err = self.vcall(cmd)
        if ret != 0:
            return ret, out, err

        # activate
        cmd = [
            Env.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 = [
                Env.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 = [Env.syspaths.nsenter, "--net=" + self.netns
               ] + Env.python_cmd + [
                   os.path.join(Env.paths.pathlib, "utilities", "arp.py"),
                   self.final_guest_dev, self.addr
               ]
        self.log.info(" ".join(cmd))
        out, err, ret = justcall(cmd)

        return 0, "", ""
Пример #14
0
 def startip_cmd(self):
     if ':' in self.addr:
         cmd = [
             'ifconfig', self.ipdev, 'inet6', 'alias',
             '/'.join([self.addr, to_cidr(self.netmask)])
         ]
     else:
         cmd = [
             'ifconfig', self.ipdev, self.addr, 'netmask',
             to_dotted(self.netmask), 'alias'
         ]
     return self.vcall(cmd)
Пример #15
0
 def label(self): # pylint: disable=method-hidden
     intf = self.get_ipdev()
     label = "cni "
     label += self.network if self.network else ""
     if intf and len(intf.ipaddr) > 0:
         label += " %s/%s" % (intf.ipaddr[0], to_cidr(intf.mask[0]))
     elif intf and len(intf.ip6addr) > 0:
         label += " %s/%s" % (intf.ip6addr[0], intf.ip6mask[0])
     if self.ipdev:
         label += " %s" % self.ipdev
     if self.expose:
         label += " %s" % " ".join(self.expose)
     return label
Пример #16
0
 def startip_cmd(self):
     cmd = [
         "/usr/sbin/ifconfig",
         self.stacked_dev,
         "plumb",
         self.addr,
         "netmask",
         cidr_to_dotted(to_cidr(self.netmask)),
         "broadcast",
         "+",
         "up",
     ]
     return self.vcall(cmd)
Пример #17
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.netmask)])
             ]
         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 = [
                     Env.syspaths.ip, "addr", "del",
                     '/'.join([self.addr,
                               to_cidr(self.netmask)]), "dev", self.ipdev
                 ]
     else:
         cmd = [
             Env.syspaths.ip, "addr", "del",
             '/'.join([self.addr, to_cidr(self.netmask)]), "dev", self.ipdev
         ]
     return self.vcall(cmd)
Пример #18
0
 def set_label(self):
     """
     Set the resource label property.
     """
     try:
         self.get_mask()
     except ex.Error:
         pass
     try:
         self.getaddr()
         addr = self.addr
     except ex.Error:
         addr = self.ipname
     self.label = "%s/%s %s/%s" % (addr, to_cidr(
         self.netmask), self.ipdev, self.ipdevext)
     if self.ipname != addr:
         self.label += " " + self.ipname
Пример #19
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.Error:
         pass
     data = [
         ["ipaddr", self.addr],
         ["ipname", self.ipname],
         ["ipdev", self.ipdev],
         ["gateway", str(self.gateway)],
     ]
     if self.netmask is not None:
         data.append(["netmask", str(to_cidr(self.netmask))])
     return data
Пример #20
0
 def startip_cmd(self):
     if not which(Env.syspaths.ipadm):
         raise ex.Error("crossbow ips are not supported on this system")
     if self.netmask is None:
         raise ex.Error("netmask not specified nor guessable")
     self.wait_net_smf()
     ret, out, err = (0, '', '')
     cmd = [
         Env.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 = [Env.syspaths.ipadm, 'create-ip', '-t', self.stacked_dev]
         r, o, e = self.vcall(cmd)
     cmd = [
         Env.syspaths.ipadm, 'create-addr', '-t', '-T', 'static', '-a',
         self.addr + "/" + to_cidr(self.netmask),
         self.stacked_dev + '/' + self.ipdevext
     ]
     r, o, e = self.vcall(cmd)
     if r != 0:
         cmd = [Env.syspaths.ipadm, 'show-if']
         self.vcall(cmd)
         raise ex.Error(
             "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
Пример #21
0
    def _status_info(self):
        """
        Contribute resource key/val pairs to the resource info.
        """
        data = {}
        try:
            self.getaddr()
        except ex.Error:
            pass

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

        if self.ipdev:
            data["ipdev"] = self.ipdev
        if self.gateway:
            data["gateway"] = self.gateway
        if self.netmask is not None:
            data["netmask"] = to_cidr(self.netmask)
        if self.expose:
            data["expose"] = self.expose
        return data
Пример #22
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 = [
            Env.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 = [Env.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 = [Env.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 = [
            Env.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 = [
            Env.syspaths.nsenter, "--net=" + self.netns, "ip", "addr", "add",
            self.addr + "/" + to_cidr(self.netmask), "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, "", ""