Update list command and created methods
We don't need a CreatedTime method on the container because it's not part of the interface and can be received via the state. We also do not need to call it CreateTime because the type of this field is time.Time so we know its time. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
480e5f4416
commit
1172a1e1e5
|
@ -65,8 +65,8 @@ type BaseState struct {
|
|||
// InitProcessStartTime is the init process start time in clock cycles since boot time.
|
||||
InitProcessStartTime string `json:"init_process_start"`
|
||||
|
||||
// CreatedTime is the unix timestamp for the creation time of the container in UTC
|
||||
CreatedTime time.Time `json:"created_time"`
|
||||
// Created is the unix timestamp for the creation time of the container in UTC
|
||||
Created time.Time `json:"created"`
|
||||
|
||||
// Config is the container's configuration.
|
||||
Config configs.Config `json:"config"`
|
||||
|
|
|
@ -40,7 +40,7 @@ type linuxContainer struct {
|
|||
m sync.Mutex
|
||||
criuVersion int
|
||||
state containerState
|
||||
createdTime time.Time
|
||||
created time.Time
|
||||
}
|
||||
|
||||
// State represents a running container's state
|
||||
|
@ -120,11 +120,6 @@ func (c *linuxContainer) ID() string {
|
|||
return c.id
|
||||
}
|
||||
|
||||
// CreatedTime returns the timestamp from when the container was CREATED
|
||||
func (c *linuxContainer) CreatedTime() time.Time {
|
||||
return c.createdTime
|
||||
}
|
||||
|
||||
// Config returns the container's configuration
|
||||
func (c *linuxContainer) Config() configs.Config {
|
||||
return *c.config
|
||||
|
@ -198,7 +193,7 @@ func (c *linuxContainer) Start(process *Process) error {
|
|||
return newSystemError(err)
|
||||
}
|
||||
// generate a timestamp indicating when the container was started
|
||||
c.createdTime = time.Now().UTC()
|
||||
c.created = time.Now().UTC()
|
||||
|
||||
c.state = &runningState{
|
||||
c: c,
|
||||
|
@ -1053,7 +1048,7 @@ func (c *linuxContainer) currentState() (*State, error) {
|
|||
Config: *c.config,
|
||||
InitProcessPid: pid,
|
||||
InitProcessStartTime: startTime,
|
||||
CreatedTime: c.createdTime,
|
||||
Created: c.created,
|
||||
},
|
||||
CgroupPaths: c.cgroupManager.GetPaths(),
|
||||
NamespacePaths: make(map[configs.NamespaceType]string),
|
||||
|
|
|
@ -202,7 +202,7 @@ func (l *LinuxFactory) Load(id string) (Container, error) {
|
|||
criuPath: l.CriuPath,
|
||||
cgroupManager: l.NewCgroupsManager(state.Config.Cgroups, state.CgroupPaths),
|
||||
root: containerRoot,
|
||||
createdTime: state.CreatedTime,
|
||||
created: state.Created,
|
||||
}
|
||||
c.state = &createdState{c: c, s: Created}
|
||||
if err := c.refreshState(); err != nil {
|
||||
|
|
50
list.go
50
list.go
|
@ -12,72 +12,60 @@ import (
|
|||
|
||||
"github.com/Sirupsen/logrus"
|
||||
"github.com/codegangsta/cli"
|
||||
"github.com/opencontainers/runc/libcontainer"
|
||||
)
|
||||
|
||||
var listCommand = cli.Command{
|
||||
Name: "list",
|
||||
Usage: "lists containers started by runc with the given root",
|
||||
Action: func(context *cli.Context) {
|
||||
|
||||
// preload the container factory
|
||||
if factory == nil {
|
||||
err := factoryPreload(context)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
return
|
||||
}
|
||||
factory, err := loadFactory(context)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
// get the list of containers
|
||||
root := context.GlobalString("root")
|
||||
absRoot, err := filepath.Abs(root)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
return
|
||||
}
|
||||
list, err := ioutil.ReadDir(absRoot)
|
||||
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
w := tabwriter.NewWriter(os.Stdout, 12, 1, 3, ' ', 0)
|
||||
fmt.Fprint(w, "ID\tPID\tSTATUS\tCREATED\n")
|
||||
|
||||
// output containers
|
||||
for _, item := range list {
|
||||
switch {
|
||||
case !item.IsDir():
|
||||
// do nothing with misc files in the containers directory
|
||||
case item.IsDir():
|
||||
outputListInfo(item.Name(), w)
|
||||
if item.IsDir() {
|
||||
if err := outputListInfo(item.Name(), factory, w); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := w.Flush(); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func outputListInfo(id string, w *tabwriter.Writer) {
|
||||
func outputListInfo(id string, factory libcontainer.Factory, w *tabwriter.Writer) error {
|
||||
container, err := factory.Load(id)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
containerStatus, err := container.Status()
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
state, err := container.State()
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Fprintf(w, "%s\t%d\t%s\t%s\n", container.ID(),
|
||||
fmt.Fprintf(w, "%s\t%d\t%s\t%s\n",
|
||||
container.ID(),
|
||||
state.BaseState.InitProcessPid,
|
||||
containerStatus.String(),
|
||||
state.BaseState.CreatedTime.Format(time.RFC3339Nano))
|
||||
|
||||
state.BaseState.Created.Format(time.RFC3339Nano))
|
||||
return nil
|
||||
}
|
||||
|
|
11
utils.go
11
utils.go
|
@ -86,17 +86,6 @@ func containerPreload(context *cli.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
var factory libcontainer.Factory
|
||||
|
||||
func factoryPreload(context *cli.Context) error {
|
||||
f, err := loadFactory(context)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
factory = f
|
||||
return nil
|
||||
}
|
||||
|
||||
// loadFactory returns the configured factory instance for execing containers.
|
||||
func loadFactory(context *cli.Context) (libcontainer.Factory, error) {
|
||||
root := context.GlobalString("root")
|
||||
|
|
Loading…
Reference in New Issue