blob: 536e9173f52ece230aadd193d05c3eb499626d4b [file] [log] [blame]
cuilin20187b2a8c32019-03-26 19:52:28 -07001/*
cbabu116b73f2019-12-10 17:56:32 +05302* Copyright 2018-present Open Networking Foundation
cuilin20187b2a8c32019-03-26 19:52:28 -07003
cbabu116b73f2019-12-10 17:56:32 +05304* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
cuilin20187b2a8c32019-03-26 19:52:28 -07007
cbabu116b73f2019-12-10 17:56:32 +05308* http://www.apache.org/licenses/LICENSE-2.0
cuilin20187b2a8c32019-03-26 19:52:28 -07009
cbabu116b73f2019-12-10 17:56:32 +053010* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
cuilin20187b2a8c32019-03-26 19:52:28 -070015 */
Girish Gowdru6a80bbd2019-07-02 07:36:09 -070016
17//Package main invokes the application
cuilin20187b2a8c32019-03-26 19:52:28 -070018package main
19
20import (
21 "context"
22 "errors"
23 "fmt"
kdarapu381c6902019-07-31 18:23:16 +053024 "os"
25 "os/signal"
26 "strconv"
27 "syscall"
28 "time"
29
Esin Karamanccb714b2019-11-29 15:02:06 +000030 "github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
kdarapu381c6902019-07-31 18:23:16 +053031
Esin Karamanccb714b2019-11-29 15:02:06 +000032 "github.com/opencord/voltha-lib-go/v3/pkg/adapters"
33 com "github.com/opencord/voltha-lib-go/v3/pkg/adapters/common"
34 "github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
35 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
36 "github.com/opencord/voltha-lib-go/v3/pkg/log"
37 "github.com/opencord/voltha-lib-go/v3/pkg/probe"
Girish Gowdru0c588b22019-04-23 23:24:56 -040038 ac "github.com/opencord/voltha-openolt-adapter/adaptercore"
39 "github.com/opencord/voltha-openolt-adapter/config"
Matt Jeanneret0c9ae282019-07-18 18:14:28 -040040 "github.com/opencord/voltha-openolt-adapter/config/version"
Esin Karamanccb714b2019-11-29 15:02:06 +000041 ic "github.com/opencord/voltha-protos/v3/go/inter_container"
42 "github.com/opencord/voltha-protos/v3/go/voltha"
cuilin20187b2a8c32019-03-26 19:52:28 -070043)
44
45type adapter struct {
Girish Gowdru6a80bbd2019-07-02 07:36:09 -070046 instanceID string
cuilin20187b2a8c32019-03-26 19:52:28 -070047 config *config.AdapterFlags
48 iAdapter adapters.IAdapter
49 kafkaClient kafka.Client
50 kvClient kvstore.Client
npujarec5762e2020-01-01 14:08:48 +053051 kip kafka.InterContainerProxy
kdarapu381c6902019-07-31 18:23:16 +053052 coreProxy adapterif.CoreProxy
53 adapterProxy adapterif.AdapterProxy
54 eventProxy adapterif.EventProxy
cuilin20187b2a8c32019-03-26 19:52:28 -070055 halted bool
56 exitChannel chan int
57 receiverChannels []<-chan *ic.InterContainerMessage
58}
59
60func init() {
Matteo Scandolo945e4012019-12-12 14:16:11 -080061 _, _ = log.AddPackage(log.CONSOLE, log.DebugLevel, nil)
cuilin20187b2a8c32019-03-26 19:52:28 -070062}
63
64func newAdapter(cf *config.AdapterFlags) *adapter {
65 var a adapter
Girish Gowdru6a80bbd2019-07-02 07:36:09 -070066 a.instanceID = cf.InstanceID
cuilin20187b2a8c32019-03-26 19:52:28 -070067 a.config = cf
68 a.halted = false
69 a.exitChannel = make(chan int, 1)
70 a.receiverChannels = make([]<-chan *ic.InterContainerMessage, 0)
71 return &a
72}
73
74func (a *adapter) start(ctx context.Context) {
75 log.Info("Starting Core Adapter components")
76 var err error
77
Rohan Agrawal828bf4e2019-10-22 10:13:19 +000078 var p *probe.Probe
79 if value := ctx.Value(probe.ProbeContextKey); value != nil {
80 if _, ok := value.(*probe.Probe); ok {
81 p = value.(*probe.Probe)
82 p.RegisterService(
83 "message-bus",
84 "kv-store",
85 "container-proxy",
86 "core-request-handler",
87 "register-with-core",
88 )
89 }
90 }
91
cuilin20187b2a8c32019-03-26 19:52:28 -070092 // Setup KV Client
93 log.Debugw("create-kv-client", log.Fields{"kvstore": a.config.KVStoreType})
Girish Gowdru6a80bbd2019-07-02 07:36:09 -070094 if err = a.setKVClient(); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -070095 log.Fatal("error-setting-kv-client")
96 }
97
Rohan Agrawal828bf4e2019-10-22 10:13:19 +000098 if p != nil {
99 p.UpdateStatus("kv-store", probe.ServiceStatusRunning)
100 }
101
cuilin20187b2a8c32019-03-26 19:52:28 -0700102 // Setup Kafka Client
103 if a.kafkaClient, err = newKafkaClient("sarama", a.config.KafkaAdapterHost, a.config.KafkaAdapterPort); err != nil {
104 log.Fatal("Unsupported-common-client")
105 }
106
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000107 if p != nil {
108 p.UpdateStatus("message-bus", probe.ServiceStatusRunning)
109 }
110
cuilin20187b2a8c32019-03-26 19:52:28 -0700111 // Start the common InterContainer Proxy - retries indefinitely
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000112 if a.kip, err = a.startInterContainerProxy(ctx, -1); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700113 log.Fatal("error-starting-inter-container-proxy")
114 }
115
116 // Create the core proxy to handle requests to the Core
117 a.coreProxy = com.NewCoreProxy(a.kip, a.config.Topic, a.config.CoreTopic)
118
119 // Create the adaptor proxy to handle request between olt and onu
120 a.adapterProxy = com.NewAdapterProxy(a.kip, "brcm_openomci_onu", a.config.CoreTopic)
121
Devmalya Paulfb990a52019-07-09 10:01:49 -0400122 // Create the event proxy to post events to KAFKA
123 a.eventProxy = com.NewEventProxy(com.MsgClient(a.kafkaClient), com.MsgTopic(kafka.Topic{Name: a.config.EventTopic}))
124
cuilin20187b2a8c32019-03-26 19:52:28 -0700125 // Create the open OLT adapter
kdarapu381c6902019-07-31 18:23:16 +0530126 if a.iAdapter, err = a.startOpenOLT(ctx, a.kip, a.coreProxy, a.adapterProxy, a.eventProxy,
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +0530127 a.config); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700128 log.Fatal("error-starting-inter-container-proxy")
129 }
130
131 // Register the core request handler
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000132 if err = a.setupRequestHandler(ctx, a.instanceID, a.iAdapter); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700133 log.Fatal("error-setting-core-request-handler")
134 }
135
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700136 // Register this adapter to the Core - retries indefinitely
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000137 if err = a.registerWithCore(ctx, -1); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700138 log.Fatal("error-registering-with-core")
139 }
cbabu95f21522019-11-13 14:25:18 +0100140
cbabu116b73f2019-12-10 17:56:32 +0530141 // check the readiness and liveliness and update the probe status
142 a.checkServicesReadiness(ctx)
cbabu95f21522019-11-13 14:25:18 +0100143}
144
145/**
146This function checks the liveliness and readiness of the kakfa and kv-client services
147and update the status in the probe.
148*/
cbabu116b73f2019-12-10 17:56:32 +0530149func (a *adapter) checkServicesReadiness(ctx context.Context) {
150 // checks the kafka readiness
151 go a.checkKafkaReadiness(ctx)
152
153 // checks the kv-store readiness
154 go a.checkKvStoreReadiness(ctx)
155}
156
157/**
158This function checks the liveliness and readiness of the kv-store service
159and update the status in the probe.
160*/
161func (a *adapter) checkKvStoreReadiness(ctx context.Context) {
162 // dividing the live probe interval by 2 to get updated status every 30s
163 timeout := a.config.LiveProbeInterval / 2
164 kvStoreChannel := make(chan bool, 1)
165
166 // Default false to check the liveliness.
167 kvStoreChannel <- false
cbabu95f21522019-11-13 14:25:18 +0100168 for {
cbabu116b73f2019-12-10 17:56:32 +0530169 timeoutTimer := time.NewTimer(timeout)
170 select {
171 case liveliness := <-kvStoreChannel:
172 if !liveliness {
173 // kv-store not reachable or down, updating the status to not ready state
174 probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusNotReady)
175 timeout = a.config.NotLiveProbeInterval
176 } else {
177 // kv-store is reachable , updating the status to running state
178 probe.UpdateStatusFromContext(ctx, "kv-store", probe.ServiceStatusRunning)
179 timeout = a.config.LiveProbeInterval / 2
180 }
181 // Check if the timer has expired or not
182 if !timeoutTimer.Stop() {
183 <-timeoutTimer.C
184 }
185 case <-timeoutTimer.C:
186 // Check the status of the kv-store
187 log.Info("kv-store liveliness-recheck")
npujarec5762e2020-01-01 14:08:48 +0530188 if a.kvClient.IsConnectionUp(ctx) {
cbabu116b73f2019-12-10 17:56:32 +0530189 kvStoreChannel <- true
190 } else {
191 kvStoreChannel <- false
192 }
cbabu95f21522019-11-13 14:25:18 +0100193 }
cbabu116b73f2019-12-10 17:56:32 +0530194 }
195}
196
197/**
198This function checks the liveliness and readiness of the kafka service
199and update the status in the probe.
200*/
201func (a *adapter) checkKafkaReadiness(ctx context.Context) {
202 livelinessChannel := a.kafkaClient.EnableLivenessChannel(true)
Scott Baker86fce9a2019-12-12 09:47:17 -0800203 healthinessChannel := a.kafkaClient.EnableHealthinessChannel(true)
cbabu116b73f2019-12-10 17:56:32 +0530204 timeout := a.config.LiveProbeInterval
205 for {
206 timeoutTimer := time.NewTimer(timeout)
207
208 select {
Scott Baker86fce9a2019-12-12 09:47:17 -0800209 case healthiness := <-healthinessChannel:
210 if !healthiness {
211 // log.Fatal will call os.Exit(1) to terminate
212 log.Fatal("Kafka service has become unhealthy")
213 }
cbabu116b73f2019-12-10 17:56:32 +0530214 case liveliness := <-livelinessChannel:
215 if !liveliness {
216 // kafka not reachable or down, updating the status to not ready state
217 probe.UpdateStatusFromContext(ctx, "message-bus", probe.ServiceStatusNotReady)
218 timeout = a.config.NotLiveProbeInterval
219 } else {
220 // kafka is reachable , updating the status to running state
221 probe.UpdateStatusFromContext(ctx, "message-bus", probe.ServiceStatusRunning)
222 timeout = a.config.LiveProbeInterval
223 }
224 // Check if the timer has expired or not
225 if !timeoutTimer.Stop() {
226 <-timeoutTimer.C
227 }
228 case <-timeoutTimer.C:
229 log.Info("kafka-proxy-liveness-recheck")
230 // send the liveness probe in a goroutine; we don't want to deadlock ourselves as
231 // the liveness probe may wait (and block) writing to our channel.
232 err := a.kafkaClient.SendLiveness()
233 if err != nil {
234 // Catch possible error case if sending liveness after Sarama has been stopped.
235 log.Warnw("error-kafka-send-liveness", log.Fields{"error": err})
236 }
cbabu95f21522019-11-13 14:25:18 +0100237 }
cbabu95f21522019-11-13 14:25:18 +0100238 }
cuilin20187b2a8c32019-03-26 19:52:28 -0700239}
240
npujarec5762e2020-01-01 14:08:48 +0530241func (a *adapter) stop(ctx context.Context) {
cuilin20187b2a8c32019-03-26 19:52:28 -0700242 // Stop leadership tracking
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700243 a.halted = true
cuilin20187b2a8c32019-03-26 19:52:28 -0700244
245 // send exit signal
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700246 a.exitChannel <- 0
cuilin20187b2a8c32019-03-26 19:52:28 -0700247
248 // Cleanup - applies only if we had a kvClient
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700249 if a.kvClient != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700250 // Release all reservations
npujarec5762e2020-01-01 14:08:48 +0530251 if err := a.kvClient.ReleaseAllReservations(ctx); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700252 log.Infow("fail-to-release-all-reservations", log.Fields{"error": err})
253 }
254 // Close the DB connection
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700255 a.kvClient.Close()
cuilin20187b2a8c32019-03-26 19:52:28 -0700256 }
257
258 // TODO: More cleanup
259}
260
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700261func newKVClient(storeType, address string, timeout int) (kvstore.Client, error) {
cuilin20187b2a8c32019-03-26 19:52:28 -0700262
263 log.Infow("kv-store-type", log.Fields{"store": storeType})
264 switch storeType {
265 case "consul":
266 return kvstore.NewConsulClient(address, timeout)
267 case "etcd":
268 return kvstore.NewEtcdClient(address, timeout)
269 }
270 return nil, errors.New("unsupported-kv-store")
271}
272
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700273func newKafkaClient(clientType, host string, port int) (kafka.Client, error) {
cuilin20187b2a8c32019-03-26 19:52:28 -0700274
275 log.Infow("common-client-type", log.Fields{"client": clientType})
276 switch clientType {
277 case "sarama":
278 return kafka.NewSaramaClient(
279 kafka.Host(host),
280 kafka.Port(port),
281 kafka.ProducerReturnOnErrors(true),
282 kafka.ProducerReturnOnSuccess(true),
283 kafka.ProducerMaxRetries(6),
Abhilash S.L3b494632019-07-16 15:51:09 +0530284 kafka.ProducerRetryBackoff(time.Millisecond*30),
285 kafka.MetadatMaxRetries(15)), nil
cuilin20187b2a8c32019-03-26 19:52:28 -0700286 }
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700287
cuilin20187b2a8c32019-03-26 19:52:28 -0700288 return nil, errors.New("unsupported-client-type")
289}
290
291func (a *adapter) setKVClient() error {
292 addr := a.config.KVStoreHost + ":" + strconv.Itoa(a.config.KVStorePort)
293 client, err := newKVClient(a.config.KVStoreType, addr, a.config.KVStoreTimeout)
294 if err != nil {
295 a.kvClient = nil
296 log.Error(err)
297 return err
298 }
299 a.kvClient = client
300 return nil
301}
302
npujarec5762e2020-01-01 14:08:48 +0530303func (a *adapter) startInterContainerProxy(ctx context.Context, retries int) (kafka.InterContainerProxy, error) {
cuilin20187b2a8c32019-03-26 19:52:28 -0700304 log.Infow("starting-intercontainer-messaging-proxy", log.Fields{"host": a.config.KafkaAdapterHost,
305 "port": a.config.KafkaAdapterPort, "topic": a.config.Topic})
306 var err error
npujarec5762e2020-01-01 14:08:48 +0530307 kip := kafka.NewInterContainerProxy(
cuilin20187b2a8c32019-03-26 19:52:28 -0700308 kafka.InterContainerHost(a.config.KafkaAdapterHost),
309 kafka.InterContainerPort(a.config.KafkaAdapterPort),
310 kafka.MsgClient(a.kafkaClient),
npujarec5762e2020-01-01 14:08:48 +0530311 kafka.DefaultTopic(&kafka.Topic{Name: a.config.Topic}))
cuilin20187b2a8c32019-03-26 19:52:28 -0700312 count := 0
313 for {
314 if err = kip.Start(); err != nil {
315 log.Warnw("error-starting-messaging-proxy", log.Fields{"error": err})
316 if retries == count {
317 return nil, err
318 }
319 count = +1
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700320 // Take a nap before retrying
cuilin20187b2a8c32019-03-26 19:52:28 -0700321 time.Sleep(2 * time.Second)
322 } else {
323 break
324 }
325 }
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000326 probe.UpdateStatusFromContext(ctx, "container-proxy", probe.ServiceStatusRunning)
cuilin20187b2a8c32019-03-26 19:52:28 -0700327 log.Info("common-messaging-proxy-created")
328 return kip, nil
329}
330
npujarec5762e2020-01-01 14:08:48 +0530331func (a *adapter) startOpenOLT(ctx context.Context, kip kafka.InterContainerProxy,
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +0530332 cp adapterif.CoreProxy, ap adapterif.AdapterProxy, ep adapterif.EventProxy,
333 cfg *config.AdapterFlags) (*ac.OpenOLT, error) {
cuilin20187b2a8c32019-03-26 19:52:28 -0700334 log.Info("starting-open-olt")
335 var err error
Abhilash Laxmeshwarf9942e92020-01-07 15:32:44 +0530336 sOLT := ac.NewOpenOLT(ctx, a.kip, cp, ap, ep, cfg)
cuilin20187b2a8c32019-03-26 19:52:28 -0700337
338 if err = sOLT.Start(ctx); err != nil {
339 log.Fatalw("error-starting-messaging-proxy", log.Fields{"error": err})
340 return nil, err
341 }
342
343 log.Info("open-olt-started")
344 return sOLT, nil
345}
346
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000347func (a *adapter) setupRequestHandler(ctx context.Context, coreInstanceID string, iadapter adapters.IAdapter) error {
cuilin20187b2a8c32019-03-26 19:52:28 -0700348 log.Info("setting-request-handler")
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700349 requestProxy := com.NewRequestHandlerProxy(coreInstanceID, iadapter, a.coreProxy)
cuilin20187b2a8c32019-03-26 19:52:28 -0700350 if err := a.kip.SubscribeWithRequestHandlerInterface(kafka.Topic{Name: a.config.Topic}, requestProxy); err != nil {
351 log.Errorw("request-handler-setup-failed", log.Fields{"error": err})
352 return err
353
354 }
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000355 probe.UpdateStatusFromContext(ctx, "core-request-handler", probe.ServiceStatusRunning)
cuilin20187b2a8c32019-03-26 19:52:28 -0700356 log.Info("request-handler-setup-done")
357 return nil
358}
359
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000360func (a *adapter) registerWithCore(ctx context.Context, retries int) error {
cuilin20187b2a8c32019-03-26 19:52:28 -0700361 log.Info("registering-with-core")
Girish Gowdru0c588b22019-04-23 23:24:56 -0400362 adapterDescription := &voltha.Adapter{Id: "openolt", // Unique name for the device type
Matt Jeanneretf880eb62019-07-16 20:08:03 -0400363 Vendor: "VOLTHA OpenOLT",
364 Version: version.VersionInfo.Version}
Girish Gowdru0c588b22019-04-23 23:24:56 -0400365 types := []*voltha.DeviceType{{Id: "openolt",
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700366 Adapter: "openolt", // Name of the adapter that handles device type
Girish Gowdru0c588b22019-04-23 23:24:56 -0400367 AcceptsBulkFlowUpdate: false, // Currently openolt adapter does not support bulk flow handling
368 AcceptsAddRemoveFlowUpdates: true}}
cuilin20187b2a8c32019-03-26 19:52:28 -0700369 deviceTypes := &voltha.DeviceTypes{Items: types}
370 count := 0
371 for {
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700372 if err := a.coreProxy.RegisterAdapter(context.TODO(), adapterDescription, deviceTypes); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700373 log.Warnw("registering-with-core-failed", log.Fields{"error": err})
374 if retries == count {
375 return err
376 }
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700377 count++
378 // Take a nap before retrying
cuilin20187b2a8c32019-03-26 19:52:28 -0700379 time.Sleep(2 * time.Second)
380 } else {
381 break
382 }
383 }
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000384 probe.UpdateStatusFromContext(ctx, "register-with-core", probe.ServiceStatusRunning)
cuilin20187b2a8c32019-03-26 19:52:28 -0700385 log.Info("registered-with-core")
386 return nil
387}
388
389func waitForExit() int {
390 signalChannel := make(chan os.Signal, 1)
391 signal.Notify(signalChannel,
392 syscall.SIGHUP,
393 syscall.SIGINT,
394 syscall.SIGTERM,
395 syscall.SIGQUIT)
396
397 exitChannel := make(chan int)
398
399 go func() {
400 s := <-signalChannel
401 switch s {
402 case syscall.SIGHUP,
403 syscall.SIGINT,
404 syscall.SIGTERM,
405 syscall.SIGQUIT:
406 log.Infow("closing-signal-received", log.Fields{"signal": s})
407 exitChannel <- 0
408 default:
409 log.Infow("unexpected-signal-received", log.Fields{"signal": s})
410 exitChannel <- 1
411 }
412 }()
413
414 code := <-exitChannel
415 return code
416}
417
418func printBanner() {
David K. Bainbridge794735f2020-02-11 21:01:37 -0800419 fmt.Println(` ____ ____ _ _______ `)
420 fmt.Println(` / _ \ / __ \| | |__ __|`)
421 fmt.Println(` | | | |_ __ ___ _ __ | | | | | | | `)
422 fmt.Println(` | | | | '_ \ / _ \ '_ \ | | | | | | | `)
423 fmt.Println(` | |__| | |_) | __/ | | || |__| | |____| | `)
424 fmt.Println(` \____/| .__/ \___|_| |_| \____/|______|_| `)
425 fmt.Println(` | | `)
426 fmt.Println(` |_| `)
427 fmt.Println(` `)
cuilin20187b2a8c32019-03-26 19:52:28 -0700428}
429
Matt Jeanneretf880eb62019-07-16 20:08:03 -0400430func printVersion() {
431 fmt.Println("VOLTHA OpenOLT Adapter")
432 fmt.Println(version.VersionInfo.String(" "))
433}
434
cuilin20187b2a8c32019-03-26 19:52:28 -0700435func main() {
436 start := time.Now()
437
438 cf := config.NewAdapterFlags()
439 cf.ParseCommandArguments()
440
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700441 // Setup logging
cuilin20187b2a8c32019-03-26 19:52:28 -0700442
Rohan Agrawal02f784d2020-02-14 09:34:02 +0000443 logLevel, err := log.StringToLogLevel(cf.LogLevel)
444 if err != nil {
445 log.Fatalf("Cannot setup logging, %s", err)
446 }
Rohan Agrawal2488f192020-01-31 09:26:55 +0000447
Girish Gowdru6a80bbd2019-07-02 07:36:09 -0700448 // Setup default logger - applies for packages that do not have specific logger set
Rohan Agrawal02f784d2020-02-14 09:34:02 +0000449 if _, err := log.SetDefaultLogger(log.JSON, logLevel, log.Fields{"instanceId": cf.InstanceID}); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700450 log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
451 }
452
453 // Update all loggers (provisionned via init) with a common field
Hardik Windlassb9c869b2019-10-10 08:34:32 +0000454 if err := log.UpdateAllLoggers(log.Fields{"instanceId": cf.InstanceID}); err != nil {
cuilin20187b2a8c32019-03-26 19:52:28 -0700455 log.With(log.Fields{"error": err}).Fatal("Cannot setup logging")
456 }
457
Rohan Agrawal02f784d2020-02-14 09:34:02 +0000458 log.SetAllLogLevel(logLevel)
Rohan Agrawal93bced32020-02-11 10:16:01 +0000459
cuilin20187b2a8c32019-03-26 19:52:28 -0700460 defer log.CleanUp()
461
Matt Jeanneretf880eb62019-07-16 20:08:03 -0400462 // Print version / build information and exit
463 if cf.DisplayVersionOnly {
464 printVersion()
465 return
466 }
467
cuilin20187b2a8c32019-03-26 19:52:28 -0700468 // Print banner if specified
469 if cf.Banner {
470 printBanner()
471 }
472
473 log.Infow("config", log.Fields{"config": *cf})
474
475 ctx, cancel := context.WithCancel(context.Background())
476 defer cancel()
477
478 ad := newAdapter(cf)
Rohan Agrawal828bf4e2019-10-22 10:13:19 +0000479
480 p := &probe.Probe{}
481 go p.ListenAndServe(fmt.Sprintf("%s:%d", ad.config.ProbeHost, ad.config.ProbePort))
482
483 probeCtx := context.WithValue(ctx, probe.ProbeContextKey, p)
484
485 go ad.start(probeCtx)
cuilin20187b2a8c32019-03-26 19:52:28 -0700486
487 code := waitForExit()
488 log.Infow("received-a-closing-signal", log.Fields{"code": code})
489
490 // Cleanup before leaving
npujarec5762e2020-01-01 14:08:48 +0530491 ad.stop(ctx)
cuilin20187b2a8c32019-03-26 19:52:28 -0700492
493 elapsed := time.Since(start)
Hardik Windlassb9c869b2019-10-10 08:34:32 +0000494 log.Infow("run-time", log.Fields{"instanceId": ad.config.InstanceID, "time": elapsed / time.Second})
cuilin20187b2a8c32019-03-26 19:52:28 -0700495}