Example #1
0
 def runTest(self):
     board.sendline(
         'rm -f /etc/config/samba; opkg update; opkg install --force-reinstall samba36-server samba36-client kmod-fs-cifs'
     )
     board.expect('Configuring samba36-server')
     board.expect(prompt)
     board.sendline(
         'mkdir -p /tmp/samba; chmod a+rwx /tmp/samba; rm -rf /tmp/samba/*')
     board.expect(prompt)
     board.sendline(
         'uci set samba.@samba[0].homes=0; uci delete samba.@sambashare[0]; uci add samba sambashare; uci set samba.@sambashare[0]=sambashare; uci set samba.@sambashare[0].name="boardfarm-test"; uci set samba.@sambashare[0].path="/tmp/samba"; uci set samba.@sambashare[0].read_only="no"; uci set samba.@sambashare[0].guest_ok="yes"; uci commit samba'
     )
     board.expect(prompt)
     board.sendline('/etc/init.d/samba restart')
     board.sendline('smbclient -N -L 127.0.0.1')
     board.expect('boardfarm-test')
     board.expect(prompt)
     lan.sendline('smbclient -N -L %s' %
                  board.get_interface_ipaddr(board.lan_iface))
     lan.expect('boardfarm-test')
     lan.expect(prompt)
     lan.sendline(
         'mkdir -p /mnt/samba; mount -o guest //%s/boardfarm-test /mnt/samba'
         % board.get_interface_ipaddr(board.lan_iface))
     lan.expect(prompt)
     lan.sendline('echo boardafarm-testing-string > /mnt/samba/test')
     lan.expect(prompt)
     lan.sendline('umount /mnt/samba')
     lan.expect(prompt)
     board.sendline('cat /tmp/samba/test')
     board.expect('boardafarm-testing-string')
     board.expect(prompt)
 def server_opts_reverse(self, node=lan):
     try:
         lan_priv_ip = node.get_interface_ipaddr(lan.iface_dut)
     except:
         lan_priv_ip = node.get_interface_ipaddr("wlan0")
     board.uci_forward_traffic_redirect("tcp", "5001", lan_priv_ip)
     self.rip = board.get_interface_ipaddr(board.wan_iface)
     return ""
Example #3
0
 def runTest(self):
     if not lan:
         msg = 'No LAN Device defined, skipping ping test from LAN.'
         lib.common.test_msg(msg)
         self.skipTest(msg)
     router_ip = board.get_interface_ipaddr(board.lan_iface)
     lan.sendline('\nping -i 0.2 -c 5 %s' % router_ip)
     lan.expect('PING ')
     lan.expect('5 (packets )?received', timeout=15)
     lan.expect(prompt)
    def runTest(self):
        wan.sendline('apt-get -o DPkg::Options::="--force-confnew" -y --force-yes install snmp')
        wan.expect(prompt)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        wan.sendline('snmpget -v2c -c public %s 1.3.6.1.2.1.1.1.0' % wan_ip)
        wan.expect('iso.3.6.1.2.1.1.1.0 = STRING: ')
        wan.expect(prompt)

        self.result_message = wan.before
Example #5
0
 def runTest(self):
     lan.sendline('nmap -sS -A -v -p 1-10000 %s' %
                  board.get_interface_ipaddr(board.lan_iface))
     lan.expect('Starting Nmap')
     for i in range(12):
         if 0 == lan.expect(['Nmap scan report', pexpect.TIMEOUT],
                            timeout=100):
             break
         board.touch()
     lan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", lan.before)
     msg = "Found %s open TCP ports on LAN interface: %s." % \
         (len(open_ports), ", ".join(open_ports))
     self.result_message = msg
    def runTest(self):
        super(NetperfUdpTest, self).runTest()

        self.run_netperf(
            lan, "192.168.0.1 -c -C -l 30 -t UDP_STREAM -- -m 1460 -M 1460")

        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr(lan.iface_dut)
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("udp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        self.run_netperf(
            wan, wan_ip,
            "-c -C -l 30 -t UDP_STREAM -- -P ,12866 -m 1460 -M 1460")
Example #7
0
 def runTest(self):
     wan_ip_addr = board.get_interface_ipaddr(board.wan_iface)
     wan.sendline('\nnmap -sS -A -v %s' % wan_ip_addr)
     wan.expect('Starting Nmap', timeout=5)
     wan.expect(pexpect.TIMEOUT, timeout=60)
     board.touch()
     wan.expect(pexpect.TIMEOUT, timeout=60)
     board.touch()
     wan.expect(pexpect.TIMEOUT, timeout=60)
     board.touch()
     wan.expect('Nmap scan report', timeout=60)
     wan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", wan.before)
     msg = "Found %s open TCP ports on WAN interface." % len(open_ports)
     self.result_message = msg
     print("open ports = %s" % open_ports)
     if hasattr(board, 'wan_open_ports'):
         print("allowing open ports %s" % board.wan_open_ports)
         open_ports = set(map(int, open_ports)) - set(board.wan_open_ports)
     assert len(open_ports) == 0
    def runTest(self):
        super(SshWanDetect, self).runTest()

        board.uci_allow_wan_ssh()

        ipaddr = board.get_interface_ipaddr(board.wan_iface)
        port = "22"

        if wan:
            t = wan
        else:
            t = pexpect.spawn("bash")

        sp = lib.common.spawn_ssh_pexpect(ipaddr,
                                          "root",
                                          "password",
                                          prompt="root@OpenWrt",
                                          port=port,
                                          via=wan)
        sp.sendline("exit")
Example #9
0
    def runTest(self):
        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr(lan.iface_dut)
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("tcp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        board.sendline('mpstat -P ALL 30 1')
        speed = self.run_netperf(wan, wan_ip,
                                 "-c -C -l 30 -t TCP_STREAM -- -P ,12866")
        board.expect(
            'Average.*idle\r\nAverage:\s+all(\s+[0-9]+.[0-9]+){10}\r\n')
        idle_cpu = float(board.match.group(1))
        avg_cpu = 100 - float(idle_cpu)
        lib.common.test_msg("Average cpu usage was %s" % avg_cpu)

        self.result_message = "Setup NetperfReverse and Ran Throughput (Speed = %s 10^6bits/sec, CPU = %s)" % (
            speed, avg_cpu)
 def forward_ip(self):
     return board.get_interface_ipaddr(board.lan_iface)
Example #11
0
    def runTest(self):
        if 'cdrouter_server' in self.config.board:
            self.cdrouter_server = self.config.board['cdrouter_server']
        elif self.config.cdrouter_server is not None:
            self.cdrouter_server = self.config.cdrouter_server

        if 'cdrouter_wan_iface' in self.config.board:
            self.cdrouter_wan_iface = self.config.board['cdrouter_wan_iface']
        else:
            self.cdrouter_wan_iface = self.config.cdrouter_wan_iface

        if 'cdrouter_lan_iface' in self.config.board:
            self.cdrouter_lan_iface = self.config.board['cdrouter_lan_iface']
        else:
            self.cdrouter_lan_iface = self.config.cdrouter_lan_iface

        if self.tests is None:
            self.skipTest("No tests defined!")

        if self.cdrouter_server is None:
            self.skipTest("No cdrouter server specified")

        lan.sendline('ifconfig %s down' % lan.iface_dut)
        lan.expect(prompt)

        if not board.has_cmts:
            wan.sendline('ifconfig %s down' % wan.iface_dut)
            wan.expect(prompt)

        c = CDRouter(self.cdrouter_server)

        try:
            board.sendcontrol('c')
            board.expect(prompt)
            board.sendline('reboot')
            board.expect('reboot: Restarting system')
        except:
            board.reset()
        board.wait_for_linux()
        board.wait_for_network()

        # Add extra board specific delay
        board.expect(pexpect.TIMEOUT, timeout=getattr(board, 'cdrouter_bootdelay', 0))

        # If alt mac addr is specified in config, use that..
        # CMTS = we route so no wan mac is used
        # if we route, we need to add routes
        wandutmac = None
        if board.has_cmts and wan.wan_cmts_provisioner:
            # TODO: there are more missing ones CDrouter expects
            wan.sendline('ip route add 200.0.0.0/8 via 192.168.3.2')
            wan.expect(prompt)
        elif not wan.static_ip:
            for device in self.config.board['devices']:
                if device['name'] == 'wan':
                    if 'alt_macaddr' in device:
                        wandutmac = device['alt_macaddr']
                    break

            # Otherwise grab this from the device interface
            if wandutmac is None:
                board.sendline('ifconfig %s' % board.wan_iface)
                board.expect('([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})')
                wandutmac = board.match.group()
                board.expect(prompt)

            print("Using %s for WAN mac address" % wandutmac)

        lan.vlan = wan.vlan = 0
        for device in self.config.board['devices']:
            d = None
            if device['name'] == 'wan':
                d = wan
            elif device['name'] == 'lan':
                d = lan
            else:
                continue

            if d is not None:
                d.vlan = getattr(device, 'vlan', 0)
            if d.vlan == 0:
                d.sendline('cat /proc/net/vlan/config')
                d.expect_exact('cat /proc/net/vlan/config')
                if 0 == d.expect([pexpect.TIMEOUT, '%s.*\|\s([0-9]+).*\|' % d.iface_dut], timeout=5):
                    d.vlan = 0
                else:
                    d.vlan = d.match.group(1)
                d.expect(prompt)

        print("Using %s for WAN vlan" % wan.vlan)
        print("Using %s for LAN vlan" % lan.vlan)

        # TODO: move wan and lan interface to bft config?
        contents="""
testvar wanInterface """ + self.cdrouter_wan_iface
        if wandutmac is not None:
            contents=contents +"""
testvar wanDutMac """ + wandutmac

        if wan.vlan != 0:
            contents=contents + """
testvar wanVlanId """ + wan.vlan

        contents=contents + """
testvar lanInterface """ + self.cdrouter_lan_iface

        if lan.vlan != 0:
            contents=contents + """
testvar lanVlanId """ + lan.vlan

        def add_cdrouter_config(config):
            cdr_conf = None

            # TODO: make a generic helper to search path and overlays
            if os.path.isfile(config):
                cdr_conf = open(config, 'r').readlines()
            elif 'BFT_OVERLAY' in os.environ:
                for p in os.environ['BFT_OVERLAY'].split(' '):
                    p = os.path.realpath(p)
                    try:
                        cdr_conf = open(os.path.join(p, config), 'r').readlines()
                    except:
                        continue
                    else:
                        break

            return "\n" + "".join(cdr_conf)

        # Take config from overall config, but fallback to board config
        if self.config.cdrouter_config is not None:
            contents = contents + add_cdrouter_config(self.config.cdrouter_config)
        elif board.cdrouter_config is not None:
            contents = contents + add_cdrouter_config(board.cdrouter_config)

        if self.extra_config:
            contents=contents + "\n" + self.extra_config.replace(',', '\n')

        if board.has_cmts:
            for i in range(5):
                try:
                    wan_ip = board.get_interface_ipaddr(board.erouter_iface)
                except:
                    board.expect(pexpect.TIMEOUT, timeout=15)
                    continue
                else:
                    if i == 4:
                        raise Exception("Failed to get erouter ip address")
                    break

            # TODO: mask from config? wanNatIp vs. wanIspAssignGateway?
            contents=contents + """
testvar wanMode static
testvar wanIspIp %s
testvar wanIspGateway %s
testvar wanIspMask 255.255.255.0
testvar wanIspAssignIp %s
testvar wanNatIp %s
testvar IPv4HopCount %s
testvar lanDnsServer %s
testvar wanDnsServer %s""" % (self.config.board['cdrouter_wanispip'], \
                              self.config.board['cdrouter_wanispgateway'], \
                              wan_ip, wan_ip, \
                              self.config.board['cdrouter_ipv4hopcount'], \
                              board.get_dns_server(), \
                              board.get_dns_server_upstream())

        print("Using below for config:")
        print(contents)
        print("#######################")

        config_name="bft-automated-job-%s" % str(time.time()).replace('.', '')
        cfg = c.configs.create(Config(name=config_name, contents=contents))

        p = c.packages.create(Package(name=config_name,
                                      testlist=self.tests,
                                      config_id=cfg.id))

        self.start_time = time.time()
        j = c.jobs.launch(Job(package_id=p.id))

        while j.result_id is None:
            if (time.time() - self.start_time) > 300:
                # delete job if it fails to start
                c.jobs.delete(j.id)
                raise Exception("Failed to start CDrouter job")

            board.expect(pexpect.TIMEOUT, timeout=1)
            j = c.jobs.get(j.id)

        print('Job Result-ID: {0}'.format(j.result_id))

        self.job_id = j.result_id
        self.results = c.results
        unpaused = False
        end_of_start = False
        no_more_pausing = False
        while True:
            r = c.results.get(j.result_id)
            print(r.status)

            # we are ready to go from boardfarm reset above
            if r.status == "paused" and unpaused == False:
                c.results.unpause(j.result_id)
                unpaused = True
                board.expect(pexpect.TIMEOUT, timeout=1)
                c.results.pause(j.result_id, when="end-of-test")
                end_of_start = True
                continue


            if r.status == "paused" and end_of_start == True:
                end_of_start = False
                # TODO: do we need this anymore? we have board specific cdrouter_bootdelay
                board.expect(pexpect.TIMEOUT, timeout=60)
                c.results.unpause(j.result_id)
                board.expect(pexpect.TIMEOUT, timeout=1)
                no_more_pausing = True
                continue

            if no_more_pausing and r.status == "paused":
                print("Error: test is still paused")
                c.results.stop(j.result_id)
                break

            if r.status != "running" and r.status != "paused":
                break

            board.expect(pexpect.TIMEOUT, timeout=5)

        print(r.result)
        self.result_message = r.result.encode('ascii','ignore')
        # TODO: results URL?
        elapsed_time = time.time() - self.start_time
        print("Test took %s" % time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))

        summary = c.results.summary_stats(j.result_id)

        self.result_message += " (Failed= %s, Passed = %s, Skipped = %s)" \
                % (summary.result_breakdown.failed, \
                   summary.result_breakdown.passed, \
                   summary.result_breakdown.skipped)

        for test in summary.test_summaries:
            self.logged[test.name] = vars(test)

            if str(test.name) not in ["start", "final"]:
                from boardfarm.lib.common import TestResult
                try:
                    grade_map = {"pass": "******", "fail": "FAIL", "skip": "SKIP"}[test.result]
                    tr = TestResult(test.name, grade_map, test.description)
                    if test.started is not None:
                        tr.start_time = test.started
                        tr.stop_time = test.started + test.duration
                    else:
                        tr.elapsed_time = test.duration
                    self.subtests.append(tr)
                except:
                    continue

            # TODO: handle skipped tests

            try:
                metric = c.results.get(j.result_id, test.name, "bandwidth")
                print(vars(metric))
                # TODO: decide how to export data to kibana
            except:
                # Not all tests have this metric, no other way?
                pass


        assert (r.result == "The package completed successfully")

        self.recover()
    def runTest(self):
        from boardfarm.devices import cdrouter
        self.cdrouter_server = "http://" + cdrouter.ipaddr
        self.cdrouter_wan_iface = cdrouter.wan_iface
        self.cdrouter_lan_iface = cdrouter.lan_iface

        if self.tests is None:
            self.skipTest("No tests defined!")

        if self.cdrouter_server is None:
            self.skipTest("No cdrouter server specified")

        lan.sendline('ifconfig %s down' % lan.iface_dut)
        lan.expect(prompt)

        if not board.has_cmts:
            wan.sendline('ifconfig %s down' % wan.iface_dut)
            wan.expect(prompt)

        c = CDRouter(self.cdrouter_server)

        #try:
        #    board.sendcontrol('c')
        #    board.expect(prompt)
        #    board.sendline('reboot')
        #    board.expect('reboot: Restarting system')
        #except:
        #    board.reset()
        #board.wait_for_linux()
        #board.wait_for_network()

        ## Add extra board specific delay
        #board.expect(pexpect.TIMEOUT, timeout=getattr(board, 'cdrouter_bootdelay', 0))

        # If alt mac addr is specified in config, use that..
        # CMTS = we route so no wan mac is used
        # if we route, we need to add routes
        wandutmac = None
        if board.has_cmts:
            from boardfarm.devices import provisioner
            # TODO: there are more missing ones CDrouter expects
            provisioner.sendline('ip route add 200.0.0.0/8 via 192.168.3.2')
            provisioner.expect(prompt)
            provisioner.sendline('ip route add 3.3.3.3 via 192.168.3.2')
            provisioner.expect(prompt)
            provisioner.sendline(
                'ip route add 3001:cafe:1::/64 via 2001:dead:beef:1::2')
            provisioner.expect(prompt)
            provisioner.sendline(
                'ip route add 3001:51a:cafe::1 via 2001:dead:beef:1::2')
            provisioner.expect(prompt)
        elif not wan.static_ip:
            for device in self.config.board['devices']:
                if device['name'] == 'wan':
                    if 'alt_macaddr' in device:
                        wandutmac = device['alt_macaddr']
                    break

            # Otherwise grab this from the device interface
            if wandutmac is None:
                board.sendline('ifconfig %s' % board.wan_iface)
                board.expect('([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})')
                wandutmac = board.match.group()
                board.expect(prompt)

            print("Using %s for WAN mac address" % wandutmac)

        lan.vlan = wan.vlan = 0
        for device in self.config.board['devices']:
            d = None
            if device['name'] == 'wan':
                d = wan
            elif device['name'] == 'lan':
                d = lan
            else:
                continue

            if d is not None:
                d.vlan = getattr(device, 'vlan', 0)
            if d.vlan == 0:
                d.sendline('cat /proc/net/vlan/config')
                d.expect_exact('cat /proc/net/vlan/config')
                if 0 == d.expect(
                    [pexpect.TIMEOUT,
                     '%s.*\|\s([0-9]+).*\|' % d.iface_dut],
                        timeout=5):
                    d.vlan = 0
                else:
                    d.vlan = d.match.group(1)
                d.expect(prompt)

        # TODO: WIP
        wan.vlan = "136"
        print("Using %s for WAN vlan" % wan.vlan)
        print("Using %s for LAN vlan" % lan.vlan)

        # TODO: move wan and lan interface to bft config?
        contents = """
testvar wanInterface """ + self.cdrouter_wan_iface
        if wandutmac is not None:
            contents = contents + """
testvar wanDutMac """ + wandutmac

        if wan.vlan != 0:
            contents = contents + """
testvar wanVlanId """ + wan.vlan

        contents = contents + """
testvar lanInterface """ + self.cdrouter_lan_iface

        if lan.vlan != 0:
            contents = contents + """
testvar lanVlanId """ + lan.vlan

        if self.extra_config:
            contents = contents + "\n" + self.extra_config.replace(',', '\n')

        def add_cdrouter_config(config):
            p = os.path.realpath(config)
            cdr_conf = open(os.path.join(p, config), 'r').readlines()

            return "\n" + "".join(cdr_conf)

        if board.cdrouter_config is not None:
            contents = contents + add_cdrouter_config(board.cdrouter_config)

        if board.has_cmts:
            for i in range(5):
                exp = None
                try:
                    wan_ip = board.get_interface_ipaddr(board.erouter_iface)
                    # TODO: this breaks ipv6 only
                    wan_ip6 = board.get_interface_ip6addr(board.erouter_iface)

                    lan.start_lan_client()
                    lan_ip6 = lan.get_interface_ip6addr(lan.iface_dut)
                    ip6 = ipaddress.IPv6Network(six.text_type(lan_ip6))
                    fixed_prefix6 = str(
                        ip6.supernet(new_prefix=64).network_address)
                    break
                except Exception as e:
                    exp = e
                    board.expect(pexpect.TIMEOUT, timeout=15)
                    continue
            else:
                if i == 4:
                    raise exp

            # TODO: mask from config? wanNatIp vs. wanIspAssignGateway?
            contents=contents + """
testvar ipv6LanIp %s%%eui64%%
testvar ipv6LanPrefixLen 64
testvar healthCheckEnable yes
testvar supportsIPv6 yes
testvar ipv6WanMode static
testvar ipv6WanIspIp %s
testvar ipv6WanIspGateway %s
testvar ipv6WanIspAssignIp %s
testvar ipv6WanIspPrefixLen 64
testvar ipv6LanMode autoconf
testvar ipv6RemoteHost            3001:51a:cafe::1
testvar ipv6FreeNetworkStart      3001:cafe:1::
testvar ipv6FreeNetworkEnd        3001:cafe:ffff::
testvar ipv6FreeNetworkPrefixLen  64
testvar wanMode static
testvar wanIspIp %s
testvar wanIspGateway %s
testvar wanIspMask 255.255.255.128
testvar wanIspAssignIp %s
testvar wanNatIp %s
testvar remoteHostIp 3.3.3.3
testvar FreeNetworkStart 200.0.0.0
testvar FreeNetworkMask  255.255.255.0
testvar FreeNetworkStop  201.0.0.0
testvar IPv4HopCount %s
testvar lanDnsServer %s
testvar wanDnsServer %s
""" % (fixed_prefix6,
            cdrouter.wanispip_v6, \
       cdrouter.wanispgateway_v6, \
       wan_ip6, \
       cdrouter.wanispip, \
       cdrouter.wanispgateway, \
       wan_ip, wan_ip, \
       cdrouter.ipv4hopcount, \
       board.get_dns_server(), \
       board.get_dns_server_upstream())

        print("Using below for config:")
        print(contents)
        print("#######################")

        config_name = "bft-automated-job-%s" % str(time.time()).replace(
            '.', '')
        cfg = c.configs.create(Config(name=config_name, contents=contents))

        p = c.packages.create(
            Package(name=config_name, testlist=self.tests, config_id=cfg.id))

        self.start_time = time.time()
        j = c.jobs.launch(Job(package_id=p.id))

        while j.result_id is None:
            if (time.time() - self.start_time) > 300:
                # delete job if it fails to start
                c.jobs.delete(j.id)
                raise Exception("Failed to start CDrouter job")

            board.expect(pexpect.TIMEOUT, timeout=1)
            j = c.jobs.get(j.id)

        print('Job Result-ID: {0}'.format(j.result_id))

        self.job_id = j.result_id
        self.results = c.results
        unpaused = False
        end_of_start = False
        no_more_pausing = False
        while True:
            r = c.results.get(j.result_id)
            print(r.status)

            # we are ready to go from boardfarm reset above
            if r.status == "paused" and unpaused == False:
                c.results.unpause(j.result_id)
                unpaused = True
                board.expect(pexpect.TIMEOUT, timeout=1)
                c.results.pause(j.result_id, when="end-of-test")
                end_of_start = True
                continue

            if r.status == "paused" and end_of_start == True:
                end_of_start = False
                # TODO: do we need this anymore? we have board specific cdrouter_bootdelay
                board.expect(pexpect.TIMEOUT, timeout=60)
                c.results.unpause(j.result_id)
                board.expect(pexpect.TIMEOUT, timeout=1)
                no_more_pausing = True
                continue

            if no_more_pausing and r.status == "paused":
                print("Error: test is still paused")
                c.results.stop(j.result_id)
                break

            if r.status != "running" and r.status != "paused":
                break

            board.expect(pexpect.TIMEOUT, timeout=5)

        print(r.result)
        self.result_message = r.result.encode('ascii', 'ignore')
        # TODO: results URL?
        elapsed_time = time.time() - self.start_time
        print("Test took %s" %
              time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))

        summary = c.results.summary_stats(j.result_id)

        self.result_message = six.text_type(self.result_message) + \
                " (Failed= %s, Passed = %s, Skipped = %s)" \
                % (summary.result_breakdown.failed, \
                   summary.result_breakdown.passed, \
                   summary.result_breakdown.skipped)

        for test in summary.test_summaries:
            self.logged[test.name] = vars(test)

            if str(test.name) not in ["start", "final"]:
                try:
                    grade_map = {
                        "pass": "******",
                        "fail": "FAIL",
                        "skip": "SKIP"
                    }[test.result]
                    tr = TestResult(test.name, grade_map, test.description)
                    if test.started is not None:
                        tr.start_time = test.started
                        tr.stop_time = test.started + test.duration
                    else:
                        tr.elapsed_time = test.duration
                    self.subtests.append(tr)
                except:
                    continue

            # TODO: handle skipped tests

            try:
                metric = c.results.get(j.result_id, test.name, "bandwidth")
                print(vars(metric))
                # TODO: decide how to export data to kibana
            except:
                # Not all tests have this metric, no other way?
                pass

        assert (r.result == "The package completed successfully")

        self.recover()