Merge pull request #622 from mrjana/bugs
Move sandbox resources when container restarts
This commit is contained in:
commit
933190302f
|
@ -307,15 +307,21 @@ func (sb *sandbox) SetKey(basePath string) error {
|
|||
}
|
||||
|
||||
sb.Lock()
|
||||
if sb.osSbox != nil {
|
||||
sb.Unlock()
|
||||
return types.ForbiddenErrorf("failed to set sandbox key : already assigned")
|
||||
}
|
||||
osSbox := sb.osSbox
|
||||
sb.Unlock()
|
||||
osSbox, err := osl.GetSandboxForExternalKey(basePath, sb.Key())
|
||||
|
||||
if osSbox != nil {
|
||||
// If we already have an OS sandbox, release the network resources from that
|
||||
// and destroy the OS snab. We are moving into a new home further down. Note that none
|
||||
// of the network resources gets destroyed during the move.
|
||||
sb.releaseOSSbox()
|
||||
}
|
||||
|
||||
osSbox, err = osl.GetSandboxForExternalKey(basePath, sb.Key())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sb.Lock()
|
||||
sb.osSbox = osSbox
|
||||
sb.Unlock()
|
||||
|
@ -335,6 +341,45 @@ func (sb *sandbox) SetKey(basePath string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func releaseOSSboxResources(osSbox osl.Sandbox, ep *endpoint) {
|
||||
for _, i := range osSbox.Info().Interfaces() {
|
||||
// Only remove the interfaces owned by this endpoint from the sandbox.
|
||||
if ep.hasInterface(i.SrcName()) {
|
||||
if err := i.Remove(); err != nil {
|
||||
log.Debugf("Remove interface failed: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ep.Lock()
|
||||
joinInfo := ep.joinInfo
|
||||
ep.Unlock()
|
||||
|
||||
// Remove non-interface routes.
|
||||
for _, r := range joinInfo.StaticRoutes {
|
||||
if err := osSbox.RemoveStaticRoute(r); err != nil {
|
||||
log.Debugf("Remove route failed: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (sb *sandbox) releaseOSSbox() {
|
||||
sb.Lock()
|
||||
osSbox := sb.osSbox
|
||||
sb.osSbox = nil
|
||||
sb.Unlock()
|
||||
|
||||
if osSbox == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, ep := range sb.getConnectedEndpoints() {
|
||||
releaseOSSboxResources(osSbox, ep)
|
||||
}
|
||||
|
||||
osSbox.Destroy()
|
||||
}
|
||||
|
||||
func (sb *sandbox) populateNetworkResources(ep *endpoint) error {
|
||||
sb.Lock()
|
||||
if sb.osSbox == nil {
|
||||
|
@ -394,25 +439,7 @@ func (sb *sandbox) clearNetworkResources(origEp *endpoint) error {
|
|||
osSbox := sb.osSbox
|
||||
sb.Unlock()
|
||||
if osSbox != nil {
|
||||
for _, i := range osSbox.Info().Interfaces() {
|
||||
// Only remove the interfaces owned by this endpoint from the sandbox.
|
||||
if ep.hasInterface(i.SrcName()) {
|
||||
if err := i.Remove(); err != nil {
|
||||
log.Debugf("Remove interface failed: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ep.Lock()
|
||||
joinInfo := ep.joinInfo
|
||||
ep.Unlock()
|
||||
|
||||
// Remove non-interface routes.
|
||||
for _, r := range joinInfo.StaticRoutes {
|
||||
if err := osSbox.RemoveStaticRoute(r); err != nil {
|
||||
log.Debugf("Remove route failed: %v", err)
|
||||
}
|
||||
}
|
||||
releaseOSSboxResources(osSbox, ep)
|
||||
}
|
||||
|
||||
sb.Lock()
|
||||
|
|
Loading…
Reference in New Issue