mirror of https://github.com/databricks/cli.git
add bash script for waiting
This commit is contained in:
parent
0423b09733
commit
981dbf787d
|
@ -36,7 +36,7 @@ var (
|
||||||
// In order to debug CLI running under acceptance test, set this to full subtest name, e.g. "bundle/variables/empty"
|
// In order to debug CLI running under acceptance test, set this to full subtest name, e.g. "bundle/variables/empty"
|
||||||
// Then install your breakpoints and click "debug test" near TestAccept in VSCODE.
|
// Then install your breakpoints and click "debug test" near TestAccept in VSCODE.
|
||||||
// example: var SingleTest = "bundle/variables/empty"
|
// example: var SingleTest = "bundle/variables/empty"
|
||||||
var SingleTest = ""
|
var SingleTest = "telemetry/dummy-without-server"
|
||||||
|
|
||||||
// If enabled, instead of compiling and running CLI externally, we'll start in-process server that accepts and runs
|
// If enabled, instead of compiling and running CLI externally, we'll start in-process server that accepts and runs
|
||||||
// CLI commands. The $CLI in test scripts is a helper that just forwards command-line arguments to this server (see bin/callserver.py).
|
// CLI commands. The $CLI in test scripts is a helper that just forwards command-line arguments to this server (see bin/callserver.py).
|
||||||
|
@ -44,7 +44,8 @@ var SingleTest = ""
|
||||||
var InprocessMode bool
|
var InprocessMode bool
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
flag.BoolVar(&InprocessMode, "inprocess", SingleTest != "", "Run CLI in the same process as test (for debugging)")
|
// flag.BoolVar(&InprocessMode, "inprocess", SingleTest != "", "Run CLI in the same process as test (for debugging)")
|
||||||
|
flag.BoolVar(&InprocessMode, "inprocess", false, "Run CLI in the same process as test (for debugging)")
|
||||||
flag.BoolVar(&KeepTmp, "keeptmp", false, "Do not delete TMP directory after run")
|
flag.BoolVar(&KeepTmp, "keeptmp", false, "Do not delete TMP directory after run")
|
||||||
flag.BoolVar(&NoRepl, "norepl", false, "Do not apply any replacements (for debugging)")
|
flag.BoolVar(&NoRepl, "norepl", false, "Do not apply any replacements (for debugging)")
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
wait_file() {
|
||||||
|
local file_path="$1"
|
||||||
|
local max_attempts=100
|
||||||
|
local attempt=0
|
||||||
|
|
||||||
|
while [ $attempt -lt $max_attempts ]; do
|
||||||
|
if [ -e "$file_path" ]; then
|
||||||
|
echo "File $file_path exists"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
sleep 0.1
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Timeout: File $file_path did not appear within 10 seconds"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "Usage: $0 <file_path>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
wait_file "$1"
|
||||||
|
exit $?
|
|
@ -0,0 +1,41 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
# wait <pid> in bash only works for child process. This script is more general.
|
||||||
|
wait_pid() {
|
||||||
|
local pid=$1
|
||||||
|
local max_attempts=100 # 100 * 0.1 seconds = 10 seconds
|
||||||
|
local attempt=0
|
||||||
|
local sleep_time=0.1
|
||||||
|
|
||||||
|
while [ $attempt -lt $max_attempts ]; do
|
||||||
|
if [[ "$OSTYPE" == "msys"* || "$OSTYPE" == "cygwin"* ]]; then
|
||||||
|
# Windows approach
|
||||||
|
if ! tasklist | grep -q $pid; then
|
||||||
|
echo "Process has ended"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Linux/macOS approach
|
||||||
|
if ! kill -0 $pid 2>/dev/null; then
|
||||||
|
echo "Process has ended"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep $sleep_time
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Timeout: Process $pid did not end within 10 seconds"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "Usage: $0 <PID>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
wait_pid $1
|
||||||
|
exit $?
|
|
@ -1 +0,0 @@
|
||||||
error: telemetry endpoint not found
|
|
|
@ -1,2 +1,4 @@
|
||||||
|
|
||||||
>>> $CLI telemetry dummy
|
>>> $CLI telemetry dummy
|
||||||
|
File ./telemetry.pid exists
|
||||||
|
Process has ended
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
export DATABRICKS_TELEMETRY_UPLOAD_LOGS_FILE=./out.upload.txt
|
export DATABRICKS_CLI_TELEMETRY_PID_FILE=./telemetry.pid
|
||||||
|
|
||||||
# This test ensures that the main CLI command does not error even if
|
# This test ensures that the main CLI command does not error even if
|
||||||
# telemetry upload fails.
|
# telemetry upload fails.
|
||||||
trace $CLI telemetry dummy
|
trace $CLI telemetry dummy
|
||||||
|
|
||||||
|
# Wait for the child telemetry process to finish
|
||||||
|
trace wait_file ./telemetry.pid
|
||||||
|
trace wait_pid $(cat ./telemetry.pid)
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
Successfully uploaded telemetry logs
|
|
||||||
Response:
|
|
||||||
{"errors":null,"numProtoSuccess":2}
|
|
|
@ -1,2 +1,4 @@
|
||||||
|
|
||||||
>>> $CLI telemetry dummy
|
>>> $CLI telemetry dummy
|
||||||
|
File ./telemetry.pid exists
|
||||||
|
Process has ended
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
export DATABRICKS_TELEMETRY_UPLOAD_LOGS_FILE=./out.upload.txt
|
export DATABRICKS_CLI_TELEMETRY_PID_FILE=./telemetry.pid
|
||||||
|
|
||||||
trace $CLI telemetry dummy
|
trace $CLI telemetry dummy
|
||||||
|
|
||||||
|
# Wait for the child telemetry process to finish
|
||||||
|
trace wait_file ./telemetry.pid
|
||||||
|
trace wait_pid $(cat ./telemetry.pid)
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
RecordRequests = true
|
RecordRequests = true
|
||||||
EventuallyFiles = [
|
|
||||||
"out.upload.txt"
|
|
||||||
]
|
|
||||||
|
|
||||||
[[Server]]
|
[[Server]]
|
||||||
Pattern = "POST /telemetry-ext"
|
Pattern = "POST /telemetry-ext"
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
"slices"
|
"slices"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -164,6 +165,8 @@ func inheritEnvVars() []string {
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const telemetryPidFileEnvVar = "DATABRICKS_CLI_TELEMETRY_PID_FILE"
|
||||||
|
|
||||||
func uploadTelemetry(ctx context.Context, cmdStr string, start, end time.Time, exitCode int) {
|
func uploadTelemetry(ctx context.Context, cmdStr string, start, end time.Time, exitCode int) {
|
||||||
// Nothing to upload.
|
// Nothing to upload.
|
||||||
if !telemetry.HasLogs(ctx) {
|
if !telemetry.HasLogs(ctx) {
|
||||||
|
@ -213,6 +216,13 @@ func uploadTelemetry(ctx context.Context, cmdStr string, start, end time.Time, e
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pidFilePath := env.Get(ctx, telemetryPidFileEnvVar); pidFilePath != "" {
|
||||||
|
err = os.WriteFile(pidFilePath, []byte(strconv.Itoa(telemetryCmd.Process.Pid)), 0o644)
|
||||||
|
if err != nil {
|
||||||
|
log.Debugf(ctx, "failed to write telemetry worker PID file: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_, err = stdin.Write(b)
|
_, err = stdin.Write(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf(ctx, "failed to write to telemetry worker: %s", err)
|
log.Debugf(ctx, "failed to write to telemetry worker: %s", err)
|
||||||
|
|
Loading…
Reference in New Issue