{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial goal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This tutorial aims to show how to **configure** a **test environment** using\n",
    "the **TestEnv module** provided by LISA."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Configure logging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import logging\n",
    "from conf import LisaLogging\n",
    "LisaLogging.setup()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Execute this cell to enabled devlib debugging statements\n",
    "logging.getLogger('ssh').setLevel(logging.DEBUG)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Other python modules required by this notebook\n",
    "import json\n",
    "import time\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Test environment setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Do you have custom scripts to deploy and use on target?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[01;34m../../tools\u001b[00m\r\n",
      "├── \u001b[01;34marm64\u001b[00m\r\n",
      "│   ├── \u001b[01;32mperf\u001b[00m\r\n",
      "│   ├── \u001b[01;32mrt-app\u001b[00m\r\n",
      "│   ├── \u001b[01;32mtaskset\u001b[00m\r\n",
      "│   └── \u001b[01;32mtrace-cmd\u001b[00m\r\n",
      "├── \u001b[01;34marmeabi\u001b[00m\r\n",
      "│   ├── \u001b[01;32mbusybox\u001b[00m\r\n",
      "│   ├── \u001b[01;32mdaemonize\u001b[00m\r\n",
      "│   ├── htop\r\n",
      "│   ├── htop.armv7\r\n",
      "│   ├── \u001b[01;32mperf\u001b[00m\r\n",
      "│   ├── \u001b[01;32mrt-app\u001b[00m\r\n",
      "│   ├── \u001b[01;32msysbench\u001b[00m\r\n",
      "│   ├── \u001b[01;32mtaskset\u001b[00m\r\n",
      "│   ├── \u001b[01;31mterminfo.tar.bz2\u001b[00m\r\n",
      "│   └── \u001b[01;32mtrace-cmd\u001b[00m\r\n",
      "├── LICENSE.busybox\r\n",
      "├── LICENSE.perf\r\n",
      "├── LICENSE.rt-app\r\n",
      "├── LICENSE.taskset\r\n",
      "├── LICENSE.trace-cmd\r\n",
      "├── \u001b[01;32mplots.py\u001b[00m\r\n",
      "├── \u001b[01;32mreport.py\u001b[00m\r\n",
      "├── report.pyc\r\n",
      "├── \u001b[01;34mscripts\u001b[00m\r\n",
      "│   ├── \u001b[01;32mcgroup_run_into.sh\u001b[00m\r\n",
      "│   ├── \u001b[01;32mcgroup_tasks_move.sh\u001b[00m\r\n",
      "│   ├── \u001b[01;32mcpuidle_sampling.sh\u001b[00m\r\n",
      "│   ├── \u001b[01;32modroid_sampler.py\u001b[00m\r\n",
      "│   ├── \u001b[01;32modroid_sampler.sh\u001b[00m\r\n",
      "│   ├── \u001b[01;32mtrace_frequencies.sh\u001b[00m\r\n",
      "│   └── \u001b[01;32mtraceview_extract.awk\u001b[00m\r\n",
      "├── \u001b[01;34mx86\u001b[00m\r\n",
      "│   ├── \u001b[01;32mbusybox\u001b[00m\r\n",
      "│   └── \u001b[01;32mchrt\u001b[00m\r\n",
      "└── \u001b[01;34mx86_64\u001b[00m\r\n",
      "    ├── \u001b[01;32mbusybox\u001b[00m\r\n",
      "    ├── \u001b[01;32mchrt\u001b[00m\r\n",
      "    ├── \u001b[01;32mperf\u001b[00m\r\n",
      "    ├── \u001b[01;32mrt-app\u001b[00m\r\n",
      "    ├── \u001b[01;32mtaskset\u001b[00m\r\n",
      "    ├── \u001b[01;32mtrace-cmd\u001b[00m\r\n",
      "    └── \u001b[01;32mwlg\u001b[00m\r\n",
      "\r\n",
      "5 directories, 38 files\r\n"
     ]
    }
   ],
   "source": [
    "# Custom scrips must be deployed under $LISA_HOME/tools\n",
    "!tree ../../tools"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "#!/bin/bash\r\n",
      "\r\n",
      "# CPU to monitor\r\n",
      "CPU=${1:-0}\r\n",
      "# Sampling time\r\n",
      "SLEEP=${2:-1}\r\n",
      "# Samples to collect\r\n",
      "COUNT=${3:-3}\r\n",
      "\r\n",
      "# Enter CPU's sysfs\r\n",
      "cd /sys/devices/system/cpu\r\n",
      "\r\n",
      "# Initial C-State residencies counter\r\n",
      "ISC=$(find cpu0/cpuidle -name \"state*\" | wc -l)\r\n",
      "for I in $(seq 0 $((ISC-1))); do\r\n",
      "\tLCS[$I]=`cat cpu$CPU/cpuidle/state$I/usage`\r\n",
      "done\r\n",
      "\r\n",
      "# Dump header\r\n",
      "printf \"#%13s \" \"Time\"\r\n",
      "for I in $(seq 0 $((ISC-1))); do\r\n",
      "  printf \"%14s \" \"idle$I\"\r\n",
      "done\r\n",
      "echo\r\n",
      "\r\n",
      "# Sampling loop\r\n",
      "for I in $(seq $COUNT); do\r\n",
      "\r\n",
      "\tsleep $SLEEP\r\n",
      "\r\n",
      "\t# Dump CPU C-State residencies\r\n",
      "\tnow=$(date +%s)\r\n",
      "\tprintf \"%14d \" $now\r\n",
      "\tfor I in $(seq 0 $((ISC-1))); do\r\n",
      "\t\tU=`cat cpu$CPU/cpuidle/state$I/usage`\r\n",
      "\t\tCCS=$(($U - ${LCS[$I]}))\r\n",
      "\t\tprintf \"%14d \" $CCS\r\n",
      "\t\tLCS[$I]=$U\r\n",
      "\tdone\r\n",
      "\techo\r\n",
      "\r\n",
      "\r\n",
      "done\r\n",
      "\r\n",
      "# vim: ts=2\r\n"
     ]
    }
   ],
   "source": [
    "# This is the (not so fancy) script we want to deploy\n",
    "!cat ../../tools/scripts/cpuidle_sampling.sh"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Which devlib modules you need for your experiments?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:34:06  INFO    : Devlib provided modules are found under:\n",
      "04:34:06  INFO    :    $LISA_HOME/libs/devlib/devlib/module/\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   thermal.py\r\n",
      "   vexpress.py\r\n",
      "   cooling.py\r\n",
      "   android.py\r\n",
      "   biglittle.py\r\n",
      "   cpuidle.py\r\n",
      "   hotplug.py\r\n",
      "   cpufreq.py\r\n",
      "   hwmon.py\r\n",
      "   cgroups.py\r\n"
     ]
    }
   ],
   "source": [
    "# You can have a look at the devlib supported modules by lising the\n",
    "devlib_modules_folder = 'libs/devlib/devlib/module/'\n",
    "\n",
    "logging.info(\"Devlib provided modules are found under:\")\n",
    "logging.info(\"   $LISA_HOME/{}\".format(devlib_modules_folder))\n",
    "!cd ../../ ; find {devlib_modules_folder} -name \"*.py\" | sed 's|libs/devlib/devlib/module/|   |' | grep -v __init__ "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup you TestEnv confguration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Setup a target configuration\n",
    "conf = {\n",
    "\n",
    "    # Define the kind of target platform to use for the experiments\n",
    "    \"platform\"    : 'linux',  # platform type, valid other options are:\n",
    "                              # android - access via ADB\n",
    "                              # linux   - access via SSH\n",
    "                              # host    - direct access\n",
    "    \n",
    "    # Preload settings for a specific target\n",
    "    \"board\"       : 'juno',   # board type, valid options are:\n",
    "                              # - juno  - JUNO Development Board\n",
    "                              # - tc2   - TC2 Development Board\n",
    "\n",
    "    # Login credentials\n",
    "    \"host\"        : \"192.168.0.1\",\n",
    "    \"username\"    : \"root\",\n",
    "    \"password\"    : \"\",\n",
    "\n",
    "    # Custom tools to deploy on target, they must be placed under:\n",
    "    #   $LISA_HOME/tools/(ARCH|scripts)\n",
    "    \"tools\" : [ \"cpuidle_sampling.sh\" ],\n",
    "\n",
    "    # FTrace configuration\n",
    "    \"ftrace\" : {\n",
    "         \"events\" : [\n",
    "             \"cpu_idle\",\n",
    "             \"sched_switch\",\n",
    "         ],\n",
    "         \"buffsize\" : 10240,\n",
    "    },\n",
    "    \n",
    "    # Where results are collected\n",
    "    \"results_dir\" : \"TestEnvExample\",\n",
    "    \n",
    "    # Devlib module required (or not required)\n",
    "    'modules' : [ \"cpufreq\", \"cgroups\" ],\n",
    "    #\"exclude_modules\" : [ \"hwmon\" ],\n",
    "    \n",
    "    # Local installation path used for kernel/dtb installation on target\n",
    "    # The specified path MUST be accessible from the board, e.g.\n",
    "    # - JUNO/TC2: it can be the mount path of the VMESD disk image\n",
    "    # - Other board: it can be a TFTP server path used by the board bootloader\n",
    "    \"tftp\"  : {\n",
    "        \"folder\"    : \"/var/lib/tftpboot\",\n",
    "        \"kernel\"    : \"kern.bin\",\n",
    "        \"dtb\"       : \"dtb.bin\",\n",
    "    },\n",
    "\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:34:08  INFO    :         Target - Using base path: /home/derkling/Code/lisa\n",
      "04:34:08  INFO    :         Target - Loading custom (inline) target configuration\n",
      "04:34:08  DEBUG   :         Target - Target configuration {'username': 'root', 'platform': 'linux', 'host': '192.168.0.1', 'ftrace': {'buffsize': 10240, 'events': ['cpu_idle', 'sched_switch']}, 'board': 'juno', 'modules': ['cpufreq', 'cgroups'], 'tftp': {'kernel': 'kern.bin', 'folder': '/var/lib/tftpboot', 'dtb': 'dtb.bin'}, 'password': '', 'tools': ['cpuidle_sampling.sh'], 'results_dir': 'TestEnvExample'}\n",
      "04:34:08  INFO    :         Target - Devlib modules to load: ['bl', 'cpufreq', 'cgroups', 'hwmon']\n",
      "04:34:08  INFO    :         Target - Connecting linux target:\n",
      "04:34:08  INFO    :         Target -   username : root\n",
      "04:34:08  INFO    :         Target -       host : 192.168.0.1\n",
      "04:34:08  INFO    :         Target -   password : \n",
      "04:34:08  DEBUG   :         Target - Setup LINUX target...\n",
      "04:34:08  DEBUG   : Installing module vexpress-u-boot\n",
      "04:34:08  DEBUG   : Installing module vexpress-dtr\n",
      "04:34:08  DEBUG   : Installing module vexpress-vemsd\n",
      "04:34:08  DEBUG   : Logging in root@192.168.0.1\n",
      "04:34:09  DEBUG   : id\n",
      "04:34:09  DEBUG   : if [ -e '/root/devlib-target/bin' ]; then echo 1; else echo 0; fi\n",
      "04:34:10  DEBUG   : ls -1 /root/devlib-target/bin\n",
      "04:34:10  DEBUG   : cat /proc/cpuinfo\n",
      "04:34:10  DEBUG   : sudo -- sh -c 'dmidecode -s system-version'\n",
      "04:34:11  DEBUG   : Installing module bl\n",
      "04:34:11  DEBUG   : /root/devlib-target/bin/busybox uname -m\n",
      "04:34:11  DEBUG   : if [ -e '/sys/devices/system/cpu/cpufreq' ]; then echo 1; else echo 0; fi\n",
      "04:34:12  DEBUG   : Installing module cpufreq\n",
      "04:34:12  DEBUG   : zcat /proc/config.gz\n",
      "04:34:12  DEBUG   : Installing module cgroups\n",
      "04:34:12  DEBUG   : mount\n",
      "04:34:12  DEBUG   : cgroup_root already mounted at /sys/fs/cgroup\n",
      "04:34:13  DEBUG   : /root/devlib-target/bin/busybox cat /proc/cgroups\n",
      "04:34:13  DEBUG   : Available controllers: ['cpuset', 'cpu', 'schedtune', 'memory', 'devices', 'freezer', 'perf_event', 'hugetlb', 'pids']\n",
      "04:34:13  DEBUG   : Init cpuset controller...\n",
      "04:34:13  DEBUG   : /root/devlib-target/bin/busybox grep cpuset /proc/cgroups\n",
      "04:34:13  DEBUG   : mount\n",
      "04:34:14  DEBUG   : Controller cpuset mounted under: /sys/fs/cgroup/devlib_cpuset\n",
      "04:34:14  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_cpuset\n",
      "04:34:14  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_cpuset ] || mkdir -p /sys/fs/cgroup/devlib_cpuset'\n",
      "04:34:14  DEBUG   : Controller cpuset enabled\n",
      "04:34:14  DEBUG   : Init cpu controller...\n",
      "04:34:14  DEBUG   : /root/devlib-target/bin/busybox grep cpu /proc/cgroups\n",
      "04:34:15  DEBUG   : mount\n",
      "04:34:15  DEBUG   : Controller cpu mounted under: /sys/fs/cgroup/devlib_cpu\n",
      "04:34:15  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_cpu\n",
      "04:34:15  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_cpu ] || mkdir -p /sys/fs/cgroup/devlib_cpu'\n",
      "04:34:15  DEBUG   : Controller cpu enabled\n",
      "04:34:15  DEBUG   : Init schedtune controller...\n",
      "04:34:15  DEBUG   : /root/devlib-target/bin/busybox grep schedtune /proc/cgroups\n",
      "04:34:16  DEBUG   : mount\n",
      "04:34:16  DEBUG   : Controller schedtune mounted under: /sys/fs/cgroup/devlib_schedtune\n",
      "04:34:16  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_schedtune\n",
      "04:34:16  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_schedtune ] || mkdir -p /sys/fs/cgroup/devlib_schedtune'\n",
      "04:34:17  DEBUG   : Controller schedtune enabled\n",
      "04:34:17  DEBUG   : Init memory controller...\n",
      "04:34:17  DEBUG   : /root/devlib-target/bin/busybox grep memory /proc/cgroups\n",
      "04:34:17  DEBUG   : mount\n",
      "04:34:17  DEBUG   : Controller memory mounted under: /sys/fs/cgroup/devlib_memory\n",
      "04:34:17  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_memory\n",
      "04:34:18  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_memory ] || mkdir -p /sys/fs/cgroup/devlib_memory'\n",
      "04:34:18  DEBUG   : Controller memory enabled\n",
      "04:34:18  DEBUG   : Init devices controller...\n",
      "04:34:18  DEBUG   : /root/devlib-target/bin/busybox grep devices /proc/cgroups\n",
      "04:34:18  DEBUG   : mount\n",
      "04:34:19  DEBUG   : Controller devices mounted under: /sys/fs/cgroup/devlib_devices\n",
      "04:34:19  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_devices\n",
      "04:34:19  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_devices ] || mkdir -p /sys/fs/cgroup/devlib_devices'\n",
      "04:34:19  DEBUG   : Controller devices enabled\n",
      "04:34:19  DEBUG   : Init freezer controller...\n",
      "04:34:19  DEBUG   : /root/devlib-target/bin/busybox grep freezer /proc/cgroups\n",
      "04:34:20  DEBUG   : mount\n",
      "04:34:20  DEBUG   : Controller freezer mounted under: /sys/fs/cgroup/devlib_freezer\n",
      "04:34:20  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_freezer\n",
      "04:34:20  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_freezer ] || mkdir -p /sys/fs/cgroup/devlib_freezer'\n",
      "04:34:20  DEBUG   : Controller freezer enabled\n",
      "04:34:20  DEBUG   : Init perf_event controller...\n",
      "04:34:20  DEBUG   : /root/devlib-target/bin/busybox grep perf_event /proc/cgroups\n",
      "04:34:21  DEBUG   : mount\n",
      "04:34:21  DEBUG   : Controller perf_event mounted under: /sys/fs/cgroup/devlib_perf_event\n",
      "04:34:21  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_perf_event\n",
      "04:34:21  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_perf_event ] || mkdir -p /sys/fs/cgroup/devlib_perf_event'\n",
      "04:34:22  DEBUG   : Controller perf_event enabled\n",
      "04:34:22  DEBUG   : Init hugetlb controller...\n",
      "04:34:22  DEBUG   : /root/devlib-target/bin/busybox grep hugetlb /proc/cgroups\n",
      "04:34:22  DEBUG   : mount\n",
      "04:34:22  DEBUG   : Controller hugetlb mounted under: /sys/fs/cgroup/devlib_hugetlb\n",
      "04:34:22  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_hugetlb\n",
      "04:34:22  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_hugetlb ] || mkdir -p /sys/fs/cgroup/devlib_hugetlb'\n",
      "04:34:23  DEBUG   : Controller hugetlb enabled\n",
      "04:34:23  DEBUG   : Init pids controller...\n",
      "04:34:23  DEBUG   : /root/devlib-target/bin/busybox grep pids /proc/cgroups\n",
      "04:34:23  DEBUG   : mount\n",
      "04:34:24  DEBUG   : Controller pids mounted under: /sys/fs/cgroup/devlib_pids\n",
      "04:34:24  DEBUG   : Creating cgroup /sys/fs/cgroup/devlib_pids\n",
      "04:34:24  DEBUG   : sudo -- sh -c '[ -d /sys/fs/cgroup/devlib_pids ] || mkdir -p /sys/fs/cgroup/devlib_pids'\n",
      "04:34:24  DEBUG   : Controller pids enabled\n",
      "04:34:24  DEBUG   : if [ -e '/sys/class/hwmon' ]; then echo 1; else echo 0; fi\n",
      "04:34:24  DEBUG   : Installing module hwmon\n",
      "04:34:25  DEBUG   : ls -1 /sys/class/hwmon\n",
      "04:34:25  DEBUG   : if [ -e '/sys/class/hwmon/hwmon0/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:25  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/name'\\'''\n",
      "04:34:26  DEBUG   : ls -1 /sys/class/hwmon/hwmon0/\n",
      "04:34:26  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon0/curr1_label'\\'''\n",
      "04:34:27  DEBUG   : if [ -e '/sys/class/hwmon/hwmon1/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:27  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon1/name'\\'''\n",
      "04:34:27  DEBUG   : ls -1 /sys/class/hwmon/hwmon1/\n",
      "04:34:28  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon1/curr1_label'\\'''\n",
      "04:34:28  DEBUG   : if [ -e '/sys/class/hwmon/hwmon10/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:29  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon10/name'\\'''\n",
      "04:34:29  DEBUG   : ls -1 /sys/class/hwmon/hwmon10/\n",
      "04:34:29  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon10/power1_label'\\'''\n",
      "04:34:30  DEBUG   : if [ -e '/sys/class/hwmon/hwmon11/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:30  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon11/name'\\'''\n",
      "04:34:31  DEBUG   : ls -1 /sys/class/hwmon/hwmon11/\n",
      "04:34:31  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon11/power1_label'\\'''\n",
      "04:34:32  DEBUG   : if [ -e '/sys/class/hwmon/hwmon12/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:32  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon12/name'\\'''\n",
      "04:34:32  DEBUG   : ls -1 /sys/class/hwmon/hwmon12/\n",
      "04:34:33  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon12/energy1_label'\\'''\n",
      "04:34:33  DEBUG   : if [ -e '/sys/class/hwmon/hwmon13/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:34  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/name'\\'''\n",
      "04:34:34  DEBUG   : ls -1 /sys/class/hwmon/hwmon13/\n",
      "04:34:34  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_label'\\'''\n",
      "04:34:35  DEBUG   : if [ -e '/sys/class/hwmon/hwmon14/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:35  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/name'\\'''\n",
      "04:34:36  DEBUG   : ls -1 /sys/class/hwmon/hwmon14/\n",
      "04:34:36  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_label'\\'''\n",
      "04:34:37  DEBUG   : if [ -e '/sys/class/hwmon/hwmon15/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:37  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon15/name'\\'''\n",
      "04:34:37  DEBUG   : ls -1 /sys/class/hwmon/hwmon15/\n",
      "04:34:38  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon15/energy1_label'\\'''\n",
      "04:34:38  DEBUG   : if [ -e '/sys/class/hwmon/hwmon16/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:39  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/name'\\'''\n",
      "04:34:39  DEBUG   : ls -1 /sys/class/hwmon/hwmon16/\n",
      "04:34:39  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in0_label'\\'''\n",
      "04:34:40  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in1_label'\\'''\n",
      "04:34:40  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in2_label'\\'''\n",
      "04:34:41  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in3_label'\\'''\n",
      "04:34:41  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in4_label'\\'''\n",
      "04:34:42  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in5_label'\\'''\n",
      "04:34:42  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/in6_label'\\'''\n",
      "04:34:42  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/temp1_label'\\'''\n",
      "04:34:43  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon16/temp2_label'\\'''\n",
      "04:34:43  DEBUG   : if [ -e '/sys/class/hwmon/hwmon2/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:44  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon2/name'\\'''\n",
      "04:34:44  DEBUG   : ls -1 /sys/class/hwmon/hwmon2/\n",
      "04:34:44  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon2/curr1_label'\\'''\n",
      "04:34:45  DEBUG   : if [ -e '/sys/class/hwmon/hwmon3/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:45  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon3/name'\\'''\n",
      "04:34:46  DEBUG   : ls -1 /sys/class/hwmon/hwmon3/\n",
      "04:34:46  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon3/curr1_label'\\'''\n",
      "04:34:47  DEBUG   : if [ -e '/sys/class/hwmon/hwmon4/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:47  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon4/name'\\'''\n",
      "04:34:47  DEBUG   : ls -1 /sys/class/hwmon/hwmon4/\n",
      "04:34:48  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon4/in1_label'\\'''\n",
      "04:34:48  DEBUG   : if [ -e '/sys/class/hwmon/hwmon5/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:49  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon5/name'\\'''\n",
      "04:34:49  DEBUG   : ls -1 /sys/class/hwmon/hwmon5/\n",
      "04:34:49  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon5/in1_label'\\'''\n",
      "04:34:50  DEBUG   : if [ -e '/sys/class/hwmon/hwmon6/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:50  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon6/name'\\'''\n",
      "04:34:51  DEBUG   : ls -1 /sys/class/hwmon/hwmon6/\n",
      "04:34:51  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon6/in1_label'\\'''\n",
      "04:34:52  DEBUG   : if [ -e '/sys/class/hwmon/hwmon7/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:52  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon7/name'\\'''\n",
      "04:34:52  DEBUG   : ls -1 /sys/class/hwmon/hwmon7/\n",
      "04:34:53  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon7/in1_label'\\'''\n",
      "04:34:53  DEBUG   : if [ -e '/sys/class/hwmon/hwmon8/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:54  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon8/name'\\'''\n",
      "04:34:54  DEBUG   : ls -1 /sys/class/hwmon/hwmon8/\n",
      "04:34:54  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon8/power1_label'\\'''\n",
      "04:34:55  DEBUG   : if [ -e '/sys/class/hwmon/hwmon9/name' ]; then echo 1; else echo 0; fi\n",
      "04:34:55  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon9/name'\\'''\n",
      "04:34:56  DEBUG   : ls -1 /sys/class/hwmon/hwmon9/\n",
      "04:34:56  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon9/power1_label'\\'''\n",
      "04:34:56  DEBUG   :         Target - Checking target connection...\n",
      "04:34:56  DEBUG   :         Target - Target info:\n",
      "04:34:56  DEBUG   :         Target -       ABI: arm64\n",
      "04:34:56  DEBUG   :         Target -      CPUs: CpuInfo(['A53', 'A57', 'A57', 'A53', 'A53', 'A53'])\n",
      "04:34:56  DEBUG   :         Target -  Clusters: [0, 1, 1, 0, 0, 0]\n",
      "04:34:57  DEBUG   : sudo -- sh -c 'mount -o remount,rw /'\n",
      "04:34:57  INFO    :         Target - Initializing target workdir:\n",
      "04:34:57  INFO    :         Target -    /root/devlib-target\n",
      "04:34:57  DEBUG   : mkdir -p /root/devlib-target\n",
      "04:34:57  DEBUG   : mkdir -p /root/devlib-target/bin\n",
      "04:34:58  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/busybox root@192.168.0.1:/root/devlib-target/bin/busybox\n",
      "04:34:58  DEBUG   : chmod a+x /root/devlib-target/bin/busybox\n",
      "04:34:58  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/libs/devlib/devlib/bin/scripts/shutils root@192.168.0.1:/root/devlib-target/bin/shutils\n",
      "04:34:58  DEBUG   : chmod a+x /root/devlib-target/bin/shutils\n",
      "04:34:59  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/tools/scripts/cpuidle_sampling.sh root@192.168.0.1:/root/devlib-target/bin/cpuidle_sampling.sh\n",
      "04:34:59  DEBUG   : chmod a+x /root/devlib-target/bin/cpuidle_sampling.sh\n",
      "04:34:59  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/tools/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n",
      "04:34:59  DEBUG   : chmod a+x /root/devlib-target/bin/trace-cmd\n",
      "04:35:00  DEBUG   :         Target - Check for module [bl]...\n",
      "04:35:00  DEBUG   :         Target - Check for module [cpufreq]...\n",
      "04:35:00  DEBUG   :         Target - Check for module [cgroups]...\n",
      "04:35:00  DEBUG   :         Target - Check for module [hwmon]...\n",
      "04:35:00  INFO    :         Target - Topology:\n",
      "04:35:00  INFO    :         Target -    [[0, 3, 4, 5], [1, 2]]\n",
      "04:35:00  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n",
      "04:35:00  DEBUG   : cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies\n",
      "04:35:01  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n",
      "04:35:01  DEBUG   : cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_available_frequencies\n",
      "04:35:01  DEBUG   :       Platform - Trying to load default EM from /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n",
      "04:35:01  INFO    :       Platform - Loading default EM:\n",
      "04:35:01  INFO    :       Platform -    /home/derkling/Code/lisa/libs/utils/platforms/juno.json\n",
      "04:35:01  DEBUG   : loading JSON...\n",
      "04:35:01  DEBUG   : Loaded JSON configuration:\n",
      "{u'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64}, u'cpu': {u'cap_max': 1024, u'nrg_max': 616}}, u'little': {u'cluster': {u'nrg_max': 57}, u'cpu': {u'cap_max': 447, u'nrg_max': 93}}}}\n",
      "04:35:01  DEBUG   :       Platform - Platform descriptor initialized\n",
      "{'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64}, u'cpu': {u'cap_max': 1024, u'nrg_max': 616}}, u'little': {u'cluster': {u'nrg_max': 57}, u'cpu': {u'cap_max': 447, u'nrg_max': 93}}}, 'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]}, 'cpus_count': 6, 'freqs': {'big': [450000, 625000, 800000, 950000, 1100000], 'little': [450000, 575000, 700000, 775000, 850000]}, 'topology': [[0, 3, 4, 5], [1, 2]]}\n",
      "04:35:01  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n",
      "04:35:02  DEBUG   : chmod a+x /root/devlib-target/bin/trace-cmd\n",
      "04:35:02  DEBUG   : cat /sys/kernel/debug/tracing/available_events\n",
      "04:35:02  INFO    :         FTrace - Enabled tracepoints:\n",
      "04:35:02  INFO    :         FTrace -   cpu_idle\n",
      "04:35:02  INFO    :         FTrace -   sched_switch\n",
      "04:35:02  DEBUG   :    EnergyMeter - using default energy meter for [juno]\n",
      "04:35:02  INFO    :    EnergyMeter - Scanning for HWMON channels, may take some time...\n",
      "04:35:02  DEBUG   : Discovering available HWMON sensors...\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_amp/curr1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_amp/curr1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_power/power1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_power/power1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_energy/energy1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_energy/energy1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_energy/energy1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_energy/energy1\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/temp1\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/temp2\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in0\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in1\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in2\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in3\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in4\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in5\n",
      "04:35:02  DEBUG   : \tAdding sensor scpi_sensors/in6\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_amp/curr1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_amp/curr1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_volt/in1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_volt/in1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_volt/in1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_volt/in1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_power/power1\n",
      "04:35:02  DEBUG   : \tAdding sensor v2m_juno_power/power1\n",
      "04:35:02  DEBUG   :    EnergyMeter - Enabling channels {'kinds': ['energy'], 'sites': ['a53', 'a57']}\n",
      "04:35:02  INFO    :    EnergyMeter - Channels selected for energy sampling:\n",
      "04:35:02  INFO    :    EnergyMeter -    a57_energy\n",
      "04:35:03  INFO    :    EnergyMeter -    a53_energy\n",
      "04:35:03  DEBUG   : No RT-App workloads, skipping calibration\n",
      "04:35:03  WARNING :        TestEnv - Wipe previous contents of the results folder:\n",
      "04:35:03  WARNING :        TestEnv -    /home/derkling/Code/lisa/results/TestEnvExample\n",
      "04:35:03  INFO    :        TestEnv - Set results folder to:\n",
      "04:35:03  INFO    :        TestEnv -    /home/derkling/Code/lisa/results/TestEnvExample\n",
      "04:35:03  INFO    :        TestEnv - Experiment results available also in:\n",
      "04:35:03  INFO    :        TestEnv -    /home/derkling/Code/lisa/results_latest\n"
     ]
    }
   ],
   "source": [
    "from env import TestEnv\n",
    "\n",
    "# Initialize a test environment using the provided configuration\n",
    "te = TestEnv(conf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Attributes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The initialization of the test environment pre-initialize some useful<br>\n",
    "environment variables which are available to write test cases.\n",
    "\n",
    "These are some of the information available via the TestEnv object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"username\": \"root\", \n",
      "    \"ftrace\": {\n",
      "        \"buffsize\": 10240, \n",
      "        \"events\": [\n",
      "            \"cpu_idle\", \n",
      "            \"sched_switch\"\n",
      "        ]\n",
      "    }, \n",
      "    \"host\": \"192.168.0.1\", \n",
      "    \"password\": \"\", \n",
      "    \"tools\": [\n",
      "        \"cpuidle_sampling.sh\", \n",
      "        \"trace-cmd\"\n",
      "    ], \n",
      "    \"modules\": [\n",
      "        \"cpufreq\", \n",
      "        \"cgroups\"\n",
      "    ], \n",
      "    \"results_dir\": \"TestEnvExample\", \n",
      "    \"platform\": \"linux\", \n",
      "    \"board\": \"juno\", \n",
      "    \"__features__\": [], \n",
      "    \"tftp\": {\n",
      "        \"kernel\": \"kern.bin\", \n",
      "        \"folder\": \"/var/lib/tftpboot\", \n",
      "        \"dtb\": \"dtb.bin\"\n",
      "    }\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "# The complete configuration of the target we have configured\n",
    "print json.dumps(te.conf, indent=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "# Last configured kernel and DTB image\n",
    "print te.kernel\n",
    "print te.dtb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "192.168.0.1\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "# The IP and MAC address of the target\n",
    "print te.ip\n",
    "print te.mac"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"nrg_model\": {\n",
      "        \"big\": {\n",
      "            \"cluster\": {\n",
      "                \"nrg_max\": 64\n",
      "            }, \n",
      "            \"cpu\": {\n",
      "                \"cap_max\": 1024, \n",
      "                \"nrg_max\": 616\n",
      "            }\n",
      "        }, \n",
      "        \"little\": {\n",
      "            \"cluster\": {\n",
      "                \"nrg_max\": 57\n",
      "            }, \n",
      "            \"cpu\": {\n",
      "                \"cap_max\": 447, \n",
      "                \"nrg_max\": 93\n",
      "            }\n",
      "        }\n",
      "    }, \n",
      "    \"clusters\": {\n",
      "        \"big\": [\n",
      "            1, \n",
      "            2\n",
      "        ], \n",
      "        \"little\": [\n",
      "            0, \n",
      "            3, \n",
      "            4, \n",
      "            5\n",
      "        ]\n",
      "    }, \n",
      "    \"cpus_count\": 6, \n",
      "    \"freqs\": {\n",
      "        \"big\": [\n",
      "            450000, \n",
      "            625000, \n",
      "            800000, \n",
      "            950000, \n",
      "            1100000\n",
      "        ], \n",
      "        \"little\": [\n",
      "            450000, \n",
      "            575000, \n",
      "            700000, \n",
      "            775000, \n",
      "            850000\n",
      "        ]\n",
      "    }, \n",
      "    \"topology\": [\n",
      "        [\n",
      "            0, \n",
      "            3, \n",
      "            4, \n",
      "            5\n",
      "        ], \n",
      "        [\n",
      "            1, \n",
      "            2\n",
      "        ]\n",
      "    ]\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "# A full platform descriptor\n",
    "print json.dumps(te.platform, indent=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/home/derkling/Code/lisa/results/TestEnvExample'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# A pre-created folder to host the tests results generated using this\n",
    "# test environment, notice that the suite could add additional information\n",
    "# in this folder, like for example a copy of the target configuration\n",
    "# and other target specific collected information\n",
    "te.res_dir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/data/local/schedtest'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The working directory on the target\n",
    "te.workdir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Functions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some methods are also exposed to test developers which could be used to easy\n",
    "the creation of tests.\n",
    "\n",
    "These are some of the methods available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:32  DEBUG   : No RT-App workloads, skipping calibration\n"
     ]
    }
   ],
   "source": [
    "# Calibrate RT-App (if required) and get the most updated calibration value\n",
    "te.calibration()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:32  DEBUG   :       Platform - Dump platform descriptor in [/tmp/platform.json]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "({'clusters': {'big': [1, 2], 'little': [0, 3, 4, 5]},\n",
       "  'cpus_count': 6,\n",
       "  'freqs': {'big': [450000, 625000, 800000, 950000, 1100000],\n",
       "   'little': [450000, 575000, 700000, 775000, 850000]},\n",
       "  'nrg_model': {u'big': {u'cluster': {u'nrg_max': 64},\n",
       "    u'cpu': {u'cap_max': 1024, u'nrg_max': 616}},\n",
       "   u'little': {u'cluster': {u'nrg_max': 57},\n",
       "    u'cpu': {u'cap_max': 447, u'nrg_max': 93}}},\n",
       "  'topology': [[0, 3, 4, 5], [1, 2]]},\n",
       " '/tmp/platform.json')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Generate a JSON file with the complete platform description\n",
    "te.platform_dump(dest_dir='/tmp')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Force a reboot of the target (and wait specified [s] before reconnect)\n",
    "# te.reboot(reboot_time=60, ping_time=15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Resolve a MAC address into an IP address\n",
    "# te.resolv_host(host='00:02:F7:00:5A:5B')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:33  INFO    :           TFTP - Deploy /etc/group into /var/lib/tftpboot/group\n"
     ]
    }
   ],
   "source": [
    "# Copy the specified file into the TFTP server folder defined by configuration\n",
    "te.tftp_deploy('/etc/group')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 12\r\n",
      "drwxrwxrwx  2 root     nogroup  4096 Feb 22 17:34 .\r\n",
      "drwxr-xr-x 79 root     root     4096 Feb 26 15:17 ..\r\n",
      "-rw-r--r--  1 derkling derkling 1168 Mar  2 16:27 group\r\n"
     ]
    }
   ],
   "source": [
    "!ls -la /var/lib/tftpboot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Access to the devlib API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A special TestEnv attribute is <b>target</b>, which represents a <b>devlib instance</b>.\n",
    "Using the target attribute we can access to the full set of devlib provided\n",
    "functionalities. Which are summarized in the following sections."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Remotes commands execution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:34  DEBUG   : echo -n 'Hello Test Environment'\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'Hello Test Environment'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Run a command on the target\n",
    "te.target.execute(\"echo -n 'Hello Test Environment'\", as_root=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:34  INFO    : Spawn a task which will run for a while...\n",
      "04:27:35  DEBUG   : sudo -- sh -c 'sh -c \"sleep 10\" 1>/dev/null 2>/dev/null &'\n"
     ]
    }
   ],
   "source": [
    "# Spawn a command in background on the target\n",
    "logging.info(\"Spawn a task which will run for a while...\")\n",
    "process = te.target.kick_off(\"sleep 10\", as_root=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:27:35  DEBUG   : ps\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  PID TTY          TIME CMD\n",
      " 6097 pts/0    00:00:00 sh\n",
      " 6270 pts/0    00:00:00 sleep\n",
      " 6271 pts/0    00:00:00 ps\n"
     ]
    }
   ],
   "source": [
    "output = te.target.execute(\"ps\")\n",
    "print '\\n'.join(output.splitlines())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice that _the Shell PID is always the same_ for all commands we execute.<br>\n",
    "This is due to devlib ensuring to keep a **persistent connection** with the target device."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Running custom scripts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:28:18  DEBUG   : if [ -e '/root/devlib-target/bin' ]; then echo 1; else echo 0; fi\n",
      "04:28:18  DEBUG   : ls -1 /root/devlib-target/bin\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/root/devlib-target/bin/cpuidle_sampling.sh\n"
     ]
    }
   ],
   "source": [
    "my_script = te.target.get_installed(\"cpuidle_sampling.sh\")\n",
    "print my_script"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:28:19  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/cpuidle_sampling.sh'\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['#         Time          idle0          idle1          idle2 ',\n",
       " '    1456934283              0             11             19 ',\n",
       " '    1456934284              0              5             17 ',\n",
       " '    1456934285              0              5             19 ']"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "output = te.target.execute(my_script, as_root=True)\n",
    "output.splitlines()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice that the output is returned as a **list of lines**. This provides a useful base for post-processing the output of that command."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "code_folding": [],
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# We can also use \"notebook embedded\" scripts\n",
    "# my_script = \" \\\n",
    "# for I in $(seq 3); do \\\n",
    "#     grep '' /sys/devices/system/cpu/cpu*/cpufreq/stats/time_in_stats | \\\n",
    "#     sed -e 's|/sys/devices/system/cpu/cpu||' -e 's|/cpufreq/scaling_governor:| |' \\\n",
    "#     sleep 1 \\\n",
    "# done \\\n",
    "# \""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# print te.target.execute(my_script)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Access to target specific attributes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ABI                 :  arm64\n",
      "big Core Family     :  A57\n",
      "LITTLE Core Family  :  A53\n",
      "CPU's Clusters IDs  :  [0, 1, 1, 0, 0, 0]\n",
      "CPUs type           :  ['A53', 'A57', 'A57', 'A53', 'A53', 'A53']\n"
     ]
    }
   ],
   "source": [
    "# Acces to many target specific information\n",
    "print \"ABI                 : \", te.target.abi\n",
    "print \"big Core Family     : \", te.target.big_core\n",
    "print \"LITTLE Core Family  : \", te.target.little_core\n",
    "print \"CPU's Clusters IDs  : \", te.target.core_clusters\n",
    "print \"CPUs type           : \", te.target.core_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:35:03  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n",
      "04:35:03  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq'\\'''\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "big CPUs IDs        :  [1, 2]\n",
      "LITTLE CPUs IDs     :  [0, 3, 4, 5]\n",
      "big CPUs freqs      : 1100000"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:35:04  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/online'\\'''\n",
      "04:35:04  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor'\\'''\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "big CPUs governor   : performance\n"
     ]
    }
   ],
   "source": [
    "# Access to big.LITTLE specific information\n",
    "print \"big CPUs IDs        : \", te.target.bl.bigs\n",
    "print \"LITTLE CPUs IDs     : \", te.target.bl.littles\n",
    "print \"big CPUs freqs      : {}\".format(te.target.bl.get_bigs_frequency())\n",
    "print \"big CPUs governor   : {}\".format(te.target.bl.get_bigs_governor())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modules usage example: CPUFreq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:36:33  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_get_all_governors'\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'0': 'performance',\n",
       " '1': 'performance',\n",
       " '2': 'performance',\n",
       " '3': 'performance',\n",
       " '4': 'performance',\n",
       " '5': 'performance'}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# You can use autocompletion to have a look at the supported method for a\n",
    "# specific module\n",
    "te.target.cpufreq #.get_all_governors()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:39:00  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors'\\'''\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['conservative', 'ondemand', 'userspace', 'powersave', 'performance', 'sched']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get goverors available for CPU0\n",
    "te.target.cpufreq.list_governors(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:40:04  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors'\\'''\n",
      "04:40:04  DEBUG   : sudo -- sh -c 'echo ondemand > '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:40:05  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:40:05  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:40:06  DEBUG   : ls -1 /sys/devices/system/cpu/cpu0/cpufreq/ondemand\n"
     ]
    }
   ],
   "source": [
    "# Set the \"ondemand\" governor\n",
    "te.target.cpufreq.set_governor(0, 'ondemand')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:40:29  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:40:29  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:40:30  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load'\\'''\n",
      "04:40:30  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/io_is_busy'\\'''\n",
      "04:40:31  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/powersave_bias'\\'''\n",
      "04:40:31  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_down_factor'\\'''\n",
      "04:40:31  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n",
      "04:40:32  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min'\\'''\n",
      "04:40:32  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold'\\'''\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'ignore_nice_load': '0',\n",
       " 'io_is_busy': '0',\n",
       " 'powersave_bias': '0',\n",
       " 'sampling_down_factor': '1',\n",
       " 'sampling_rate': '1200000',\n",
       " 'sampling_rate_min': '24000',\n",
       " 'up_threshold': '95'}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Check governor tunables\n",
    "te.target.cpufreq.get_governor_tunables(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:41:46  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:41:46  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:41:47  DEBUG   : sudo -- sh -c 'echo 2000000 > '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n",
      "04:41:47  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n",
      "04:41:47  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:41:48  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'\\'''\n",
      "04:41:48  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load'\\'''\n",
      "04:41:49  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/io_is_busy'\\'''\n",
      "04:41:49  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/powersave_bias'\\'''\n",
      "04:41:49  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_down_factor'\\'''\n",
      "04:41:50  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate'\\'''\n",
      "04:41:50  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min'\\'''\n",
      "04:41:51  DEBUG   : sudo -- sh -c 'cat '\\''/sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold'\\'''\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'ignore_nice_load': '0',\n",
       " 'io_is_busy': '0',\n",
       " 'powersave_bias': '0',\n",
       " 'sampling_down_factor': '1',\n",
       " 'sampling_rate': '2000000',\n",
       " 'sampling_rate_min': '24000',\n",
       " 'up_threshold': '95'}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Update governor tunables\n",
    "te.target.cpufreq.set_governor_tunables(0, sampling_rate=2000000)\n",
    "te.target.cpufreq.get_governor_tunables(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modules usage example: CGroups"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:51:18  INFO    :         CGroup - Available controllers:\n",
      "04:51:18  DEBUG   : /root/devlib-target/bin/busybox cat /proc/cgroups\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpuset     (hierarchy id: 1) has 2 cgroups\n",
      "cpu        (hierarchy id: 2) has 1 cgroups\n",
      "schedtune  (hierarchy id: 3) has 1 cgroups\n",
      "memory     (hierarchy id: 4) has 1 cgroups\n",
      "devices    (hierarchy id: 5) has 1 cgroups\n",
      "freezer    (hierarchy id: 6) has 1 cgroups\n",
      "perf_event (hierarchy id: 7) has 1 cgroups\n",
      "hugetlb    (hierarchy id: 8) has 1 cgroups\n",
      "pids       (hierarchy id: 9) has 1 cgroups\n"
     ]
    }
   ],
   "source": [
    "logging.info('%14s - Available controllers:', 'CGroup')\n",
    "ssys = target.cgroups.list_subsystems()\n",
    "for (n,h,g,e) in ssys:\n",
    "    print '{:10} (hierarchy id: {:d}) has {} cgroups'.format(n, h, g)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Get a reference to the CPUSet controller\n",
    "cpuset = target.cgroups.controller('cpuset')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:51:42  DEBUG   : Listing groups for cpuset controller\n",
      "04:51:43  DEBUG   : /root/devlib-target/bin/busybox find /sys/fs/cgroup/devlib_cpuset -type d\n",
      "04:51:43  DEBUG   : Populate cpuset cgroup: /\n",
      "04:51:43  DEBUG   : Populate cpuset cgroup: /LITTLE\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Existing CGropups:\n",
      "    /\n",
      "    /LITTLE\n"
     ]
    }
   ],
   "source": [
    "# Get the list of current configured CGroups for that controller\n",
    "cgroups = cpuset.list_all()\n",
    "print 'Existing CGropups:'\n",
    "for cg in cgroups:\n",
    "    print \"   \", cg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:45:15  DEBUG   : Reading cpuset attributes from:\n",
      "04:45:15  DEBUG   :   /sys/fs/cgroup/devlib_cpuset/LITTLE\n",
      "04:45:15  DEBUG   : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset/LITTLE cpuset\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'cpu_exclusive': '0',\n",
       " 'cpus': '',\n",
       " 'effective_cpus': '',\n",
       " 'effective_mems': '',\n",
       " 'mem_exclusive': '0',\n",
       " 'mem_hardwall': '0',\n",
       " 'memory_migrate': '0',\n",
       " 'memory_pressure': '0',\n",
       " 'memory_spread_page': '0',\n",
       " 'memory_spread_slab': '0',\n",
       " 'mems': '',\n",
       " 'sched_load_balance': '1',\n",
       " 'sched_relax_domain_level': '-1'}"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create a LITTLE partition and check which tunables we have\n",
    "cpuset_littles = cpuset.cgroup('/LITTLE')\n",
    "cpuset_littles.get()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:47:33  DEBUG   : Set attribute [/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus] to: 0,3-5\"\n",
      "04:47:33  DEBUG   : sudo -- sh -c 'echo 0,3-5 > '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus'\\'''\n",
      "04:47:33  DEBUG   : sudo -- sh -c 'cat '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.cpus'\\'''\n",
      "04:47:34  DEBUG   : Set attribute [/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems] to: 0\"\n",
      "04:47:34  DEBUG   : sudo -- sh -c 'echo 0 > '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems'\\'''\n",
      "04:47:34  DEBUG   : sudo -- sh -c 'cat '\\''/sys/fs/cgroup/devlib_cpuset/LITTLE/cpuset.mems'\\'''\n"
     ]
    }
   ],
   "source": [
    "# Setup CPUs and MEMORY nodes for the LITTLE partition\n",
    "cpuset_littles.set(cpus=te.target.bl.littles, mems=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "04:52:55  DEBUG   : Reading cpuset attributes from:\n",
      "04:52:55  DEBUG   :   /sys/fs/cgroup/devlib_cpuset\n",
      "04:52:55  DEBUG   : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset cpuset\n",
      "04:52:55  DEBUG   : Reading cpuset attributes from:\n",
      "04:52:55  DEBUG   :   /sys/fs/cgroup/devlib_cpuset/LITTLE\n",
      "04:52:55  DEBUG   : /root/devlib-target/bin/shutils cgroups_get_attributes /sys/fs/cgroup/devlib_cpuset/LITTLE cpuset\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpuset:/               cpus: 0-5\n",
      "cpuset:/LITTLE         cpus: 0,3-5\n"
     ]
    }
   ],
   "source": [
    "# Dump the configuraiton of each controller\n",
    "for cgname in cgroups:\n",
    "    cgroup = cpuset.cgroup(cgname)\n",
    "    attrs = cgroup.get()\n",
    "    cpus = attrs['cpus']\n",
    "    print '{}:{:<15} cpus: {}'.format(cpuset.kind, cgroup.name, cpus)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Methods exists to move tasks in/out and in between groups\n",
    "# cpuset_littles.add_task()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sample energy from the target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "03:02:39  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n",
      "03:02:39  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n",
      "03:02:39  DEBUG   : SAMPLE: {'a53': {'total': 10.111351999999897, 'last': 1335.646094, 'delta': 9.059672999999975}, 'a57': {'total': 15.980763000000024, 'last': 2052.693486, 'delta': 13.449973000000227}}\n",
      "03:02:39  DEBUG   : RESET: {'a53': {'total': 0, 'last': 1335.646094, 'delta': 0}, 'a57': {'total': 0, 'last': 2052.693486, 'delta': 0}}\n",
      "03:02:40  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n",
      "03:02:40  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n",
      "03:02:40  DEBUG   : SAMPLE: {'a53': {'total': 0.3706250000000182, 'last': 1336.016719, 'delta': 0.3706250000000182}, 'a57': {'total': 0.49970399999983783, 'last': 2053.19319, 'delta': 0.49970399999983783}}\n",
      "03:02:40  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n",
      "03:02:41  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n",
      "03:02:41  DEBUG   : SAMPLE: {'a53': {'total': 0.7240460000000439, 'last': 1336.37014, 'delta': 0.35342100000002574}, 'a57': {'total': 0.9984340000000884, 'last': 2053.69192, 'delta': 0.4987300000002506}}\n",
      "03:02:43  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n",
      "03:02:44  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n",
      "03:02:44  DEBUG   : SAMPLE: {'a53': {'total': 1.2472549999999956, 'last': 1336.893349, 'delta': 0.5232089999999516}, 'a57': {'total': 1.9705329999997048, 'last': 2054.664019, 'delta': 0.9720989999996164}}\n",
      "03:02:44  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon13/energy1_input'\\'''\n",
      "03:02:45  DEBUG   : sudo -- sh -c 'cat '\\''/sys/class/hwmon/hwmon14/energy1_input'\\'''\n",
      "03:02:45  DEBUG   : SAMPLE: {'a53': {'total': 1.4408379999999852, 'last': 1337.086932, 'delta': 0.19358299999998962}, 'a57': {'total': 2.4585919999999533, 'last': 2055.152078, 'delta': 0.4880590000002485}}\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First read:  {\n",
      "    \"a53\": {\n",
      "        \"total\": 0.7240460000000439, \n",
      "        \"last\": 1336.37014, \n",
      "        \"delta\": 0.35342100000002574\n",
      "    }, \n",
      "    \"a57\": {\n",
      "        \"total\": 0.9984340000000884, \n",
      "        \"last\": 2053.69192, \n",
      "        \"delta\": 0.4987300000002506\n",
      "    }\n",
      "}\n",
      "Second read:  {\n",
      "    \"a53\": {\n",
      "        \"total\": 1.4408379999999852, \n",
      "        \"last\": 1337.086932, \n",
      "        \"delta\": 0.19358299999998962\n",
      "    }, \n",
      "    \"a57\": {\n",
      "        \"total\": 2.4585919999999533, \n",
      "        \"last\": 2055.152078, \n",
      "        \"delta\": 0.4880590000002485\n",
      "    }\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "# Reset and sample energy counters\n",
    "te.emeter.reset()\n",
    "\n",
    "# Sleep some time\n",
    "time.sleep(2)\n",
    "\n",
    "# Sample energy consumption since last reset\n",
    "nrg = te.emeter.sample()\n",
    "nrg = json.dumps(te.emeter.sample(), indent=4)\n",
    "print \"First read: \", nrg\n",
    "\n",
    "# Sleep some more time\n",
    "time.sleep(2)\n",
    "\n",
    "# Sample again\n",
    "nrg = te.emeter.sample()\n",
    "nrg = json.dumps(te.emeter.sample(), indent=4)\n",
    "print \"Second read: \", nrg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Configure FTrace for a sepcific experiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "02:59:43  DEBUG   : /usr/bin/scp -r   /home/derkling/Code/lisa/libs/devlib/devlib/bin/arm64/trace-cmd root@192.168.0.1:/root/devlib-target/bin/trace-cmd\n",
      "02:59:44  DEBUG   : chmod a+x /root/devlib-target/bin/trace-cmd\n",
      "02:59:44  DEBUG   : cat /sys/kernel/debug/tracing/available_events\n",
      "02:59:44  INFO    :         FTrace - Enabled tracepoints:\n",
      "02:59:44  INFO    :         FTrace -   cpu_idle\n",
      "02:59:44  INFO    :         FTrace -   cpu_capacity\n",
      "02:59:44  INFO    :         FTrace -   cpu_frequency\n",
      "02:59:44  INFO    :         FTrace -   sched_switch\n"
     ]
    }
   ],
   "source": [
    "# Configure a specific set of events to trace\n",
    "te.ftrace_conf(\n",
    "    {                                                                                                                                             \n",
    "         \"events\" : [                                                                                                                                            \n",
    "             \"cpu_idle\",                                                                                                                                         \n",
    "             \"cpu_capacity\",\n",
    "             \"cpu_frequency\",\n",
    "             \"sched_switch\",\n",
    "         ],                                                                                                                                                      \n",
    "         \"buffsize\" : 10240                                                                                                                                      \n",
    "    }\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "02:59:45  DEBUG   : sudo -- sh -c 'echo 10240 > '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n",
      "02:59:45  DEBUG   : sudo -- sh -c 'cat '\\''/sys/kernel/debug/tracing/buffer_size_kb'\\'''\n",
      "02:59:45  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/trace-cmd reset'\n",
      "02:59:46  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/trace-cmd start -e cpu_idle -e cpu_capacity -e cpu_frequency -e sched_switch'\n",
      "02:59:48  DEBUG   : sudo -- sh -c 'echo TRACE_MARKER_START > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n",
      "02:59:48  DEBUG   : Trace CPUFreq frequencies\n",
      "02:59:48  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n",
      "02:59:48  DEBUG   : uname -a\n",
      "02:59:49  DEBUG   : Trace CPUFreq frequencies\n",
      "02:59:49  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/shutils cpufreq_trace_all_frequencies'\n",
      "02:59:49  DEBUG   : sudo -- sh -c 'echo TRACE_MARKER_STOP > '\\''/sys/kernel/debug/tracing/trace_marker'\\'''\n",
      "02:59:49  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/trace-cmd stop'\n"
     ]
    }
   ],
   "source": [
    "# Start/Stop a FTrace session\n",
    "te.ftrace.start()\n",
    "te.target.execute(\"uname -a\")\n",
    "te.ftrace.stop()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "02:59:50  DEBUG   : sudo -- sh -c '/root/devlib-target/bin/trace-cmd extract -o /root/devlib-target/trace.dat'\n",
      "02:59:51  DEBUG   : /usr/bin/scp -r   root@192.168.0.1:/root/devlib-target/trace.dat /home/derkling/Code/lisa/results/TestEnvExample/trace.dat\n"
     ]
    }
   ],
   "source": [
    "# Collect and visualize the trace\n",
    "trace_file = os.path.join(te.res_dir, 'trace.dat')\n",
    "te.ftrace.get_trace(trace_file)\n",
    "output = os.popen(\"DISPLAY=:0.0 kernelshark {}\".format(trace_file))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}