Browse Source

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 <github@gone.nl>
Sebastiaan van Stijn 5 years ago
parent
commit
04203d13fb
1 changed files with 40 additions and 43 deletions
  1. 40 43
      api/server/router/build/build_routes.go

+ 40 - 43
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)
 	}
 }