Order containers returned from state and make container config public
Signed-off-by: Matthew Heon <matthew.heon@gmail.com> Closes: #63 Approved by: baude
This commit is contained in:
parent
bd4e106de3
commit
34ba0cb8a9
|
|
@ -46,7 +46,7 @@ const (
|
||||||
|
|
||||||
// Container is a single OCI container
|
// Container is a single OCI container
|
||||||
type Container struct {
|
type Container struct {
|
||||||
config *containerConfig
|
config *ContainerConfig
|
||||||
|
|
||||||
pod *Pod
|
pod *Pod
|
||||||
runningSpec *spec.Spec
|
runningSpec *spec.Spec
|
||||||
|
|
@ -59,7 +59,7 @@ type Container struct {
|
||||||
runtime *Runtime
|
runtime *Runtime
|
||||||
}
|
}
|
||||||
|
|
||||||
// containerState contains the current state of the container
|
// containerRuntimeInfo contains the current state of the container
|
||||||
// It is stored on disk in a tmpfs and recreated on reboot
|
// It is stored on disk in a tmpfs and recreated on reboot
|
||||||
type containerRuntimeInfo struct {
|
type containerRuntimeInfo struct {
|
||||||
// The current state of the running container
|
// The current state of the running container
|
||||||
|
|
@ -88,10 +88,10 @@ type containerRuntimeInfo struct {
|
||||||
// TODO: Save information about image used in container if one is used
|
// TODO: Save information about image used in container if one is used
|
||||||
}
|
}
|
||||||
|
|
||||||
// containerConfig contains all information that was used to create the
|
// ContainerConfig contains all information that was used to create the
|
||||||
// container. It may not be changed once created.
|
// container. It may not be changed once created.
|
||||||
// It is stored, read-only, on disk
|
// It is stored, read-only, on disk
|
||||||
type containerConfig struct {
|
type ContainerConfig struct {
|
||||||
Spec *spec.Spec `json:"spec"`
|
Spec *spec.Spec `json:"spec"`
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|
@ -153,6 +153,14 @@ func (c *Container) Labels() map[string]string {
|
||||||
return labels
|
return labels
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Config returns the configuration used to create the container
|
||||||
|
func (c *Container) Config() *ContainerConfig {
|
||||||
|
returnConfig := new(ContainerConfig)
|
||||||
|
deepcopier.Copy(c.config).To(returnConfig)
|
||||||
|
|
||||||
|
return returnConfig
|
||||||
|
}
|
||||||
|
|
||||||
// LogPath returns the path to the container's log file
|
// LogPath returns the path to the container's log file
|
||||||
// This file will only be present after Init() is called to create the container
|
// This file will only be present after Init() is called to create the container
|
||||||
// in runc
|
// in runc
|
||||||
|
|
@ -235,7 +243,7 @@ func newContainer(rspec *spec.Spec) (*Container, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctr := new(Container)
|
ctr := new(Container)
|
||||||
ctr.config = new(containerConfig)
|
ctr.config = new(ContainerConfig)
|
||||||
ctr.state = new(containerRuntimeInfo)
|
ctr.state = new(containerRuntimeInfo)
|
||||||
|
|
||||||
ctr.config.ID = stringid.GenerateNonCryptoID()
|
ctr.config.ID = stringid.GenerateNonCryptoID()
|
||||||
|
|
|
||||||
|
|
@ -544,7 +544,8 @@ func (s *SQLState) AllContainers() ([]*Container, error) {
|
||||||
containerState.Pid
|
containerState.Pid
|
||||||
FROM containers
|
FROM containers
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
containerState ON containers.Id = containerState.Id;`
|
containerState ON containers.Id = containerState.Id
|
||||||
|
ORDER BY containers.CreatedTime DESC;`
|
||||||
|
|
||||||
if !s.valid {
|
if !s.valid {
|
||||||
return nil, ErrDBClosed
|
return nil, ErrDBClosed
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ func ctrFromScannable(row scannable, runtime *Runtime, specsDir string) (*Contai
|
||||||
}
|
}
|
||||||
|
|
||||||
ctr := new(Container)
|
ctr := new(Container)
|
||||||
ctr.config = new(containerConfig)
|
ctr.config = new(ContainerConfig)
|
||||||
ctr.state = new(containerRuntimeInfo)
|
ctr.state = new(containerRuntimeInfo)
|
||||||
|
|
||||||
ctr.config.ID = id
|
ctr.config.ID = id
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import (
|
||||||
|
|
||||||
func getTestContainer(id, name string) *Container {
|
func getTestContainer(id, name string) *Container {
|
||||||
ctr := &Container{
|
ctr := &Container{
|
||||||
config: &containerConfig{
|
config: &ContainerConfig{
|
||||||
ID: id,
|
ID: id,
|
||||||
Name: name,
|
Name: name,
|
||||||
RootfsImageID: id,
|
RootfsImageID: id,
|
||||||
|
|
@ -518,4 +518,15 @@ func TestGetAllContainersTwoContainers(t *testing.T) {
|
||||||
ctrs, err := state.AllContainers()
|
ctrs, err := state.AllContainers()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, 2, len(ctrs))
|
assert.Equal(t, 2, len(ctrs))
|
||||||
|
|
||||||
|
// Containers should be ordered by creation time
|
||||||
|
|
||||||
|
// Use assert.EqualValues if the test fails to pretty print diff
|
||||||
|
// between actual and expected
|
||||||
|
if !testContainersEqual(testCtr2, ctrs[0]) {
|
||||||
|
assert.EqualValues(t, testCtr2, ctrs[0])
|
||||||
|
}
|
||||||
|
if !testContainersEqual(testCtr1, ctrs[1]) {
|
||||||
|
assert.EqualValues(t, testCtr1, ctrs[1])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue