11package grpc
22
33import (
4- "fmt"
54 "net"
65 "net/http"
76 "strings"
@@ -10,67 +9,46 @@ import (
109 "github.com/ovrclk/akash/keys"
1110 "github.com/ovrclk/akash/provider"
1211 "github.com/ovrclk/akash/provider/cluster"
13- "github.com/ovrclk/akash/provider/cluster/kube"
1412 "github.com/ovrclk/akash/provider/manifest"
13+ "github.com/ovrclk/akash/provider/session"
1514 "github.com/ovrclk/akash/types"
1615 "github.com/ovrclk/akash/version"
1716 "github.com/tendermint/tmlibs/log"
1817 "golang.org/x/net/context"
19- "golang.org/x/net/netutil"
2018 "google.golang.org/grpc"
2119)
2220
2321type server struct {
24- cluster. Client
25- * grpc. Server
22+ session session. Session
23+ client cluster. Client
2624 status provider.StatusClient
2725 handler manifest.Handler
28- network string
29- port string
3026 log log.Logger
3127}
3228
33- func RunServer (ctx context.Context , log log.Logger , network ,
34- port string , handler manifest.Handler , client kube.Client ,
35- status provider.StatusClient ) error {
36-
37- address := fmt .Sprintf (":%v" , port )
38-
39- server := newServer (log , network , address , handler , client , status )
40-
41- ctx , cancel := context .WithCancel (ctx )
42-
43- donech := make (chan struct {})
44-
45- go func () {
46- defer close (donech )
47- <- ctx .Done ()
48- log .Info ("Shutting down server" )
49- server .GracefulStop ()
50- }()
51-
52- log .Info ("Starting GRPC server" , "address" , address )
53- err := server .listenAndServe ()
54- cancel ()
55-
56- <- donech
57-
58- log .Info ("GRPC server shutdown" )
59-
60- return err
29+ func Run (
30+ ctx context.Context ,
31+ address string ,
32+ session session.Session ,
33+ client cluster.Client ,
34+ status provider.StatusClient ,
35+ handler manifest.Handler ) error {
36+ server := create (session , client , status , handler )
37+ return run (ctx , server , address )
6138}
6239
63- func (s server ) Status (ctx context.Context , req * types.Empty ) (* types.ServerStatus , error ) {
40+ func (s * server ) Status (ctx context.Context , req * types.Empty ) (* types.ServerStatus , error ) {
6441 status , err := s .status .Status (ctx )
6542 if err != nil {
6643 return nil , err
6744 }
6845
6946 vsn := version .Get ()
7047 return & types.ServerStatus {
71- Code : http . StatusOK ,
48+ Provider : s . session . Provider (). Address ,
7249 Version : & vsn ,
73- Provider : status ,
50+ Status : status ,
51+ Code : http .StatusOK ,
7452 Message : "OK" ,
7553 }, nil
7654}
@@ -85,7 +63,7 @@ func (s server) Deploy(ctx context.Context, req *types.ManifestRequest) (*types.
8563}
8664
8765// Lease status will retry for one minute
88- func (s server ) LeaseStatus (ctx context.Context , req * types.LeaseStatusRequest ) (* types.LeaseStatusResponse , error ) {
66+ func (s * server ) LeaseStatus (ctx context.Context , req * types.LeaseStatusRequest ) (* types.LeaseStatusResponse , error ) {
8967 attempts := 12
9068
9169 lease , err := keys .ParseLeasePath (strings .Join ([]string {req .Deployment , req .Group , req .Order , req .Provider }, "/" ))
@@ -94,14 +72,14 @@ func (s server) LeaseStatus(ctx context.Context, req *types.LeaseStatusRequest)
9472 return nil , types.ErrInternalError {Message : "internal error" }
9573 }
9674
97- response , err := s .Client .LeaseStatus (lease .LeaseID )
75+ response , err := s .client .LeaseStatus (lease .LeaseID )
9876 if err == nil {
9977 return response , err
10078 }
10179
10280 for i := 0 ; i < attempts ; i ++ {
10381 time .Sleep (time .Second * 5 )
104- response , err = s .Client .LeaseStatus (lease .LeaseID )
82+ response , err = s .client .LeaseStatus (lease .LeaseID )
10583 if err != cluster .ErrNoDeployments {
10684 break
10785 }
@@ -110,23 +88,23 @@ func (s server) LeaseStatus(ctx context.Context, req *types.LeaseStatusRequest)
11088 return response , err
11189}
11290
113- func (s server ) ServiceStatus (ctx context.Context ,
91+ func (s * server ) ServiceStatus (ctx context.Context ,
11492 req * types.ServiceStatusRequest ) (* types.ServiceStatusResponse , error ) {
11593 lease , err := keys .ParseLeasePath (strings .Join ([]string {req .Deployment , req .Group , req .Order , req .Provider }, "/" ))
11694 if err != nil {
11795 s .log .Error (err .Error ())
11896 return nil , types.ErrInternalError {Message : "internal error" }
11997 }
120- return s .Client .ServiceStatus (lease .LeaseID , req .Name )
98+ return s .client .ServiceStatus (lease .LeaseID , req .Name )
12199}
122100
123- func (s server ) ServiceLogs (req * types.LogRequest , server types.Cluster_ServiceLogsServer ) error {
101+ func (s * server ) ServiceLogs (req * types.LogRequest , server types.Cluster_ServiceLogsServer ) error {
124102 lease , err := keys .ParseLeasePath (strings .Join ([]string {req .Deployment , req .Group , req .Order , req .Provider }, "/" ))
125103 if err != nil {
126104 s .log .Error (err .Error ())
127105 return types.ErrInternalError {Message : "internal error" }
128106 }
129- logs , err := s .Client .ServiceLogs (server .Context (), lease .LeaseID , req .Options .TailLines , req .Options .Follow )
107+ logs , err := s .client .ServiceLogs (server .Context (), lease .LeaseID , req .Options .TailLines , req .Options .Follow )
130108 if err != nil {
131109 s .log .Error (err .Error ())
132110 return types.ErrInternalError {Message : "internal error" }
@@ -165,28 +143,54 @@ func (s server) ServiceLogs(req *types.LogRequest, server types.Cluster_ServiceL
165143 return nil
166144}
167145
168- // NewServer network can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". phandler is the provider cluster handler
169- func newServer (log log.Logger , network , port string , handler manifest.Handler ,
170- client kube.Client , status provider.StatusClient ) * server {
171- s := & server {
146+ func create (
147+ session session.Session ,
148+ client cluster.Client ,
149+ status provider.StatusClient ,
150+ handler manifest.Handler ) * server {
151+
152+ log := session .Log ().With ("cmp" , "grpc-server" )
153+
154+ return & server {
155+ session : session ,
156+ client : client ,
172157 status : status ,
173158 handler : handler ,
174- network : network ,
175- port : port ,
176- Server : grpc .NewServer (grpc .MaxConcurrentStreams (2 ), grpc .MaxRecvMsgSize (500000 )),
177159 log : log ,
178- Client : client ,
179160 }
180- types .RegisterClusterServer (s .Server , s )
181- return s
182161}
183162
184- func (s * server ) listenAndServe () error {
185- l , err := net .Listen (s .network , s .port )
163+ func run (ctx context.Context , server * server , address string ) error {
164+
165+ fd , err := net .Listen ("tcp4" , address )
186166 if err != nil {
187167 return err
188168 }
189- l = netutil .LimitListener (l , 10 )
190- s .log .Info ("Running manifest server" , "port" , s .port , "network" , s .network )
191- return s .Server .Serve (l )
169+
170+ gserver := grpc .NewServer (grpc .MaxConcurrentStreams (2 ), grpc .MaxRecvMsgSize (500000 ))
171+ types .RegisterClusterServer (gserver , server )
172+
173+ ctx , cancel := context .WithCancel (ctx )
174+ donech := make (chan struct {})
175+
176+ go func () {
177+ defer close (donech )
178+ <- ctx .Done ()
179+ server .log .Info ("Shutting down server" )
180+ gserver .GracefulStop ()
181+ }()
182+
183+ server .log .Info ("Starting GRPC server" , "address" , address )
184+ err = gserver .Serve (fd )
185+ server .log .Info ("GRPC server shutdown." )
186+ if ctx .Err () == context .Canceled {
187+ err = nil
188+ }
189+ cancel ()
190+
191+ <- donech
192+
193+ server .log .Info ("GRPC done." )
194+
195+ return err
192196}
0 commit comments