forked from voyagermesh/voyager
-
Notifications
You must be signed in to change notification settings - Fork 0
/
operator.go
102 lines (90 loc) · 2.69 KB
/
operator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package operator
import (
"sync"
"time"
"github.com/appscode/log"
tapi "github.com/appscode/voyager/api"
tcs "github.com/appscode/voyager/client/clientset"
"github.com/appscode/voyager/pkg/certificate"
"github.com/appscode/voyager/pkg/config"
"github.com/appscode/voyager/pkg/eventer"
pcm "github.com/coreos/prometheus-operator/pkg/client/monitoring/v1alpha1"
kerr "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientset "k8s.io/client-go/kubernetes"
extensions "k8s.io/client-go/pkg/apis/extensions/v1beta1"
"k8s.io/client-go/tools/record"
)
type Operator struct {
KubeClient clientset.Interface
ExtClient tcs.ExtensionInterface
PromClient pcm.MonitoringV1alpha1Interface
Opt config.Options
recorder record.EventRecorder
SyncPeriod time.Duration
sync.Mutex
}
func New(
kubeClient clientset.Interface,
extClient tcs.ExtensionInterface,
promClient pcm.MonitoringV1alpha1Interface,
opt config.Options,
) *Operator {
return &Operator{
KubeClient: kubeClient,
ExtClient: extClient,
PromClient: promClient,
Opt: opt,
recorder: eventer.NewEventRecorder(kubeClient, "voyager operator"),
SyncPeriod: 2 * time.Minute,
}
}
func (op *Operator) Setup() error {
log.Infoln("Ensuring TPR registration")
if err := op.ensureThirdPartyResource(tapi.ResourceNameIngress + "." + tapi.V1beta1SchemeGroupVersion.Group); err != nil {
return err
}
if err := op.ensureThirdPartyResource(tapi.ResourceNameCertificate + "." + tapi.V1beta1SchemeGroupVersion.Group); err != nil {
return err
}
return nil
}
func (op *Operator) ensureThirdPartyResource(resourceName string) error {
_, err := op.KubeClient.ExtensionsV1beta1().ThirdPartyResources().Get(resourceName, metav1.GetOptions{})
if !kerr.IsNotFound(err) {
return err
}
thirdPartyResource := &extensions.ThirdPartyResource{
TypeMeta: metav1.TypeMeta{
APIVersion: "extensions/v1beta1",
Kind: "ThirdPartyResource",
},
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Labels: map[string]string{
"app": "voyager",
},
},
Description: "Voyager by AppsCode - Secure Ingress Controller for Kubernetes",
Versions: []extensions.APIVersion{
{
Name: tapi.V1beta1SchemeGroupVersion.Version,
},
},
}
_, err = op.KubeClient.ExtensionsV1beta1().ThirdPartyResources().Create(thirdPartyResource)
return err
}
func (op *Operator) Run() {
go op.WatchNamespaces()
go op.WatchConfigMaps()
go op.WatchServiceMonitors()
go op.WatchDaemonSets()
go op.WatchDeployments()
go op.WatchServices()
go op.WatchEndpoints()
go op.WatchIngresses()
go op.WatchIngressTPRs()
go op.WatchCertificateTPRs()
go certificate.CheckCertificates(op.KubeClient, op.ExtClient, op.Opt)
}