From a5adc3d80f7387c75c83f1e0c7ad3333fdc48806 Mon Sep 17 00:00:00 2001 From: Jhon Honce Date: Thu, 29 Jul 2021 08:34:49 -0700 Subject: [PATCH] Add support for mount options to API When creating containers the specialized mount options where not populated via the API. Fixes: #10831 Signed-off-by: Jhon Honce --- cmd/podman/common/create_opts.go | 45 +++++++++++++++++++++++++------- pkg/specgenutil/volumes.go | 4 +-- test/apiv2/20-containers.at | 8 ++++++ test/apiv2/test-apiv2 | 3 ++- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/cmd/podman/common/create_opts.go b/cmd/podman/common/create_opts.go index 2f592cba7b..09ac61f2eb 100644 --- a/cmd/podman/common/create_opts.go +++ b/cmd/podman/common/create_opts.go @@ -16,6 +16,7 @@ import ( "github.com/containers/podman/v3/pkg/domain/entities" "github.com/containers/podman/v3/pkg/rootless" "github.com/containers/podman/v3/pkg/specgen" + "github.com/docker/docker/api/types/mount" "github.com/pkg/errors" ) @@ -94,18 +95,30 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c expose = append(expose, fmt.Sprintf("%s/%s", p.Port(), p.Proto())) } - // mounts type=tmpfs/bind,source=,dest=,opt=val - // TODO options + // mounts type=tmpfs/bind,source=...,target=...=,opt=val mounts := make([]string, 0, len(cc.HostConfig.Mounts)) + var builder strings.Builder for _, m := range cc.HostConfig.Mounts { - mount := fmt.Sprintf("type=%s", m.Type) - if len(m.Source) > 0 { - mount += fmt.Sprintf(",source=%s", m.Source) + addField(&builder, "type", string(m.Type)) + addField(&builder, "source", m.Source) + addField(&builder, "target", m.Target) + addField(&builder, "ro", strconv.FormatBool(m.ReadOnly)) + addField(&builder, "consistency", string(m.Consistency)) + + // Map any specialized mount options that intersect between *Options and cli options + switch m.Type { + case mount.TypeBind: + addField(&builder, "bind-propagation", string(m.BindOptions.Propagation)) + addField(&builder, "bind-nonrecursive", strconv.FormatBool(m.BindOptions.NonRecursive)) + case mount.TypeTmpfs: + addField(&builder, "tmpfs-size", strconv.FormatInt(m.TmpfsOptions.SizeBytes, 10)) + addField(&builder, "tmpfs-mode", strconv.FormatUint(uint64(m.TmpfsOptions.Mode), 10)) + case mount.TypeVolume: + // All current VolumeOpts are handled above + // See vendor/github.com/containers/common/pkg/parse/parse.go:ValidateVolumeOpts() } - if len(m.Target) > 0 { - mount += fmt.Sprintf(",dst=%s", m.Target) - } - mounts = append(mounts, mount) + mounts = append(mounts, builder.String()) + builder.Reset() } // dns @@ -506,3 +519,17 @@ func logDriver() string { } return "" } + +// addField is a helper function to populate mount options +func addField(b *strings.Builder, name string, value string) { + if value == "" { + return + } + + if b.Len() > 0 { + b.WriteRune(',') + } + b.WriteString(name) + b.WriteRune('=') + b.WriteString(value) +} diff --git a/pkg/specgenutil/volumes.go b/pkg/specgenutil/volumes.go index e9f70fc9d3..0ed08198f9 100644 --- a/pkg/specgenutil/volumes.go +++ b/pkg/specgenutil/volumes.go @@ -620,9 +620,9 @@ func getTmpfsMounts(tmpfsFlag []string) (map[string]spec.Mount, error) { mount := spec.Mount{ Destination: filepath.Clean(destPath), - Type: string(define.TypeTmpfs), + Type: define.TypeTmpfs, Options: options, - Source: string(define.TypeTmpfs), + Source: define.TypeTmpfs, } m[destPath] = mount } diff --git a/test/apiv2/20-containers.at b/test/apiv2/20-containers.at index e2eb942336..8fdecb4bdf 100644 --- a/test/apiv2/20-containers.at +++ b/test/apiv2/20-containers.at @@ -366,4 +366,12 @@ t GET containers/$cid/json 200 \ .Config.Healthcheck.Timeout=30000000000 \ .Config.Healthcheck.Retries=3 +# compat api: Test for mount options support +payload='{"Mounts":[{"Type":"tmpfs","Target":"/mnt/scratch","TmpfsOptions":{"SizeBytes":1024,"Mode":755}}]}' +t POST containers/create Image=$IMAGE HostConfig="$payload" 201 .Id~[0-9a-f]\\{64\\} +cid=$(jq -r '.Id' <<<"$output") +t GET containers/$cid/json 200 \ + .HostConfig.Tmpfs['"/mnt/scratch"']~.*size=1024.* \ + .HostConfig.Tmpfs['"/mnt/scratch"']~.*mode=755.* + t DELETE containers/$cid?v=true 204 diff --git a/test/apiv2/test-apiv2 b/test/apiv2/test-apiv2 index 26619ae031..e1bf28baed 100755 --- a/test/apiv2/test-apiv2 +++ b/test/apiv2/test-apiv2 @@ -327,7 +327,8 @@ function start_service() { die "Cannot start service on non-localhost ($HOST)" fi - $PODMAN_BIN --root $WORKDIR/server_root system service \ + $PODMAN_BIN --root $WORKDIR/server_root --syslog=true \ + system service \ --time 15 \ tcp:127.0.0.1:$PORT \ &> $WORKDIR/server.log &