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

Commit 511ec59

Browse files
author
Pablo Mercado
authored
Merge pull request #6 from triggermesh/task/example-kuard
kuard handler example
2 parents c38bee1 + c47aca1 commit 511ec59

File tree

8 files changed

+237
-58
lines changed

8 files changed

+237
-58
lines changed

cmd/triggermesh-hook/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
package main
25

36
import (

cmd/triggermesh-hook/start/start.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ package start
55

66
import (
77
commoncmd "github.com/triggermesh/scoby-hook-triggermesh/pkg/common/cmd"
8+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/handler"
9+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/handler/kuards"
10+
811
"github.com/triggermesh/scoby-hook-triggermesh/pkg/server"
912
)
1013

@@ -13,9 +16,14 @@ type Cmd struct {
1316
Path string `help:"Path where hook requests are served." env:"PATH" default:"v1"`
1417
}
1518

16-
func (c *Cmd) Run(globals *commoncmd.Globals) error {
17-
globals.Logger.Debug("Creating TriggerMesh hook server")
19+
func (c *Cmd) Run(g *commoncmd.Globals) error {
20+
g.Logger.Debug("Creating TriggerMesh hook server")
21+
22+
r := handler.NewRegistry([]handler.Handler{
23+
// Kuards is a temporary playground
24+
kuards.New(),
25+
})
1826

19-
s := server.New(c.Path, c.Address, globals.Logger)
20-
return s.Start(globals.Context)
27+
s := server.New(c.Path, c.Address, r, g.DynClient, g.Logger)
28+
return s.Start(g.Context)
2129
}

pkg/common/cmd/globals.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
package cmd
25

36
import (
@@ -14,6 +17,7 @@ import (
1417
apierrors "k8s.io/apimachinery/pkg/api/errors"
1518
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1619
"k8s.io/apimachinery/pkg/util/wait"
20+
kdclient "k8s.io/client-go/dynamic"
1721
kclient "k8s.io/client-go/kubernetes"
1822

1923
"github.com/triggermesh/scoby-hook-triggermesh/pkg/config/observability"
@@ -43,6 +47,7 @@ type Globals struct {
4347
Logger *zap.SugaredLogger `kong:"-"`
4448
LogLevel zap.AtomicLevel `kong:"-"`
4549
KubeClient kclient.Interface `kong:"-"`
50+
DynClient kdclient.Interface `kong:"-"`
4651
ConfigMethod ConfigMethod `kong:"-"`
4752
}
4853

@@ -83,11 +88,11 @@ func (g *Globals) Initialize() error {
8388
defaultConfigApplied := false
8489
var err error
8590

86-
kcfg, err := kubernetes.NewClient(g.Kubeconfig)
91+
kc, kdc, err := kubernetes.NewClients(g.Kubeconfig)
8792
if err != nil {
8893
return err
8994
}
90-
g.KubeClient = kcfg
95+
g.KubeClient, g.DynClient = kc, kdc
9196

9297
switch {
9398
case g.ObservabilityConfig != "":

pkg/handler/handler.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package handler
5+
6+
import (
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
10+
hookv1 "github.com/triggermesh/scoby/pkg/hook/v1"
11+
)
12+
13+
type HandlerD struct {
14+
GVR schema.GroupVersionResource
15+
Kind string
16+
}
17+
18+
// Handler exposes methods for hook handler registration and reconciling.
19+
type Handler interface {
20+
// GVR for the managed object
21+
GroupVersionResource() *schema.GroupVersionResource
22+
// Kind for the managed object
23+
Kind() string
24+
25+
Reconcile(obj metav1.Object) *hookv1.HookResponse
26+
}
27+
28+
// HandlerFinalizable exposes methods for hook handler finalize operation.
29+
type HandlerFinalizable interface {
30+
Finalize(obj metav1.Object) *hookv1.HookResponse
31+
}

pkg/handler/kuards/kuards.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package kuards
5+
6+
import (
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
10+
commonv1alpha1 "github.com/triggermesh/scoby/pkg/apis/common/v1alpha1"
11+
hookv1 "github.com/triggermesh/scoby/pkg/hook/v1"
12+
corev1 "k8s.io/api/core/v1"
13+
14+
"github.com/triggermesh/scoby-hook-triggermesh/pkg/handler"
15+
)
16+
17+
type KuardHandler struct {
18+
gvr schema.GroupVersionResource
19+
kind string
20+
}
21+
22+
var _ handler.Handler = (*KuardHandler)(nil)
23+
24+
func New() *KuardHandler {
25+
return &KuardHandler{
26+
gvr: schema.GroupVersionResource{
27+
Group: "extensions.triggermesh.io",
28+
Version: "v1",
29+
Resource: "kuards",
30+
},
31+
kind: "Kuard",
32+
}
33+
}
34+
35+
func (h *KuardHandler) GroupVersionResource() *schema.GroupVersionResource {
36+
return &h.gvr
37+
}
38+
39+
// Kind for the managed object
40+
func (h *KuardHandler) Kind() string {
41+
return h.kind
42+
}
43+
44+
func (h *KuardHandler) Reconcile(obj metav1.Object) *hookv1.HookResponse {
45+
return &hookv1.HookResponse{
46+
Status: &hookv1.HookStatus{
47+
Conditions: commonv1alpha1.Conditions{
48+
{
49+
Type: "HookReportedStatus",
50+
Status: metav1.ConditionTrue,
51+
Reason: "HOOKREPORTSOK",
52+
},
53+
},
54+
Annotations: map[string]string{
55+
"io.triggermesh.hook/my-annotation": "annotation from hook",
56+
},
57+
},
58+
EnvVars: []corev1.EnvVar{
59+
{
60+
Name: "FROM_HOOK_NAME",
61+
Value: obj.GetName(),
62+
},
63+
{
64+
Name: "FROM_HOOK_NAMESPACE",
65+
Value: obj.GetNamespace(),
66+
},
67+
},
68+
}
69+
}
70+
71+
func (h *KuardHandler) Finalize(obj metav1.Object) *hookv1.HookResponse {
72+
return &hookv1.HookResponse{
73+
Status: &hookv1.HookStatus{
74+
Annotations: map[string]string{
75+
"io.triggermesh.hook/my-annotation": "deletion ok",
76+
},
77+
},
78+
}
79+
}

pkg/handler/registry.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package handler
5+
6+
import (
7+
"k8s.io/apimachinery/pkg/runtime/schema"
8+
)
9+
10+
type Registry map[schema.GroupVersionKind]Handler
11+
12+
func NewRegistry(h []Handler) Registry {
13+
r := make(map[schema.GroupVersionKind]Handler, len(h))
14+
15+
for i := range h {
16+
gvr := h[i].GroupVersionResource()
17+
r[schema.GroupVersionKind{
18+
Group: gvr.Group,
19+
Version: gvr.Version,
20+
Kind: h[i].Kind(),
21+
}] = h[i]
22+
}
23+
24+
return r
25+
}

pkg/kubernetes/client.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
// Copyright 2023 TriggerMesh Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
package kubernetes
25

36
import (
47
"os"
58
"path/filepath"
69

10+
kdclient "k8s.io/client-go/dynamic"
711
kclient "k8s.io/client-go/kubernetes"
812
restclient "k8s.io/client-go/rest"
913
"k8s.io/client-go/tools/clientcmd"
@@ -32,11 +36,21 @@ func NewConfig(path string) (*restclient.Config, error) {
3236
return restclient.InClusterConfig()
3337
}
3438

35-
func NewClient(path string) (kclient.Interface, error) {
39+
func NewClients(path string) (kclient.Interface, kdclient.Interface, error) {
3640
cfg, err := NewConfig(path)
3741
if err != nil {
38-
return nil, err
42+
return nil, nil, err
43+
}
44+
45+
kc, err := kclient.NewForConfig(cfg)
46+
if err != nil {
47+
return nil, nil, err
48+
}
49+
50+
kdc, err := kdclient.NewForConfig(cfg)
51+
if err != nil {
52+
return nil, nil, err
3953
}
4054

41-
return kclient.NewForConfig(cfg)
55+
return kc, kdc, err
4256
}

0 commit comments

Comments
 (0)