Merge lp:~pedronis/ubuntu-push/foreign-listener into lp:ubuntu-push

Proposed by Samuele Pedroni
Status: Merged
Approved by: Samuele Pedroni
Approved revision: 80
Merged at revision: 80
Proposed branch: lp:~pedronis/ubuntu-push/foreign-listener
Merge into: lp:ubuntu-push
Diff against target: 179 lines (+61/-16)
5 files modified
server/dev/server.go (+1/-1)
server/listener/listener.go (+12/-7)
server/listener/listener_test.go (+27/-5)
server/runner_devices.go (+4/-2)
server/runner_test.go (+17/-1)
To merge this branch: bzr merge lp:~pedronis/ubuntu-push/foreign-listener
Reviewer Review Type Date Requested Status
John Lenton (community) Approve
Review via email: mp+209862@code.launchpad.net

Commit message

let the device listener setup code also take a prebuilt listener

Description of the change

let the device listener setup code also take a prebuilt listener

To post a comment you must log in.
Revision history for this message
John Lenton (chipaca) wrote :

A very very very very small nit: can you eliminate the orphan "If" in DevicesRunner's doc? (either by taking it down to the next line, or pulling up the next word).

That is all I have. So you know it's good =)

review: Approve
80. By Samuele Pedroni

move If

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'server/dev/server.go'
2--- server/dev/server.go 2014-02-24 15:54:37 +0000
3+++ server/dev/server.go 2014-03-12 12:33:02 +0000
4@@ -64,7 +64,7 @@
5 handler := api.PanicTo500Handler(mux, logger)
6 go server.HTTPServeRunner(handler, &cfg.HTTPServeParsedConfig)()
7 // listen for device connections
8- server.DevicesRunner(func(conn net.Conn) error {
9+ server.DevicesRunner(nil, func(conn net.Conn) error {
10 track := session.NewTracker(logger)
11 return session.Session(conn, broker, cfg, track)
12 }, logger, &cfg.DevicesParsedConfig)()
13
14=== modified file 'server/listener/listener.go'
15--- server/listener/listener.go 2014-02-21 16:04:44 +0000
16+++ server/listener/listener.go 2014-03-12 12:33:02 +0000
17@@ -41,8 +41,17 @@
18 net.Listener
19 }
20
21-// DeviceListen creates a DeviceListener for device connections based on config.
22-func DeviceListen(cfg DeviceListenerConfig) (*DeviceListener, error) {
23+// DeviceListen creates a DeviceListener for device connections based
24+// on config. If lst is not nil DeviceListen just wraps it with a TLS
25+// layer instead of starting creating a new listener.
26+func DeviceListen(lst net.Listener, cfg DeviceListenerConfig) (*DeviceListener, error) {
27+ if lst == nil {
28+ var err error
29+ lst, err = net.Listen("tcp", cfg.Addr())
30+ if err != nil {
31+ return nil, err
32+ }
33+ }
34 cert, err := tls.X509KeyPair(cfg.CertPEMBlock(), cfg.KeyPEMBlock())
35 if err != nil {
36 return nil, err
37@@ -51,11 +60,7 @@
38 Certificates: []tls.Certificate{cert},
39 SessionTicketsDisabled: true,
40 }
41- lst, err := tls.Listen("tcp", cfg.Addr(), tlsCfg)
42- if err != nil {
43- return nil, err
44- }
45- return &DeviceListener{lst}, err
46+ return &DeviceListener{tls.NewListener(lst, tlsCfg)}, err
47 }
48
49 // handleTemporary checks and handles if the error is just a temporary network
50
51=== modified file 'server/listener/listener_test.go'
52--- server/listener/listener_test.go 2014-02-10 23:19:08 +0000
53+++ server/listener/listener_test.go 2014-03-12 12:33:02 +0000
54@@ -74,7 +74,7 @@
55 }
56
57 func (s *listenerSuite) TestDeviceListen(c *C) {
58- lst, err := DeviceListen(&testDevListenerCfg{"127.0.0.1:0"})
59+ lst, err := DeviceListen(nil, &testDevListenerCfg{"127.0.0.1:0"})
60 c.Check(err, IsNil)
61 defer lst.Close()
62 c.Check(lst.Addr().String(), Matches, `127.0.0.1:\d{5}`)
63@@ -82,7 +82,7 @@
64
65 func (s *listenerSuite) TestDeviceListenError(c *C) {
66 // assume tests are not running as root
67- _, err := DeviceListen(&testDevListenerCfg{"127.0.0.1:99"})
68+ _, err := DeviceListen(nil, &testDevListenerCfg{"127.0.0.1:99"})
69 c.Check(err, ErrorMatches, ".*permission denied.*")
70 }
71
72@@ -142,7 +142,7 @@
73 }
74
75 func (s *listenerSuite) TestDeviceAcceptLoop(c *C) {
76- lst, err := DeviceListen(&testDevListenerCfg{"127.0.0.1:0"})
77+ lst, err := DeviceListen(nil, &testDevListenerCfg{"127.0.0.1:0"})
78 c.Check(err, IsNil)
79 defer lst.Close()
80 errCh := make(chan error)
81@@ -169,7 +169,7 @@
82 // ENFILE is not the temp network error we want to handle this way
83 // but is relatively easy to generate in a controlled way
84 var err error
85- lst, err := DeviceListen(&testDevListenerCfg{"127.0.0.1:0"})
86+ lst, err := DeviceListen(nil, &testDevListenerCfg{"127.0.0.1:0"})
87 c.Check(err, IsNil)
88 defer lst.Close()
89 errCh := make(chan error)
90@@ -202,7 +202,7 @@
91 }
92
93 func (s *listenerSuite) TestDeviceAcceptLoopPanic(c *C) {
94- lst, err := DeviceListen(&testDevListenerCfg{"127.0.0.1:0"})
95+ lst, err := DeviceListen(nil, &testDevListenerCfg{"127.0.0.1:0"})
96 c.Check(err, IsNil)
97 defer lst.Close()
98 errCh := make(chan error)
99@@ -219,3 +219,25 @@
100 c.Check(<-errCh, ErrorMatches, ".*use of closed.*")
101 c.Check(s.testlog.Captured(), Matches, "(?s)ERROR\\(PANIC\\) terminating device connection on: session crash:.*AcceptLoop.*")
102 }
103+
104+func (s *listenerSuite) TestForeignListener(c *C) {
105+ foreignLst, err := net.Listen("tcp", "127.0.0.1:0")
106+ c.Check(err, IsNil)
107+ lst, err := DeviceListen(foreignLst, &testDevListenerCfg{"127.0.0.1:0"})
108+ c.Check(err, IsNil)
109+ defer lst.Close()
110+ errCh := make(chan error)
111+ go func() {
112+ errCh <- lst.AcceptLoop(testSession, s.testlog)
113+ }()
114+ listenerAddr := lst.Addr().String()
115+ c.Check(listenerAddr, Equals, foreignLst.Addr().String())
116+ conn1, err := testTlsDial(c, listenerAddr)
117+ c.Assert(err, IsNil)
118+ defer conn1.Close()
119+ testWriteByte(c, conn1, '1')
120+ testReadByte(c, conn1, '1')
121+ lst.Close()
122+ c.Check(<-errCh, ErrorMatches, ".*use of closed.*")
123+ c.Check(s.testlog.Captured(), Equals, "")
124+}
125
126=== modified file 'server/runner_devices.go'
127--- server/runner_devices.go 2014-02-10 23:19:08 +0000
128+++ server/runner_devices.go 2014-03-12 12:33:02 +0000
129@@ -87,7 +87,9 @@
130 }
131
132 // DevicesRunner returns a function to accept device connections.
133-func DevicesRunner(session func(net.Conn) error, logger logger.Logger, parsedCfg *DevicesParsedConfig) func() {
134+// If adoptLst is not nil it will be used as the underlying listener, instead
135+// of creating one, wrapped in a TLS layer.
136+func DevicesRunner(adoptLst net.Listener, session func(net.Conn) error, logger logger.Logger, parsedCfg *DevicesParsedConfig) func() {
137 BootLogger.Debugf("PingInterval: %s, ExchangeTimeout %s", parsedCfg.PingInterval(), parsedCfg.ExchangeTimeout())
138 var rlim syscall.Rlimit
139 err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim)
140@@ -95,7 +97,7 @@
141 BootLogFatalf("getrlimit failed: %v", err)
142 }
143 BootLogger.Debugf("nofile soft: %d hard: %d", rlim.Cur, rlim.Max)
144- lst, err := listener.DeviceListen(parsedCfg)
145+ lst, err := listener.DeviceListen(adoptLst, parsedCfg)
146 if err != nil {
147 BootLogFatalf("start device listening: %v", err)
148 }
149
150=== modified file 'server/runner_test.go'
151--- server/runner_test.go 2014-02-10 23:19:08 +0000
152+++ server/runner_test.go 2014-03-12 12:33:02 +0000
153@@ -108,9 +108,25 @@
154 defer func() {
155 BootLogger = prevBootLogger
156 }()
157- runner := DevicesRunner(func(conn net.Conn) error { return nil }, BootLogger, &testDevicesParsedConfig)
158+ runner := DevicesRunner(nil, func(conn net.Conn) error { return nil }, BootLogger, &testDevicesParsedConfig)
159 c.Assert(s.lst, Not(IsNil))
160 s.lst.Close()
161 c.Check(s.kind, Equals, "devices")
162 c.Check(runner, PanicMatches, "accepting device connections:.*closed.*")
163 }
164+
165+func (s *runnerSuite) TestDevicesRunnerAdoptListener(c *C) {
166+ prevBootLogger := BootLogger
167+ testlog := helpers.NewTestLogger(c, "debug")
168+ BootLogger = testlog
169+ defer func() {
170+ BootLogger = prevBootLogger
171+ }()
172+ lst0, err := net.Listen("tcp", "127.0.0.1:0")
173+ c.Assert(err, IsNil)
174+ defer lst0.Close()
175+ DevicesRunner(lst0, func(conn net.Conn) error { return nil }, BootLogger, &testDevicesParsedConfig)
176+ c.Assert(s.lst, Not(IsNil))
177+ c.Check(s.lst.Addr().String(), Equals, lst0.Addr().String())
178+ s.lst.Close()
179+}

Subscribers

People subscribed via source and target branches