Files
golib/config/interface.go
Nicolas JUHEL 49db5e2afb Add Package Config :
- major dependancies are :
  - golib/context config
  - golib/viper
- interface config extend :
  - golib/context config interface
  - component list
- interface component list :
  this interface implement all function to manage a collection of component. All component are registred with they config key.
  A component must implement basic function like start, stop, reload, defaultConfig...
  The main config json is set by calling all component config with the config key attached
  Each component have some status status like isStarted, isRunning, ...
  Each component must also declare his dependencies with other component. As that when start or reload is called,
  the component is sure that dependencies are still started or reloaded.
- They are 4 component for now : log, tls, headers and http server
- The config package will start a new context / cancelfunc on init to be sure to stop cleanly all component and process

Add Package Viper :
- this package is an helper to the config package with the spf13 viper lib
- this package can watch any change of a config file or can be connected to a remote config cluster like ETCD

Add Package Cobra :
- this package is an helper to make a CLI with flag / command
- this package is based on spf13 cobra has all method to be connected to viper golib
2022-02-21 07:32:44 +01:00

159 lines
4.7 KiB
Go

/*
* MIT License
*
* Copyright (c) 2022 Nicolas JUHEL
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*
*/
package config
import (
"context"
"os"
"os/signal"
"sync"
"syscall"
libctx "github.com/nabbar/golib/context"
liberr "github.com/nabbar/golib/errors"
libvpr "github.com/nabbar/golib/viper"
)
type FuncContext func() context.Context
type FuncComponentGet func(key string) Component
type FuncComponentConfigGet func(model interface{}) liberr.Error
type Config interface {
/*
// Section Context : github.com/nabbar/golib/context
*/
// Context return the current context pointer
Context() context.Context
// ContextMerge trigger the golib/context/config interface
// and will merge the stored context value into current context
ContextMerge(ctx libctx.Config) bool
// ContextStore trigger the golib/context/config interface
// and will store a context value into current context
ContextStore(key string, cfg interface{})
// ContextLoad trigger the golib/context/config interface
// and will restore a context value or nil
ContextLoad(key string) interface{}
// ContextSetCancel allow to register a custom function called on cancel context.
// On context cancel event or signal kill, term... this function will be called
// before config stop and main context cancel function
ContextSetCancel(fct func())
/*
// Section Event : github.com/nabbar/golib/config
*/
RegisterFuncViper(fct func() libvpr.Viper)
// Start will trigger the start function of all registered component.
// If any component return an error, this func will stop the start
// process and return the error.
Start() liberr.Error
// RegisterFuncStartBefore allow to register a func to be call when the config Start
// is trigger. This func is call before the start sequence.
RegisterFuncStartBefore(fct func() liberr.Error)
// RegisterFuncStartAfter allow to register a func to be call when the config Start
// is trigger. This func is call after the start sequence.
RegisterFuncStartAfter(fct func() liberr.Error)
// Reload triggers the Reload function of each registered Component.
Reload() liberr.Error
// RegisterFuncReloadBefore allow to register a func to be call when the config Reload
// is trigger. This func is call before the reload sequence.
RegisterFuncReloadBefore(fct func() liberr.Error)
// RegisterFuncReloadAfter allow to register a func to be call when the config Reload
// is trigger. This func is call after the reload sequence.
RegisterFuncReloadAfter(fct func() liberr.Error)
// Stop will trigger the stop function of all registered component.
// All component must stop cleanly.
Stop()
// RegisterFuncStopBefore allow to register a func to be call when the config Stop
// is trigger. This func is call before the stop sequence.
RegisterFuncStopBefore(fct func())
// RegisterFuncStopAfter allow to register a func to be call when the config Stop
// is trigger. This func is call after the stop sequence.
RegisterFuncStopAfter(fct func())
/*
// Section Component : github.com/nabbar/golib/config
*/
ComponentList
}
var (
ctx context.Context
cnl context.CancelFunc
)
func init() {
ctx, cnl = context.WithCancel(context.Background())
go func() {
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 5 seconds.
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT)
signal.Notify(quit, syscall.SIGTERM)
signal.Notify(quit, syscall.SIGQUIT)
select {
case <-quit:
cnl()
case <-ctx.Done():
cnl()
}
}()
}
func New() Config {
c := &configModel{
m: sync.Mutex{},
ctx: libctx.NewConfig(ctx),
cpt: newComponentList(),
}
go func() {
select {
case <-c.ctx.Done():
c.cancel()
}
}()
return c
}