Skip to content

Commit

Permalink
Add DevContainers functionality to Finch
Browse files Browse the repository at this point in the history
Signed-off-by: Sam Chew <[email protected]>
  • Loading branch information
chews93319 committed Sep 19, 2024
1 parent 5299443 commit d31230d
Showing 1 changed file with 35 additions and 31 deletions.
66 changes: 35 additions & 31 deletions cmd/finch/nerdctl_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -164,26 +165,39 @@ 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: --<long_flag>
nerdctlArgs = append(nerdctlArgs, arg)
case longFlagBoolSet.Has(strings.Split(arg, "=")[0]):
// begins with --<long_flag>
// 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
// -????="<value>" one or more short bool flags ending with a short arg flag equated to value
// -????"<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 <value>
// or begins with a short arg flag:
// short arg flag concatenated to value: -?"<value>"
// short arg flag equated to value: -?="<value>" or -?=<value>
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
skip = shouldSkip
if addKey != "" {
nerdctlArgs = append(nerdctlArgs, addKey)
nerdctlArgs = append(nerdctlArgs, addVal)
}
case strings.HasPrefix(arg, "--"):
// --<long_flag>="<value>", --<long_flag> "<value>"
// exact match to a long arg flag: -<long_flag>
// next arg must be the <value>
// or begins with a long arg flag:
// long arg flag concatenated to value: --<long_flag>"<value>"
// long arg flag equated to value: --<long_flag>="<value>" or --<long_flag>=<value>
shouldSkip, addKey, addVal := nc.handleFlagArg(arg, args[i+1])
skip = shouldSkip
if addKey != "" {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
}

Expand All @@ -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()
}

Expand Down Expand Up @@ -525,20 +536,20 @@ 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)
}
return arg
}

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
}

Expand All @@ -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
}

Expand All @@ -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 {
Expand All @@ -587,7 +597,6 @@ func handleDockerCompatInspect(fc *config.Finch, args []string) []string {
continue
}
newArgList = append(newArgList, arg)

}

if !isInspect {
Expand All @@ -607,27 +616,23 @@ 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")
logrus.Warn("buildx is not supported. using standard buildkit instead...")
}

if buildx {

buildxWarnMsg := "buildx %s command is not supported."

if arg == "build" {
Expand All @@ -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)
}
Expand Down

0 comments on commit d31230d

Please sign in to comment.