Skip to content

Commit 35d47d6

Browse files
committed
driver(external): complete external driver manager and registering process
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent 09e50ef commit 35d47d6

File tree

1 file changed

+93
-28
lines changed

1 file changed

+93
-28
lines changed

pkg/registry/registry.go

Lines changed: 93 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package registry
55

66
import (
7+
"bufio"
78
"context"
89
"fmt"
910
"io"
@@ -12,9 +13,11 @@ import (
1213
"path/filepath"
1314
"strings"
1415
"sync"
16+
"time"
1517

1618
"github.com/lima-vm/lima/pkg/driver"
1719
"github.com/lima-vm/lima/pkg/driver/external/client"
20+
"github.com/lima-vm/lima/pkg/usrlocalsharelima"
1821
"github.com/sirupsen/logrus"
1922
)
2023

@@ -26,6 +29,7 @@ type ExternalDriver struct {
2629
Client *client.DriverClient // Client is the gRPC client for the external driver
2730
Path string
2831
ctx context.Context
32+
logger *logrus.Logger
2933
cancelFunc context.CancelFunc
3034
}
3135

@@ -42,6 +46,64 @@ func NewRegistry() *Registry {
4246
}
4347
}
4448

49+
func (e *ExternalDriver) Start() error {
50+
e.logger.Infof("Starting external driver at %s", e.Path)
51+
52+
ctx, cancel := context.WithCancel(context.Background())
53+
cmd := exec.CommandContext(ctx, e.Path)
54+
55+
stdin, err := cmd.StdinPipe()
56+
if err != nil {
57+
cancel()
58+
return fmt.Errorf("failed to create stdin pipe: %w", err)
59+
}
60+
61+
stdout, err := cmd.StdoutPipe()
62+
if err != nil {
63+
cancel()
64+
return fmt.Errorf("failed to create stdout pipe: %w", err)
65+
}
66+
67+
stderr, err := cmd.StderrPipe()
68+
if err != nil {
69+
cancel()
70+
return fmt.Errorf("failed to create stderr pipe: %w", err)
71+
}
72+
73+
if err := cmd.Start(); err != nil {
74+
cancel()
75+
return fmt.Errorf("failed to start external driver: %w", err)
76+
}
77+
78+
driverLogger := e.logger.WithField("driver", e.Name)
79+
80+
go func() {
81+
scanner := bufio.NewScanner(stderr)
82+
for scanner.Scan() {
83+
driverLogger.Info(scanner.Text())
84+
}
85+
}()
86+
87+
time.Sleep(4 * time.Second)
88+
89+
driverClient, err := client.NewDriverClient(stdin, stdout, e.logger)
90+
if err != nil {
91+
cancel()
92+
cmd.Process.Kill()
93+
return fmt.Errorf("failed to create driver client: %w", err)
94+
}
95+
96+
e.Command = cmd
97+
e.Stdin = stdin
98+
e.Stdout = stdout
99+
e.Client = driverClient
100+
e.ctx = ctx
101+
e.cancelFunc = cancel
102+
103+
driverLogger.Infof("External driver %s started successfully", e.Name)
104+
return nil
105+
}
106+
45107
func (r *Registry) List() []string {
46108
r.mu.RLock()
47109
defer r.mu.RUnlock()
@@ -51,7 +113,6 @@ func (r *Registry) List() []string {
51113
names = append(names, name)
52114
}
53115

54-
r.DiscoverDrivers()
55116
for name := range r.externalDrivers {
56117
names = append(names, name+" (external)")
57118
}
@@ -66,6 +127,11 @@ func (r *Registry) Get(name string) (driver.Driver, bool) {
66127
if !exists {
67128
externalDriver, exists := r.externalDrivers[name]
68129
if exists {
130+
externalDriver.logger.Debugf("Using external driver %q", name)
131+
if err := externalDriver.Start(); err != nil {
132+
externalDriver.logger.Errorf("Failed to start external driver %q: %v", name, err)
133+
return nil, false
134+
}
69135
return externalDriver.Client, true
70136
}
71137

@@ -77,33 +143,38 @@ func (r *Registry) RegisterDriver(name, path string) {
77143
r.mu.Lock()
78144
defer r.mu.Unlock()
79145

80-
if _, exists := r.externalDrivers[name]; exists {
146+
if _, exists := DefaultRegistry.externalDrivers[name]; exists {
81147
logrus.Debugf("Driver %q is already registered, skipping", name)
82148
return
83149
}
84150

85-
r.externalDrivers[name].Path = path
86-
logrus.Debugf("Registered driver %q at %s", name, path)
151+
log := logrus.New()
152+
log.SetFormatter(&logrus.TextFormatter{
153+
FullTimestamp: true,
154+
})
155+
156+
DefaultRegistry.externalDrivers[name] = &ExternalDriver{
157+
Name: name,
158+
Path: path,
159+
logger: log,
160+
}
87161
}
88162

89163
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-
// }
164+
limaShareDir, err := usrlocalsharelima.Dir()
165+
if err != nil {
166+
return fmt.Errorf("failed to determine Lima share directory: %w", err)
167+
}
168+
stdDriverDir := filepath.Join(filepath.Dir(limaShareDir), "libexec", "lima", "drivers")
169+
170+
if _, err := os.Stat(stdDriverDir); err == nil {
171+
if err := r.discoverDriversInDir(stdDriverDir); err != nil {
172+
logrus.Warnf("Error discovering drivers in %s: %v", stdDriverDir, err)
173+
}
174+
}
102175

103176
if driverPaths := os.Getenv("LIMA_DRIVERS_PATH"); driverPaths != "" {
104-
fmt.Printf("Discovering drivers in LIMA_DRIVERS_PATH: %s\n", driverPaths)
105177
paths := filepath.SplitList(driverPaths)
106-
fmt.Println("Driver paths:", paths)
107178
for _, path := range paths {
108179
if path == "" {
109180
continue
@@ -114,9 +185,6 @@ func (r *Registry) DiscoverDrivers() error {
114185
logrus.Warnf("Error accessing driver path %s: %v", path, err)
115186
continue
116187
}
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())
120188

121189
if info.IsDir() {
122190
if err := r.discoverDriversInDir(path); err != nil {
@@ -162,18 +230,13 @@ func (r *Registry) discoverDriversInDir(dir string) error {
162230
func (r *Registry) registerDriverFile(path string) {
163231
base := filepath.Base(path)
164232
if !strings.HasPrefix(base, "lima-driver-") {
233+
fmt.Printf("Skipping %s: does not start with 'lima-driver-'\n", base)
165234
return
166235
}
167236

168237
name := strings.TrimPrefix(base, "lima-driver-")
169238
name = strings.TrimSuffix(name, filepath.Ext(name))
170239

171-
cmd := exec.Command(path, "--version")
172-
if err := cmd.Run(); err != nil {
173-
logrus.Warnf("driver %s failed version check: %v", path, err)
174-
return
175-
}
176-
177240
r.RegisterDriver(name, path)
178241
}
179242

@@ -185,7 +248,9 @@ var DefaultRegistry *Registry
185248

186249
func init() {
187250
DefaultRegistry = NewRegistry()
188-
DefaultRegistry.DiscoverDrivers()
251+
if err := DefaultRegistry.DiscoverDrivers(); err != nil {
252+
logrus.Warnf("Error discovering drivers: %v", err)
253+
}
189254
}
190255

191256
func Register(driver driver.Driver) {

0 commit comments

Comments
 (0)