cmd/root: Make 'toolbox' create or fall back to a container if possible
This makes 'toolbox', without any commands specified, behave a lot like 'toolbox enter'. When there aren't any toolbox containers, it will offer to create a new container matching the same parameters passed to the command. If there's just one toolbox container available, then it will fall back to it. This makes the command line interface a lot similar to that of github.com/coreos/toolbox, which makes things easier for those switching over from it. Some changes by Debarshi Ray. https://github.com/containers/toolbox/pull/811
This commit is contained in:
parent
73450bd8ac
commit
6c86cabbe5
|
@ -177,17 +177,62 @@ func rootHelp(cmd *cobra.Command, args []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func rootRun(cmd *cobra.Command, args []string) error {
|
func rootRun(cmd *cobra.Command, args []string) error {
|
||||||
var builder strings.Builder
|
if len(args) != 0 {
|
||||||
fmt.Fprintf(&builder, "missing command\n")
|
panic("unexpected argument: commands known or unknown shouldn't reach here")
|
||||||
fmt.Fprintf(&builder, "\n")
|
}
|
||||||
fmt.Fprintf(&builder, "create Create a new toolbox container\n")
|
|
||||||
fmt.Fprintf(&builder, "enter Enter an existing toolbox container\n")
|
|
||||||
fmt.Fprintf(&builder, "list List all existing toolbox containers and images\n")
|
|
||||||
fmt.Fprintf(&builder, "\n")
|
|
||||||
fmt.Fprintf(&builder, "Run '%s --help' for usage.", executableBase)
|
|
||||||
|
|
||||||
errMsg := builder.String()
|
if utils.IsInsideContainer() {
|
||||||
return errors.New(errMsg)
|
if !utils.IsInsideToolboxContainer() {
|
||||||
|
return errors.New("this is not a toolbox container")
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := utils.ForwardToHost(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
container, image, release, err := utils.ResolveContainerAndImageNames("", "", "", "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
userShell := os.Getenv("SHELL")
|
||||||
|
if userShell == "" {
|
||||||
|
return errors.New("failed to get the current user's default shell")
|
||||||
|
}
|
||||||
|
|
||||||
|
command := []string{userShell, "-l"}
|
||||||
|
|
||||||
|
hostID, err := utils.GetHostID()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get the host ID: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
hostVariantID, err := utils.GetHostVariantID()
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("failed to get the host VARIANT_ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
var emitEscapeSequence bool
|
||||||
|
|
||||||
|
if hostID == "fedora" && (hostVariantID == "silverblue" || hostVariantID == "workstation") {
|
||||||
|
emitEscapeSequence = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := runCommand(container,
|
||||||
|
true,
|
||||||
|
image,
|
||||||
|
release,
|
||||||
|
command,
|
||||||
|
emitEscapeSequence,
|
||||||
|
true,
|
||||||
|
false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func rootUsage(cmd *cobra.Command) error {
|
func rootUsage(cmd *cobra.Command) error {
|
||||||
|
|
|
@ -4,14 +4,6 @@ load 'libs/bats-support/load'
|
||||||
load 'libs/bats-assert/load'
|
load 'libs/bats-assert/load'
|
||||||
load 'libs/helpers.bash'
|
load 'libs/helpers.bash'
|
||||||
|
|
||||||
@test "help: Try to run toolbox with no command (shows usage screen)" {
|
|
||||||
run $TOOLBOX
|
|
||||||
|
|
||||||
assert_failure
|
|
||||||
assert_line --index 0 "Error: missing command"
|
|
||||||
assert_output --partial "Run 'toolbox --help' for usage."
|
|
||||||
}
|
|
||||||
|
|
||||||
@test "help: Run command 'help'" {
|
@test "help: Run command 'help'" {
|
||||||
run $TOOLBOX help
|
run $TOOLBOX help
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue