Skip to content

Commit 18a6e0d

Browse files
committed
driver(external): tweak some external driver manager code
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent 8404fce commit 18a6e0d

File tree

2 files changed

+83
-49
lines changed

2 files changed

+83
-49
lines changed

pkg/driver/qemu/cmd/main.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// SPDX-FileCopyrightText: Copyright The Lima Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package main
5+
6+
import (
7+
"github.com/lima-vm/lima/pkg/driver/external/server"
8+
"github.com/lima-vm/lima/pkg/driver/qemu"
9+
)
10+
11+
func main() {
12+
driver := qemu.New()
13+
server.Serve(driver)
14+
}

pkg/registry/registry.go

Lines changed: 69 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,41 @@
44
package registry
55

66
import (
7+
"context"
78
"fmt"
9+
"io"
810
"os"
911
"os/exec"
1012
"path/filepath"
1113
"strings"
1214
"sync"
1315

1416
"github.com/lima-vm/lima/pkg/driver"
15-
"github.com/lima-vm/lima/pkg/usrlocalsharelima"
17+
"github.com/lima-vm/lima/pkg/driver/external/client"
1618
"github.com/sirupsen/logrus"
1719
)
1820

21+
type ExternalDriver struct {
22+
Name string
23+
Command *exec.Cmd
24+
Stdin io.WriteCloser
25+
Stdout io.ReadCloser
26+
Client *client.DriverClient // Client is the gRPC client for the external driver
27+
Path string
28+
ctx context.Context
29+
cancelFunc context.CancelFunc
30+
}
31+
1932
type Registry struct {
20-
drivers map[string]driver.Driver
21-
externalDrivers map[string]string // For now mapping external driver names to paths
33+
internalDrivers map[string]driver.Driver
34+
externalDrivers map[string]*ExternalDriver
2235
mu sync.RWMutex
2336
}
2437

2538
func NewRegistry() *Registry {
2639
return &Registry{
27-
drivers: make(map[string]driver.Driver),
28-
externalDrivers: make(map[string]string),
40+
internalDrivers: make(map[string]driver.Driver),
41+
externalDrivers: make(map[string]*ExternalDriver),
2942
}
3043
}
3144

@@ -34,10 +47,11 @@ func (r *Registry) List() []string {
3447
defer r.mu.RUnlock()
3548

3649
var names []string
37-
for name := range r.drivers {
50+
for name := range r.internalDrivers {
3851
names = append(names, name)
3952
}
4053

54+
r.DiscoverDrivers()
4155
for name := range r.externalDrivers {
4256
names = append(names, name+" (external)")
4357
}
@@ -48,74 +62,79 @@ func (r *Registry) Get(name string) (driver.Driver, bool) {
4862
r.mu.RLock()
4963
defer r.mu.RUnlock()
5064

51-
driver, exists := r.drivers[name]
52-
return driver, exists
53-
}
54-
55-
func (r *Registry) GetExternalDriver(name string) (string, bool) {
56-
r.mu.RLock()
57-
defer r.mu.RUnlock()
65+
driver, exists := r.internalDrivers[name]
66+
if !exists {
67+
externalDriver, exists := r.externalDrivers[name]
68+
if exists {
69+
return externalDriver.Client, true
70+
}
5871

59-
plugin, exists := r.externalDrivers[name]
60-
return plugin, exists
72+
}
73+
return driver, exists
6174
}
6275

63-
func (r *Registry) RegisterPlugin(name, path string) {
76+
func (r *Registry) RegisterDriver(name, path string) {
6477
r.mu.Lock()
6578
defer r.mu.Unlock()
6679

6780
if _, exists := r.externalDrivers[name]; exists {
68-
logrus.Debugf("Plugin %q is already registered, skipping", name)
81+
logrus.Debugf("Driver %q is already registered, skipping", name)
6982
return
7083
}
7184

72-
r.externalDrivers[name] = path
73-
logrus.Debugf("Registered plugin %q at %s", name, path)
85+
r.externalDrivers[name].Path = path
86+
logrus.Debugf("Registered driver %q at %s", name, path)
7487
}
7588

76-
func (r *Registry) DiscoverPlugins() error {
77-
limaShareDir, err := usrlocalsharelima.Dir()
78-
if err != nil {
79-
return fmt.Errorf("failed to determine Lima share directory: %w", err)
80-
}
81-
stdPluginDir := filepath.Join(filepath.Dir(limaShareDir), "libexec", "lima", "drivers")
82-
83-
if _, err := os.Stat(stdPluginDir); err == nil {
84-
if err := r.discoverPluginsInDir(stdPluginDir); err != nil {
85-
logrus.Warnf("Error discovering plugins in %s: %v", stdPluginDir, err)
86-
}
87-
}
88-
89-
if pluginPaths := os.Getenv("LIMA_DRIVERS_PATH"); pluginPaths != "" {
90-
paths := filepath.SplitList(pluginPaths)
89+
func (r *Registry) DiscoverDrivers() error {
90+
// limaShareDir, err := usrlocalsharelima.Dir()
91+
// if err != nil {
92+
// return fmt.Errorf("failed to determine Lima share directory: %w", err)
93+
// }
94+
// fmt.Printf("Discovering drivers in %s\n", limaShareDir)
95+
// stdDriverDir := filepath.Join(filepath.Dir(limaShareDir), "libexec", "lima", "drivers")
96+
97+
// if _, err := os.Stat(stdDriverDir); err == nil {
98+
// if err := r.discoverDriversInDir(stdDriverDir); err != nil {
99+
// logrus.Warnf("Error discovering drivers in %s: %v", stdDriverDir, err)
100+
// }
101+
// }
102+
103+
if driverPaths := os.Getenv("LIMA_DRIVERS_PATH"); driverPaths != "" {
104+
fmt.Printf("Discovering drivers in LIMA_DRIVERS_PATH: %s\n", driverPaths)
105+
paths := filepath.SplitList(driverPaths)
106+
fmt.Println("Driver paths:", paths)
91107
for _, path := range paths {
92108
if path == "" {
93109
continue
94110
}
95111

96112
info, err := os.Stat(path)
97113
if err != nil {
98-
logrus.Warnf("Error accessing plugin path %s: %v", path, err)
114+
logrus.Warnf("Error accessing driver path %s: %v", path, err)
99115
continue
100116
}
117+
fmt.Printf("Info for %s: %+v\n", path, info)
118+
fmt.Printf("IsExecutable: %v\n", isExecutable(info.Mode()))
119+
fmt.Printf("IsDir: %v\n", info.IsDir())
101120

102121
if info.IsDir() {
103-
if err := r.discoverPluginsInDir(path); err != nil {
104-
logrus.Warnf("Error discovering plugins in %s: %v", path, err)
122+
if err := r.discoverDriversInDir(path); err != nil {
123+
logrus.Warnf("Error discovering drivers in %s: %v", path, err)
105124
}
106125
} else if isExecutable(info.Mode()) {
107-
r.registerPluginFile(path)
126+
r.registerDriverFile(path)
108127
}
109128
}
110129
}
111130

112131
return nil
113132
}
114133

115-
func (r *Registry) discoverPluginsInDir(dir string) error {
134+
func (r *Registry) discoverDriversInDir(dir string) error {
116135
entries, err := os.ReadDir(dir)
117136
if err != nil {
118-
return fmt.Errorf("failed to read plugin directory %s: %w", dir, err)
137+
return fmt.Errorf("failed to read driver directory %s: %w", dir, err)
119138
}
120139

121140
for _, entry := range entries {
@@ -133,29 +152,29 @@ func (r *Registry) discoverPluginsInDir(dir string) error {
133152
continue
134153
}
135154

136-
pluginPath := filepath.Join(dir, entry.Name())
137-
r.registerPluginFile(pluginPath)
155+
driverPath := filepath.Join(dir, entry.Name())
156+
r.registerDriverFile(driverPath)
138157
}
139158

140159
return nil
141160
}
142161

143-
func (r *Registry) registerPluginFile(path string) {
162+
func (r *Registry) registerDriverFile(path string) {
144163
base := filepath.Base(path)
145-
if !strings.HasPrefix(base, "lima-plugin-") {
164+
if !strings.HasPrefix(base, "lima-driver-") {
146165
return
147166
}
148167

149-
name := strings.TrimPrefix(base, "lima-plugin-")
168+
name := strings.TrimPrefix(base, "lima-driver-")
150169
name = strings.TrimSuffix(name, filepath.Ext(name))
151170

152171
cmd := exec.Command(path, "--version")
153172
if err := cmd.Run(); err != nil {
154-
logrus.Warnf("Plugin %s failed version check: %v", path, err)
173+
logrus.Warnf("driver %s failed version check: %v", path, err)
155174
return
156175
}
157176

158-
r.RegisterPlugin(name, path)
177+
r.RegisterDriver(name, path)
159178
}
160179

161180
func isExecutable(mode os.FileMode) bool {
@@ -166,15 +185,16 @@ var DefaultRegistry *Registry
166185

167186
func init() {
168187
DefaultRegistry = NewRegistry()
188+
DefaultRegistry.DiscoverDrivers()
169189
}
170190

171191
func Register(driver driver.Driver) {
172192
if DefaultRegistry != nil {
173193
name := driver.GetInfo().DriverName
174-
if _, exists := DefaultRegistry.drivers[name]; exists {
194+
if _, exists := DefaultRegistry.internalDrivers[name]; exists {
175195
return
176196
}
177197

178-
DefaultRegistry.drivers[name] = driver
198+
DefaultRegistry.internalDrivers[name] = driver
179199
}
180200
}

0 commit comments

Comments
 (0)