Implement health check infrastructure
This commit adds health check capabilities to the hsm.Access and health response data to the messages returned by the health command.
This commit is contained in:
parent
3107ad8abb
commit
60be959c24
6 changed files with 622 additions and 45 deletions
|
@ -62,45 +62,15 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
configFile, err := os.Open(signerConfigFile)
|
caConfig := LoadConfig(signerConfigFile, errorLog)
|
||||||
if err != nil {
|
|
||||||
errorLog.Fatalf("could not open signer configuration file %s: %v", signerConfigFile, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
opts := make([]hsm.ConfigOption, 0)
|
access := initializeHSM(caConfig, setupMode, verbose, infoLog, errorLog)
|
||||||
|
|
||||||
caConfig, err := config.LoadConfiguration(configFile)
|
|
||||||
if err != nil {
|
|
||||||
errorLog.Fatalf("could not load CA hierarchy: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
opts = append(opts, hsm.CaConfigOption(caConfig))
|
|
||||||
|
|
||||||
if setupMode {
|
|
||||||
infoLog.Print("running in setup mode")
|
|
||||||
|
|
||||||
opts = append(opts, hsm.SetupModeOption())
|
|
||||||
}
|
|
||||||
|
|
||||||
if verbose {
|
|
||||||
opts = append(opts, hsm.VerboseLoggingOption())
|
|
||||||
}
|
|
||||||
|
|
||||||
acc, err := hsm.NewAccess(infoLog, opts...)
|
|
||||||
if err != nil {
|
|
||||||
errorLog.Fatalf("could not setup HSM access: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = acc.EnsureCAKeysAndCertificates()
|
|
||||||
if err != nil {
|
|
||||||
errorLog.Fatalf("could not ensure CA keys and certificates exist: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if setupMode {
|
if setupMode {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
healthHandler := health.New(version)
|
healthHandler := health.New(version, access)
|
||||||
|
|
||||||
proto, err := protocol.New(infoLog, errorLog, protocol.RegisterHealthHandler(healthHandler))
|
proto, err := protocol.New(infoLog, errorLog, protocol.RegisterHealthHandler(healthHandler))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -120,3 +90,45 @@ func main() {
|
||||||
|
|
||||||
infoLog.Print("setup complete, starting signer operation")
|
infoLog.Print("setup complete, starting signer operation")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func initializeHSM(caConfig *config.SignerConfig, setupMode, verbose bool, infoLog, errorLog *log.Logger) *hsm.Access {
|
||||||
|
opts := make([]hsm.ConfigOption, 0)
|
||||||
|
|
||||||
|
opts = append(opts, hsm.CaConfigOption(caConfig))
|
||||||
|
|
||||||
|
if setupMode {
|
||||||
|
infoLog.Print("running in setup mode")
|
||||||
|
|
||||||
|
opts = append(opts, hsm.SetupModeOption())
|
||||||
|
}
|
||||||
|
|
||||||
|
if verbose {
|
||||||
|
opts = append(opts, hsm.VerboseLoggingOption())
|
||||||
|
}
|
||||||
|
|
||||||
|
access, err := hsm.NewAccess(infoLog, opts...)
|
||||||
|
if err != nil {
|
||||||
|
errorLog.Fatalf("could not setup HSM access: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = access.EnsureCAKeysAndCertificates()
|
||||||
|
if err != nil {
|
||||||
|
errorLog.Fatalf("could not ensure CA keys and certificates exist: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return access
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfig(signerConfigFile string, errorLog *log.Logger) *config.SignerConfig {
|
||||||
|
configFile, err := os.Open(signerConfigFile)
|
||||||
|
if err != nil {
|
||||||
|
errorLog.Fatalf("could not open signer configuration file %s: %v", signerConfigFile, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
caConfig, err := config.LoadConfiguration(configFile)
|
||||||
|
if err != nil {
|
||||||
|
errorLog.Fatalf("could not load CA hierarchy: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return caConfig
|
||||||
|
}
|
||||||
|
|
|
@ -18,10 +18,49 @@ limitations under the License.
|
||||||
// Package health implements Health checks
|
// Package health implements Health checks
|
||||||
package health
|
package health
|
||||||
|
|
||||||
type Handler struct {
|
import (
|
||||||
Version string
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Info struct {
|
||||||
|
Healthy bool
|
||||||
|
Source string
|
||||||
|
MoreInfo map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(version string) *Handler {
|
type Aware interface {
|
||||||
return &Handler{Version: version}
|
Healthy() (*Info, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Handler struct {
|
||||||
|
version string
|
||||||
|
healthAware []Aware
|
||||||
|
}
|
||||||
|
|
||||||
|
type Result struct {
|
||||||
|
Healthy bool
|
||||||
|
Version string
|
||||||
|
Info []*Info
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handler) CheckHealth() (*Result, error) {
|
||||||
|
healthInfo := make([]*Info, len(h.healthAware))
|
||||||
|
|
||||||
|
healthy := true
|
||||||
|
|
||||||
|
for idx, aware := range h.healthAware {
|
||||||
|
info, err := aware.Healthy()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("health check failed: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
healthInfo[idx] = info
|
||||||
|
healthy = healthy && info.Healthy
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Result{Healthy: healthy, Version: h.version, Info: healthInfo}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(version string, healthAware ...Aware) *Handler {
|
||||||
|
return &Handler{version: version, healthAware: healthAware}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ import (
|
||||||
|
|
||||||
"github.com/ThalesIgnite/crypto11"
|
"github.com/ThalesIgnite/crypto11"
|
||||||
|
|
||||||
|
"git.cacert.org/cacert-gosigner/pkg/health"
|
||||||
|
|
||||||
"git.cacert.org/cacert-gosigner/pkg/config"
|
"git.cacert.org/cacert-gosigner/pkg/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -62,6 +64,60 @@ type Access struct {
|
||||||
verbose bool
|
verbose bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *Access) Healthy() (*health.Info, error) {
|
||||||
|
healthy := true
|
||||||
|
|
||||||
|
moreInfo := make(map[string]string)
|
||||||
|
|
||||||
|
const checkFailed = "failed"
|
||||||
|
|
||||||
|
for _, ca := range a.signerConfig.RootCAs() {
|
||||||
|
infoKey := fmt.Sprintf("root-%s", ca)
|
||||||
|
|
||||||
|
cert, err := a.GetRootCACertificate(ca)
|
||||||
|
if err != nil {
|
||||||
|
healthy = false
|
||||||
|
|
||||||
|
moreInfo[infoKey] = checkFailed
|
||||||
|
}
|
||||||
|
|
||||||
|
moreInfo[infoKey] = fmt.Sprintf("ok, valid until %s", cert.NotAfter.UTC().Format(time.RFC3339))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ca := range a.signerConfig.IntermediaryCAs() {
|
||||||
|
infoKey := fmt.Sprintf("sub-%s", ca)
|
||||||
|
|
||||||
|
cert, err := a.GetIntermediaryCACertificate(ca)
|
||||||
|
if err != nil {
|
||||||
|
healthy = false
|
||||||
|
|
||||||
|
moreInfo[infoKey] = checkFailed
|
||||||
|
}
|
||||||
|
|
||||||
|
def, err := a.signerConfig.GetCADefinition(ca)
|
||||||
|
if err != nil {
|
||||||
|
healthy = false
|
||||||
|
|
||||||
|
moreInfo[infoKey] = checkFailed
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = a.getKeyPair(ca, def.KeyInfo)
|
||||||
|
if err != nil {
|
||||||
|
healthy = false
|
||||||
|
|
||||||
|
moreInfo[infoKey] = checkFailed
|
||||||
|
}
|
||||||
|
|
||||||
|
moreInfo[infoKey] = fmt.Sprintf("ok, valid until %s", cert.NotAfter.UTC().Format(time.RFC3339))
|
||||||
|
}
|
||||||
|
|
||||||
|
return &health.Info{
|
||||||
|
Healthy: healthy,
|
||||||
|
Source: "HSM",
|
||||||
|
MoreInfo: moreInfo,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewAccess(infoLog *log.Logger, options ...ConfigOption) (*Access, error) {
|
func NewAccess(infoLog *log.Logger, options ...ConfigOption) (*Access, error) {
|
||||||
access := &Access{infoLog: infoLog}
|
access := &Access{infoLog: infoLog}
|
||||||
access.setupContext(options...)
|
access.setupContext(options...)
|
||||||
|
|
|
@ -59,8 +59,16 @@ type Response struct {
|
||||||
Payload interface{} `msgpack:"payload"`
|
Payload interface{} `msgpack:"payload"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type HealthInfo struct {
|
||||||
|
Source string
|
||||||
|
Healthy bool
|
||||||
|
MoreInfo map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
type HealthResponse struct {
|
type HealthResponse struct {
|
||||||
Version string `msgpack:"version"`
|
Version string `msgpack:"version"`
|
||||||
|
Healthy bool
|
||||||
|
Info []HealthInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type ErrorResponse struct {
|
type ErrorResponse struct {
|
||||||
|
|
|
@ -26,6 +26,36 @@ func ___encode(i interface{}) ([]byte, error) {
|
||||||
// encodeAsArray
|
// encodeAsArray
|
||||||
func ___encodeAsArray(i interface{}) ([]byte, error) {
|
func ___encodeAsArray(i interface{}) ([]byte, error) {
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
|
case HealthInfo:
|
||||||
|
encoder := enc.NewEncoder()
|
||||||
|
size, err := ___calcArraySizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
encoder.MakeBytes(size)
|
||||||
|
b, offset, err := ___encodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if size != offset {
|
||||||
|
return nil, fmt.Errorf("%s size / offset different %d : %d", "HealthInfo", size, offset)
|
||||||
|
}
|
||||||
|
return b, err
|
||||||
|
case *HealthInfo:
|
||||||
|
encoder := enc.NewEncoder()
|
||||||
|
size, err := ___calcArraySizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
encoder.MakeBytes(size)
|
||||||
|
b, offset, err := ___encodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, encoder, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if size != offset {
|
||||||
|
return nil, fmt.Errorf("%s size / offset different %d : %d", "HealthInfo", size, offset)
|
||||||
|
}
|
||||||
|
return b, err
|
||||||
case HealthResponse:
|
case HealthResponse:
|
||||||
encoder := enc.NewEncoder()
|
encoder := enc.NewEncoder()
|
||||||
size, err := ___calcArraySizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
size, err := ___calcArraySizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
||||||
|
@ -93,6 +123,36 @@ func ___encodeAsArray(i interface{}) ([]byte, error) {
|
||||||
// encodeAsMap
|
// encodeAsMap
|
||||||
func ___encodeAsMap(i interface{}) ([]byte, error) {
|
func ___encodeAsMap(i interface{}) ([]byte, error) {
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
|
case HealthInfo:
|
||||||
|
encoder := enc.NewEncoder()
|
||||||
|
size, err := ___calcMapSizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
encoder.MakeBytes(size)
|
||||||
|
b, offset, err := ___encodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if size != offset {
|
||||||
|
return nil, fmt.Errorf("%s size / offset different %d : %d", "HealthInfo", size, offset)
|
||||||
|
}
|
||||||
|
return b, err
|
||||||
|
case *HealthInfo:
|
||||||
|
encoder := enc.NewEncoder()
|
||||||
|
size, err := ___calcMapSizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
encoder.MakeBytes(size)
|
||||||
|
b, offset, err := ___encodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, encoder, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if size != offset {
|
||||||
|
return nil, fmt.Errorf("%s size / offset different %d : %d", "HealthInfo", size, offset)
|
||||||
|
}
|
||||||
|
return b, err
|
||||||
case HealthResponse:
|
case HealthResponse:
|
||||||
encoder := enc.NewEncoder()
|
encoder := enc.NewEncoder()
|
||||||
size, err := ___calcMapSizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
size, err := ___calcMapSizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, encoder)
|
||||||
|
@ -169,6 +229,20 @@ func ___decode(data []byte, i interface{}) (bool, error) {
|
||||||
// decodeAsArray
|
// decodeAsArray
|
||||||
func ___decodeAsArray(data []byte, i interface{}) (bool, error) {
|
func ___decodeAsArray(data []byte, i interface{}) (bool, error) {
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
|
case *HealthInfo:
|
||||||
|
decoder := dec.NewDecoder(data)
|
||||||
|
offset, err := ___decodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
||||||
|
if err == nil && offset != decoder.Len() {
|
||||||
|
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
|
case **HealthInfo:
|
||||||
|
decoder := dec.NewDecoder(data)
|
||||||
|
offset, err := ___decodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, decoder, 0)
|
||||||
|
if err == nil && offset != decoder.Len() {
|
||||||
|
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
case *HealthResponse:
|
case *HealthResponse:
|
||||||
decoder := dec.NewDecoder(data)
|
decoder := dec.NewDecoder(data)
|
||||||
offset, err := ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
offset, err := ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
||||||
|
@ -204,6 +278,20 @@ func ___decodeAsArray(data []byte, i interface{}) (bool, error) {
|
||||||
// decodeAsMap
|
// decodeAsMap
|
||||||
func ___decodeAsMap(data []byte, i interface{}) (bool, error) {
|
func ___decodeAsMap(data []byte, i interface{}) (bool, error) {
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
|
case *HealthInfo:
|
||||||
|
decoder := dec.NewDecoder(data)
|
||||||
|
offset, err := ___decodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
||||||
|
if err == nil && offset != decoder.Len() {
|
||||||
|
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
|
case **HealthInfo:
|
||||||
|
decoder := dec.NewDecoder(data)
|
||||||
|
offset, err := ___decodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(*v, decoder, 0)
|
||||||
|
if err == nil && offset != decoder.Len() {
|
||||||
|
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
|
||||||
|
}
|
||||||
|
return true, err
|
||||||
case *HealthResponse:
|
case *HealthResponse:
|
||||||
decoder := dec.NewDecoder(data)
|
decoder := dec.NewDecoder(data)
|
||||||
offset, err := ___decodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
offset, err := ___decodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v, decoder, 0)
|
||||||
|
@ -236,43 +324,330 @@ func ___decodeAsMap(data []byte, i interface{}) (bool, error) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___calcArraySizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthInfo, encoder *enc.Encoder) (int, error) {
|
||||||
|
size := 0
|
||||||
|
size += encoder.CalcStructHeaderFix(3)
|
||||||
|
size += encoder.CalcString(v.Source)
|
||||||
|
size += encoder.CalcBool(v.Healthy)
|
||||||
|
if v.MoreInfo != nil {
|
||||||
|
s, err := encoder.CalcMapLength(len(v.MoreInfo))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += s
|
||||||
|
for kk, vv := range v.MoreInfo {
|
||||||
|
size += encoder.CalcString(kk)
|
||||||
|
size += encoder.CalcString(vv)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size += encoder.CalcNil()
|
||||||
|
}
|
||||||
|
return size, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___calcMapSizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthInfo, encoder *enc.Encoder) (int, error) {
|
||||||
|
size := 0
|
||||||
|
size += encoder.CalcStructHeaderFix(3)
|
||||||
|
size += encoder.CalcStringFix(6)
|
||||||
|
size += encoder.CalcString(v.Source)
|
||||||
|
size += encoder.CalcStringFix(7)
|
||||||
|
size += encoder.CalcBool(v.Healthy)
|
||||||
|
size += encoder.CalcStringFix(8)
|
||||||
|
if v.MoreInfo != nil {
|
||||||
|
s, err := encoder.CalcMapLength(len(v.MoreInfo))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += s
|
||||||
|
for kk, vv := range v.MoreInfo {
|
||||||
|
size += encoder.CalcString(kk)
|
||||||
|
size += encoder.CalcString(vv)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size += encoder.CalcNil()
|
||||||
|
}
|
||||||
|
return size, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___encodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthInfo, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
||||||
|
var err error
|
||||||
|
offset = encoder.WriteStructHeaderFixAsArray(3, offset)
|
||||||
|
offset = encoder.WriteString(v.Source, offset)
|
||||||
|
offset = encoder.WriteBool(v.Healthy, offset)
|
||||||
|
if v.MoreInfo != nil {
|
||||||
|
offset = encoder.WriteMapLength(len(v.MoreInfo), offset)
|
||||||
|
for kk, vv := range v.MoreInfo {
|
||||||
|
offset = encoder.WriteString(kk, offset)
|
||||||
|
offset = encoder.WriteString(vv, offset)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
offset = encoder.WriteNil(offset)
|
||||||
|
}
|
||||||
|
return encoder.EncodedBytes(), offset, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___encodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthInfo, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
||||||
|
var err error
|
||||||
|
offset = encoder.WriteStructHeaderFixAsMap(3, offset)
|
||||||
|
offset = encoder.WriteStringFix("Source", 6, offset)
|
||||||
|
offset = encoder.WriteString(v.Source, offset)
|
||||||
|
offset = encoder.WriteStringFix("Healthy", 7, offset)
|
||||||
|
offset = encoder.WriteBool(v.Healthy, offset)
|
||||||
|
offset = encoder.WriteStringFix("MoreInfo", 8, offset)
|
||||||
|
if v.MoreInfo != nil {
|
||||||
|
offset = encoder.WriteMapLength(len(v.MoreInfo), offset)
|
||||||
|
for kk, vv := range v.MoreInfo {
|
||||||
|
offset = encoder.WriteString(kk, offset)
|
||||||
|
offset = encoder.WriteString(vv, offset)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
offset = encoder.WriteNil(offset)
|
||||||
|
}
|
||||||
|
return encoder.EncodedBytes(), offset, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode to git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___decodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthInfo, decoder *dec.Decoder, offset int) (int, error) {
|
||||||
|
offset, err := decoder.CheckStructHeader(3, offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var vv string
|
||||||
|
vv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Source = vv
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var vv bool
|
||||||
|
vv, offset, err = decoder.AsBool(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Healthy = vv
|
||||||
|
}
|
||||||
|
if !decoder.IsCodeNil(offset) {
|
||||||
|
var vv map[string]string
|
||||||
|
var vvl int
|
||||||
|
vvl, offset, err = decoder.MapLength(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv = make(map[string]string, vvl)
|
||||||
|
for vvi := 0; vvi < vvl; vvi++ {
|
||||||
|
var kkv string
|
||||||
|
kkv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
var vvv string
|
||||||
|
vvv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv[kkv] = vvv
|
||||||
|
}
|
||||||
|
v.MoreInfo = vv
|
||||||
|
} else {
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
return offset, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode to git.cacert.org/cacert-gosigner/pkg/messages.HealthInfo
|
||||||
|
func ___decodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthInfo, decoder *dec.Decoder, offset int) (int, error) {
|
||||||
|
keys := [][]byte{
|
||||||
|
{uint8(0x53), uint8(0x6f), uint8(0x75), uint8(0x72), uint8(0x63), uint8(0x65)}, // Source
|
||||||
|
{uint8(0x48), uint8(0x65), uint8(0x61), uint8(0x6c), uint8(0x74), uint8(0x68), uint8(0x79)}, // Healthy
|
||||||
|
{uint8(0x4d), uint8(0x6f), uint8(0x72), uint8(0x65), uint8(0x49), uint8(0x6e), uint8(0x66), uint8(0x6f)}, // MoreInfo
|
||||||
|
}
|
||||||
|
offset, err := decoder.CheckStructHeader(3, offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
count := 0
|
||||||
|
for count < 3 {
|
||||||
|
var dataKey []byte
|
||||||
|
dataKey, offset, err = decoder.AsStringBytes(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
fieldIndex := -1
|
||||||
|
for i, key := range keys {
|
||||||
|
if len(dataKey) != len(key) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fieldIndex = i
|
||||||
|
for dataKeyIndex := range dataKey {
|
||||||
|
if dataKey[dataKeyIndex] != key[dataKeyIndex] {
|
||||||
|
fieldIndex = -1
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fieldIndex >= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch fieldIndex {
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
var vv string
|
||||||
|
vv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Source = vv
|
||||||
|
}
|
||||||
|
count++
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
var vv bool
|
||||||
|
vv, offset, err = decoder.AsBool(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Healthy = vv
|
||||||
|
}
|
||||||
|
count++
|
||||||
|
case 2:
|
||||||
|
if !decoder.IsCodeNil(offset) {
|
||||||
|
var vv map[string]string
|
||||||
|
var vvl int
|
||||||
|
vvl, offset, err = decoder.MapLength(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv = make(map[string]string, vvl)
|
||||||
|
for vvi := 0; vvi < vvl; vvi++ {
|
||||||
|
var kkv string
|
||||||
|
kkv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
var vvv string
|
||||||
|
vvv, offset, err = decoder.AsString(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv[kkv] = vvv
|
||||||
|
}
|
||||||
|
v.MoreInfo = vv
|
||||||
|
} else {
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
count++
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("unknown key[%s] found", string(dataKey))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return offset, err
|
||||||
|
}
|
||||||
|
|
||||||
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
||||||
func ___calcArraySizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder) (int, error) {
|
func ___calcArraySizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder) (int, error) {
|
||||||
size := 0
|
size := 0
|
||||||
size += encoder.CalcStructHeaderFix(1)
|
size += encoder.CalcStructHeaderFix(3)
|
||||||
size += encoder.CalcString(v.Version)
|
size += encoder.CalcString(v.Version)
|
||||||
|
size += encoder.CalcBool(v.Healthy)
|
||||||
|
if v.Info != nil {
|
||||||
|
s, err := encoder.CalcSliceLength(len(v.Info), false)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += s
|
||||||
|
for _, vv := range v.Info {
|
||||||
|
size_vv, err := ___calcArraySizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(vv, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += size_vv
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size += encoder.CalcNil()
|
||||||
|
}
|
||||||
return size, nil
|
return size, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
// calculate size from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
||||||
func ___calcMapSizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder) (int, error) {
|
func ___calcMapSizeHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder) (int, error) {
|
||||||
size := 0
|
size := 0
|
||||||
size += encoder.CalcStructHeaderFix(1)
|
size += encoder.CalcStructHeaderFix(3)
|
||||||
size += encoder.CalcStringFix(7)
|
size += encoder.CalcStringFix(7)
|
||||||
size += encoder.CalcString(v.Version)
|
size += encoder.CalcString(v.Version)
|
||||||
|
size += encoder.CalcStringFix(7)
|
||||||
|
size += encoder.CalcBool(v.Healthy)
|
||||||
|
size += encoder.CalcStringFix(4)
|
||||||
|
if v.Info != nil {
|
||||||
|
s, err := encoder.CalcSliceLength(len(v.Info), false)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += s
|
||||||
|
for _, vv := range v.Info {
|
||||||
|
size_vv, err := ___calcMapSizeHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(vv, encoder)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
size += size_vv
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size += encoder.CalcNil()
|
||||||
|
}
|
||||||
return size, nil
|
return size, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
||||||
func ___encodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
func ___encodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
||||||
var err error
|
var err error
|
||||||
offset = encoder.WriteStructHeaderFixAsArray(1, offset)
|
offset = encoder.WriteStructHeaderFixAsArray(3, offset)
|
||||||
offset = encoder.WriteString(v.Version, offset)
|
offset = encoder.WriteString(v.Version, offset)
|
||||||
|
offset = encoder.WriteBool(v.Healthy, offset)
|
||||||
|
if v.Info != nil {
|
||||||
|
offset = encoder.WriteSliceLength(len(v.Info), offset, false)
|
||||||
|
for _, vv := range v.Info {
|
||||||
|
_, offset, err = ___encodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(vv, encoder, offset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
offset = encoder.WriteNil(offset)
|
||||||
|
}
|
||||||
return encoder.EncodedBytes(), offset, err
|
return encoder.EncodedBytes(), offset, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
// encode from git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
||||||
func ___encodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
func ___encodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v HealthResponse, encoder *enc.Encoder, offset int) ([]byte, int, error) {
|
||||||
var err error
|
var err error
|
||||||
offset = encoder.WriteStructHeaderFixAsMap(1, offset)
|
offset = encoder.WriteStructHeaderFixAsMap(3, offset)
|
||||||
offset = encoder.WriteStringFix("version", 7, offset)
|
offset = encoder.WriteStringFix("version", 7, offset)
|
||||||
offset = encoder.WriteString(v.Version, offset)
|
offset = encoder.WriteString(v.Version, offset)
|
||||||
|
offset = encoder.WriteStringFix("Healthy", 7, offset)
|
||||||
|
offset = encoder.WriteBool(v.Healthy, offset)
|
||||||
|
offset = encoder.WriteStringFix("Info", 4, offset)
|
||||||
|
if v.Info != nil {
|
||||||
|
offset = encoder.WriteSliceLength(len(v.Info), offset, false)
|
||||||
|
for _, vv := range v.Info {
|
||||||
|
_, offset, err = ___encodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(vv, encoder, offset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
offset = encoder.WriteNil(offset)
|
||||||
|
}
|
||||||
return encoder.EncodedBytes(), offset, err
|
return encoder.EncodedBytes(), offset, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// decode to git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
// decode to git.cacert.org/cacert-gosigner/pkg/messages.HealthResponse
|
||||||
func ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthResponse, decoder *dec.Decoder, offset int) (int, error) {
|
func ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthResponse, decoder *dec.Decoder, offset int) (int, error) {
|
||||||
offset, err := decoder.CheckStructHeader(1, offset)
|
offset, err := decoder.CheckStructHeader(3, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -284,6 +659,34 @@ func ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a8137
|
||||||
}
|
}
|
||||||
v.Version = vv
|
v.Version = vv
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
var vv bool
|
||||||
|
vv, offset, err = decoder.AsBool(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Healthy = vv
|
||||||
|
}
|
||||||
|
if !decoder.IsCodeNil(offset) {
|
||||||
|
var vv []HealthInfo
|
||||||
|
var vvl int
|
||||||
|
vvl, offset, err = decoder.SliceLength(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv = make([]HealthInfo, vvl)
|
||||||
|
for vvi := range vv {
|
||||||
|
var vvv HealthInfo
|
||||||
|
offset, err = ___decodeArrayHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(&vvv, decoder, offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv[vvi] = vvv
|
||||||
|
}
|
||||||
|
v.Info = vv
|
||||||
|
} else {
|
||||||
|
offset++
|
||||||
|
}
|
||||||
return offset, err
|
return offset, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,13 +694,15 @@ func ___decodeArrayHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a8137
|
||||||
func ___decodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthResponse, decoder *dec.Decoder, offset int) (int, error) {
|
func ___decodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(v *HealthResponse, decoder *dec.Decoder, offset int) (int, error) {
|
||||||
keys := [][]byte{
|
keys := [][]byte{
|
||||||
{uint8(0x76), uint8(0x65), uint8(0x72), uint8(0x73), uint8(0x69), uint8(0x6f), uint8(0x6e)}, // version
|
{uint8(0x76), uint8(0x65), uint8(0x72), uint8(0x73), uint8(0x69), uint8(0x6f), uint8(0x6e)}, // version
|
||||||
|
{uint8(0x48), uint8(0x65), uint8(0x61), uint8(0x6c), uint8(0x74), uint8(0x68), uint8(0x79)}, // Healthy
|
||||||
|
{uint8(0x49), uint8(0x6e), uint8(0x66), uint8(0x6f)}, // Info
|
||||||
}
|
}
|
||||||
offset, err := decoder.CheckStructHeader(1, offset)
|
offset, err := decoder.CheckStructHeader(3, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
count := 0
|
count := 0
|
||||||
for count < 1 {
|
for count < 3 {
|
||||||
var dataKey []byte
|
var dataKey []byte
|
||||||
dataKey, offset, err = decoder.AsStringBytes(offset)
|
dataKey, offset, err = decoder.AsStringBytes(offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -330,6 +735,38 @@ func ___decodeMapHealthResponse_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f
|
||||||
v.Version = vv
|
v.Version = vv
|
||||||
}
|
}
|
||||||
count++
|
count++
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
var vv bool
|
||||||
|
vv, offset, err = decoder.AsBool(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
v.Healthy = vv
|
||||||
|
}
|
||||||
|
count++
|
||||||
|
case 2:
|
||||||
|
if !decoder.IsCodeNil(offset) {
|
||||||
|
var vv []HealthInfo
|
||||||
|
var vvl int
|
||||||
|
vvl, offset, err = decoder.SliceLength(offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv = make([]HealthInfo, vvl)
|
||||||
|
for vvi := range vv {
|
||||||
|
var vvv HealthInfo
|
||||||
|
offset, err = ___decodeMapHealthInfo_e587a81c7cb163b35488bdef0f58c292f99f4bd65a81377f81e5b18c3d86855d(&vvv, decoder, offset)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
vv[vvi] = vvv
|
||||||
|
}
|
||||||
|
v.Info = vv
|
||||||
|
} else {
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
count++
|
||||||
default:
|
default:
|
||||||
return 0, fmt.Errorf("unknown key[%s] found", string(dataKey))
|
return 0, fmt.Errorf("unknown key[%s] found", string(dataKey))
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,17 +78,42 @@ func (m *MsgPackHandler) HandleFrame(frame []byte) ([]byte, error) {
|
||||||
|
|
||||||
func (m *MsgPackHandler) handleCommand(command *messages.Command) (*messages.Response, error) {
|
func (m *MsgPackHandler) handleCommand(command *messages.Command) (*messages.Response, error) {
|
||||||
var (
|
var (
|
||||||
|
err error
|
||||||
payload interface{}
|
payload interface{}
|
||||||
responseCode messages.ResponseCode
|
responseCode messages.ResponseCode
|
||||||
)
|
)
|
||||||
|
|
||||||
switch command.Code {
|
switch command.Code {
|
||||||
case messages.CmdHealth:
|
case messages.CmdHealth:
|
||||||
responseCode, payload = messages.RspHealth, messages.HealthResponse{Version: m.healthHandler.Version}
|
var res *health.Result
|
||||||
|
|
||||||
|
res, err = m.healthHandler.CheckHealth()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
response := messages.HealthResponse{
|
||||||
|
Version: res.Version,
|
||||||
|
Healthy: res.Healthy,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, info := range res.Info {
|
||||||
|
response.Info = append(response.Info, messages.HealthInfo{
|
||||||
|
Source: info.Source,
|
||||||
|
Healthy: info.Healthy,
|
||||||
|
MoreInfo: info.MoreInfo,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
responseCode, payload = messages.RspHealth, response
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unhandled command %s", command)
|
return nil, fmt.Errorf("unhandled command %s", command)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error from command handler: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return &messages.Response{TimeStamp: time.Now().UTC(), Code: responseCode, Payload: payload}, nil
|
return &messages.Response{TimeStamp: time.Now().UTC(), Code: responseCode, Payload: payload}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue