Add SystemdMode to inspect for containers

This allows us to determine if the container auto-detected that
systemd was in use, and correctly activated systemd integration.
Use this to wire up some integration tests to verify that systemd
integration is working properly.

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
This commit is contained in:
Matthew Heon 2020-07-14 13:21:05 -04:00
parent dc2ca45d75
commit 05988fc74f
4 changed files with 93 additions and 54 deletions

View File

@ -289,6 +289,7 @@ func (c *Container) generateInspectContainerConfig(spec *spec.Spec) *define.Insp
ctrConfig.OpenStdin = c.config.Stdin
ctrConfig.Image = c.config.RootfsImageName
ctrConfig.SystemdMode = c.config.Systemd
// Leave empty is not explicitly overwritten by user
if len(c.config.Command) != 0 {

View File

@ -57,6 +57,10 @@ type InspectContainerConfig struct {
// Timezone is the timezone inside the container.
// Local means it has the same timezone as the host machine
Timezone string `json:"Timezone,omitempty"`
// SystemdMode is whether the container is running in systemd mode. In
// systemd mode, the container configuration is customized to optimize
// running systemd in the container.
SystemdMode bool `json:"SystemdMode,omitempty"`
}
// InspectRestartPolicy holds information about the container's restart policy.
@ -631,3 +635,56 @@ type InspectContainerData struct {
Config *InspectContainerConfig `json:"Config"`
HostConfig *InspectContainerHostConfig `json:"HostConfig"`
}
// InspectExecSession contains information about a given exec session.
type InspectExecSession struct {
// CanRemove is legacy and used purely for compatibility reasons.
// Will always be set to true, unless the exec session is running.
CanRemove bool `json:"CanRemove"`
// ContainerID is the ID of the container this exec session is attached
// to.
ContainerID string `json:"ContainerID"`
// DetachKeys are the detach keys used by the exec session.
// If set to "" the default keys are being used.
// Will show "<none>" if no detach keys are set.
DetachKeys string `json:"DetachKeys"`
// ExitCode is the exit code of the exec session. Will be set to 0 if
// the exec session has not yet exited.
ExitCode int `json:"ExitCode"`
// ID is the ID of the exec session.
ID string `json:"ID"`
// OpenStderr is whether the container's STDERR stream will be attached.
// Always set to true if the exec session created a TTY.
OpenStderr bool `json:"OpenStderr"`
// OpenStdin is whether the container's STDIN stream will be attached
// to.
OpenStdin bool `json:"OpenStdin"`
// OpenStdout is whether the container's STDOUT stream will be attached.
// Always set to true if the exec session created a TTY.
OpenStdout bool `json:"OpenStdout"`
// Running is whether the exec session is running.
Running bool `json:"Running"`
// Pid is the PID of the exec session's process.
// Will be set to 0 if the exec session is not running.
Pid int `json:"Pid"`
// ProcessConfig contains information about the exec session's process.
ProcessConfig *InspectExecProcess `json:"ProcessConfig"`
}
// InspectExecProcess contains information about the process in a given exec
// session.
type InspectExecProcess struct {
// Arguments are the arguments to the entrypoint command of the exec
// session.
Arguments []string `json:"arguments"`
// Entrypoint is the entrypoint for the exec session (the command that
// will be executed in the container).
Entrypoint string `json:"entrypoint"`
// Privileged is whether the exec session will be started with elevated
// privileges.
Privileged bool `json:"privileged"`
// Tty is whether the exec session created a terminal.
Tty bool `json:"tty"`
// User is the user the exec session was started as.
User string `json:"user"`
}

View File

@ -1,54 +0,0 @@
package define
// InspectExecSession contains information about a given exec session.
type InspectExecSession struct {
// CanRemove is legacy and used purely for compatibility reasons.
// Will always be set to true, unless the exec session is running.
CanRemove bool `json:"CanRemove"`
// ContainerID is the ID of the container this exec session is attached
// to.
ContainerID string `json:"ContainerID"`
// DetachKeys are the detach keys used by the exec session.
// If set to "" the default keys are being used.
// Will show "<none>" if no detach keys are set.
DetachKeys string `json:"DetachKeys"`
// ExitCode is the exit code of the exec session. Will be set to 0 if
// the exec session has not yet exited.
ExitCode int `json:"ExitCode"`
// ID is the ID of the exec session.
ID string `json:"ID"`
// OpenStderr is whether the container's STDERR stream will be attached.
// Always set to true if the exec session created a TTY.
OpenStderr bool `json:"OpenStderr"`
// OpenStdin is whether the container's STDIN stream will be attached
// to.
OpenStdin bool `json:"OpenStdin"`
// OpenStdout is whether the container's STDOUT stream will be attached.
// Always set to true if the exec session created a TTY.
OpenStdout bool `json:"OpenStdout"`
// Running is whether the exec session is running.
Running bool `json:"Running"`
// Pid is the PID of the exec session's process.
// Will be set to 0 if the exec session is not running.
Pid int `json:"Pid"`
// ProcessConfig contains information about the exec session's process.
ProcessConfig *InspectExecProcess `json:"ProcessConfig"`
}
// InspectExecProcess contains information about the process in a given exec
// session.
type InspectExecProcess struct {
// Arguments are the arguments to the entrypoint command of the exec
// session.
Arguments []string `json:"arguments"`
// Entrypoint is the entrypoint for the exec session (the command that
// will be executed in the container).
Entrypoint string `json:"entrypoint"`
// Privileged is whether the exec session will be started with elevated
// privileges.
Privileged bool `json:"privileged"`
// Tty is whether the exec session created a terminal.
Tty bool `json:"tty"`
// User is the user the exec session was started as.
User string `json:"user"`
}

View File

@ -112,5 +112,40 @@ WantedBy=multi-user.target
systemctl.WaitWithDefaultTimeout()
Expect(systemctl.ExitCode()).To(Equal(0))
Expect(strings.Contains(systemctl.OutputToString(), "State:")).To(BeTrue())
result := podmanTest.Podman([]string{"inspect", ctrName})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
conData := result.InspectContainerToJSON()
Expect(len(conData)).To(Equal(1))
Expect(conData[0].Config.SystemdMode).To(BeTrue())
})
It("podman create container with systemd entrypoint triggers systemd mode", func() {
ctrName := "testCtr"
run := podmanTest.Podman([]string{"create", "--name", ctrName, "--entrypoint", "/sbin/init", ubi_init})
run.WaitWithDefaultTimeout()
Expect(run.ExitCode()).To(Equal(0))
result := podmanTest.Podman([]string{"inspect", ctrName})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
conData := result.InspectContainerToJSON()
Expect(len(conData)).To(Equal(1))
Expect(conData[0].Config.SystemdMode).To(BeTrue())
})
It("podman create container with systemd=always triggers systemd mode", func() {
ctrName := "testCtr"
run := podmanTest.Podman([]string{"create", "--name", ctrName, "--systemd", "always", ALPINE})
run.WaitWithDefaultTimeout()
Expect(run.ExitCode()).To(Equal(0))
result := podmanTest.Podman([]string{"inspect", ctrName})
result.WaitWithDefaultTimeout()
Expect(result.ExitCode()).To(Equal(0))
conData := result.InspectContainerToJSON()
Expect(len(conData)).To(Equal(1))
Expect(conData[0].Config.SystemdMode).To(BeTrue())
})
})