From 04203d13fb52ae41a156506831ce44abcc726dd6 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 13 Oct 2019 16:30:03 +0200 Subject: [PATCH] api/server: build: refactor for better readability - construct the initial options as a literal - move validation for windows up, and fail early - move all API-version handling together Signed-off-by: Sebastiaan van Stijn --- api/server/router/build/build_routes.go | 83 ++++++++++++------------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/api/server/router/build/build_routes.go b/api/server/router/build/build_routes.go index a67063f036..9b57e68963 100644 --- a/api/server/router/build/build_routes.go +++ b/api/server/router/build/build_routes.go @@ -38,8 +38,36 @@ func (e invalidIsolationError) Error() string { func (e invalidIsolationError) InvalidParameter() {} func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBuildOptions, error) { + options := &types.ImageBuildOptions{ + Version: types.BuilderV1, // Builder V1 is the default, but can be overridden + Dockerfile: r.FormValue("dockerfile"), + SuppressOutput: httputils.BoolValue(r, "q"), + NoCache: httputils.BoolValue(r, "nocache"), + ForceRemove: httputils.BoolValue(r, "forcerm"), + MemorySwap: httputils.Int64ValueOrZero(r, "memswap"), + Memory: httputils.Int64ValueOrZero(r, "memory"), + CPUShares: httputils.Int64ValueOrZero(r, "cpushares"), + CPUPeriod: httputils.Int64ValueOrZero(r, "cpuperiod"), + CPUQuota: httputils.Int64ValueOrZero(r, "cpuquota"), + CPUSetCPUs: r.FormValue("cpusetcpus"), + CPUSetMems: r.FormValue("cpusetmems"), + CgroupParent: r.FormValue("cgroupparent"), + NetworkMode: r.FormValue("networkmode"), + Tags: r.Form["t"], + ExtraHosts: r.Form["extrahosts"], + SecurityOpt: r.Form["securityopt"], + Squash: httputils.BoolValue(r, "squash"), + Target: r.FormValue("target"), + RemoteContext: r.FormValue("remote"), + SessionID: r.FormValue("session"), + BuildID: r.FormValue("buildid"), + } + + if runtime.GOOS != "windows" && options.SecurityOpt != nil { + return nil, errdefs.InvalidParameter(errors.New("The daemon on this platform does not support setting security options on build")) + } + version := httputils.VersionFromContext(ctx) - options := &types.ImageBuildOptions{} if httputils.BoolValue(r, "forcerm") && versions.GreaterThanOrEqualTo(version, "1.12") { options.Remove = true } else if r.FormValue("rm") == "" && versions.GreaterThanOrEqualTo(version, "1.12") { @@ -50,30 +78,19 @@ func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBui if httputils.BoolValue(r, "pull") && versions.GreaterThanOrEqualTo(version, "1.16") { options.PullParent = true } - - options.Version = types.BuilderV1 // Builder V1 is the default, but can be overridden - options.Dockerfile = r.FormValue("dockerfile") - options.SuppressOutput = httputils.BoolValue(r, "q") - options.NoCache = httputils.BoolValue(r, "nocache") - options.ForceRemove = httputils.BoolValue(r, "forcerm") - options.MemorySwap = httputils.Int64ValueOrZero(r, "memswap") - options.Memory = httputils.Int64ValueOrZero(r, "memory") - options.CPUShares = httputils.Int64ValueOrZero(r, "cpushares") - options.CPUPeriod = httputils.Int64ValueOrZero(r, "cpuperiod") - options.CPUQuota = httputils.Int64ValueOrZero(r, "cpuquota") - options.CPUSetCPUs = r.FormValue("cpusetcpus") - options.CPUSetMems = r.FormValue("cpusetmems") - options.CgroupParent = r.FormValue("cgroupparent") - options.NetworkMode = r.FormValue("networkmode") - options.Tags = r.Form["t"] - options.ExtraHosts = r.Form["extrahosts"] - options.SecurityOpt = r.Form["securityopt"] - options.Squash = httputils.BoolValue(r, "squash") - options.Target = r.FormValue("target") - options.RemoteContext = r.FormValue("remote") if versions.GreaterThanOrEqualTo(version, "1.32") { options.Platform = r.FormValue("platform") } + if versions.GreaterThanOrEqualTo(version, "1.40") { + outputsJSON := r.FormValue("outputs") + if outputsJSON != "" { + var outputs []types.ImageBuildOutput + if err := json.Unmarshal([]byte(outputsJSON), &outputs); err != nil { + return nil, err + } + options.Outputs = outputs + } + } if s := r.Form.Get("shmsize"); s != "" { shmSize, err := strconv.ParseInt(s, 10, 64) @@ -90,10 +107,6 @@ func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBui } } - if runtime.GOOS != "windows" && options.SecurityOpt != nil { - return nil, errdefs.InvalidParameter(errors.New("The daemon on this platform does not support setting security options on build")) - } - if ulimitsJSON := r.FormValue("ulimits"); ulimitsJSON != "" { var buildUlimits = []*units.Ulimit{} if err := json.Unmarshal([]byte(ulimitsJSON), &buildUlimits); err != nil { @@ -137,8 +150,6 @@ func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBui } options.CacheFrom = cacheFrom } - options.SessionID = r.FormValue("session") - options.BuildID = r.FormValue("buildid") if bv := r.FormValue("version"); bv != "" { v, err := parseVersion(bv) @@ -148,31 +159,17 @@ func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBui options.Version = v } - if versions.GreaterThanOrEqualTo(version, "1.40") { - outputsJSON := r.FormValue("outputs") - if outputsJSON != "" { - var outputs []types.ImageBuildOutput - if err := json.Unmarshal([]byte(outputsJSON), &outputs); err != nil { - return nil, err - } - options.Outputs = outputs - } - } - return options, nil } func parseVersion(s string) (types.BuilderVersion, error) { - if s == "" { - return types.BuilderV1, nil - } switch types.BuilderVersion(s) { case types.BuilderV1: return types.BuilderV1, nil case types.BuilderBuildKit: return types.BuilderBuildKit, nil default: - return "", errors.Errorf("invalid version %s", s) + return "", errors.Errorf("invalid version %q", s) } }