From c58e8dea6ce1e9ff02c383c1698733fd0554ba2e Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Tue, 8 Nov 2016 10:54:53 -0800 Subject: [PATCH] Terminate template VMs on layer delete Signed-off-by: Darren Stahl --- daemon/graphdriver/windows/windows.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/daemon/graphdriver/windows/windows.go b/daemon/graphdriver/windows/windows.go index 29d53dc427..c0bd2e5cf1 100644 --- a/daemon/graphdriver/windows/windows.go +++ b/daemon/graphdriver/windows/windows.go @@ -244,6 +244,32 @@ func (d *Driver) Remove(id string) error { return err } + // Get and terminate any template VMs that are currently using the layer + computeSystems, err := hcsshim.GetContainers(hcsshim.ComputeSystemQuery{}) + if err != nil { + return err + } + + for _, computeSystem := range computeSystems { + if strings.Contains(computeSystem.RuntimeImagePath, id) && computeSystem.IsRuntimeTemplate { + container, err := hcsshim.OpenContainer(computeSystem.ID) + if err != nil { + return err + } + defer container.Close() + err = container.Terminate() + if hcsshim.IsPending(err) { + err = container.Wait() + } else if hcsshim.IsAlreadyStopped(err) { + err = nil + } + + if err != nil { + return err + } + } + } + layerPath := filepath.Join(d.info.HomeDir, rID) tmpID := fmt.Sprintf("%s-removing", rID) tmpLayerPath := filepath.Join(d.info.HomeDir, tmpID)