Abstract cdata variables from Container struct

This commit is contained in:
Joel Elkins 2022-12-11 16:23:14 -06:00
parent beb1fe71a8
commit 1f4387f9b4
No known key found for this signature in database
GPG Key ID: 133589DC38921AE2

View File

@ -68,8 +68,8 @@ type Container struct {
Devices []string `toml:"devices,omitempty"`
conn context.Context
cdataChan chan chan *define.InspectContainerData // do not use directly -- use getCData()
cdataInval chan bool // send a bool when container state changes
getCData func() *define.InspectContainerData
invalCData func()
wasRunning bool
}
@ -157,7 +157,7 @@ func (c *Container) newCommandSet(op string, cmds cmd.Commands) cmd.Set {
func (c *Container) PullCommands() cmd.Set {
return c.newCommandSet("PULL", cmd.Commands{
cmd.NewFunc("do_pull", func() error {
c.cdataInval <- true
c.invalCData()
return c.pull()
}),
})
@ -261,7 +261,7 @@ func (c *Container) CreateCommands() cmd.Set {
if err != nil {
return err
}
c.cdataInval <- true
c.invalCData()
return c.pull()
}
return nil
@ -271,7 +271,7 @@ func (c *Container) CreateCommands() cmd.Set {
if _, err := containers.CreateWithSpec(c.conn, &spec, nil); err != nil {
return err
}
c.cdataInval <- true
c.invalCData()
return nil
}),
})
@ -296,7 +296,7 @@ func (c *Container) RemoveCommands() cmd.Set {
}
yes := true
_, err := containers.Remove(c.conn, cdata.ID, &containers.RemoveOptions{Force: &yes})
c.cdataInval <- true
c.invalCData()
return err
}),
})
@ -326,7 +326,7 @@ func (c *Container) StartCommands() cmd.Set {
if err != nil {
return err
}
c.cdataInval <- true
c.invalCData()
cdata = c.getCData()
if cdata != nil && cdata.HostConfig != nil && cdata.HostConfig.NetworkMode == "bridge" {
err = c.assureNetNS()
@ -436,36 +436,40 @@ func (c *Container) StopCommands() cmd.Set {
if err != nil {
return err
}
c.cdataInval <- true
c.invalCData()
return nil
}),
})
}
func (c *Container) watchCData() {
c.cdataChan = make(chan chan *define.InspectContainerData)
c.cdataInval = make(chan bool)
cdataChan := make(chan chan *define.InspectContainerData)
cdataInval := make(chan bool)
go func() {
var cache *define.InspectContainerData
for {
select {
case dchan := <-c.cdataChan:
case dchan := <-cdataChan:
if cache == nil {
no := false
cache, _ = containers.Inspect(c.conn, c.Name, &containers.InspectOptions{Size: &no})
}
dchan <- cache
case <-c.cdataInval:
case <-cdataInval:
cache = nil
}
}
}()
}
func (c *Container) getCData() *define.InspectContainerData {
cc := make(chan *define.InspectContainerData)
c.cdataChan <- cc
return <-cc
c.getCData = func() *define.InspectContainerData {
cc := make(chan *define.InspectContainerData)
cdataChan <- cc
return <-cc
}
c.invalCData = func() {
cdataInval <- true
}
}
// Pid will return the host process id of the main container process (pid