=================================
What's New in Workload Automation
=================================

-------------
Version 2.5.0
-------------

Additions:
##########

Instruments
~~~~~~~~~~~
- ``servo_power``: Added support for chromebook servo boards.
- ``file_poller``: polls files and outputs a CSV of their values over time.
- ``systrace``: The Systrace tool helps analyze the performance of your
  application by capturing and displaying execution times of your applications
  processes and other Android system processes.

Workloads
~~~~~~~~~
- ``blogbench``: Blogbench is a portable filesystem benchmark that tries to
  reproduce the load of a real-world busy file server.
- ``stress-ng``: Designed to exercise various physical subsystems of a computer
  as well as the various operating system kernel interfaces.
- ``hwuitest``: Uses hwuitest from AOSP to test rendering latency on Android
  devices.
- ``recentfling``: Tests UI jank on android devices.
- ``apklaunch``: installs and runs an arbitrary apk file.
- ``googlemap``: Launches Google Maps and replays previously recorded
  interactions.

Framework
~~~~~~~~~
- ``wlauto.utils.misc``: Added ``memoised`` function decorator that allows
  caching of previous function/method call results.
- Added new ``Device`` APIs:
   - ``lsmod``: lists kernel modules
   - ``insmod``: inserts a kernel module from a ``.ko`` file on the host.
   - ``get_binary_path``: Checks ``binary_directory`` for the wanted binary,
     if it is not found there it will try to use ``which``
   - ``install_if_needed``: Will only install a binary if it is not already
     on the target.
   - ``get_device_model``: Gets the model of the device.
- ``wlauto.core.execution.ExecutionContext``:
   - ``add_classfiers``: Allows adding a classfier to all metrics for the
     current result.

Other
~~~~~
- Commands:
   - ``record``: Simplifies recording revent files.
   - ``replay``: Plays back revent files.

Fixes/Improvements:
###################

Devices
~~~~~~~
- ``juno``:
   - Fixed ``bootargs`` parameter not being passed  to ``_boot_via_uboot``.
   - Removed default ``bootargs``
- ``gem5_linux``:
   - Added ``login_prompt`` and ``login_password_prompt`` parameters.
- ``generic_linux``: ABI is now read from the target device.

Instruments
~~~~~~~~~~~
- ``trace-cmd``:
   - Added the ability to report the binary trace on the target device,
     removing the need for ``trace-cmd`` binary to be present on the host.
   - Updated to handle messages that the trace for a CPU is empty.
   - Made timeout for pulling trace 1 minute at minimum.
- ``perf``: per-cpu statistics now get added as metrics to the results (with a
   classifier used to identify the cpu).
- ``daq``:
   - Fixed bug where an exception would be raised if ``merge_channels=False``
   - No longer allows duplicate channel labels
- ``juno_energy``:
   - Summary metrics are now calculated from the contents of ``energy.csv`` and
     added to the overall results.
   - Added a ``strict`` parameter. When this is set to ``False`` the device
     check during validation is omitted.
- ``sysfs_extractor``: tar and gzip are now performed separately to solve
  permission issues.
- ``fps``:
   - Now only checks for crashed content if ``crash_check`` is ``True``.
   - Can now process multiple ``view`` attributes.
- ``hwmon``: Sensor naming fixed, they are also now added as result classifiers

Resource Getters
~~~~~~~~~~~~~~~~
- ``extension_asset``: Now picks up the path to the mounted filer from the
  ``remote_assets_path`` global setting.

Result Processors
~~~~~~~~~~~~~~~~~
- ``cpustates``:
   - Added the ability to configure how a missing ``START`` marker in the trace
     is handled.
   - Now raises a warning when there is a ``START`` marker in the trace but no
     ``STOP`` marker.
   - Exceptions in PowerStateProcessor no longer stop the processing of the
     rest of the trace.
   - Now ensures a known initial state by nudging each CPU to bring it out of
     idle and writing starting CPU frequencies to the trace.
   - Added the ability to create a CPU utilisation timeline.
   - Fixed issues with getting frequencies of hotplugged CPUs
- ``csv``: Zero-value classifieres are no longer converted to an empty entry.
- ``ipynb_exporter``: Default template no longer shows a blank plot for
  workloads without ``summary_metrics``

Workloads
~~~~~~~~~
- ``vellamo``:
   - Added support for v3.2.4.
   - Fixed getting values from logcat.
- ``cameracapture``: Updated to work with Android M+.
- ``camerarecord``: Updated to work with Android M+.
- ``lmbench``:
   - Added the output file as an artifact.
   - Added taskset support
- ``antutu`` - Added support for v6.0.1
- ``ebizzy``: Fixed use of ``os.path`` to ``self.device.path``.
- ``bbench``: Fixed browser crashes & permissions issues on android M+.
- ``geekbench``:
   - Added check whether device is rooted.
- ``manual``: Now only uses logcat on Android devices.
- ``applaunch``:
   - Fixed ``cleanup`` not getting forwarded to script.
   - Added the ability to stress IO during app launch.
- ``dhrystone``: Now uses WA's resource resolution to find it's binary so it
  uses the correct ABI.
- ``glbench``: Updated for new logcat formatting.

Framework
~~~~~~~~~
- ``ReventWorkload``:
   - Now kills all revent instances on teardown.
   - Device model name is now used when searching for revent files, falling back
     to WA device name.
- ``BaseLinuxDevice``:
   - ``killall`` will now run as root by default if the device
     is rooted.
   - ``list_file_systems`` now handles blank lines.
   - All binaries are now installed into ``binaries_directory`` this allows..
   - Busybox is now deployed on non-root devices.
   - gzipped property files are no zcat'ed
- ``LinuxDevice``:
   - ``kick_off`` no longer requires root.
   - ``kick_off`` will now run as root by default if the device is rooted.
   - No longer raises an exception if a connection was dropped during a reboot.
   - Added a delay before polling for a connection to avoid re-connecting to a
     device that is still in the process of rebooting.
- ``wlauto.utils.types``: ``list_or_string`` now ensures that elements of a list
  are strings.
- ``AndroidDevice``:
   - ``kick_off`` no longer requires root.
   - Build props are now gathered via ``getprop`` rather than trying to parse
     build.prop directly.
   - WA now pushes its own ``sqlite3`` binary.
   - Now uses ``content`` instead of ``settings`` to get ``ANDROID_ID``
   - ``swipe_to_unlock`` parameter is now actually used. It has been changed to
      take a direction to accomodate various devices.
   - ``ensure_screen_is_on`` will now also unlock the screen if swipe_to_unlock
     is set.
   - Fixed use of variables in as_root=True commands.
   - ``get_pids_of`` now used ``busybox grep`` since as of Android M+ ps cannot
     filter by process name anymore.
   - Fixed installing APK files with whitespace in their path/name.
- ``adb_shell``:
   - Fixed handling of line breaks at the end of command output.
   - Newline separator is now detected from the target.
   - As of ADB v1.0.35, ADB returns the return code of the command run. WA now
     handles this correctly.
- ``ApkWorkload``:
   - Now attempts to grant all runtime permissions for devices on Android M+.
   - Can now launch packages that don't have a launch activity defined.
   - Package version is now added to results as a classifier.
   - Now clears app data if an uninstall failed to ensure it starts from a known
     state.
- ``wlauto.utils.ipython``: Updated to work with ipython v5.
- ``Gem5Device``:
   - Added support for deploying the ``m5`` binary.
   - No longer waits for the boot animation to finish if it has been disabled.
   - Fixed runtime error caused by lack of kwargs.
   - No longer depends on ``busybox``.
   - Split out commands to resize shell to ``resize_shell``.
   - Now tries to connect to the shell up to 10 times.
   - No longer renames gzipped files.
- Agendas:
  - Now errors when an agenda key is empty.
- ``wlauto.core.execution.RunInfo``: ``run_name`` will now default to
  ``{output_folder}_{date}_{time}``.
- Extensions:
   - Two different parameters can now have the same global alias as long as they
     their types match.
   - You can no longer ``override`` parameters that are defined at the same
     level.
- ``wlauto.core.entry_point``: Now gives a better error when a config file
  doesn't exist.
- ``wlauto.utils.misc``: Added ``aarch64`` to list for arm64 ABI.
- ``wlauto.core.resolver``: Now shows what version was being search for when a
  resource is not found.
- Will no longer start instruments ect. if a run has no workload specs.
- ``wlauto.utils.uboot``: Now detects uboot version to use correct line endings.
- ``wlauto.utils.trace_cmd``: Added a parser for sched_switch events.

Other
~~~~~
- Updated to pylint v1.5.1
- Rebuilt ``busybox`` binaries to prefer built-in applets over system binaries.
- ``BaseUiAutomation``: Added functions for checking version strings.

Incompatible changes
####################

Instruments
~~~~~~~~~~~
- ``apk_version``: Removed, use result classifiers instead.

Framework
~~~~~~~~~
- ``BaseLinuxDevice``: Removed ``is_installed`` use ``install_if_needed`` and
  ``get_binary_path`` instead.
- ``LinuxDevice``: Removed ``has_root`` method, use ``is_rooted`` instead.
- ``AndroidDevice``: ``swipe_to_unlock`` method replaced with
  ``perform_unlock_swipe``.

-------------
Version 2.4.0
-------------

Additions:
##########

Devices
~~~~~~~~
- ``gem5_linux`` and ``gem5_android``: Interfaces for Gem5 simulation
  environment running Linux and Android respectively.
- ``XE503C1211``: Interface for Samsung XE503C12 Chromebooks.
- ``chromeos_test_image``: Chrome OS test image device. An off the shelf
  device will not work with this device interface.

Instruments
~~~~~~~~~~~~
- ``freq_sweep``: Allows "sweeping" workloads across multiple CPU frequencies.
- ``screenon``: Ensures screen is on, before each iteration, or periodically
  on Android devices.
- ``energy_model``: This instrument can be used to generate an energy model
  for a device based on collected power and performance measurments.
- ``netstats``:  Allows monitoring data sent/received by applications on an
  Android device.

Modules
~~~~~~~
- ``cgroups``: Allows query and manipulation of cgroups controllers on a Linux
  device. Currently, only cpusets controller is implemented.
- ``cpuidle``: Implements cpuidle state discovery, query and manipulation for
  a Linux device. This replaces the more primitive get_cpuidle_states method
  of LinuxDevice.
- ``cpufreq`` has now been split out into a device module

Reasource Getters
~~~~~~~~~~~~~~~~~
- ``http_assets``:  Downloads resources from a web server.

Results Processors
~~~~~~~~~~~~~~~~~~~
- ``ipynb_exporter``: Generates an IPython notebook from a template with the
  results and runs it.
- ``notify``: Displays a desktop notification when a run finishes
  (Linux only).
- ``cpustates``: Processes power ftrace to produce CPU state and parallelism
  stats. There is also a script to invoke this outside of WA.

Workloads
~~~~~~~~~
- ``telemetry``: Executes Google's Telemetery benchmarking framework
- ``hackbench``: Hackbench runs tests on the Linux scheduler
- ``ebizzy``: This workload resembles common web server application workloads.
- ``power_loadtest``: Continuously cycles through a set of browser-based
  activities and monitors battery drain on a device (part of ChromeOS autotest
  suite).
- ``rt-app``: Simulates configurable real-time periodic load.
- ``linpack-cli``:  Command line version of linpack benchmark.
- ``lmbench``: A suite of portable ANSI/C microbenchmarks for UNIX/POSIX.
- ``stream``: Measures memory bandwidth.
- ``iozone``: Runs a series of disk I/O performance tests.
- ``androbench``:  Measures the storage performance of device.
- ``autotest``:  Executes tests from ChromeOS autotest suite.

Framework
~~~~~~~~~
- ``wlauto.utils``:
   - Added ``trace_cmd``, a generic trace-cmd paraser.
   - Added ``UbootMenu``, allows navigating Das U-boot menu over serial.
- ``wlauto.utils.types``:
   - ``caseless_string``: Behaves exactly like a string, except this ignores
     case in comparisons. It does, however, preserve case.
   - ``list_of``: allows dynamic generation of type-safe list types based on
     an existing type.
   - ``arguments``: represents arguments that are passed on a command line to
     an application.
   - ``list-or``: allows dynamic generation of types that accept either a base
     type or a list of base type. Using this ``list_or_integer``,
     ``list_or_number`` and ``list_or_bool`` were also added.
- ``wlauto.core.configuration.WorkloadRunSpec``:
   - ``copy``: Allows making duplicates of ``WorkloadRunSpec``'s
- ``wlatuo.utils.misc``:
   - ``list_to_ranges`` and ``ranges_to_list``: convert between lists of
     integers and corresponding range strings, e.g. between [0,1,2,4] and
     '0-2,4'
   - ``list_to_mask`` and ``mask_to_list``: convert between lists of integers
     and corresponding integer masks, e.g. between [0,1,2,4] and 0x17
- ``wlauto.instrumentation``:
   - ``instrument_is_enabled``: Returns whether or not an instrument is
     enabled for the current job.
- ``wlauto.core.result``:
   - Added "classifiers" field to Metric objects. This is a dict mapping
     classifier names (arbitrary strings) to corresponding values for that
     specific metrics. This is to allow extensions to add extension-specific
     annotations to metric that could be handled in a generic way (e.g. by
     result processors). They can also be set in agendas.
- Failed jobs will now be automatically retired
- Implemented dynamic device modules that may be loaded automatically on
  device initialization if the device supports them.
- Added support for YAML configs.
- Added ``initialze`` and ``finalize`` methods to workloads.
- ``wlauto.core.ExecutionContext``:
   - Added ``job_status`` property that returns the status of the currently
     running job.

Fixes/Improvements
##################

Devices
~~~~~~~~
- ``tc2``: Workaround for buffer overrun when loading large initrd blob.
- ``juno``:
     - UEFI config can now be specified as a parameter.
     - Adding support for U-Boot booting.
     - No longer auto-disconnects ADB at the end of a run.
     - Added ``actually_disconnect`` to restore old disconnect behaviour
     - Now passes ``video`` command line to Juno kernel to work around a known
       issue where HDMI loses sync with monitors.
     - Fixed flashing.

Instruments
~~~~~~~~~~~
- ``trace_cmd``:
     - Fixed ``buffer_size_file`` for non-Android devices
     - Reduce starting priority.
     - Now handles trace headers and thread names with spaces
- ``energy_probe``: Added ``device_entry`` parameter.
- ``hwmon``:
     - Sensor discovery is now done only at the start of a run.
     - Now prints both before/after and mean temperatures.
- ``daq``:
     - Now reports energy
     - Fixed file descriptor leak
     - ``daq_power.csv`` now matches the order of labels (if specified).
     - Added ``gpio_sync``. When enabled, this wil cause the instrument to
       insert a marker into ftrace, while at the same time setting a GPIO pin
       high.
     - Added ``negative_values`` parameter. which can be used to specify how
       negative values in the samples should be handled.
     - Added ``merge_channels`` parameter. When set DAQ channel will be summed
       together.
     - Workload labels, rather than names, are now used in the "workload"
       column.
- ``cpufreq``:
     - Fixes missing directories problem.
     - Refined the availability check not to rely on the top-level cpu/cpufreq
       directory
     - Now handles non-integer output in ``get_available_frequencies``.
- ``sysfs_extractor``:
     - No longer raises an error when both device and host paths are empty.
     - Fixed pulled files verification.
- ``perf``:
     - Updated binaries.
     - Added option to force install.
     - ``killall`` is now run as root on rooted Android devices.
- ``fps``:
     - now generates detailed FPS traces as well as report average FPS.
     - Updated jank calcluation to only count "large" janks.
     - Now filters out bogus ``actual-present`` times and ignore janks above
       ``PAUSE_LATENCY``
- ``delay``:
     - Added ``fixed_before_start`` parameter.
     - Changed existing ``*_between_specs`` and ``*_between_iterations``
       callbacks to be ``very_slow``
- ``streamline``:
     - Added Linux support
     - ``gatord`` is now only started once at the start of the run.

modules
~~~~~~~
- ``flashing``:
     - Fixed vexpress flashing
     - Added an option to keep UEFI entry

Result Processors
~~~~~~~~~~~~~~~~~
- ``cpustate``:
     - Now generates a timeline csv as well as stats.
     - Adding ID to overall cpustate reports.
- ``csv``: (partial) ``results.csv`` will now be written after each iteration
  rather than at the end of the run.

Workloads
~~~~~~~~~
- ``glb_corporate``: clears logcat to prevent getting results from previous
  run.
- ``sysbench``:
     - Updated sysbench binary to a statically linked verison
     - Added ``file_test_mode parameter`` - this is a mandatory argumet if
       ``test`` is ``"fileio"``.
     - Added ``cmd_params`` parameter to pass options directily to sysbench
       invocation.
     - Removed Android browser launch and shutdown from workload (now runs on
       both Linux and Android).
     - Now works with unrooted devices.
     - Added the ability to run based on time.
     - Added a parameter to taskset to specific core(s).
     - Added ``threads`` parameter to be consistent with dhrystone.
     - Fixed case where default ``timeout`` < ``max_time``.
- ``Dhrystone``:
     - added ``taskset_mask`` parameter to allow pinning to specific cores.
     - Now kills any running instances during setup (also handles CTRL-C).
- ``sysfs_extractor``: Added parameter to explicitly enable/disable tempfs
  caching.
- ``antutu``:
     - Fixed multi-``times`` playback for v5.
     - Updated result parsing to handle Android M logcat output.
- ``geekbench``: Increased timout to cater for slower devices.
- ``idle``: Now works on Linux devices.
- ``manhattan``: Added ``run_timemout`` parameter.
- ``bbench``: Now works when binaries_directory is not in path.
- ``nemamark``: Made duration configurable.

Framework
~~~~~~~~~~
- ``BaseLinuxDevice``:
     - Now checks that at least one core is enabled on another cluster before
       attempting to set number of cores on a cluster to ``0``.
     - No longer uses ``sudo`` if already logged in as ``root``.
     - Now saves ``dumpsys window`` output to the ``__meta`` directory.
     - Now takes ``password_prompt`` as a parameter for devices with a non
       standard ``sudo`` password prompt.
     - No longer raises an error if ``keyfile`` or ``password`` are not
       provided when they are not necessary.
     - Added new cpufreq APIs:
        - ``core`` APIs take a core name as the parameter (e.g. "a15")
        - ``cluster`` APIs take a numeric cluster ID (eg. 0)
        - ``cpu`` APIs take a cpufreq cpu ID as a parameter.
     - ``set_cpu_frequency`` now has a ``exact`` parameter. When true (the
       default) it will produce an error when the specified frequency is not
       supported by the cpu, otherwise cpufreq will decide what to do.
     - Added ``{core}_frequency`` runtime parameter to set cluster frequency.
     - Added ``abi`` property.
     - ``get_properties`` moved from ``LinuxDevice``, meaning ``AndroidDevice``
       will try to pull the same files. Added more paths to pull by default
       too.
     - fixed ``list_file_systems`` for Android M and Linux devices.
     - Now sets ``core_clusters`` from ``core_names`` if not explicitly
       specified.
     - Added ``invoke`` method that allows invoking an executable on the device
       under controlled contions (e.g. within a particular directory, or
       taskset to specific CPUs).
     - No longer attempts to ``get_sysfile_value()`` as root on unrooted
       devices.
- ``LinuxDevice``:
     - Now creates ``binaries_directory`` path if it doesn't exist.
     - Fixed device reset
     - Fixed ``file_exists``
     - implemented ``get_pid_of()`` and ``ps()``. Existing implementation
       relied on Android version of ps.
     - ``listdir`` will now return an empty list for an empty directory
       instead of a list containing a single empty string.
- ``AndroidDevice``:
     - Executable (un)installation now works on unrooted devices.
     - Now takes into account ``binar_directory`` when setting up busybox path.
     - update ``android_prompt`` so that it works even if is not ``"/"``
     - ``adb_connect``: do not assume port 5555 anymore.
     - Now always deploys busybox on rooted devices.
     - Added ``swipe_to_unlock`` method.
- Fixed initialization of ``~/.workload_automation.``.
- Fixed replaying events using revent on 64 bit platforms.
- Improved error repoting when loading extensions.
- ``result`` objects now track their output directories.
- ``context.result`` will not result in ``context.run_result`` when not
  executing a job.
- ``wlauto.utils.ssh``:
     - Fixed key-based authentication.
     - Fixed carriage return stripping in ssh.
     - Now takes ``password_prompt`` as a parameter for non standard ``sudo``
       password prompts.
     - Now with 100% more thread safety!
     - If a timeout condition is hit, ^C is now sent to kill the current
       foreground process and make the shell available for subsequent commands.
     - More robust ``exit_code`` handling for ssh interface
     - Now attempts to deal with dropped connections
     - Fixed error reporting on failed exit code extraction.
     - Now handles backspaces in serial output
     - Added ``port`` argument for telnet connections.
     - Now allows telnet connections without a password.
- Fixed config processing for extensions with non-identifier names.
- Fixed ``get_meansd`` for numbers < 1
- ``wlatuo.utils.ipython``:
     - Now supports old versions of IPython
     - Updated version check to only initialize ipython utils if version is
       < 4.0.0. Version 4.0.0 changes API and breaks WA's usage of it.
- Added ``ignore`` parameter to ``check_output``
- Agendas:
     - Now raise an error if an agenda contains duplicate keys
     - Now raise an error if config section in an agenda is not dict-like
     - Now properly handles ``core_names`` and ``core_clusters``
     - When merging list parameters from different sources, duplicates are no
       longer removed.
- The ``INITIAL_BOOT`` signal is now sent went performing a hard reset during
  intial boot
- updated ``ExecutionContext`` to keep a reference to the ``runner``. This
  will enable Extenstions to do things like modify the job queue.
- Parameter now automatically convert int and boot kinds to integer and
  boolean respectively, this behavior can be supressed by specifying
  ``convert_types``=``False`` when defining the parameter.
- Fixed resource resolution when dependency location does not exist.
- All device ``push`` and ``pull`` commands now raise ``DeviceError`` if they
  didn't succeed.
- Fixed showing Parameter default of ``False`` for boolean values.
- Updated csv result processor with the option to use classifiers to
  add columns to ``results.csv``.
- ``wlauto.utils.formatter``: Fix terminal size discovery.
- The extension loader will now follow symlinks.
- Added arm64-v8a to ABI map
- WA now reports syntax errors in a more informative way.
- Resource resolver: now prints the path of the found resource to the log.
- Resource getter: look for executable in the bin/ directory under resource
  owner's dependencies directory as well as general dependencies bin.
- ``GamingWorkload``:
     - Added an option to prevent clearing of package data before execution.
     - Added the ability to override the timeout of deploying the assets
       tarball.
- ``ApkWorkload``: Added an option to skip host-side APK check entirely.
- ``utils.misc.normalize``: only normalize string keys.
- Better error reporting for subprocess.CalledProcessError
- ``boolean`` now interprets ``'off'`` as ``False``
- ``wlauto.utils.uefi``: Added support for debug builds.
- ``wlauto.utils.serial_port``: Now supports fdexpect versions > 4.0.0
- Semanatics for ``initialize``/``finalize`` for *all* Extensions are changed
  so that now they will always run at most once per run. They will not be
  executed twice even if invoked via instances of different subclasses (if
  those subclasses defined their own verions, then their versions will be
  invoked once each, but the base version will only get invoked once).
- Pulling entries from procfs does not work on some platforms. WA now tries
  to cat the contents of a property_file and write it to a output file on the
  host.

Documentation
~~~~~~~~~~~~~
- ``installation``:
     - Added ``post install`` section which lists workloads that require
       additional external dependencies.
     - Added the ``uninstall`` and ``upgrade`` commands for users to remove or
       upgrade Workload Automation.
     - Added documentation explaining how to use ``remote_assets_path``
       setting.
     - Added warning about potential permission issues with pip.
- ``quickstart``: Added steps for setting up WA to run on Linux devices.
- ``device_setup``: fixed ``generic_linux`` ``device_config`` example.
- ``contributing``: Clarified style guidelines
- ``daq_device_setup``: Added an illustration for DAQ wiring.
- ``writing_extensions``: Documented the Workload initialize and finalize
  methods.
- Added descriptions to extension that didn't have one.

Other
~~~~~
- ``daq_server``:
     - Fixed showing available devices.
     - Now works with earlier versions of the DAQmx driver.thus you can now run
       the server on Linux systems.
     - DAQ error messages are now properly propaged to the client.
     - Server will now periodically clean up uncollected files.
     - fixed not being able to resolve IP address for hostname
       (report "localhost" in that case).
     - Works with latest version of twisted.
- ``setup.py``: Fixed paths to work with Mac OS X.
- ``summary_csv`` is no longer enabled by default.
- ``status`` result processor is now enabled by default.
- Commands:
     - ``show``:
         - Now shows what platform extensions support.
         - Will no longer try to use a pager if ``PAGER=''`` in the environment.
     - ``list``:
         - Added ``"-p"`` option to filter results by supported platforms.
         - Added ``"--packaged-only"`` option to only list extensions packaged
           with WA.
     - ``run``: Added ``"--disable"`` option to diable instruments.
     - ``create``:
         - Added ``agenda`` sub-command to generate agendas for a set of
           extensions.
         - ``create workload`` now gives more informative errors if Android SDK
           installed but no platform has been downloaded.

Incompatible changes
####################

Framework
~~~~~~~~~
- ``BaseLinuxDevice``:
     - Renamed ``active_cpus`` to ``online_cpus``
     - Renamed ``get_cluster_cpu`` to ``get_cluster_active_cpu``
     - Renamed ``get_core_cpu`` to ``get_core_online_cpu``
- All extension's ``initialize`` function now takes one (and only one)
  parameter, ``context``.
- ``wlauto.core.device``: Removed ``init`` function. Replaced with
  ``initialize``

-------------
Version 2.3.0
-------------

- First publicly-released version.
