tree: 6253bc0ce608a416241d4243aa42f70d868a3225 [path history] [tgz]
  1. cli/
  2. service/
  3. state-machine/
  4. cros_fw_provision_test.go
  5. main.go
  6. OWNERS
  7. README.md
src/go.chromium.org/chromiumos/test/provision/v2/cros-fw-provision/README.md

cros-fw-provision

This directory contains cros-fw-provision: a service for preparing devices-under-test with specific application processor (“AP”) and embedded controller (“EC”) firmware (“fw”) builds. Preparing devices with specific builds is called “provisioning”.

See go/cft-fw-provision-v2 for background.

Launching

A prebuilt cros-fw-provision will be available in the chroot. To launch it, execute, cros-fw-provision server or cros-fw-provision cli. server spins up a service and waits for a gRPC request to come over the network before provisioning starts. cli immediately executes the request, which is required to be passed in during launch.

Building locally

See also go/cft-fw-provision-local-guide.

To build and run locally:

These example assume some vars are set in your shell:

BOARD=myBoard
MODEL=myModel
DUT_HOSTNAME=192.168.0.0

Outside chroot

cd ~/chromiumos
cros workon --host start local-cft && cros_sdk -- sudo emerge local-cft

gcloud auth application-default print-access-token >/dev/null || gcloud auth application-default login

If you are running with a local dut, you will need a cache server. Then set the CACHE_SERVER variable below with your IP as seen from the DUT, otherwise set the CACHE_SERVER variable to any cache server that is visible from the DUT.

docker run -d --rm -P --cap-add=NET_RAW --name visible-cache-server --expose 8082 -p 8082:8082 --volume $HOME/.config/:/root/.config --volume /tmp/local-cft/cacheserver:/tmp/cacheserver us-docker.pkg.dev/cros-registry/test-services/cacheserver:prod cacheserver -location /tmp/cacheserver -port 8082

Alternatively, you can build the cache server from source and run it.

sudo ufw allow 8082 # Open the port in the linux firewall.
~/chromiumos/src/platform/dev/fast_build.sh -b go.chromium.org/chromiumos/prototytpe/cache/cmd/cacheserver -o ~/go/bin/cacheserver && ~/go/bin/cacheserver -port 8082

Then run the local-cft binary to run the cros-dut server.

./chroot/usr/bin/local-cft -board ${BOARD?} -host ${DUT_HOSTNAME?} -stayalive -port cros-dut=8123
# If you made changes in another service like cros-dut run
# ./chroot/usr/bin/local-cft -board ${BOARD?} -host ${DUT_HOSTNAME?} -stayalive -port cros-dut=8123 --chroot ~/chromiumos/chroot --localservices cros-dut

To find the cache server on a lab machine:

ssh $DUT_HOSTNAME 'for devserver in 192.168.100.1 100.115.168.190 10.128.176.210 100.115.21.212 100.115.245.199 100.115.245.200 100.115.219.131 100.115.219.132 100.115.219.133 100.115.219.134 100.115.219.137; do if curl -f --connect-timeout 3 "http://${devserver?}:8082/check_health" >/dev/null ; then echo CACHE_SERVER=${devserver?} ; fi; done'

Inside chroot

FW_IMAGE=$(gsutil ls -l gs://chromeos-image-archive/firmware-{brya,glados,oak,${BOARD?}}*-branch/*/${BOARD?}/firmware_from_source.tar.bz2 | grep -v TOTAL | sort -k2 | tail -1 | awk '{print $3}')
CACHE_SERVER=192.168.100.1
cat >startup.json <<STARTUP
{
        "dut": {
                "chromeos": {
                        "dut_model": {
                                "build_target": "${BOARD?}",
                                "model_name": "${MODEL?}"
                        }
                },
                "cache_server": {
                        "address": {
                                "address": "${CACHE_SERVER?}",
                                "port": 8082
                        }
                }
        },
        "dut_server": {
                "address": "localhost",
                "port": 8123
        }
}
STARTUP
cat >install.json <<INSTALL
{
        "metadata": {
                "@type": "chromiumos.test.api.FirmwareProvisionInstallMetadata",
                "firmware_config": {
                        "mainRoPayload": {
                                "firmwareImagePath": {
                                        "hostType": "GS",
                                        "path": "${FW_IMAGE?}"
                                }
                        },
                        "ecRoPayload": {
                                "firmwareImagePath": {
                                        "hostType": "GS",
                                        "path": "${FW_IMAGE?}"
                                }
                        }
                }
        }
}
INSTALL
~/chromiumos/src/platform/dev/fast_build.sh -b go.chromium.org/chromiumos/test/provision/v2/cros-fw-provision \
        -o ~/go/bin/cros-fw-provision && \
        ~/go/bin/cros-fw-provision cli -startup startup.json -install install.json

Dependencies

cros-fw-provision expects cros-cache, and either cros-dut or cros-servod, to be running.

In the lab, the cache server should already be up. Local runs of cros-fw-provision will need the cache server started.

cros-dut is needed if provisioning directly.

cros-servod is needed if provisioning over servo.

Testing

Run the test with fast_build.sh:

~/chromiumos/src/platform/dev/fast_build.sh -t go.chromium.org/chromiumos/test/provision/v2/cros-fw-provision

Generate coverage report

Build the ebuild with coverage enabled:

cros workon --host start cros-fw-provision
sudo USE="coverage" FEATURES="test noclean" emerge cros-fw-provision

Then open the html file at /var/lib/chromeos/package-artifacts/dev-util/cros-fw-provision-9999/cros-artifacts/coverage_logs/cros-fw-provision.html