@@ -34,7 +34,6 @@ import (
3434
3535type syslogSuite struct {
3636 agenttest.AgentSuite
37- server * rfc5424test.Server
3837 logsCh logsender.LogRecordCh
3938 received chan rfc5424test.Message
4039 fakeEnsureMongo * agenttest.FakeEnsureMongo
@@ -65,32 +64,14 @@ func (s *syslogSuite) SetUpSuite(c *gc.C) {
6564 })
6665}
6766
68- func (s * syslogSuite ) SetUpTest (c * gc.C ) {
69- if runtime .GOOS != "linux" {
70- c .Skip (fmt .Sprintf ("this test requires a controller, therefore does not support %q" , runtime .GOOS ))
71- }
72- currentSeries := series .HostSeries ()
73- osFromSeries , err := series .GetOSFromSeries (currentSeries )
74- c .Assert (err , jc .ErrorIsNil )
75- if osFromSeries != os .Ubuntu {
76- c .Skip (fmt .Sprintf ("this test requires a controller, therefore does not support OS %q only Ubuntu" , osFromSeries .String ()))
77- }
78- s .AgentSuite .SetUpTest (c )
79- // TODO(perrito666) 200160701:
80- // This needs to be done to stop the test from trying to install mongo
81- // while running, but it is a huge footprint for such little benefit.
82- // This test should not need JujuConnSuite or AgentSuite.
83- s .fakeEnsureMongo = agenttest .InstallFakeEnsureMongo (s )
84-
85- done := make (chan struct {})
86- s .received = make (chan rfc5424test.Message )
87- s .server = rfc5424test .NewServer (rfc5424test .HandlerFunc (func (msg rfc5424test.Message ) {
67+ func (s * syslogSuite ) createSyslogServer (c * gc.C , received chan rfc5424test.Message , done chan struct {}) string {
68+ server := rfc5424test .NewServer (rfc5424test .HandlerFunc (func (msg rfc5424test.Message ) {
8869 select {
89- case s . received <- msg :
70+ case received <- msg :
9071 case <- done :
9172 }
9273 }))
93- s .AddCleanup (func (* gc.C ) { s . server .Close () })
74+ s .AddCleanup (func (* gc.C ) { server .Close () })
9475 s .AddCleanup (func (* gc.C ) { close (done ) })
9576
9677 serverCert , err := tls .X509KeyPair (
@@ -102,17 +83,42 @@ func (s *syslogSuite) SetUpTest(c *gc.C) {
10283 c .Assert (err , jc .ErrorIsNil )
10384 clientCAs := x509 .NewCertPool ()
10485 clientCAs .AddCert (caCert )
105- s . server .TLS = & tls.Config {
86+ server .TLS = & tls.Config {
10687 Certificates : []tls.Certificate {serverCert },
10788 ClientCAs : clientCAs ,
10889 }
109- s . server .StartTLS ()
90+ server .StartTLS ()
11091
11192 // We must use "localhost", as the certificate does not
11293 // have any IP SANs.
113- port := s . server .Listener .Addr ().(* net.TCPAddr ).Port
94+ port := server .Listener .Addr ().(* net.TCPAddr ).Port
11495 addr := net .JoinHostPort ("localhost" , fmt .Sprint (port ))
96+ return addr
97+ }
11598
99+ func (s * syslogSuite ) SetUpTest (c * gc.C ) {
100+ if runtime .GOOS != "linux" {
101+ c .Skip (fmt .Sprintf ("this test requires a controller, therefore does not support %q" , runtime .GOOS ))
102+ }
103+ currentSeries := series .HostSeries ()
104+ osFromSeries , err := series .GetOSFromSeries (currentSeries )
105+ c .Assert (err , jc .ErrorIsNil )
106+ if osFromSeries != os .Ubuntu {
107+ c .Skip (fmt .Sprintf ("this test requires a controller, therefore does not support OS %q only Ubuntu" , osFromSeries .String ()))
108+ }
109+ s .AgentSuite .SetUpTest (c )
110+ // TODO(perrito666) 200160701:
111+ // This needs to be done to stop the test from trying to install mongo
112+ // while running, but it is a huge footprint for such little benefit.
113+ // This test should not need JujuConnSuite or AgentSuite.
114+ s .fakeEnsureMongo = agenttest .InstallFakeEnsureMongo (s )
115+
116+ done := make (chan struct {})
117+ s .received = make (chan rfc5424test.Message )
118+ addr := s .createSyslogServer (c , s .received , done )
119+
120+ // Leave log forwarding disabled initially, it will be enabled
121+ // via a model config update in the test.
116122 err = s .State .UpdateModelConfig (map [string ]interface {}{
117123 "syslog-host" : addr ,
118124 "syslog-ca-cert" : coretesting .CACert ,
@@ -143,23 +149,23 @@ func (s *syslogSuite) sendRecord(c *gc.C, rec *logsender.LogRecord) {
143149 }
144150}
145151
146- func (s * syslogSuite ) popMessagesUntil (c * gc.C , expected string ) rfc5424test.Message {
152+ func (s * syslogSuite ) popMessagesUntil (c * gc.C , expected string , received chan rfc5424test. Message ) rfc5424test.Message {
147153 re , err := regexp .Compile (expected )
148154 c .Assert (err , jc .ErrorIsNil )
149155
150156 c .Logf ("popping messages" )
151157 for {
152- msg := s .nextMessage (c )
158+ msg := s .nextMessage (c , received )
153159 c .Logf ("message: %+v" , msg )
154160 if re .MatchString (msg .Message ) {
155161 return msg
156162 }
157163 }
158164}
159165
160- func (s * syslogSuite ) nextMessage (c * gc.C ) rfc5424test.Message {
166+ func (s * syslogSuite ) nextMessage (c * gc.C , received chan rfc5424test. Message ) rfc5424test.Message {
161167 select {
162- case msg , ok := <- s . received :
168+ case msg , ok := <- received :
163169 c .Assert (ok , jc .IsTrue )
164170 return msg
165171 case <- time .After (coretesting .LongWait ):
@@ -168,6 +174,22 @@ func (s *syslogSuite) nextMessage(c *gc.C) rfc5424test.Message {
168174 return rfc5424test.Message {}
169175}
170176
177+ func (s * syslogSuite ) assertLogRecordForwarded (c * gc.C , received chan rfc5424test.Message ) {
178+ // Pop off all initial log records.
179+ s .sendRecord (c , s .newRecord ("<stop here>" ))
180+ s .popMessagesUntil (c , `.*<stop here>` , received )
181+
182+ // Ensure that a specific log record gets forwarded.
183+ rec := s .newRecord ("something happened!" )
184+ rec .Time = time .Date (2099 , time .June , 1 , 23 , 2 , 1 , 23 , time .UTC )
185+ s .sendRecord (c , rec )
186+ msg := s .popMessagesUntil (c , `something happened!` , received )
187+ expected := `<11>1 2099-06-01T23:02:01.000000023Z machine-0.%s jujud-machine-agent-%s - - [origin enterpriseID="28978" sofware="jujud-machine-agent" swVersion="%s"][model@28978 controller-uuid="%s" model-uuid="%s"][log@28978 module="juju.featuretests.syslog" source="syslog_test.go:99999"] something happened!`
188+ modelID := coretesting .ModelTag .Id ()
189+ ctlrID := modelID
190+ c .Check (msg .Message , gc .Equals , fmt .Sprintf (expected , modelID , modelID [:28 ], version .Current , ctlrID , modelID ))
191+ }
192+
171193func (s * syslogSuite ) TestLogRecordForwarded (c * gc.C ) {
172194 // Create a machine and an agent for it.
173195 m , password := s .Factory .MakeMachineReturningPassword (c , & factory.MachineParams {
@@ -187,17 +209,44 @@ func (s *syslogSuite) TestLogRecordForwarded(c *gc.C) {
187209 go func () { c .Check (a .Run (nil ), jc .ErrorIsNil ) }()
188210 defer a .Stop ()
189211
190- // Pop off all initial log records.
191- s .sendRecord (c , s .newRecord ("<stop here>" ))
192- s .popMessagesUntil (c , `.*<stop here>` )
212+ err := s .State .UpdateModelConfig (map [string ]interface {}{
213+ "logforward-enabled" : true ,
214+ }, nil , nil )
215+ c .Assert (err , jc .ErrorIsNil )
193216
194- // Ensure that a specific log record gets forwarded.
195- rec := s .newRecord ("something happened!" )
196- rec .Time = time .Date (2099 , time .June , 1 , 23 , 2 , 1 , 23 , time .UTC )
197- s .sendRecord (c , rec )
198- msg := s .popMessagesUntil (c , `something happened!` )
199- expected := `<11>1 2099-06-01T23:02:01.000000023Z machine-0.%s jujud-machine-agent-%s - - [origin enterpriseID="28978" sofware="jujud-machine-agent" swVersion="%s"][model@28978 controller-uuid="%s" model-uuid="%s"][log@28978 module="juju.featuretests.syslog" source="syslog_test.go:99999"] something happened!`
200- modelID := coretesting .ModelTag .Id ()
201- ctlrID := modelID
202- c .Check (msg .Message , gc .Equals , fmt .Sprintf (expected , modelID , modelID [:28 ], version .Current , ctlrID , modelID ))
217+ s .assertLogRecordForwarded (c , s .received )
218+ }
219+
220+ func (s * syslogSuite ) TestConfigChange (c * gc.C ) {
221+ // Create a machine and an agent for it.
222+ m , password := s .Factory .MakeMachineReturningPassword (c , & factory.MachineParams {
223+ Nonce : agent .BootstrapNonce ,
224+ Jobs : []state.MachineJob {state .JobManageModel },
225+ })
226+
227+ s .PrimeAgent (c , m .Tag (), password )
228+ agentConf := agentcmd .NewAgentConf (s .DataDir ())
229+ agentConf .ReadConfig (m .Tag ().String ())
230+
231+ machineAgentFactory := agentcmd .MachineAgentFactoryFn (agentConf , s .logsCh , c .MkDir ())
232+ a := machineAgentFactory (m .Id ())
233+
234+ // Ensure there's no logs to begin with.
235+ // Start the agent.
236+ go func () { c .Check (a .Run (nil ), jc .ErrorIsNil ) }()
237+ defer a .Stop ()
238+
239+ done := make (chan struct {})
240+ received := make (chan rfc5424test.Message )
241+ addr := s .createSyslogServer (c , received , done )
242+
243+ err := s .State .UpdateModelConfig (map [string ]interface {}{
244+ "logforward-enabled" : true ,
245+ "syslog-host" : addr ,
246+ "syslog-ca-cert" : coretesting .CACert ,
247+ "syslog-client-cert" : coretesting .ServerCert ,
248+ "syslog-client-key" : coretesting .ServerKey ,
249+ }, nil , nil )
250+ c .Assert (err , jc .ErrorIsNil )
251+ s .assertLogRecordForwarded (c , received )
203252}
0 commit comments