Skip to content

Commit f413f62

Browse files
Adjust API calls for compression
Add the various compression API calls as created by @nalind in #28807 Signed-off-by: Tom Sweeney <tsweeney@redhat.com>
1 parent 550f8a7 commit f413f62

5 files changed

Lines changed: 87 additions & 11 deletions

File tree

cmd/podman/common/build.go

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"go.podman.io/common/pkg/completion"
2727
"go.podman.io/common/pkg/config"
2828
"go.podman.io/image/v5/docker/reference"
29+
"go.podman.io/image/v5/pkg/compression"
2930
"go.podman.io/image/v5/types"
3031
"go.podman.io/podman/v6/cmd/podman/registry"
3132
"go.podman.io/podman/v6/cmd/podman/utils"
@@ -425,9 +426,9 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
425426
return nil, err
426427
}
427428

428-
compression := buildahDefine.Gzip
429+
compressionIntent := buildahDefine.Gzip
429430
if flags.DisableCompression {
430-
compression = buildahDefine.Uncompressed
431+
compressionIntent = buildahDefine.Uncompressed
431432
}
432433

433434
isolation := buildahDefine.IsolationDefault
@@ -562,6 +563,44 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
562563
sbomScanOptions = append(sbomScanOptions, *sbomScanOption)
563564
}
564565

566+
if c.Flag("disable-compression").Changed && flags.DisableCompression {
567+
if c.Flag("compression-format").Changed {
568+
return nil, errors.New("--disable-compression and --compression-format cannot be used together")
569+
}
570+
if c.Flag("force-compression").Changed {
571+
return nil, errors.New("--disable-compression and --force-compression cannot be used together")
572+
}
573+
}
574+
var compressionLevel *int
575+
if c.Flag("compression-level").Changed {
576+
compressionLevel = &flags.CompressionLevel
577+
} else {
578+
compressionLevel = podmanConfig.ContainersConfDefaultsRO.Engine.CompressionLevel
579+
}
580+
var compressionFormat *compression.Algorithm
581+
forceCompressionFormat := flags.ForceCompressionFormat
582+
if c.Flag("compression-format").Changed {
583+
algo, err := compression.AlgorithmByName(flags.CompressionFormat)
584+
if err != nil {
585+
return nil, fmt.Errorf("unable to parse value provided %q as --compression-format: %w", flags.CompressionFormat, err)
586+
}
587+
compressionFormat = &algo
588+
if !c.Flag("disable-compression").Changed {
589+
compressionIntent = buildahDefine.Gzip
590+
}
591+
} else {
592+
algo, err := compression.AlgorithmByName(podmanConfig.ContainersConfDefaultsRO.Engine.CompressionFormat)
593+
if err != nil {
594+
return nil, fmt.Errorf("parsing compression_format from containers.conf: %w", err)
595+
}
596+
compressionFormat = &algo
597+
if !c.Flag("force-compression").Changed {
598+
forceCompressionFormat = true
599+
}
600+
if !c.Flag("disable-compression").Changed {
601+
compressionIntent = buildahDefine.Gzip
602+
}
603+
}
565604
opts := buildahDefine.BuildOptions{
566605
AddCapabilities: flags.CapAdd,
567606
AdditionalTags: tags,
@@ -576,7 +615,9 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
576615
CacheTTL: cacheTTL,
577616
ConfidentialWorkload: confidentialWorkloadOptions,
578617
CommonBuildOpts: commonOpts,
579-
Compression: compression,
618+
Compression: compressionIntent,
619+
CompressionFormat: compressionFormat,
620+
CompressionLevel: compressionLevel,
580621
ConfigureNetwork: networkPolicy,
581622
ContextDirectory: contextDir,
582623
CPPFlags: flags.CPPFlags,
@@ -585,6 +626,7 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
585626
DropCapabilities: flags.CapDrop,
586627
Envs: buildahCLI.LookupEnvVarReferences(flags.Envs, os.Environ()),
587628
Err: stderr,
629+
ForceCompressionFormat: forceCompressionFormat,
588630
ForceRmIntermediateCtrs: flags.ForceRm,
589631
From: flags.From,
590632
GroupAdd: flags.GroupAdd,

pkg/api/handlers/compat/images_build.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"go.podman.io/buildah/pkg/parse"
2626
"go.podman.io/common/pkg/config"
2727
"go.podman.io/image/v5/docker/reference"
28+
"go.podman.io/image/v5/pkg/compression"
2829
"go.podman.io/image/v5/types"
2930
"go.podman.io/podman/v6/internal/localapi"
3031
"go.podman.io/podman/v6/libpod"
@@ -57,6 +58,8 @@ type BuildQuery struct {
5758
CgroupParent string `schema:"cgroupparent"`
5859
CompatVolumes bool `schema:"compatvolumes"`
5960
Compression uint64 `schema:"compression"`
61+
CompressionFormat string `schema:"compressionFormat"`
62+
CompressionLevel *int `schema:"compressionLevel"`
6063
ConfigureNetwork string `schema:"networkmode"`
6164
CPPFlags string `schema:"cppflags"`
6265
CpuPeriod uint64 `schema:"cpuperiod"`
@@ -74,6 +77,7 @@ type BuildQuery struct {
7477
Envs []string `schema:"setenv"`
7578
Excludes string `schema:"excludes"`
7679
ForceRm bool `schema:"forcerm"`
80+
ForceCompressionFormat bool `schema:"forceCompressionFormat"`
7781
From string `schema:"from"`
7882
GroupAdd []string `schema:"groupadd"`
7983
HTTPProxy bool `schema:"httpproxy"`
@@ -385,7 +389,7 @@ func createBuildOptions(query *BuildQuery, buildCtx *BuildContext, queryValues u
385389

386390
compatVolumes, _ := utils.ParseOptionalBool(query.CompatVolumes, "compatvolumes", queryValues)
387391

388-
compression := archive.Compression(query.Compression)
392+
compressionIntent := archive.Compression(query.Compression)
389393

390394
if query.StageLabels && !query.SaveStages {
391395
return nil, nil, utils.GetGenericBadRequestError(errors.New("stage-labels requires save-stages be set as well"))
@@ -694,6 +698,15 @@ func createBuildOptions(query *BuildQuery, buildCtx *BuildContext, queryValues u
694698
sbomScanOptions = append(sbomScanOptions, *sbomScanOption)
695699
}
696700

701+
var compressionFormat *compression.Algorithm
702+
if query.CompressionFormat != "" {
703+
algo, err := compression.AlgorithmByName(query.CompressionFormat)
704+
if err != nil {
705+
return nil, cleanup, utils.GetBadRequestError("compressionFormat", query.CompressionFormat, err)
706+
}
707+
compressionFormat = &algo
708+
}
709+
697710
// Create build options
698711
buildOptions := &buildahDefine.BuildOptions{
699712
AddCapabilities: addCaps,
@@ -732,8 +745,10 @@ func createBuildOptions(query *BuildQuery, buildCtx *BuildContext, queryValues u
732745
Volumes: query.Volumes,
733746
},
734747
CompatVolumes: compatVolumes,
748+
CompressionFormat: compressionFormat,
749+
CompressionLevel: query.CompressionLevel,
735750
CreatedAnnotation: query.CreatedAnnotation,
736-
Compression: compression,
751+
Compression: compressionIntent,
737752
ConfigureNetwork: parseNetworkConfigurationPolicy(query.ConfigureNetwork),
738753
ContextDirectory: buildCtx.ContextDirectory,
739754
Devices: devices,

pkg/api/server/register_images.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,18 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {
289289
// type: boolean
290290
// description: Use compression on image.
291291
// - in: query
292+
// name: compressionFormat
293+
// type: string
294+
// description: The type of compression to apply to layer blobs pushed to build caches in registries.
295+
// - in: query
296+
// name: compressionLevel
297+
// type: integer
298+
// description: The level of compression to apply to layer blobs pushed to build caches in registries. The range of acceptable values varies based on the compression format.
299+
// - in: query
300+
// name: forceCompressionFormat
301+
// type: boolean
302+
// description: Use the specified compression format for layer blobs, even when pushing to a location where an equivalent blob which differs only in how it's compressed could be reused.
303+
// - in: query
292304
// name: destination
293305
// type: string
294306
// description: Allows for pushing the image to a different destination than the image refers to.

pkg/bindings/images/build.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,16 @@ func prepareParams(options types.BuildOptions) (url.Values, error) {
168168
params.Add("t", tag)
169169
}
170170

171-
if options.IDMappingOptions != nil {
172-
idmappingsOptions, err := jsoniter.Marshal(options.IDMappingOptions)
173-
if err != nil {
174-
return nil, err
175-
}
176-
params.Set("idmappingoptions", string(idmappingsOptions))
171+
if options.CompressionFormat != nil {
172+
params.Set("compressionFormat", options.CompressionFormat.Name())
173+
}
174+
if options.CompressionLevel != nil {
175+
params.Set("compressionLevel", strconv.Itoa(*options.CompressionLevel))
176+
}
177+
if options.ForceCompressionFormat {
178+
params.Set("forceCompressionFormat", "1")
179+
} else {
180+
params.Set("forceCompressionFormat", "0")
177181
}
178182
if buildArgs := options.Args; len(buildArgs) > 0 {
179183
bArgs, err := jsoniter.MarshalToString(buildArgs)

test/buildah-bud/apply-podman-deltas

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ skip "Requires bit-identical tar outputs when using process substitution" \
349349
"use-secret-to-env-variable" \
350350
"use-secret-to-env-variable-and-file-path"
351351

352+
skip_if_remote "remote builds only commit to local storage, and this test isn't worth working around that" \
353+
"build --compression-format zstd to dir and oci-archive"
354+
352355
# END temporary workarounds that must be reevaluated periodically
353356
###############################################################################
354357

0 commit comments

Comments
 (0)