Left: | ||
Right: |
OLD | NEW |
---|---|
1 // Copyright 2013 Canonical Ltd. | 1 // Copyright 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package apiserver | 4 package apiserver |
5 | 5 |
6 import ( | 6 import ( |
7 "code.google.com/p/go.net/websocket" | 7 "code.google.com/p/go.net/websocket" |
8 "crypto/tls" | 8 "crypto/tls" |
9 "launchpad.net/juju-core/log" | 9 "launchpad.net/juju-core/log" |
10 "launchpad.net/juju-core/rpc" | 10 "launchpad.net/juju-core/rpc" |
11 "launchpad.net/juju-core/rpc/jsoncodec" | 11 "launchpad.net/juju-core/rpc/jsoncodec" |
12 "launchpad.net/juju-core/state" | 12 "launchpad.net/juju-core/state" |
13 "launchpad.net/tomb" | 13 "launchpad.net/tomb" |
14 "net" | 14 "net" |
15 "net/http" | 15 "net/http" |
16 "sync" | 16 "sync" |
17 ) | 17 ) |
18 | 18 |
19 // Server holds the server side of the API. | 19 // Server holds the server side of the API. |
20 type Server struct { | 20 type Server struct { |
21 tomb tomb.Tomb | 21 tomb tomb.Tomb |
22 wg sync.WaitGroup | 22 wg sync.WaitGroup |
23 state *state.State | 23 state *state.State |
24 addr net.Addr | 24 addr net.Addr |
25 root *srvRoot | |
25 } | 26 } |
26 | 27 |
27 // Serve serves the given state by accepting requests on the given | 28 // Serve serves the given state by accepting requests on the given |
28 // listener, using the given certificate and key (in PEM format) for | 29 // listener, using the given certificate and key (in PEM format) for |
29 // authentication. | 30 // authentication. |
30 func NewServer(s *state.State, addr string, cert, key []byte) (*Server, error) { | 31 func NewServer(s *state.State, addr string, cert, key []byte) (*Server, error) { |
31 lis, err := net.Listen("tcp", addr) | 32 lis, err := net.Listen("tcp", addr) |
32 if err != nil { | 33 if err != nil { |
33 return nil, err | 34 return nil, err |
34 } | 35 } |
35 log.Infof("state/api: listening on %q", addr) | 36 log.Infof("state/api: listening on %q", addr) |
36 tlsCert, err := tls.X509KeyPair(cert, key) | 37 tlsCert, err := tls.X509KeyPair(cert, key) |
37 if err != nil { | 38 if err != nil { |
38 return nil, err | 39 return nil, err |
39 } | 40 } |
40 srv := &Server{ | 41 srv := &Server{ |
41 state: s, | 42 state: s, |
42 addr: lis.Addr(), | 43 addr: lis.Addr(), |
43 } | 44 } |
44 // TODO(rog) check that *srvRoot is a valid type for using | 45 // TODO(rog) check that *srvRoot is a valid type for using |
45 // as an RPC server. | 46 // as an RPC server. |
46 lis = tls.NewListener(lis, &tls.Config{ | 47 lis = tls.NewListener(lis, &tls.Config{ |
47 Certificates: []tls.Certificate{tlsCert}, | 48 Certificates: []tls.Certificate{tlsCert}, |
48 }) | 49 }) |
50 srv.root = newStateServer(srv) | |
49 go srv.run(lis) | 51 go srv.run(lis) |
50 return srv, nil | 52 return srv, nil |
51 } | 53 } |
52 | 54 |
53 // Dead returns a channel that signals when the server has exited. | 55 // Dead returns a channel that signals when the server has exited. |
54 func (srv *Server) Dead() <-chan struct{} { | 56 func (srv *Server) Dead() <-chan struct{} { |
55 return srv.tomb.Dead() | 57 return srv.tomb.Dead() |
56 } | 58 } |
57 | 59 |
58 // Stop stops the server and returns when all running requests | 60 // Stop stops the server and returns when all running requests |
(...skipping 30 matching lines...) Expand all Loading... | |
89 http.Serve(lis, handler) | 91 http.Serve(lis, handler) |
90 } | 92 } |
91 | 93 |
92 // Addr returns the address that the server is listening on. | 94 // Addr returns the address that the server is listening on. |
93 func (srv *Server) Addr() string { | 95 func (srv *Server) Addr() string { |
94 return srv.addr.String() | 96 return srv.addr.String() |
95 } | 97 } |
96 | 98 |
97 func (srv *Server) serveConn(wsConn *websocket.Conn) error { | 99 func (srv *Server) serveConn(wsConn *websocket.Conn) error { |
98 conn := rpc.NewConn(jsoncodec.NewWebsocket(wsConn)) | 100 conn := rpc.NewConn(jsoncodec.NewWebsocket(wsConn)) |
99 » if err := conn.Serve(newStateServer(srv), serverError); err != nil { | 101 » if err := conn.Serve(srv.root, serverError); err != nil { |
fwereade
2013/06/04 08:37:29
Not clear on the impact of this change, but it sme
dimitern
2013/06/04 11:06:18
Good catch! Reverted and changed as agreed - machi
| |
100 return err | 102 return err |
101 } | 103 } |
102 conn.Start() | 104 conn.Start() |
103 select { | 105 select { |
104 case <-conn.Dead(): | 106 case <-conn.Dead(): |
105 case <-srv.tomb.Dying(): | 107 case <-srv.tomb.Dying(): |
106 } | 108 } |
107 return conn.Close() | 109 return conn.Close() |
108 } | 110 } |
109 | 111 |
110 var logRequests = true | 112 var logRequests = true |
OLD | NEW |