@@ -18,7 +18,6 @@ import (
18
18
"encoding/json"
19
19
"flag"
20
20
"fmt"
21
- "io/ioutil"
22
21
"net/http"
23
22
"os"
24
23
"os/signal"
@@ -27,24 +26,20 @@ import (
27
26
"github.com/sirupsen/logrus"
28
27
"golang.org/x/sync/errgroup"
29
28
29
+ "github.com/firecracker-microvm/firecracker-containerd/firecracker-control/client"
30
+ "github.com/firecracker-microvm/firecracker-containerd/proto"
30
31
proxyaddress "github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy/address"
31
32
)
32
33
33
34
var (
34
- port int
35
- filepath string
36
- logger * logrus.Logger
37
- store map [string ]networkAddress
35
+ port int
36
+ containerdSockPath string
37
+ logger * logrus.Logger
38
38
)
39
39
40
- type networkAddress struct {
41
- Network string `json:"network"`
42
- Address string `json:"address"`
43
- }
44
-
45
40
func init () {
46
- flag .IntVar (& port , "port" , 10001 , "port to be used in the network address" )
47
- flag .StringVar (& filepath , "map " , "map.json " , "filepath to map configuration " )
41
+ flag .IntVar (& port , "port" , 10001 , "service port for address resolver " )
42
+ flag .StringVar (& containerdSockPath , "containerdSocket " , "/run/firecracker-containerd/containerd.sock " , "filepath to the containerd socket " )
48
43
logger = logrus .New ()
49
44
}
50
45
@@ -56,8 +51,8 @@ func init() {
56
51
//
57
52
// Response:
58
53
// {
59
- // "network": "tcp ",
60
- // "address": "192.168.0.1:80 "
54
+ // "network": "unix ",
55
+ // "address": "/var/lib/firecracker-containerd/shim-base/default#cbfad871-0862-4dd6-ae7a-52e9b1c16ede/firecracker.vsock "
61
56
// }
62
57
func main () {
63
58
ctx , cancel := context .WithCancel (context .Background ())
@@ -74,17 +69,12 @@ func main() {
74
69
flag .Parse ()
75
70
}
76
71
77
- if err := loadStoreFromFile (filepath ); err != nil {
78
- logger .WithError (err ).Error ()
79
- os .Exit (1 )
80
- }
81
-
82
72
http .HandleFunc ("/address" , queryAddress )
83
73
httpServer := & http.Server {
84
74
Addr : fmt .Sprintf (":%d" , port ),
85
75
}
86
76
87
- logger .Info (fmt .Sprintf ("http server serving at port %d" , port ))
77
+ logger .Info (fmt .Sprintf ("http resolver serving at port %d" , port ))
88
78
g , gCtx := errgroup .WithContext (ctx )
89
79
g .Go (func () error {
90
80
return httpServer .ListenAndServe ()
@@ -102,20 +92,6 @@ func main() {
102
92
logger .Info ("http: server closed" )
103
93
}
104
94
105
- func loadStoreFromFile (filepath string ) error {
106
- store = make (map [string ]networkAddress )
107
- contextLogger := logger .WithField ("filepath" , filepath )
108
- contextLogger .Info ("opening file for read..." )
109
-
110
- fileStream , err := ioutil .ReadFile (filepath )
111
- if err != nil {
112
- return err
113
- }
114
-
115
- contextLogger .Info ("reading JSON from file..." )
116
- return json .Unmarshal (fileStream , & store )
117
- }
118
-
119
95
func queryAddress (writ http.ResponseWriter , req * http.Request ) {
120
96
if req .Method != http .MethodGet {
121
97
http .Error (writ , fmt .Sprintf ("%s method not allowed" , req .Method ), http .StatusForbidden )
@@ -132,17 +108,27 @@ func queryAddress(writ http.ResponseWriter, req *http.Request) {
132
108
}
133
109
134
110
namespace := keys [0 ]
135
- networkAddress , ok := store [namespace ]
136
- if ! ok {
137
- http .Error (writ , "Socket path not found" , http .StatusNotFound )
111
+
112
+ fcClient , err := client .New (containerdSockPath + ".ttrpc" )
113
+ if err != nil {
114
+ logger .WithError (err ).Error ("could not create firecracker client" )
115
+ http .Error (writ , "Internal server error" , http .StatusInternalServerError )
116
+ return
117
+ }
118
+ defer fcClient .Close ()
119
+
120
+ vmInfo , err := fcClient .GetVMInfo (req .Context (), & proto.GetVMInfoRequest {VMID : namespace })
121
+ if err != nil {
122
+ logger .WithField ("VMID" , namespace ).WithError (err ).Error ("unable to retrieve VM Info" )
123
+ http .Error (writ , "Internal server error" , http .StatusInternalServerError )
138
124
return
139
125
}
140
126
141
127
writ .WriteHeader (http .StatusOK )
142
128
143
129
response , err := json .Marshal (proxyaddress.Response {
144
- Network : networkAddress . Network ,
145
- Address : networkAddress . Address ,
130
+ Network : "unix" ,
131
+ Address : vmInfo . VSockPath ,
146
132
})
147
133
if err != nil {
148
134
http .Error (writ , "Internal server error" , http .StatusInternalServerError )
0 commit comments