databricks-cli/cmd/selftest/child.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

60 lines
1.7 KiB
Go
Raw Normal View History

2025-02-17 18:23:02 +00:00
package selftest
import (
"errors"
"fmt"
"io"
"os"
"strconv"
"github.com/databricks/cli/libs/daemon"
"github.com/databricks/cli/libs/process"
"github.com/spf13/cobra"
)
2025-02-17 18:27:53 +00:00
// TODO CONTINUE:
2025-02-17 18:23:02 +00:00
//
// Ensure that a robust timeout mechanism exists for the telemetry process. We
// do not want the daemons to hang indefinitely. Can this also be tested?
//
// TODO: One set of tests will be asserting that the tests have the right
// properties. A thread on my personal slack account will help with that.
// The other set of tests will assert on the functional behaviour, that the
// parent and child process are indeed indpenedent, and that the child process
// does not block the parent process.
//
// TODO: Make sure to acknowledge the risk of failing when people try to delete
// the binary in windows.
//
// TODO: Ensure that child stdout / stderr are not sent to the parent process.
func newChildCommand() *cobra.Command {
return &cobra.Command{
Use: "child",
RunE: func(cmd *cobra.Command, args []string) error {
parentPid, err := strconv.Atoi(os.Getenv(daemon.DatabricksCliParentPid))
if err != nil {
return fmt.Errorf("failed to parse parent PID: %w", err)
}
err = process.Wait(parentPid)
if err != nil && !errors.As(err, &process.ErrProcessNotFound{}) {
return fmt.Errorf("failed to wait for parent process: %w", err)
}
fmt.Println("\n====================")
fmt.Println("\nAll output from this point on is from the child process")
fmt.Println("Parent process has exited")
in, err := io.ReadAll(os.Stdin)
if err != nil {
return fmt.Errorf("failed to read from stdin: %w", err)
}
fmt.Println("Received input from parent process:")
fmt.Println(string(in))
return nil
},
}
}