Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
961db91
[bug] pooling convert layout bug in pooling.cc and in test_pass_conve…
Oct 9, 2021
5a2eed6
[Frontend][PaddlePaddle] Fix bug for paddle frontend (#9236)
jiangjiajun Oct 9, 2021
b275781
[BugFix] Fix to allow zero-copy between numpy and TVM NDArrays (#9230)
junrushao Oct 9, 2021
44549e6
Documentation Refactor (#9203)
Oct 9, 2021
322aad5
[CI] Use correct tag in Docker --cache-from (#9234)
Mousius Oct 10, 2021
74aa856
[DOCS] Fix installation from source link some text (#9238)
tqchen Oct 11, 2021
0b91e53
Initial Implementation of TIRToRuntime Target hook (#9190)
Mousius Oct 11, 2021
0fa860c
[TVM] Add importer for ONNX QLinearMatMul op (#8952)
cconvey Oct 11, 2021
8ba0451
Arm(R) Ethos(TM)-U NPU Depthwise2d operator support (#9209)
ekalda Oct 11, 2021
5ad2f77
[Relay] Gather op dynamic input support (#9240)
masahi Oct 11, 2021
95cde0c
[AlterLayout] Strided slice layout transform fix (disallow NCHW4c -> …
masahi Oct 11, 2021
f08dca8
[RPC] Fix Server connecting to RPC Tracker through a Proxy (#9210)
KJlaccHoeUM9l Oct 11, 2021
01744d1
Fix typo in error message in CMakeLists.txt (#9251)
electriclilies Oct 12, 2021
8725eb5
add stage to log (#9249)
mehrdadh Oct 12, 2021
a7cf317
[TIR][USMP] Add a parallel to serial for loop converter pass (#8469)
manupak Oct 12, 2021
d1967f2
[Relay] Improve reduction op layout propagation for packed input (#9…
masahi Oct 12, 2021
0d10973
[microNPU] Enforce bias when pattern matching conv2d (#9244)
lhutton1 Oct 12, 2021
f4922bc
Fix USMP parallel to serial loop transform test (#9254)
Mousius Oct 12, 2021
9f27be6
[TVMC] Split common tvmc test file into more specific files (#9206)
Mousius Oct 12, 2021
4f6b478
Address review comments on Arm(R) Ethos(TM)-U PR 3/6 (#9159)
mbaret Oct 12, 2021
8bd845d
[Simplifier] Add printing of SplitExprNode and SumExprNode (#9262)
Oct 13, 2021
b5d863c
fix docs (#9266)
altanh Oct 13, 2021
3229cb3
[LLVM] Treat scalars as single-lane vectors in CreateVecConcat (#9264)
Oct 13, 2021
617c712
[TIR] Added PrettyPrint of ProducerStore/ProducerRealize nodes (#9259)
Lunderberg Oct 13, 2021
3ee8efa
[TIR] Minor refactor to tir.transform.StorageFlatten (#9260)
Lunderberg Oct 13, 2021
8a3fcc4
[TVMC] Compose target options from target registry (#9218)
Mousius Oct 13, 2021
80beda7
Hexagon conv2d full output slice (#9198)
adstraw Oct 13, 2021
9cd07e4
[Hexagon] Add hexagon launcher to apps and add to TVM's build system …
csullivan Oct 13, 2021
f9caf2e
Propagate tvm target through graph tuning setup (#9248)
rkimball Oct 13, 2021
185e2fb
[Topi] Fix direct SIMD conv2d schedule name (#9225)
mehrdadh Oct 13, 2021
2dc58be
Bumping up CMSIS-NN version to be in sync with TFLu (#9247)
asparkhi Oct 13, 2021
b206570
[Runtime] Pipeline Executor Second patch, configuration load and exec…
huajsj Oct 14, 2021
4c00264
[CI] Pre-build Reference System Dependencies (#9270)
Mousius Oct 14, 2021
523eb12
[Pytest] Sort unit tests before running. (#9188)
Lunderberg Oct 14, 2021
7e014a4
[ONNX] [Relay] Resize Opset 13 (#9265)
CircleSpin Oct 14, 2021
575ac86
Skip onnx test cases if no onnx (#9272)
Mousius Oct 14, 2021
d153676
Update TVM_LOG_DEBUG for IR tracing. (#9278)
mbs-octoml Oct 14, 2021
594f23d
[Core][Build] Move build module transformations and utilities to C++ …
mikepapadim Oct 14, 2021
2177632
[Tutorial] Fix vta vision detection tutorial 'sphinx' style error. (#…
huajsj Oct 14, 2021
59b3cf7
Reset sphinx-gallery version to 0.4.0 (#9280)
Mousius Oct 14, 2021
95a2031
[Tests] Ensure MyPy type checks pass (#9284)
Mousius Oct 14, 2021
08018ea
[TIR] Add support for 0-dim buffer (#9224)
Oct 14, 2021
f4db899
[TFLite] Add option to overwrite OperatorConverter class in relay.fro…
PhilippvK Oct 14, 2021
acff61c
[Frontend][PaddlePaddle] Remove unused parameters and fix doc string …
jiangjiajun Oct 15, 2021
c00ce37
[Profiler] Do not aggregate frames with different devices (#9290)
tkonolige Oct 15, 2021
afcf80c
[Hexagon] Fix addressing TVMValue array (#9302)
Oct 16, 2021
39d32c3
[Profiler] Sort columns in table and csv output (#9300)
tkonolige Oct 16, 2021
c279b94
[TE] Light refactoring of TE -> TIR paths. (#9263)
Lunderberg Oct 16, 2021
236e4c7
[iOS] Fix build issues on the latest XCode and iOS (#9298)
echuraev Oct 16, 2021
f5eb4c2
Rename build helper (#9297)
mikepapadim Oct 16, 2021
2b06ab3
[TVMC] Support dot inside of TVMC input shape name arguments (#9294)
lixiaoquan Oct 17, 2021
97f996c
fix typo (#9304)
jikechao Oct 17, 2021
d095a96
llvm 14 and above move TargetRegistry into MC (#9305)
powderluv Oct 17, 2021
151696f
[unittests] Skip import of tvm.micro if micro-TVM was not enabled (#9…
Oct 18, 2021
5443c7c
[microTVM][RVM] Always destroy the VM if all tests pass (#8739)
gromero Oct 18, 2021
d23688c
update block syntax (#9286)
Oct 18, 2021
75cf964
Test run triage (#9308)
tqchen Oct 18, 2021
9319d90
[bug] pooling convert layout bug in pooling.cc and in test_pass_conve…
Oct 9, 2021
5e77c54
Merge branch 'working' of https://github.com/ccjoechou/tvm into working
Oct 19, 2021
781ebe1
updated format of two py files
Oct 19, 2021
dbf3e74
[Codegen][LLVM] Add ability to turn on fast math flags (#9223)
AndrewZhaoLuo Oct 19, 2021
66afd36
[Profiler] Add significant VM instructions to profiling report (#9292)
tkonolige Oct 19, 2021
bd4313c
Fix direct and broken links (#9314)
Oct 19, 2021
66fee55
[Keras] Support return_sequences in LSTM (#9303)
apivovarov Oct 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .asf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,17 @@ github:
- vulkan
- spirv
- machine-learning

# Triage perm for collaborators(test run)
#
# The perm is given based on needs and not based on
# evaluation of past contributions. The rationale
# is that people may need the permission to start
# contributing in this way. It serves to diversify
# the ways to contribute.
#
# There is a limited number of slots. To enable broad
# participation, permission is given on a three month
# cycle. PMC may review and recycle slots when necessary.
collaborators:
- denise-k
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ if(USE_CCACHE) # True for AUTO, ON, /path/to/ccache
message(STATUS "Found the path to ccache, enabling ccache")
set(PATH_TO_CCACHE ccache)
else()
message(FATAL_ERROR "Cannot find ccache. Set USE_CCACHE mode to AUTO or OFF to build without ccache. USE_CCACHE=" "${USE_CCACHE")
message(FATAL_ERROR "Cannot find ccache. Set USE_CCACHE mode to AUTO or OFF to build without ccache. USE_CCACHE=" "${USE_CCACHE}")
endif(CCACHE_FOUND)
else() # /path/to/ccache
set(PATH_TO_CCACHE USE_CCACHE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@
## Compilation

The launcher consists of two parts: part running on Hexagon, and part running
on Android. They need to be compiled separately. Since some source files are
shared between these two parts, make sure to delete all object files between
compilations. Compile the Hexagon code first.
on Android. Each component must be compiled separately.

The supported Snapdragon architectures are 855, 865, and 888.

Expand All @@ -33,7 +31,46 @@ The supported Snapdragon architectures are 855, 865, and 888.
Android NDK can be downloaded from https://developer.android.com/ndk.
Hexagon SDK is available at //developer.qualcomm.com/software/hexagon-dsp-sdk.

### Compilation of the Hexagon part
### Compilation with TVM

Building the Hexagon launcher application as a component of the main TVM build
used for Hexagon codegen can be achieved by setting `USE_HEXAGON_LAUNCHER=ON`.
This option will compile core tvm, the android launcher binary and its corresponding
tvm_runtime, as well as the Hexagon launcher shared library and its corresponding
tvm_runtime. As described in the [Manual compilation](#Manual compilation) section
each component requires Hexagon and android dependencies. When building the launcher
along with TVM these configurations must be providing when invoking cmake. A minimal
example invocation for compiling TVM along with the Hexagon launcher is included below,

```
cmake -DCMAKE_MAKE_PROGRAM=make \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_CXX_FLAGS='-stdlib=libc++' \
-DCMAKE_CXX_STANDARD=14 \
-DUSE_LLVM=/path/to/hexagon/llvm/bin/llvm-config \
-DUSE_HEXAGON_LAUNCHER=ON \
-DUSE_ANDROID_TOOLCHAIN=/path/to/android-ndk/build/cmake/android.toolchain.cmake \
-DANDROID_PLATFORM=android-28 \
-DANDROID_ABI=arm64-v8a \
-DUSE_HEXAGON_ARCH=v68 \
-DUSE_HEXAGON_SDK=/path/to/hexagon/SDK \
-DUSE_HEXAGON_TOOLCHAIN=/path/to/hexagon/Toolchain/ ..
```

The Hexagon launcher application is an android binary and thus requires the use
of an android toolchain for compilation. Similarly, the Hexagon tvm runtime
requires the use of the Hexagon toolchain and depends on the Hexagon SDK. The
resulting hexagon launcher binaries can be found in the `launcher` subdirectory
of the cmake build directory.

### Manual compilation

Since some source files are shared between the Hexagon and android builds,
make sure to delete all object files between compilations. Compile the Hexagon
code first.

#### Compilation of the Hexagon part

1. Build the static version of TVM runtime for Hexagon. Use Hexagon clang
from the Hexagon SDK. This step is the same as building the shared version,
Expand All @@ -55,7 +92,7 @@ Hexagon SDK is available at //developer.qualcomm.com/software/hexagon-dsp-sdk.

3. Run `make`. This will create `liblauncher_rpc_skel.so`.

### Compilation of the Android part
#### Compilation of the Android part

1. Build TVM runtime for Android, using clang for AArch64 from the Android
NDK. Unlike in the Hexagon case, this should be the dynamic library (which
Expand Down
61 changes: 61 additions & 0 deletions apps/hexagon_launcher/cmake/HexagonLauncher.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

if(NOT "${FASTRPC_LIBS}" STREQUAL "SKEL" AND
NOT "${FASTRPC_LIBS}" STREQUAL "STUB")
message(SEND_ERROR "Please set FASTRPC_LIBS to either SKEL or STUB")
endif()

if(NOT DEFINED USE_HEXAGON_SDK)
message(SEND_ERROR "Please set USE_HEXAGON_SDK to the location of Hexagon SDK")
endif()
if (NOT DEFINED USE_HEXAGON_ARCH)
message(SEND_ERROR "Please set USE_HEXAGON_ARCH to the Hexagon architecture version")
endif()

set(TVM_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../")

include(ExternalProject)
include("${TVM_SOURCE_DIR}/cmake/modules/HexagonSDK.cmake")

find_hexagon_sdk_root("${USE_HEXAGON_SDK}" "${USE_HEXAGON_ARCH}")

include_directories(SYSTEM ${HEXAGON_SDK_INCLUDES} ${HEXAGON_REMOTE_ROOT})

set(QAIC_EXE "${HEXAGON_QAIC_EXE}")
foreach(INCDIR IN LISTS HEXAGON_SDK_INCLUDES HEXAGON_REMOTE_ROOT)
list(APPEND QAIC_FLAGS "-I${INCDIR}")
endforeach()

set(LAUNCHER_SRC "${CMAKE_CURRENT_SOURCE_DIR}/../../")
set(CMAKE_SKIP_RPATH TRUE)

# Qaic for the domain header.
#
# Don't add paths to these filenames, or otherwise cmake may spontaneously
# add -o option to the qaic invocation (with an undesirable path).
set(LAUNCHER_RPC_IDL "launcher_rpc.idl")
set(LAUNCHER_RPC_H "launcher_rpc.h")
set(LAUNCHER_RPC_SKEL_C "launcher_rpc_skel.c")
set(LAUNCHER_RPC_STUB_C "launcher_rpc_stub.c")

include_directories(
"${LAUNCHER_SRC}"
"${TVM_SOURCE_DIR}/include"
"${TVM_SOURCE_DIR}/3rdparty/dlpack/include"
"${TVM_SOURCE_DIR}/3rdparty/dmlc-core/include"
)
77 changes: 77 additions & 0 deletions apps/hexagon_launcher/cmake/android/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

cmake_minimum_required(VERSION 3.2)
project(HexagonAndroidLauncher C CXX)

include("${CMAKE_CURRENT_SOURCE_DIR}/../HexagonLauncher.cmake")

add_custom_command(
OUTPUT ${LAUNCHER_RPC_STUB_C}
COMMAND ${QAIC_EXE} ${QAIC_FLAGS}
"${LAUNCHER_SRC}/${LAUNCHER_RPC_IDL}"
COMMAND ${CMAKE_COMMAND} -E rename "${LAUNCHER_RPC_H}"
"${LAUNCHER_SRC}/${LAUNCHER_RPC_H}"
MAIN_DEPENDENCY "${LAUNCHER_SRC}/${LAUNCHER_RPC_IDL}"
)

include_directories(SYSTEM
"${HEXAGON_SDK_INCLUDES}"
"${HEXAGON_RPCMEM_ROOT}/inc"
)

link_directories(${HEXAGON_REMOTE_ROOT})

add_definitions(-DDMLC_USE_LOGGING_LIBRARY=<tvm/runtime/logging.h>)

set(STUB_SRCS
"${LAUNCHER_SRC}/launcher_android.cc"
"${LAUNCHER_SRC}/launcher_core.cc"
"${LAUNCHER_SRC}/launcher_main.cc"
"${LAUNCHER_SRC}/launcher_util.cc"
)

add_executable(launcher_android
"${STUB_SRCS}"
"${LAUNCHER_RPC_STUB_C}"
)

ExternalProject_Add(android_tvm_runtime
SOURCE_DIR "${TVM_SOURCE_DIR}"
BUILD_COMMAND $(MAKE) runtime
CMAKE_ARGS
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
"-DANDROID_PLATFORM=${ANDROID_PLATFORM}"
"-DANDROID_ABI=${ANDROID_ABI}"
"-DCMAKE_CXX_STANDARD=14"
"-DUSE_LIBBACKTRACE=OFF"
"-DUSE_LLVM=OFF"
"-DUSE_RPC=OFF"
INSTALL_COMMAND ""
BUILD_ALWAYS ON
)
ExternalProject_Get_Property(android_tvm_runtime BINARY_DIR)
ExternalProject_Add_Step(android_tvm_runtime copy_binaries
COMMAND ${CMAKE_COMMAND} -E copy_directory ${BINARY_DIR} ${CMAKE_INSTALL_PREFIX}
DEPENDEES install
)

add_dependencies(launcher_android android_tvm_runtime)
add_library(tvm_runtime SHARED IMPORTED)
set_target_properties(tvm_runtime PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/libtvm_runtime.so")

target_link_libraries(launcher_android cdsprpc log tvm_runtime)
84 changes: 84 additions & 0 deletions apps/hexagon_launcher/cmake/hexagon/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

cmake_minimum_required(VERSION 3.2)
project(HexagonLauncherRPCSkel C CXX)

include("${CMAKE_CURRENT_SOURCE_DIR}/../HexagonLauncher.cmake")

add_custom_command(
OUTPUT ${LAUNCHER_RPC_SKEL_C} ${LAUNCHER_RPC_H}
COMMAND ${QAIC_EXE} ${QAIC_FLAGS}
"${LAUNCHER_SRC}/${LAUNCHER_RPC_IDL}"
MAIN_DEPENDENCY "${LAUNCHER_SRC}/${LAUNCHER_RPC_IDL}"
)

include_directories(SYSTEM ${HEXAGON_QURT_INCLUDES})

link_directories(${HEXAGON_QURT_LIBS})

add_definitions(-D_MACH_I32=int)
add_definitions(-DDMLC_CXX11_THREAD_LOCAL=0)
add_definitions(-DDMLC_USE_LOGGING_LIBRARY=<tvm/runtime/logging.h>)

# Extra compile flags (both C and C++).
set(EXTRA_COMP_FLAGS
"-O3"
"-m${USE_HEXAGON_ARCH}"
)
string(REGEX REPLACE ";" " " EXTRA_COMP_FLAGS_STR "${EXTRA_COMP_FLAGS}")
set(CMAKE_C_FLAGS "${EXTRA_COMP_FLAGS_STR} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${EXTRA_COMP_FLAGS_STR} ${CMAKE_CXX_FLAGS}")

set(SKEL_SRCS
"${LAUNCHER_SRC}/launcher_core.cc"
"${LAUNCHER_SRC}/launcher_hexagon.cc"
)
add_library(launcher_rpc_skel SHARED
"${LAUNCHER_SRC}/${LAUNCHER_RPC_H}"
"${LAUNCHER_RPC_SKEL_C}"
"${SKEL_SRCS}"
)

ExternalProject_Add(static_hexagon_tvm_runtime
SOURCE_DIR "${TVM_SOURCE_DIR}"
BUILD_COMMAND $(MAKE) runtime
CMAKE_ARGS
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"-DUSE_HEXAGON_ARCH=${USE_HEXAGON_ARCH}"
"-DCMAKE_CXX_STANDARD=14"
"-DUSE_LIBBACKTRACE=OFF"
"-DUSE_LLVM=OFF"
"-DUSE_RPC=OFF"
"-DBUILD_STATIC_RUNTIME=ON"
"-DUSE_HEXAGON_SDK=${USE_HEXAGON_SDK}"
INSTALL_COMMAND ""
BUILD_ALWAYS ON
)
ExternalProject_Get_Property(static_hexagon_tvm_runtime BINARY_DIR)
ExternalProject_Add_Step(static_hexagon_tvm_runtime copy_binaries
COMMAND ${CMAKE_COMMAND} -E copy_directory ${BINARY_DIR} ${CMAKE_INSTALL_PREFIX}
DEPENDEES install
)

add_dependencies(launcher_rpc_skel static_hexagon_tvm_runtime)
add_library(static_tvm_runtime STATIC IMPORTED)
set_target_properties(static_tvm_runtime PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/libtvm_runtime.a")

target_link_libraries(launcher_rpc_skel -Wl,--whole-archive static_tvm_runtime -Wl,--no-whole-archive)

48 changes: 35 additions & 13 deletions apps/microtvm/reference-vm/base-box-tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,13 +388,15 @@ def test_command(args):
microtvm_test_config["microtvm_board"] = args.microtvm_board

providers = args.provider
provider_passed = {p: False for p in providers}

release_test_dir = os.path.join(THIS_DIR, f"release-test-{args.platform}")

if args.skip_build:
assert len(providers) == 1, "--skip-build was given, but >1 provider specified"
if args.skip_build or args.skip_destroy:
assert (
len(providers) == 1
), "--skip-build and/or --skip-destroy was given, but >1 provider specified"

test_failed = False
for provider_name in providers:
try:
if not args.skip_build:
Expand All @@ -408,18 +410,27 @@ def test_command(args):
microtvm_test_config,
args.test_device_serial,
)
provider_passed[provider_name] = True

except subprocess.CalledProcessError:
test_failed = True
sys.exit(
f"\n\nERROR: Provider '{provider_name}' failed the release test. "
"You can re-run it to reproduce the issue without building everything "
"again by passing the --skip-build and specifying only the provider that failed. "
"The VM is still running in case you want to connect it via SSH to "
"investigate further the issue, thus it's necessary to destroy it manually "
"to release the resources back to the host, like a USB device attached to the VM."
)

finally:
if not args.skip_build and len(providers) > 1:
# if we reached out here do_run_release_test() succeeded, hence we can
# destroy the VM and release the resources back to the host if user haven't
# requested to not destroy it.
if not (args.skip_destroy or test_failed):
subprocess.check_call(["vagrant", "destroy", "-f"], cwd=release_test_dir)
shutil.rmtree(release_test_dir)

if not all(provider_passed[p] for p in provider_passed.keys()):
sys.exit(
"some providers failed release test: "
+ ",".join(name for name, passed in provider_passed if not passed)
)
print(f'\n\nThe release tests passed on all specified providers: {", ".join(providers)}.')


def release_command(args):
Expand Down Expand Up @@ -493,9 +504,20 @@ def parse_args():
"--skip-build",
action="store_true",
help=(
"If given, assume a box has already been built in "
"the release-test subdirectory. Attach a USB device to this box and execute the "
"release test script--do not delete it."
"If given, assume a box has already been built in the release-test subdirectory, "
"so use that box to execute the release test script. If the tests fail the VM used "
"for testing will be left running for further investigation and will need to be "
"destroyed manually. If all tests pass on all specified providers no VM is left running, "
"unless --skip-destroy is given too."
),
)
parser_test.add_argument(
"--skip-destroy",
action="store_true",
help=(
"Skip destroying the test VM even if all tests pass. Can only be used if a single "
"provider is specified. Default is to destroy the VM if all tests pass (and always "
"skip destroying it if a test fails)."
),
)
parser_test.add_argument(
Expand Down
Loading