Skip to content

Commit 7d5e3b2

Browse files
committed
Adds unix socket based client transport provider
The client transport can be used for instantiating a HTTP based firecracker client. See firecracker.go for sample usage
1 parent 3f6d97e commit 7d5e3b2

File tree

5 files changed

+104
-32
lines changed

5 files changed

+104
-32
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ all: build
1919
test: all-tests
2020

2121
unit-tests:
22-
go test -short $(EXTRAGOARGS)
22+
go test -short ./... $(EXTRAGOARGS)
2323

2424
all-tests:
25-
go test $(EXTRAGOARGS)
25+
go test ./... $(EXTRAGOARGS)
2626

2727
generate build clean:
2828
go $@ $(EXTRAGOARGS)

client/client_transports.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"github.com/go-openapi/runtime"
6+
"net"
7+
"net/http"
8+
9+
"github.com/sirupsen/logrus"
10+
11+
httptransport "github.com/go-openapi/runtime/client"
12+
)
13+
14+
// NewUnixSocketTransport creates a new clientTransport configured at the specified Unix socketPath.
15+
func NewUnixSocketTransport(socketPath string, logger *logrus.Entry, debug bool) runtime.ClientTransport {
16+
socketTransport := &http.Transport{
17+
DialContext: func(ctx context.Context, network, path string) (net.Conn, error) {
18+
addr, err := net.ResolveUnixAddr("unix", socketPath)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
return net.DialUnix("unix", nil, addr)
24+
},
25+
}
26+
27+
transport := httptransport.New(DefaultHost, DefaultBasePath, DefaultSchemes)
28+
transport.Transport = socketTransport
29+
30+
if debug {
31+
transport.SetDebug(debug)
32+
}
33+
34+
if logger != nil {
35+
transport.SetLogger(logger)
36+
}
37+
38+
return transport
39+
}

client/client_transports_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package client
2+
3+
import (
4+
"github.com/firecracker-microvm/firecracker-go-sdk/client/operations"
5+
"github.com/go-openapi/runtime"
6+
"github.com/stretchr/testify/assert"
7+
"net"
8+
"testing"
9+
"time"
10+
)
11+
12+
func TestNewUnixSocketTransport(t *testing.T) {
13+
done := make(chan bool)
14+
15+
expectedMessage := "PUT /logger HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 0\r\nAccept: application/json\r\nContent-Type: application/json\r\nAccept-Encoding: gzip\r\n\r\n"
16+
socketPath := "testingUnixSocket.sock"
17+
addr, _ := net.ResolveUnixAddr("unix", socketPath)
18+
listener, _ := net.ListenUnix("unix", addr)
19+
defer listener.Close()
20+
21+
go func() {
22+
conn, err := listener.AcceptUnix()
23+
if err != nil {
24+
t.Error(err)
25+
}
26+
27+
buf := make([]byte, 512)
28+
nr, err := conn.Read(buf)
29+
if err != nil {
30+
return
31+
}
32+
33+
data := string(buf[0:nr])
34+
assert.Equal(t, expectedMessage, data, "expectedMessage received on socket is different than what was sent")
35+
done <- true
36+
}()
37+
38+
unixTransport := NewUnixSocketTransport(socketPath, nil, false)
39+
40+
unixTransport.Submit(testOperation())
41+
42+
select {
43+
case <-time.After(100 * time.Millisecond):
44+
t.Errorf("Timed out from the listener")
45+
case <-done:
46+
}
47+
}
48+
49+
func testOperation() *runtime.ClientOperation {
50+
return &runtime.ClientOperation{
51+
ID: "putLogger",
52+
Method: "PUT",
53+
PathPattern: "/logger",
54+
ProducesMediaTypes: []string{"application/json"},
55+
Schemes: []string{"http"},
56+
Params: operations.NewPutLoggerParams(),
57+
}
58+
}

firecracker.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,14 @@ package firecracker
1515

1616
import (
1717
"context"
18-
"net"
19-
"net/http"
18+
"github.com/go-openapi/strfmt"
2019
"time"
2120

22-
"github.com/go-openapi/strfmt"
2321
"github.com/sirupsen/logrus"
2422

2523
"github.com/firecracker-microvm/firecracker-go-sdk/client"
2624
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
2725
ops "github.com/firecracker-microvm/firecracker-go-sdk/client/operations"
28-
httptransport "github.com/go-openapi/runtime/client"
2926
)
3027

3128
const firecrackerRequestTimeout = 500 * time.Millisecond
@@ -37,33 +34,10 @@ type FirecrackerClient struct {
3734

3835
// NewFirecrackerClient creates a FirecrackerClient
3936
func NewFirecrackerClient(socketPath string, logger *logrus.Entry, debug bool) *FirecrackerClient {
40-
httpClient := client.NewHTTPClient(strfmt.NewFormats())
41-
42-
socketTransport := &http.Transport{
43-
DialContext: func(ctx context.Context, network, path string) (net.Conn, error) {
44-
addr, err := net.ResolveUnixAddr("unix", socketPath)
45-
if err != nil {
46-
return nil, err
47-
}
48-
49-
return net.DialUnix("unix", nil, addr)
50-
},
51-
}
52-
53-
transport := httptransport.New(client.DefaultHost, client.DefaultBasePath, client.DefaultSchemes)
54-
transport.Transport = socketTransport
55-
56-
if debug {
57-
transport.SetDebug(debug)
58-
}
59-
60-
if logger != nil {
61-
transport.SetLogger(logger)
62-
}
63-
64-
httpClient.SetTransport(transport)
37+
unixTransport := client.NewUnixSocketTransport(socketPath, logger, debug)
38+
firecracker := client.New(unixTransport, strfmt.NewFormats())
6539

66-
return &FirecrackerClient{client: httpClient}
40+
return &FirecrackerClient{client: firecracker}
6741
}
6842

6943
func (f *FirecrackerClient) PutLogger(ctx context.Context, logger *models.Logger) (*ops.PutLoggerNoContent, error) {

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ require (
88
github.com/go-openapi/validate v0.17.1
99
github.com/golang/mock v1.1.1
1010
github.com/sirupsen/logrus v1.1.1
11+
github.com/stretchr/testify v1.2.2
1112
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519
1213
)

0 commit comments

Comments
 (0)