Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(4)

Side by Side Diff: state/apiserver/apiserver.go

Issue 9896046: state/api: Machiner API facade (Closed)
Patch Set: Created 11 years, 9 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b