From d31230dea7b90f814546735edd1b84cacf3a0e71 Mon Sep 17 00:00:00 2001 From: Sam Chew Date: Thu, 19 Sep 2024 13:53:41 -0700 Subject: [PATCH] Add DevContainers functionality to Finch Signed-off-by: Sam Chew --- cmd/finch/nerdctl_remote.go | 66 ++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/cmd/finch/nerdctl_remote.go b/cmd/finch/nerdctl_remote.go index 9441097bd..ed356602d 100644 --- a/cmd/finch/nerdctl_remote.go +++ b/cmd/finch/nerdctl_remote.go @@ -72,7 +72,6 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { } switch cmdName { - case "container run", "exec", "compose": // check if an option flag is present; immediately following the command switch { @@ -140,6 +139,13 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { } arg = fmt.Sprintf("%s%s", arg[0:11], resolvedIP) nerdctlArgs = append(nerdctlArgs, arg) + case arg == "--load": + // This is a docker specific command which alias for --output=type=docker. + // This should only applied for build args. + // Long term, this run command potentially needs to be refactored. + // Currently, the way it handles the args is too hacky. + nc.logger.Info("found --load converting to --output flag") + nerdctlArgs = handleLoad(nc.fc, nerdctlArgs) case strings.HasPrefix(arg, "--env-file"): // exact match to --env-file // or arg begins with --env-file @@ -149,11 +155,6 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { } skip = shouldSkip fileEnvs = append(fileEnvs, addEnvs...) - // This is a docker specific command which alias for --output=type=docker. This should only applied for build args. - // On a long term this run command potentially needs to be refactored, currently it is too hacky the way it handles the args. - case arg == "--load": - nc.logger.Info("found --load converting to --output flag") - nerdctlArgs = handleLoad(nc.fc, nerdctlArgs) case argIsEnv(arg): // exact match to either -e or --env // or arg begins with -e or --env @@ -164,18 +165,27 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { if addEnv != "" { envs = append(envs, addEnv) } - case longFlagBoolSet.Has(strings.Split(arg, "=")[0]) || longFlagBoolSet.Has(arg): - // exact match to a short flag: -? + case shortFlagBoolSet.Has(arg) || longFlagBoolSet.Has(arg): + // exact match to a short no argument flag: -? // or exact match to: -- nerdctlArgs = append(nerdctlArgs, arg) + case longFlagBoolSet.Has(strings.Split(arg, "=")[0]): + // begins with -- + // e.g. --sig-proxy=false + nerdctlArgs = append(nerdctlArgs, arg) case shortFlagBoolSet.Has(arg[:2]): - // begins with a defined short flag, but is adjacent to one or more short flags: -???? + // or begins with a defined short no argument flag, but is adjacent to something + // -???? one or more short bool flags; no following values + // -????="" one or more short bool flags ending with a short arg flag equated to value + // -????"" one or more short bool flags ending with a short arg flag concatenated to value addArg := nc.handleMultipleShortFlags(shortFlagBoolSet, shortFlagArgSet, args, i) nerdctlArgs = append(nerdctlArgs, addArg) case shortFlagArgSet.Has(arg) || shortFlagArgSet.Has(arg[:2]): - // exact match to: -h,-m,-u,-w,-p,-l,-v - // or begins with: -h,-m,-u,-w,-p,-l,-v - // concatenated short flags and values: -p"8080:8080" + // exact match to a short arg flag: -? + // next arg must be the + // or begins with a short arg flag: + // short arg flag concatenated to value: -?"" + // short arg flag equated to value: -?="" or -?= shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) skip = shouldSkip if addKey != "" { @@ -183,7 +193,11 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { nerdctlArgs = append(nerdctlArgs, addVal) } case strings.HasPrefix(arg, "--"): - // --="", -- "" + // exact match to a long arg flag: - + // next arg must be the + // or begins with a long arg flag: + // long arg flag concatenated to value: --"" + // long arg flag equated to value: --="" or --= shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1]) skip = shouldSkip if addKey != "" { @@ -256,7 +270,6 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { case arg == "--help": nerdctlArgs = append(nerdctlArgs, arg) case arg == "--load": - nc.logger.Info("found --load converting to --output flag") nerdctlArgs = handleLoad(nc.fc, nerdctlArgs) default: nerdctlArgs = append(nerdctlArgs, arg) @@ -295,7 +308,7 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { if slices.Contains(args, "run") { ensureRemoteCredentials(nc.fc, nc.ecc, &additionalEnv, nc.logger) } - case "build", "pull", "push", "run": + case "build", "pull", "push", "container run": ensureRemoteCredentials(nc.fc, nc.ecc, &additionalEnv, nc.logger) } @@ -322,8 +335,6 @@ func (nc *nerdctlCommand) run(cmdName string, args []string) error { runArgs = handleDockerCompatInspect(nc.fc, runArgs) - nc.logger.Info("Running nerdctl command args ", runArgs, " end") - return nc.ncc.Create(runArgs...).Run() } @@ -525,12 +536,12 @@ func handleEnvFile(fs afero.Fs, systemDeps NerdctlCommandSystemDeps, arg, arg2 s func handleCache(fc *config.Finch, arg string) string { // Hack to handle consistency params during mounts. This is assuming no other commands or env variable will have the word consistency. - if fc.Mode == nil || *fc.Mode != "dockercompat" || runtime.GOOS != "darwin" { + if fc == nil || fc.Mode == nil || *fc.Mode != "dockercompat" || runtime.GOOS != "darwin" { return arg } if strings.Contains(arg, "consistency") { - arg = strings.Replace(arg, ",consistency=cache", "", 1) + arg = strings.Replace(arg, ",consistency=cached", "", 1) arg = strings.Replace(arg, ",consistency=delegated", "", 1) arg = strings.Replace(arg, ",consistency=consistent", "", 1) } @@ -538,7 +549,7 @@ func handleCache(fc *config.Finch, arg string) string { } func handleLoad(fc *config.Finch, args []string) []string { - if fc.Mode == nil || *fc.Mode != "dockercompat" || args == nil { + if fc == nil || fc.Mode == nil || *fc.Mode != "dockercompat" || args == nil { return args } @@ -553,8 +564,7 @@ func handleLoad(fc *config.Finch, args []string) []string { } func handleDockerCompatInspect(fc *config.Finch, args []string) []string { - - if fc.Mode == nil || *fc.Mode != "dockercompat" { + if fc == nil || fc.Mode == nil || *fc.Mode != "dockercompat" { return args } @@ -575,7 +585,7 @@ func handleDockerCompatInspect(fc *config.Finch, args []string) []string { newArgList = append(newArgList, arg) } - if strings.Contains(arg, "--type") && (idx < len(args)+1) && isInspect { + if strings.Contains(arg, "--type") && (idx < len(args)-1) && isInspect { if strings.Contains(arg, "=") { inspectType = strings.Split(arg, "=")[1] } else { @@ -587,7 +597,6 @@ func handleDockerCompatInspect(fc *config.Finch, args []string) []string { continue } newArgList = append(newArgList, arg) - } if !isInspect { @@ -607,19 +616,16 @@ func handleDockerCompatInspect(fc *config.Finch, args []string) []string { } func handleBuildx(fc *config.Finch, limaArgs []string) (bool, []string) { - logrus.Warn("handling buildx") - buildx := false skipCmd := true var newLimaArgs []string buildxSubcommands := []string{"bake", "create", "debug", "du", "imagetools", "inspect", "ls", "prune", "rm", "stop", "use", "version"} - if fc.Mode == nil || *fc.Mode != "dockercompat" { + if fc == nil || fc.Mode == nil || *fc.Mode != "dockercompat" { return !skipCmd, limaArgs } - for idx, arg := range limaArgs { - logrus.Warnf("looking at arg %s at index %d", arg, idx) + for _, arg := range limaArgs { if arg == "buildx" { buildx = true newLimaArgs = append(newLimaArgs, "build") @@ -627,7 +633,6 @@ func handleBuildx(fc *config.Finch, limaArgs []string) (bool, []string) { } if buildx { - buildxWarnMsg := "buildx %s command is not supported." if arg == "build" { @@ -640,7 +645,6 @@ func handleBuildx(fc *config.Finch, limaArgs []string) (bool, []string) { logrus.Warnf("appending build") newLimaArgs = append(newLimaArgs, arg) - } else { newLimaArgs = append(newLimaArgs, arg) }