Skip to content

Commit 8027b9c

Browse files
committed
driver(external): proxy vsock to ga.sock for vz
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent 2b3b01d commit 8027b9c

File tree

10 files changed

+257
-291
lines changed

10 files changed

+257
-291
lines changed
Lines changed: 132 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,135 @@
1-
// SPDX-FileCopyrightText: Copyright The Lima Authors
2-
// SPDX-License-Identifier: Apache-2.0
1+
// // SPDX-FileCopyrightText: Copyright The Lima Authors
2+
// // SPDX-License-Identifier: Apache-2.0
33

44
package grpchijack
55

6-
import (
7-
"errors"
8-
"fmt"
9-
"io"
10-
"net"
11-
"sync"
12-
"time"
13-
14-
pb "github.com/lima-vm/lima/pkg/driver/external"
15-
"google.golang.org/grpc"
16-
)
17-
18-
type streamConn struct {
19-
stream pb.Driver_GuestAgentConnClient
20-
readBuf []byte
21-
lastBuf []byte
22-
readMu sync.Mutex
23-
writeMu sync.Mutex
24-
closeCh chan struct{}
25-
closedOnce sync.Once
26-
closed bool
27-
}
28-
29-
func StreamToConn(stream pb.Driver_GuestAgentConnClient) *streamConn {
30-
return &streamConn{
31-
stream: stream,
32-
closeCh: make(chan struct{}),
33-
}
34-
}
35-
36-
func (c *streamConn) Read(b []byte) (int, error) {
37-
c.readMu.Lock()
38-
defer c.readMu.Unlock()
39-
40-
if c.closed {
41-
return 0, io.EOF
42-
}
43-
44-
if c.lastBuf != nil {
45-
n := copy(b, c.lastBuf)
46-
c.lastBuf = c.lastBuf[n:]
47-
if len(c.lastBuf) == 0 {
48-
c.lastBuf = nil
49-
}
50-
return n, nil
51-
}
52-
53-
msg := new(pb.BytesMessage)
54-
msg, err := c.stream.Recv()
55-
if err != nil {
56-
c.closed = true
57-
if err == io.EOF {
58-
return 0, io.EOF
59-
}
60-
return 0, fmt.Errorf("stream receive error: %w", err)
61-
}
62-
63-
n := copy(b, msg.Data)
64-
if n < len(msg.Data) {
65-
c.readBuf = make([]byte, len(msg.Data)-n)
66-
copy(c.readBuf, msg.Data[n:])
67-
}
68-
69-
return n, nil
70-
}
71-
72-
func (c *streamConn) Write(b []byte) (int, error) {
73-
c.writeMu.Lock()
74-
defer c.writeMu.Unlock()
75-
76-
if c.closed {
77-
return 0, errors.New("connection closed")
78-
}
79-
80-
err := c.stream.Send(&pb.BytesMessage{Data: b})
81-
if err != nil {
82-
c.closed = true
83-
return 0, fmt.Errorf("stream send error: %w", err)
84-
}
85-
86-
return len(b), nil
87-
}
88-
89-
func (c *streamConn) Close() error {
90-
c.closedOnce.Do(func() {
91-
defer func() {
92-
close(c.closeCh)
93-
}()
94-
95-
if cs, ok := c.stream.(grpc.ClientStream); ok {
96-
c.writeMu.Lock()
97-
err := cs.CloseSend()
98-
c.writeMu.Unlock()
99-
if err != nil {
100-
return
101-
}
102-
}
103-
104-
c.readMu.Lock()
105-
for {
106-
m := new(pb.BytesMessage)
107-
m.Data = c.readBuf
108-
err := c.stream.RecvMsg(m)
109-
if err != nil {
110-
if !errors.Is(err, io.EOF) {
111-
c.readMu.Unlock()
112-
return
113-
}
114-
err = nil
115-
break
116-
}
117-
c.readBuf = m.Data[:cap(m.Data)]
118-
c.lastBuf = append(c.lastBuf, c.readBuf...)
119-
}
120-
c.readMu.Unlock()
121-
})
122-
return nil
123-
}
124-
125-
func (c *streamConn) LocalAddr() net.Addr { return &grpcAddr{} }
126-
func (c *streamConn) RemoteAddr() net.Addr { return &grpcAddr{} }
127-
128-
func (c *streamConn) SetDeadline(t time.Time) error { return nil }
129-
func (c *streamConn) SetReadDeadline(t time.Time) error { return nil }
130-
func (c *streamConn) SetWriteDeadline(t time.Time) error { return nil }
131-
132-
type grpcAddr struct{}
133-
134-
func (grpcAddr) Network() string { return "grpc" }
135-
func (grpcAddr) String() string { return "grpc-stream" }
6+
// import (
7+
// "errors"
8+
// "fmt"
9+
// "io"
10+
// "net"
11+
// "sync"
12+
// "time"
13+
14+
// pb "github.com/lima-vm/lima/pkg/driver/external"
15+
// "google.golang.org/grpc"
16+
// )
17+
18+
// type streamConn struct {
19+
// stream pb.Driver_GuestAgentConnClient
20+
// readBuf []byte
21+
// lastBuf []byte
22+
// readMu sync.Mutex
23+
// writeMu sync.Mutex
24+
// closeCh chan struct{}
25+
// closedOnce sync.Once
26+
// closed bool
27+
// }
28+
29+
// func StreamToConn(stream pb.Driver_GuestAgentConnClient) *streamConn {
30+
// return &streamConn{
31+
// stream: stream,
32+
// closeCh: make(chan struct{}),
33+
// }
34+
// }
35+
36+
// func (c *streamConn) Read(b []byte) (int, error) {
37+
// c.readMu.Lock()
38+
// defer c.readMu.Unlock()
39+
40+
// if c.closed {
41+
// return 0, io.EOF
42+
// }
43+
44+
// if c.lastBuf != nil {
45+
// n := copy(b, c.lastBuf)
46+
// c.lastBuf = c.lastBuf[n:]
47+
// if len(c.lastBuf) == 0 {
48+
// c.lastBuf = nil
49+
// }
50+
// return n, nil
51+
// }
52+
53+
// msg := new(pb.BytesMessage)
54+
// msg, err := c.stream.Recv()
55+
// if err != nil {
56+
// c.closed = true
57+
// if err == io.EOF {
58+
// return 0, io.EOF
59+
// }
60+
// return 0, fmt.Errorf("stream receive error: %w", err)
61+
// }
62+
63+
// n := copy(b, msg.Data)
64+
// if n < len(msg.Data) {
65+
// c.readBuf = make([]byte, len(msg.Data)-n)
66+
// copy(c.readBuf, msg.Data[n:])
67+
// }
68+
69+
// return n, nil
70+
// }
71+
72+
// func (c *streamConn) Write(b []byte) (int, error) {
73+
// c.writeMu.Lock()
74+
// defer c.writeMu.Unlock()
75+
76+
// if c.closed {
77+
// return 0, errors.New("connection closed")
78+
// }
79+
80+
// err := c.stream.Send(&pb.BytesMessage{Data: b})
81+
// if err != nil {
82+
// c.closed = true
83+
// return 0, fmt.Errorf("stream send error: %w", err)
84+
// }
85+
86+
// return len(b), nil
87+
// }
88+
89+
// func (c *streamConn) Close() error {
90+
// c.closedOnce.Do(func() {
91+
// defer func() {
92+
// close(c.closeCh)
93+
// }()
94+
95+
// if cs, ok := c.stream.(grpc.ClientStream); ok {
96+
// c.writeMu.Lock()
97+
// err := cs.CloseSend()
98+
// c.writeMu.Unlock()
99+
// if err != nil {
100+
// return
101+
// }
102+
// }
103+
104+
// c.readMu.Lock()
105+
// for {
106+
// m := new(pb.BytesMessage)
107+
// m.Data = c.readBuf
108+
// err := c.stream.RecvMsg(m)
109+
// if err != nil {
110+
// if !errors.Is(err, io.EOF) {
111+
// c.readMu.Unlock()
112+
// return
113+
// }
114+
// err = nil
115+
// break
116+
// }
117+
// c.readBuf = m.Data[:cap(m.Data)]
118+
// c.lastBuf = append(c.lastBuf, c.readBuf...)
119+
// }
120+
// c.readMu.Unlock()
121+
// })
122+
// return nil
123+
// }
124+
125+
// func (c *streamConn) LocalAddr() net.Addr { return &grpcAddr{} }
126+
// func (c *streamConn) RemoteAddr() net.Addr { return &grpcAddr{} }
127+
128+
// func (c *streamConn) SetDeadline(t time.Time) error { return nil }
129+
// func (c *streamConn) SetReadDeadline(t time.Time) error { return nil }
130+
// func (c *streamConn) SetWriteDeadline(t time.Time) error { return nil }
131+
132+
// type grpcAddr struct{}
133+
134+
// func (grpcAddr) Network() string { return "grpc" }
135+
// func (grpcAddr) String() string { return "grpc-stream" }

pkg/driver/external/client/methods.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414

1515
"github.com/lima-vm/lima/pkg/driver"
1616
pb "github.com/lima-vm/lima/pkg/driver/external"
17-
"github.com/lima-vm/lima/pkg/driver/external/client/grpchijack"
1817
"github.com/lima-vm/lima/pkg/store"
1918
)
2019

@@ -240,27 +239,23 @@ func (d *DriverClient) ForwardGuestAgent() bool {
240239
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
241240
defer cancel()
242241

243-
resp, err := d.DriverSvc.ForwardGuestAgent(ctx, &emptypb.Empty{})
242+
_, err := d.DriverSvc.ForwardGuestAgent(ctx, &emptypb.Empty{})
244243
if err != nil {
245244
d.logger.Errorf("Failed to check guest agent forwarding: %v", err)
246245
return false
247246
}
248247

249-
d.logger.Debugf("Guest agent forwarding status: %v", resp.ShouldForward)
250-
return resp.ShouldForward
248+
return true
251249
}
252250

253-
// NOTE: This method is might not work correctly.
254251
func (d *DriverClient) GuestAgentConn(ctx context.Context) (net.Conn, error) {
255-
d.logger.Debug("Getting guest agent connection")
256-
257-
connStream, err := d.DriverSvc.GuestAgentConn(ctx)
252+
d.logger.Info("Getting guest agent connection")
253+
_, err := d.DriverSvc.GuestAgentConn(ctx, &emptypb.Empty{})
258254
if err != nil {
259255
d.logger.Errorf("Failed to get guest agent connection: %v", err)
260256
return nil, err
261257
}
262-
263-
return grpchijack.StreamToConn(connStream), nil
258+
return nil, nil
264259
}
265260

266261
func (d *DriverClient) GetInfo() driver.Info {

0 commit comments

Comments
 (0)