From ef85dd7950800fdce9ab58724921507cba31004b Mon Sep 17 00:00:00 2001
From: baude <bbaude@redhat.com>
Date: Wed, 6 Feb 2019 09:44:16 -0600
Subject: podman-remote build

add the ability to build images using files local to the remote-client
but over a varlink interface to a "remote" server.

Signed-off-by: baude <bbaude@redhat.com>
---
 cmd/podman/build.go                  | 111 ++++++++++++++++-------------------
 cmd/podman/varlink/io.podman.varlink |  65 ++++++++++++--------
 2 files changed, 92 insertions(+), 84 deletions(-)

(limited to 'cmd')

diff --git a/cmd/podman/build.go b/cmd/podman/build.go
index fef93ac47..30a734377 100644
--- a/cmd/podman/build.go
+++ b/cmd/podman/build.go
@@ -1,7 +1,6 @@
 package main
 
 import (
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -9,10 +8,9 @@ import (
 	"github.com/containers/buildah"
 	"github.com/containers/buildah/imagebuildah"
 	buildahcli "github.com/containers/buildah/pkg/cli"
-	"github.com/containers/buildah/pkg/parse"
 	"github.com/containers/libpod/cmd/podman/cliconfig"
-	"github.com/containers/libpod/cmd/podman/libpodruntime"
-	"github.com/containers/libpod/pkg/rootless"
+	"github.com/containers/libpod/libpod/adapter"
+	"github.com/docker/go-units"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
@@ -76,7 +74,6 @@ func getDockerfiles(files []string) []string {
 func buildCmd(c *cliconfig.BuildValues) error {
 	// The following was taken directly from containers/buildah/cmd/bud.go
 	// TODO Find a away to vendor more of this in rather than copy from bud
-
 	output := ""
 	tags := []string{}
 	if c.Flag("tag").Changed {
@@ -86,6 +83,7 @@ func buildCmd(c *cliconfig.BuildValues) error {
 			tags = tags[1:]
 		}
 	}
+
 	pullPolicy := imagebuildah.PullNever
 	if c.Pull {
 		pullPolicy = imagebuildah.PullIfMissing
@@ -173,16 +171,17 @@ func buildCmd(c *cliconfig.BuildValues) error {
 		dockerfiles = append(dockerfiles, filepath.Join(contextDir, "Dockerfile"))
 	}
 
+	runtime, err := adapter.GetRuntime(&c.PodmanCommand)
+	if err != nil {
+		return errors.Wrapf(err, "could not get runtime")
+	}
+
 	runtimeFlags := []string{}
 	for _, arg := range c.RuntimeOpts {
 		runtimeFlags = append(runtimeFlags, "--"+arg)
 	}
 	// end from buildah
 
-	runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
-	if err != nil {
-		return errors.Wrapf(err, "could not get runtime")
-	}
 	defer runtime.Shutdown(false)
 
 	var stdout, stderr, reporter *os.File
@@ -201,72 +200,64 @@ func buildCmd(c *cliconfig.BuildValues) error {
 		reporter = f
 	}
 
-	systemContext, err := parse.SystemContextFromOptions(c.PodmanCommand.Command)
-	if err != nil {
-		return errors.Wrapf(err, "error building system context")
-	}
-	systemContext.AuthFilePath = getAuthFile(c.Authfile)
-	commonOpts, err := parse.CommonBuildOptions(c.PodmanCommand.Command)
-	if err != nil {
-		return err
+	var memoryLimit, memorySwap int64
+	if c.Flags().Changed("memory") {
+		memoryLimit, err = units.RAMInBytes(c.Memory)
+		if err != nil {
+			return err
+		}
 	}
 
-	namespaceOptions, networkPolicy, err := parse.NamespaceOptions(c.PodmanCommand.Command)
-	if err != nil {
-		return errors.Wrapf(err, "error parsing namespace-related options")
-	}
-	usernsOption, idmappingOptions, err := parse.IDMappingOptions(c.PodmanCommand.Command)
-	if err != nil {
-		return errors.Wrapf(err, "error parsing ID mapping options")
+	if c.Flags().Changed("memory-swap") {
+		memorySwap, err = units.RAMInBytes(c.MemorySwap)
+		if err != nil {
+			return err
+		}
 	}
-	namespaceOptions.AddOrReplace(usernsOption...)
 
-	ociruntime := runtime.GetOCIRuntimePath()
-	if c.Flag("runtime").Changed {
-		ociruntime = c.Runtime
+	buildOpts := buildah.CommonBuildOptions{
+		AddHost:      c.AddHost,
+		CgroupParent: c.CgroupParent,
+		CPUPeriod:    c.CPUPeriod,
+		CPUQuota:     c.CPUQuota,
+		CPUShares:    c.CPUShares,
+		CPUSetCPUs:   c.CPUSetCPUs,
+		CPUSetMems:   c.CPUSetMems,
+		Memory:       memoryLimit,
+		MemorySwap:   memorySwap,
+		ShmSize:      c.ShmSize,
+		Ulimit:       c.Ulimit,
+		Volumes:      c.Volume,
 	}
+
 	options := imagebuildah.BuildOptions{
-		ContextDirectory:        contextDir,
-		PullPolicy:              pullPolicy,
-		Compression:             imagebuildah.Gzip,
-		Quiet:                   c.Quiet,
-		SignaturePolicyPath:     c.SignaturePolicy,
-		Args:                    args,
-		Output:                  output,
+		CommonBuildOpts:         &buildOpts,
 		AdditionalTags:          tags,
-		Out:                     stdout,
-		Err:                     stderr,
-		ReportWriter:            reporter,
-		Runtime:                 ociruntime,
-		RuntimeArgs:             runtimeFlags,
-		OutputFormat:            format,
-		SystemContext:           systemContext,
-		NamespaceOptions:        namespaceOptions,
-		ConfigureNetwork:        networkPolicy,
-		CNIPluginPath:           c.CNIPlugInPath,
+		Annotations:             c.Annotation,
+		Args:                    args,
 		CNIConfigDir:            c.CNIConfigDir,
-		IDMappingOptions:        idmappingOptions,
-		CommonBuildOpts:         commonOpts,
+		CNIPluginPath:           c.CNIPlugInPath,
+		Compression:             imagebuildah.Gzip,
+		ContextDirectory:        contextDir,
 		DefaultMountsFilePath:   c.GlobalFlags.DefaultMountsFile,
+		Err:                     stderr,
+		ForceRmIntermediateCtrs: c.ForceRm,
 		IIDFile:                 c.Iidfile,
-		Squash:                  c.Squash,
 		Labels:                  c.Label,
-		Annotations:             c.Annotation,
 		Layers:                  layers,
 		NoCache:                 c.NoCache,
+		Out:                     stdout,
+		Output:                  output,
+		OutputFormat:            format,
+		PullPolicy:              pullPolicy,
+		Quiet:                   c.Quiet,
 		RemoveIntermediateCtrs:  c.Rm,
-		ForceRmIntermediateCtrs: c.ForceRm,
-	}
-
-	if c.Quiet {
-		options.ReportWriter = ioutil.Discard
-	}
-
-	if rootless.IsRootless() {
-		options.Isolation = buildah.IsolationOCIRootless
+		ReportWriter:            reporter,
+		RuntimeArgs:             runtimeFlags,
+		SignaturePolicyPath:     c.SignaturePolicy,
+		Squash:                  c.Squash,
 	}
-
-	return runtime.Build(getContext(), options, dockerfiles...)
+	return runtime.Build(getContext(), c, options, dockerfiles)
 }
 
 // Tail returns a string slice after the first element unless there are
diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink
index 03ea06dfc..dc6a25c44 100644
--- a/cmd/podman/varlink/io.podman.varlink
+++ b/cmd/podman/varlink/io.podman.varlink
@@ -311,33 +311,50 @@ type IDMap (
     size: int
 )
 
+# BuildOptions are are used to describe describe physical attributes of the build
+type BuildOptions (
+    addHosts: []string,
+    cgroupParent: string,
+    cpuPeriod: int,
+    cpuQuota: int,
+    cpuShares: int,
+    cpusetCpus: string,
+    cpusetMems: string,
+    memory: int,
+    memorySwap: int,
+    shmSize: string,
+    ulimit: []string,
+    volume: []string
+)
+
 # BuildInfo is used to describe user input for building images
 type BuildInfo (
-    # paths to one or more dockerfiles
-    dockerfile: []string,
-    tags: []string,
-    add_hosts: []string,
-    cgroup_parent: string,
-    cpu_period: int,
-    cpu_quota: int,
-    cpu_shares: int,
-    cpuset_cpus: string,
-    cpuset_mems: string,
-    memory: string,
-    memory_swap: string,
-    security_opts: []string,
-    shm_size: string,
-    ulimit: []string,
-    volume: []string,
-    squash: bool,
-    pull: bool,
-    pull_always: bool,
-    force_rm: bool,
-    rm: bool,
-    label: []string,
+    additionalTags: []string,
     annotations: []string,
-    build_args: [string]string,
-    image_format: string
+    buildArgs: [string]string,
+    buildOptions: BuildOptions,
+    cniConfigDir: string,
+    cniPluginDir: string,
+    compression: string,
+    contextDir: string,
+    defaultsMountFilePath: string,
+    dockerfiles: []string,
+    err: string,
+    forceRmIntermediateCtrs: bool,
+    iidfile: string,
+    label: []string,
+    layers: bool,
+    nocache: bool,
+    out: string,
+    output: string,
+    outputFormat: string,
+    pullPolicy: string,
+    quiet: bool,
+    remoteIntermediateCtrs: bool,
+    reportWriter: string,
+    runtimeArgs: []string,
+    signaturePolicyPath: string,
+    squash: bool
 )
 
 # MoreResponse is a struct for when responses from varlink requires longer output
-- 
cgit v1.2.3-54-g00ecf