Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 0faddde

Browse files
author
odacremolbap
committed
non usable, first commit
1 parent f55f8a6 commit 0faddde

File tree

12 files changed

+1299
-0
lines changed

12 files changed

+1299
-0
lines changed

.gitignore

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Local configurations and secrets
2+
/.env/
3+
/.local/
4+
5+
# Editors and IDEs
6+
*.swo
7+
*.swp
8+
*~
9+
/*.sublime-project
10+
/*.sublime-workspace
11+
/.idea/
12+
/.vscode/
13+
14+
# OS Artifacts
15+
.DS_Store
16+
17+
# GNU patch
18+
*.orig
19+
*.rej
20+
21+
# Build artifacts
22+
/releases/
23+
/releases-go/
24+
_output/
25+
26+
# Test artifacts
27+
*.test

cmd/triggermesh-hook/kodata/HEAD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../.git/HEAD

cmd/triggermesh-hook/kodata/refs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../.git/refs

cmd/triggermesh-hook/main.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"os/signal"
8+
"syscall"
9+
10+
"github.com/alecthomas/kong"
11+
12+
"github.com/triggermesh/scoby-hook-triggermesh/cmd/triggermesh-hook/start"
13+
commoncmd "github.com/triggermesh/scoby-hook-triggermesh/pkg/common/cmd"
14+
)
15+
16+
type cli struct {
17+
commoncmd.Globals
18+
19+
Start start.Cmd `cmd:"" help:"Starts the TriggerMesh hook for Scoby."`
20+
}
21+
22+
func main() {
23+
24+
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM, os.Kill)
25+
defer stop()
26+
27+
cli := cli{
28+
Globals: commoncmd.Globals{
29+
Context: ctx,
30+
},
31+
}
32+
33+
kc := kong.Parse(&cli)
34+
35+
err := cli.Initialize()
36+
if err != nil {
37+
panic(fmt.Errorf("error initializing: %w", err))
38+
}
39+
defer cli.Flush()
40+
41+
err = kc.Run(&cli.Globals)
42+
kc.FatalIfErrorf(err)
43+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2022 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package start
5+
6+
import (
7+
commoncmd "github.com/triggermesh/scoby-hook-triggermesh/pkg/common/cmd"
8+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/server"
9+
)
10+
11+
type Cmd struct {
12+
Address string `help:"Address to listen for incoming requests." env:"ADDRESS" default:":8080"`
13+
Path string `help:"Path where hook requests are served." env:"PATH" default:"v1"`
14+
}
15+
16+
func (c *Cmd) Run(globals *commoncmd.Globals) error {
17+
globals.Logger.Debug("Creating TriggerMesh hook server")
18+
19+
s := server.New(c.Path, c.Address, globals.Logger)
20+
return s.Start(globals.Context)
21+
}

go.mod

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
module github.com/triggermesh/scoby-hook-triggermesh
2+
3+
go 1.20
4+
5+
require (
6+
github.com/alecthomas/kong v0.7.1
7+
github.com/stretchr/testify v1.8.2
8+
github.com/triggermesh/scoby v0.0.0-20230410193949-ba37efdfa633
9+
go.uber.org/zap v1.24.0
10+
k8s.io/api v0.26.3
11+
k8s.io/apimachinery v0.26.3
12+
k8s.io/client-go v0.26.1
13+
sigs.k8s.io/yaml v1.3.0
14+
)
15+
16+
require (
17+
github.com/davecgh/go-spew v1.1.1 // indirect
18+
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
19+
github.com/go-logr/logr v1.2.4 // indirect
20+
github.com/go-openapi/jsonpointer v0.19.5 // indirect
21+
github.com/go-openapi/jsonreference v0.20.0 // indirect
22+
github.com/go-openapi/swag v0.19.15 // indirect
23+
github.com/gogo/protobuf v1.3.2 // indirect
24+
github.com/golang/protobuf v1.5.3 // indirect
25+
github.com/google/gnostic v0.5.7-v3refs // indirect
26+
github.com/google/go-cmp v0.5.9 // indirect
27+
github.com/google/gofuzz v1.2.0 // indirect
28+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
29+
github.com/imdario/mergo v0.3.12 // indirect
30+
github.com/josharian/intern v1.0.0 // indirect
31+
github.com/json-iterator/go v1.1.12 // indirect
32+
github.com/mailru/easyjson v0.7.7 // indirect
33+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
34+
github.com/modern-go/reflect2 v1.0.2 // indirect
35+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
36+
github.com/pmezard/go-difflib v1.0.0 // indirect
37+
github.com/spf13/pflag v1.0.5 // indirect
38+
go.uber.org/atomic v1.9.0 // indirect
39+
go.uber.org/goleak v1.2.0 // indirect
40+
go.uber.org/multierr v1.8.0 // indirect
41+
golang.org/x/net v0.8.0 // indirect
42+
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
43+
golang.org/x/sys v0.6.0 // indirect
44+
golang.org/x/term v0.6.0 // indirect
45+
golang.org/x/text v0.8.0 // indirect
46+
golang.org/x/time v0.3.0 // indirect
47+
google.golang.org/appengine v1.6.7 // indirect
48+
google.golang.org/protobuf v1.28.1 // indirect
49+
gopkg.in/inf.v0 v0.9.1 // indirect
50+
gopkg.in/yaml.v2 v2.4.0 // indirect
51+
gopkg.in/yaml.v3 v3.0.1 // indirect
52+
k8s.io/klog/v2 v2.80.1 // indirect
53+
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
54+
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
55+
knative.dev/pkg v0.0.0-20221123011842-b78020c16606 // indirect
56+
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
57+
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
58+
)

go.sum

Lines changed: 513 additions & 0 deletions
Large diffs are not rendered by default.

pkg/common/cmd/globals.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package cmd
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"log"
8+
"strings"
9+
"time"
10+
11+
"go.uber.org/zap"
12+
13+
corev1 "k8s.io/api/core/v1"
14+
apierrors "k8s.io/apimachinery/pkg/api/errors"
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/apimachinery/pkg/util/wait"
17+
kclient "k8s.io/client-go/kubernetes"
18+
19+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/config/observability"
20+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/kubernetes"
21+
)
22+
23+
type ConfigMethod int
24+
25+
const (
26+
ConfigMethodUnknown = iota
27+
ConfigMethodKubernetesConfigMap
28+
ConfigMethodCommandLineOrEnv
29+
)
30+
31+
type Globals struct {
32+
Port int `help:"HTTP Port to listen for hook requests." env:"PORT" default:"8080"`
33+
34+
Kubeconfig string `help:"Kubeconfig file." env:"KUBECONFIG"`
35+
36+
ObservabilityConfig string `help:"JSON representation of observability configuration." env:"OBSERVABILITY_CONFIG"`
37+
38+
// Kubernetes parameters
39+
KubernetesNamespace string `help:"Namespace where the hook is running." env:"KUBERNETES_NAMESPACE"`
40+
KubernetesObservabilityConfigMapName string `help:"ConfigMap object name that contains the observability configuration." env:"KUBERNETES_OBSERVABILITY_CONFIGMAP_NAME"`
41+
42+
Context context.Context `kong:"-"`
43+
Logger *zap.SugaredLogger `kong:"-"`
44+
LogLevel zap.AtomicLevel `kong:"-"`
45+
KubeClient kclient.Interface `kong:"-"`
46+
ConfigMethod ConfigMethod `kong:"-"`
47+
}
48+
49+
func (g *Globals) Validate() error {
50+
msg := []string{}
51+
52+
switch {
53+
case g.KubernetesObservabilityConfigMapName != "":
54+
if g.KubernetesNamespace == "" {
55+
msg = append(msg, "Kubernetes namespace must be informed.")
56+
}
57+
58+
if g.ObservabilityConfig != "" {
59+
msg = append(msg, "Argument or environment config cannot be used along with Kubernetes configuration.")
60+
}
61+
62+
g.ConfigMethod = ConfigMethodKubernetesConfigMap
63+
64+
case g.ObservabilityConfig != "":
65+
if g.KubernetesObservabilityConfigMapName != "" {
66+
msg = append(msg, "Argument or environment config cannot be used along with Kubernetes configuration.")
67+
}
68+
69+
g.ConfigMethod = ConfigMethodCommandLineOrEnv
70+
}
71+
72+
if len(msg) != 0 {
73+
g.ConfigMethod = ConfigMethodUnknown
74+
return fmt.Errorf(strings.Join(msg, " "))
75+
}
76+
77+
return nil
78+
}
79+
80+
func (g *Globals) Initialize() error {
81+
var cfg *observability.Config
82+
var l *zap.Logger
83+
defaultConfigApplied := false
84+
var err error
85+
86+
kcfg, err := kubernetes.NewClient(g.Kubeconfig)
87+
if err != nil {
88+
return err
89+
}
90+
g.KubeClient = kcfg
91+
92+
switch {
93+
case g.ObservabilityConfig != "":
94+
data := map[string]string{}
95+
err = json.Unmarshal([]byte(g.ObservabilityConfig), &data)
96+
if err != nil {
97+
log.Printf("Could not appliying provided config: %v", err)
98+
defaultConfigApplied = true
99+
break
100+
}
101+
102+
cfg, err = observability.ParseFromMap(data)
103+
if err != nil || cfg.LoggerCfg == nil {
104+
log.Printf("Could not appliying provided config: %v", err)
105+
defaultConfigApplied = true
106+
}
107+
108+
case g.KubernetesObservabilityConfigMapName != "":
109+
cm := &corev1.ConfigMap{}
110+
var lastErr error
111+
if err := wait.PollImmediate(1*time.Second, 5*time.Second, func() (bool, error) {
112+
cm, lastErr = g.KubeClient.CoreV1().ConfigMaps(g.KubernetesNamespace).Get(g.Context, g.KubernetesObservabilityConfigMapName, metav1.GetOptions{})
113+
return lastErr == nil || apierrors.IsNotFound(lastErr), nil
114+
}); err != nil {
115+
log.Printf("Could not retrieve observability ConfigMap %q: %v",
116+
g.KubernetesObservabilityConfigMapName, err)
117+
defaultConfigApplied = true
118+
}
119+
120+
cfg, err = observability.ParseFromMap(cm.Data)
121+
if err != nil || cfg.LoggerCfg == nil {
122+
log.Printf("Could not apply provided config from ConfigMap %q: %v",
123+
g.KubernetesObservabilityConfigMapName, err)
124+
defaultConfigApplied = true
125+
}
126+
127+
default:
128+
log.Print("Applying default configuration")
129+
defaultConfigApplied = true
130+
}
131+
132+
if defaultConfigApplied {
133+
cfg = observability.DefaultConfig()
134+
}
135+
136+
// Call build to perform validation of zap configuration.
137+
l, err = cfg.LoggerCfg.Build()
138+
for {
139+
if err == nil {
140+
break
141+
}
142+
if defaultConfigApplied {
143+
return fmt.Errorf("default config failed to be applied due to error: %w", err)
144+
}
145+
146+
defaultConfigApplied = true
147+
cfg = observability.DefaultConfig()
148+
l, err = cfg.LoggerCfg.Build()
149+
}
150+
151+
g.LogLevel = cfg.LoggerCfg.Level
152+
153+
g.Logger = l.Sugar()
154+
g.LogLevel = cfg.LoggerCfg.Level
155+
156+
return nil
157+
}
158+
159+
func (g *Globals) Flush() {
160+
if g.Logger != nil {
161+
_ = g.Logger.Sync()
162+
}
163+
}

0 commit comments

Comments
 (0)