예제 #1
0
class BaseStressTest(object, metaclass=StressTestMetaclass):
    def __init__(self, name, headers, raw=False):
        self.name = name
        self._otns_args = []
        if raw:
            self._otns_args.append('-raw')
        self.ns = OTNS(otns_args=self._otns_args)
        self.ns.speed = float('inf')
        self.ns.web()

        self.result = StressTestResult(name=name, headers=headers)
        self.result.start()

    def run(self):
        raise NotImplementedError()

    def reset(self):
        nodes = self.ns.nodes()
        if nodes:
            self.ns.delete(*nodes.keys())

    def stop(self):
        self.result.stop()
        self.ns.close()

    def expect_node_state(self,
                          nid: int,
                          state: str,
                          timeout: float,
                          go_step: int = 1) -> None:
        while timeout > 0:
            self.ns.go(go_step)
            timeout -= go_step

            if self.ns.get_state(nid) == state:
                return

        raise UnexpectedNodeState(nid, state, self.ns.get_state(nid))

    def report(self):
        try:
            STRESS_RESULT_FILE = os.environ['STRESS_RESULT_FILE']
            stress_result_fd = open(STRESS_RESULT_FILE, 'wt')
        except KeyError:
            stress_result_fd = sys.stdout

        try:
            stress_result_fd.write(
                f"""**[OTNS](https://github.com/openthread/ot-ns) Stress Tests Report Generated at {time.strftime(
                    "%m/%d %H:%M:%S")}**\n""")
            stress_result_fd.write(self.result.format())
        finally:
            if stress_result_fd is not sys.stdout:
                stress_result_fd.close()

    def avg_except_max(self, vals: Collection[float]) -> float:
        assert len(vals) >= 2
        max_val = max(vals)
        max_idxes = [i for i in range(len(vals)) if vals[i] >= max_val]
        assert max_idxes
        rmidx = max_idxes[0]
        vals[rmidx:rmidx + 1] = []
        return self.avg(vals)

    def avg(self, vals: Collection[float]) -> float:
        assert len(vals) > 0
        return sum(vals) / len(vals)

    def expect_all_nodes_become_routers(self, timeout: int = 1000) -> None:
        all_routers = False

        while timeout > 0 and not all_routers:
            self.ns.go(10)
            timeout -= 10

            nodes = (self.ns.nodes())

            all_routers = True
            print(nodes)
            for nid, info in nodes.items():
                if info['state'] not in ['leader', 'router']:
                    all_routers = False
                    break

            if all_routers:
                break

        if not all_routers:
            raise UnexpectedError("not all nodes are Routers: %s" %
                                  self.ns.nodes())

    def expect_node_addr(self, nodeid: int, addr: str, timeout=100):
        addr = ipaddress.IPv6Address(addr)

        found_addr = False
        while timeout > 0:
            if addr in map(ipaddress.IPv6Address, self.ns.get_ipaddrs(nodeid)):
                found_addr = True
                break

            self.ns.go(1)

        if not found_addr:
            raise UnexpectedNodeAddr(
                f'Address {addr} not found on node {nodeid}')

    def expect_node_mleid(self, nodeid: int, timeout: int):
        while True:
            mleid = self.ns.get_mleid(nodeid)
            if mleid:
                return mleid

            self.ns.go(1)
            timeout -= 1
            if timeout <= 0:
                raise UnexpectedNodeAddr(f'MLEID not found on node {nodeid}')
예제 #2
0
파일: ping.py 프로젝트: sbeyn/ot-ns
C1 = add_node("router", 950, 300)
C2 = add_node("router", 800, 700)
C3 = add_node("router", 1100, 700)


def ping(src: int, dst: int, duration: float):
    while duration > 0:
        ns.ping(src, dst)
        ns.go(1)
        duration -= 1


while True:
    ping(1, 11, 30)
    c1_rlocs = ns.get_ipaddrs(C1, "rloc")
    if c1_rlocs:
        for i in range(4):
            for id in (6, 7, 8, 9, 16, 17, 18, 19, C2, C3):
                ns.ping(id, c1_rlocs[0])

    ns.delete(C1)
    ping(1, 11, 30)
    ns.delete(C2)
    ns.delete(C3)
    ns.go(130)

    add_node("router", 950, 300, id=C1)
    add_node("router", 800, 700, id=C2)
    add_node("router", 1100, 700, id=C3)
    ns.go(10)
예제 #3
0
파일: ping.py 프로젝트: ctan-g/ot-ns
def main():
    logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s',
                        level=logging.DEBUG)

    ns = OTNS()
    ns.set_title("Ping Example")
    ns.set_network_info(version="Latest", commit="master", real=False)
    ns.web()

    ns.speed = 4

    def add_node(*args, **kwargs):
        return ns.add(*args, **kwargs, radio_range=RADIO_RANGE)

    add_node("fed", 100, 100)
    add_node("fed", 100, 300)
    add_node("fed", 100, 500)
    add_node("fed", 100, 700)
    add_node("fed", 100, 900)

    add_node("router", 450, 100)
    add_node("router", 550, 300)
    add_node("router", 450, 500)
    add_node("router", 550, 700)
    add_node("router", 450, 900)

    add_node("fed", 1800, 100)
    add_node("fed", 1800, 300)
    add_node("fed", 1800, 500)
    add_node("fed", 1800, 700)
    add_node("fed", 1800, 900)

    add_node("router", 1450, 100)
    add_node("router", 1350, 300)
    add_node("router", 1450, 500)
    add_node("router", 1350, 700)
    add_node("router", 1450, 900)

    C1 = add_node("router", 950, 300)
    C2 = add_node("router", 800, 700)
    C3 = add_node("router", 1100, 700)

    def ping(src: int, dst: int, duration: float):
        while duration > 0:
            ns.ping(src, dst)
            ns.go(1)
            duration -= 1

    while True:
        ping(1, 11, 30)
        c1_rlocs = ns.get_ipaddrs(C1, "rloc")
        if c1_rlocs:
            for i in range(4):
                for id in (6, 7, 8, 9, 16, 17, 18, 19, C2, C3):
                    ns.ping(id, c1_rlocs[0])

        ns.delete(C1)
        ping(1, 11, 30)
        ns.delete(C2)
        ns.delete(C3)
        ns.go(130)

        add_node("router", 950, 300, id=C1)
        add_node("router", 800, 700, id=C2)
        add_node("router", 1100, 700, id=C3)
        ns.go(10)