Skip to content

Commit 9abdd10

Browse files
committed
driver(external): manage external driver lifecycle
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent 62754a4 commit 9abdd10

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

cmd/limactl/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
// _ "github.com/lima-vm/lima/pkg/driver/qemu" // register qemu driver for all platforms
2020
"github.com/lima-vm/lima/pkg/fsutil"
2121
"github.com/lima-vm/lima/pkg/osutil"
22+
"github.com/lima-vm/lima/pkg/registry"
2223
"github.com/lima-vm/lima/pkg/store/dirnames"
2324
"github.com/lima-vm/lima/pkg/version"
2425
)
@@ -44,6 +45,8 @@ func main() {
4445
handleExitCoder(err)
4546
logrus.Fatal(err)
4647
}
48+
49+
defer registry.DefaultRegistry.StopAllExternalDrivers()
4750
}
4851

4952
func newApp() *cobra.Command {

pkg/registry/registry.go

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,52 @@ func (e *ExternalDriver) Start() error {
106106
return nil
107107
}
108108

109+
func (e *ExternalDriver) cleanup() {
110+
if e.cancelFunc != nil {
111+
e.cancelFunc()
112+
}
113+
if e.Stdin != nil {
114+
e.Stdin.Close()
115+
}
116+
if e.Stdout != nil {
117+
e.Stdout.Close()
118+
}
119+
e.Command = nil
120+
e.Client = nil
121+
e.ctx = nil
122+
e.cancelFunc = nil
123+
}
124+
125+
func (e *ExternalDriver) Stop() error {
126+
if e.Command == nil || e.Command.Process == nil {
127+
return fmt.Errorf("external driver %s is not running", e.Name)
128+
}
129+
130+
e.logger.Infof("Stopping external driver %s", e.Name)
131+
e.cleanup()
132+
133+
e.logger.Infof("External driver %s stopped successfully", e.Name)
134+
return nil
135+
}
136+
137+
func (r *Registry) StopAllExternalDrivers() {
138+
r.mu.Lock()
139+
defer r.mu.Unlock()
140+
141+
for name, driver := range r.externalDrivers {
142+
// Only try to stop if the driver is actually running
143+
if driver.Command != nil && driver.Command.Process != nil {
144+
if err := driver.Stop(); err != nil {
145+
logrus.Errorf("Failed to stop external driver %s: %v", name, err)
146+
} else {
147+
logrus.Infof("External driver %s stopped successfully", name)
148+
}
149+
}
150+
// Always remove from registry
151+
delete(r.externalDrivers, name)
152+
}
153+
}
154+
109155
func (r *Registry) List() []string {
110156
r.mu.RLock()
111157
defer r.mu.RUnlock()
@@ -130,13 +176,18 @@ func (r *Registry) Get(name string) (driver.Driver, bool) {
130176
externalDriver, exists := r.externalDrivers[name]
131177
if exists {
132178
externalDriver.logger.Debugf("Using external driver %q", name)
133-
if err := externalDriver.Start(); err != nil {
134-
externalDriver.logger.Errorf("Failed to start external driver %q: %v", name, err)
135-
return nil, false
179+
if externalDriver.Client == nil || externalDriver.Command == nil || externalDriver.Command.Process == nil {
180+
logrus.Infof("Starting new instance of external driver %q", name)
181+
if err := externalDriver.Start(); err != nil {
182+
externalDriver.logger.Errorf("Failed to start external driver %q: %v", name, err)
183+
return nil, false
184+
}
185+
} else {
186+
logrus.Infof("Reusing existing external driver %q instance", name)
136187
}
188+
137189
return externalDriver.Client, true
138190
}
139-
140191
}
141192
return driver, exists
142193
}

0 commit comments

Comments
 (0)