diff options
-rw-r--r-- | cmd/podman/common.go | 4 | ||||
-rw-r--r-- | cmd/podman/create.go | 23 | ||||
-rw-r--r-- | completions/bash/podman | 1 | ||||
-rw-r--r-- | docs/podman-create.1.md | 4 | ||||
-rw-r--r-- | docs/podman-run.1.md | 4 | ||||
-rw-r--r-- | pkg/spec/createconfig.go | 47 | ||||
-rw-r--r-- | pkg/spec/spec.go | 2 | ||||
-rw-r--r-- | pkg/spec/spec_test.go | 6 | ||||
-rw-r--r-- | test/e2e/create_test.go | 14 |
9 files changed, 52 insertions, 53 deletions
diff --git a/cmd/podman/common.go b/cmd/podman/common.go index 63c41d01c..f38348a65 100644 --- a/cmd/podman/common.go +++ b/cmd/podman/common.go @@ -80,6 +80,10 @@ var createFlags = []cli.Flag{ Usage: "Add a custom host-to-IP mapping (host:ip) (default [])", }, cli.StringSliceFlag{ + Name: "annotation", + Usage: "Add annotations to container (key:value) (default [])", + }, + cli.StringSliceFlag{ Name: "attach, a", Usage: "Attach to STDIN, STDOUT or STDERR (default [])", }, diff --git a/cmd/podman/create.go b/cmd/podman/create.go index 89a8baf6d..35487a83a 100644 --- a/cmd/podman/create.go +++ b/cmd/podman/create.go @@ -19,6 +19,7 @@ import ( "github.com/projectatomic/libpod/cmd/podman/libpodruntime" "github.com/projectatomic/libpod/libpod" "github.com/projectatomic/libpod/libpod/image" + ann "github.com/projectatomic/libpod/pkg/annotations" "github.com/projectatomic/libpod/pkg/inspect" cc "github.com/projectatomic/libpod/pkg/spec" "github.com/projectatomic/libpod/pkg/util" @@ -377,6 +378,27 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim } } + // ANNOTATIONS + annotations := make(map[string]string) + // First, add our default annotations + annotations[ann.ContainerType] = "sandbox" + annotations[ann.TTY] = "false" + if tty { + annotations[ann.TTY] = "true" + } + // Next, add annotations from the image + for key, value := range data.Annotations { + annotations[key] = value + } + // Last, add user annotations + for _, annotation := range c.StringSlice("annotation") { + splitAnnotation := strings.SplitN(annotation, "=", 2) + if len(splitAnnotation) < 2 { + return nil, errors.Errorf("Annotations must be formatted KEY=VALUE") + } + annotations[splitAnnotation[0]] = splitAnnotation[1] + } + // WORKING DIRECTORY workDir := "/" if c.IsSet("workdir") { @@ -463,6 +485,7 @@ func parseCreateOpts(ctx context.Context, c *cli.Context, runtime *libpod.Runtim config := &cc.CreateConfig{ Runtime: runtime, + Annotations: annotations, BuiltinImgVolumes: ImageVolumes, ConmonPidFile: c.String("conmon-pidfile"), ImageVolumeType: c.String("image-volume"), diff --git a/completions/bash/podman b/completions/bash/podman index 00da883e7..7a991e808 100644 --- a/completions/bash/podman +++ b/completions/bash/podman @@ -1134,6 +1134,7 @@ _podman_push() { _podman_container_run() { local options_with_args=" --add-host + --annotation --attach -a --blkio-weight --blkio-weight-device diff --git a/docs/podman-create.1.md b/docs/podman-create.1.md index be861cfbe..79d8c1d2c 100644 --- a/docs/podman-create.1.md +++ b/docs/podman-create.1.md @@ -23,6 +23,10 @@ The initial status of the container created with **podman create** is 'created'. Add a line to /etc/hosts. The format is hostname:ip. The **--add-host** option can be set multiple times. +**--annotation**=[] + Add an annotation to the container. The format is key=value. +The **--annotation** option can be set multiple times. + **-a**, **--attach**=[] Attach to STDIN, STDOUT or STDERR. diff --git a/docs/podman-run.1.md b/docs/podman-run.1.md index 918c27ccf..ed6589f26 100644 --- a/docs/podman-run.1.md +++ b/docs/podman-run.1.md @@ -35,6 +35,10 @@ is located at `/run/.containerenv`. Add a line to /etc/hosts. The format is hostname:ip. The **--add-host** option can be set multiple times. +**--annotation**=[] + Add an annotation to the container. The format is key=value. +The **--annotation** option can be set multiple times. + **-a**, **--attach**=[] Attach to STDIN, STDOUT or STDERR. diff --git a/pkg/spec/createconfig.go b/pkg/spec/createconfig.go index de6e0f593..25a0e26bd 100644 --- a/pkg/spec/createconfig.go +++ b/pkg/spec/createconfig.go @@ -16,7 +16,6 @@ import ( "github.com/opencontainers/selinux/go-selinux/label" "github.com/pkg/errors" "github.com/projectatomic/libpod/libpod" - ann "github.com/projectatomic/libpod/pkg/annotations" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -67,6 +66,7 @@ type CreateResourceConfig struct { // CreateConfig is a pre OCI spec structure. It represents user input from varlink or the CLI type CreateConfig struct { Runtime *libpod.Runtime + Annotations map[string]string Args []string CapAdd []string // cap-add CapDrop []string // cap-drop @@ -219,51 +219,6 @@ func makeThrottleArray(throttleInput []string, rateType int) ([]spec.LinuxThrott return ltds, nil } -// GetAnnotations returns the all the annotations for the container -func (c *CreateConfig) GetAnnotations() map[string]string { - a := getDefaultAnnotations() - // TODO - Which annotations do we want added by default - // TODO - This should be added to the DB long term - if c.Tty { - a["io.kubernetes.cri-o.TTY"] = "true" - } - return a -} - -func getDefaultAnnotations() map[string]string { - var annotations map[string]string - annotations = make(map[string]string) - annotations[ann.Annotations] = "" - annotations[ann.ContainerID] = "" - annotations[ann.ContainerName] = "" - annotations[ann.ContainerType] = "sandbox" - annotations[ann.Created] = "" - annotations[ann.HostName] = "" - annotations[ann.IP] = "" - annotations[ann.Image] = "" - annotations[ann.ImageName] = "" - annotations[ann.ImageRef] = "" - annotations[ann.KubeName] = "" - annotations[ann.Labels] = "" - annotations[ann.LogPath] = "" - annotations[ann.Metadata] = "" - annotations[ann.Name] = "" - annotations[ann.PrivilegedRuntime] = "" - annotations[ann.ResolvPath] = "" - annotations[ann.HostnamePath] = "" - annotations[ann.SandboxID] = "" - annotations[ann.SandboxName] = "" - annotations[ann.ShmPath] = "" - annotations[ann.MountPoint] = "" - annotations[ann.TrustedSandbox] = "" - annotations[ann.TTY] = "false" - annotations[ann.Stdin] = "" - annotations[ann.StdinOnce] = "" - annotations[ann.Volumes] = "" - - return annotations -} - //GetVolumeMounts takes user provided input for bind mounts and creates Mount structs func (c *CreateConfig) GetVolumeMounts(specMounts []spec.Mount) ([]spec.Mount, error) { var m []spec.Mount diff --git a/pkg/spec/spec.go b/pkg/spec/spec.go index 5260b9b19..fdbbcd6ad 100644 --- a/pkg/spec/spec.go +++ b/pkg/spec/spec.go @@ -58,7 +58,7 @@ func CreateConfigToOCISpec(config *CreateConfig) (*spec.Spec, error) { //nolint g.SetProcessArgs(config.Command) g.SetProcessTerminal(config.Tty) - for key, val := range config.GetAnnotations() { + for key, val := range config.Annotations { g.AddAnnotation(key, val) } g.SetRootReadonly(config.ReadOnlyRootfs) diff --git a/pkg/spec/spec_test.go b/pkg/spec/spec_test.go index 2a040a9a0..de3605068 100644 --- a/pkg/spec/spec_test.go +++ b/pkg/spec/spec_test.go @@ -23,12 +23,6 @@ func TestCreateConfig_GetVolumeMounts(t *testing.T) { assert.True(t, reflect.DeepEqual(data, specMount[0])) } -func TestCreateConfig_GetAnnotations(t *testing.T) { - config := CreateConfig{} - annotations := config.GetAnnotations() - assert.True(t, reflect.DeepEqual("sandbox", annotations["io.kubernetes.cri-o.ContainerType"])) -} - func TestCreateConfig_GetTmpfsMounts(t *testing.T) { data := spec.Mount{ Destination: "/homer", diff --git a/test/e2e/create_test.go b/test/e2e/create_test.go index ebe4ed924..b6bc9b70d 100644 --- a/test/e2e/create_test.go +++ b/test/e2e/create_test.go @@ -54,4 +54,18 @@ var _ = Describe("Podman create", func() { Expect(session.ExitCode()).To(Equal(0)) Expect(podmanTest.NumberOfContainers()).To(Equal(1)) }) + + It("podman create adds annotation", func() { + session := podmanTest.Podman([]string{"create", "--annotation", "HELLO=WORLD", ALPINE, "ls"}) + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + Expect(podmanTest.NumberOfContainers()).To(Equal(1)) + + check := podmanTest.Podman([]string{"inspect", "-l"}) + check.WaitWithDefaultTimeout() + data := check.InspectContainerToJSON() + value, ok := data[0].Config.Annotations["HELLO"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("WORLD")) + }) }) |