controller: refactor build inputs to external struct
This patch continues the move to attempt to merge the build.Options struct into the controllerapi.Options message. To do this, we extract all the input parameters into a dedicated message (adding the missing ones, except for the InStream parameter which will require some additional fiddling around). We also rework the NamedContexts to allow containing States (by transmitting them as DefinitionOps), and adding a Linked field to the common options. Signed-off-by: Justin Chadwell <me@jedevc.com>
This commit is contained in:
@@ -81,23 +81,32 @@ type buildOptions struct {
|
||||
|
||||
func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) {
|
||||
var err error
|
||||
opts := controllerapi.BuildOptions{
|
||||
Allow: o.allow,
|
||||
BuildArgs: listToMap(o.buildArgs, true),
|
||||
CgroupParent: o.cgroupParent,
|
||||
|
||||
inputs := controllerapi.Inputs{
|
||||
ContextPath: o.contextPath,
|
||||
DockerfileName: o.dockerfileName,
|
||||
ExtraHosts: o.extraHosts,
|
||||
Labels: listToMap(o.labels, false),
|
||||
NetworkMode: o.networkMode,
|
||||
NoCacheFilter: o.noCacheFilter,
|
||||
Platforms: o.platforms,
|
||||
PrintFunc: o.printFunc,
|
||||
ShmSize: int64(o.shmSize),
|
||||
Tags: o.tags,
|
||||
Target: o.target,
|
||||
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
|
||||
Opts: &o.CommonOptions,
|
||||
}
|
||||
inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
|
||||
if err != nil {
|
||||
return controllerapi.BuildOptions{}, err
|
||||
}
|
||||
|
||||
opts := controllerapi.BuildOptions{
|
||||
Inputs: &inputs,
|
||||
Allow: o.allow,
|
||||
BuildArgs: listToMap(o.buildArgs, true),
|
||||
CgroupParent: o.cgroupParent,
|
||||
ExtraHosts: o.extraHosts,
|
||||
Labels: listToMap(o.labels, false),
|
||||
NetworkMode: o.networkMode,
|
||||
NoCacheFilter: o.noCacheFilter,
|
||||
Platforms: o.platforms,
|
||||
PrintFunc: o.printFunc,
|
||||
ShmSize: int64(o.shmSize),
|
||||
Tags: o.tags,
|
||||
Target: o.target,
|
||||
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
|
||||
Opts: &o.CommonOptions,
|
||||
}
|
||||
|
||||
inAttests := append([]string{}, o.attests...)
|
||||
@@ -112,11 +121,6 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error)
|
||||
return controllerapi.BuildOptions{}, err
|
||||
}
|
||||
|
||||
opts.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
|
||||
if err != nil {
|
||||
return controllerapi.BuildOptions{}, err
|
||||
}
|
||||
|
||||
opts.Exports, err = buildflags.ParseExports(o.outputs)
|
||||
if err != nil {
|
||||
return controllerapi.BuildOptions{}, err
|
||||
@@ -662,45 +666,6 @@ func dockerUlimitToControllerUlimit(u *dockeropts.UlimitOpt) *controllerapi.Ulim
|
||||
// resolvePaths resolves all paths contained in controllerapi.BuildOptions
|
||||
// and replaces them to absolute paths.
|
||||
func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOptions, err error) {
|
||||
if options.ContextPath != "" && options.ContextPath != "-" {
|
||||
options.ContextPath, err = filepath.Abs(options.ContextPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if options.DockerfileName != "" && options.DockerfileName != "-" {
|
||||
options.DockerfileName, err = filepath.Abs(options.DockerfileName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var contexts map[string]string
|
||||
for k, v := range options.NamedContexts {
|
||||
if urlutil.IsGitURL(v) || urlutil.IsURL(v) || strings.HasPrefix(v, "docker-image://") {
|
||||
// url prefix, this is a remote path
|
||||
} else if strings.HasPrefix(v, "oci-layout://") {
|
||||
// oci layout prefix, this is a local path
|
||||
p := strings.TrimPrefix(v, "oci-layout://")
|
||||
p, err = filepath.Abs(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v = "oci-layout://" + p
|
||||
} else {
|
||||
// no prefix, assume local path
|
||||
v, err = filepath.Abs(v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if contexts == nil {
|
||||
contexts = make(map[string]string)
|
||||
}
|
||||
contexts[k] = v
|
||||
}
|
||||
options.NamedContexts = contexts
|
||||
|
||||
var cacheFrom []*controllerapi.CacheOptionsEntry
|
||||
for _, co := range options.CacheFrom {
|
||||
switch co.Type {
|
||||
@@ -812,5 +777,50 @@ func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOp
|
||||
}
|
||||
}
|
||||
|
||||
if options.Inputs == nil {
|
||||
return options, nil
|
||||
}
|
||||
if options.Inputs.ContextPath != "" && options.Inputs.ContextPath != "-" {
|
||||
options.Inputs.ContextPath, err = filepath.Abs(options.Inputs.ContextPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if options.Inputs.DockerfileName != "" && options.Inputs.DockerfileName != "-" {
|
||||
options.Inputs.DockerfileName, err = filepath.Abs(options.Inputs.DockerfileName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var contexts map[string]*controllerapi.NamedContext
|
||||
for k, v := range options.Inputs.NamedContexts {
|
||||
v := *v
|
||||
if v.Definition != nil {
|
||||
// definition, no path
|
||||
} else if urlutil.IsGitURL(v.Path) || urlutil.IsURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") {
|
||||
// url prefix, this is a remote path
|
||||
} else if strings.HasPrefix(v.Path, "oci-layout://") {
|
||||
// oci layout prefix, this is a local path
|
||||
p := strings.TrimPrefix(v.Path, "oci-layout://")
|
||||
p, err = filepath.Abs(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v.Path = "oci-layout://" + p
|
||||
} else {
|
||||
// no prefix, assume local path
|
||||
v.Path, err = filepath.Abs(v.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if contexts == nil {
|
||||
contexts = make(map[string]*controllerapi.NamedContext)
|
||||
}
|
||||
contexts[k] = &v
|
||||
}
|
||||
options.Inputs.NamedContexts = contexts
|
||||
|
||||
return options, nil
|
||||
}
|
||||
|
||||
@@ -21,36 +21,68 @@ func TestResolvePaths(t *testing.T) {
|
||||
want controllerapi.BuildOptions
|
||||
}{
|
||||
{
|
||||
name: "contextpath",
|
||||
options: controllerapi.BuildOptions{ContextPath: "test"},
|
||||
want: controllerapi.BuildOptions{ContextPath: filepath.Join(tmpwd, "test")},
|
||||
name: "contextpath",
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: "test"},
|
||||
},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: filepath.Join(tmpwd, "test")},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "contextpath-cwd",
|
||||
options: controllerapi.BuildOptions{ContextPath: "."},
|
||||
want: controllerapi.BuildOptions{ContextPath: tmpwd},
|
||||
name: "contextpath-cwd",
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: "."},
|
||||
},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: tmpwd},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "contextpath-dash",
|
||||
options: controllerapi.BuildOptions{ContextPath: "-"},
|
||||
want: controllerapi.BuildOptions{ContextPath: "-"},
|
||||
name: "contextpath-dash",
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: "-"},
|
||||
},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{ContextPath: "-"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "dockerfilename",
|
||||
options: controllerapi.BuildOptions{DockerfileName: "test"},
|
||||
want: controllerapi.BuildOptions{DockerfileName: filepath.Join(tmpwd, "test")},
|
||||
name: "dockerfilename",
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{DockerfileName: "test"},
|
||||
},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{DockerfileName: filepath.Join(tmpwd, "test")},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "dockerfilename-dash",
|
||||
options: controllerapi.BuildOptions{DockerfileName: "-"},
|
||||
want: controllerapi.BuildOptions{DockerfileName: "-"},
|
||||
name: "dockerfilename-dash",
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{DockerfileName: "-"},
|
||||
},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{DockerfileName: "-"},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "contexts",
|
||||
options: controllerapi.BuildOptions{NamedContexts: map[string]string{"a": "test1", "b": "test2",
|
||||
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}},
|
||||
want: controllerapi.BuildOptions{NamedContexts: map[string]string{"a": filepath.Join(tmpwd, "test1"), "b": filepath.Join(tmpwd, "test2"),
|
||||
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}},
|
||||
options: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{NamedContexts: map[string]*controllerapi.NamedContext{
|
||||
"a": {Path: "test1"},
|
||||
"b": {Path: "test2"},
|
||||
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
|
||||
"project": {Path: "https://github.com/myuser/project.git"},
|
||||
},
|
||||
}},
|
||||
want: controllerapi.BuildOptions{
|
||||
Inputs: &controllerapi.Inputs{NamedContexts: map[string]*controllerapi.NamedContext{
|
||||
"a": {Path: filepath.Join(tmpwd, "test1")},
|
||||
"b": {Path: filepath.Join(tmpwd, "test2")},
|
||||
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
|
||||
"project": {Path: "https://github.com/myuser/project.git"},
|
||||
},
|
||||
}},
|
||||
},
|
||||
{
|
||||
name: "cache-from",
|
||||
|
||||
Reference in New Issue
Block a user