This repository has been archived by the owner on Oct 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.go
115 lines (93 loc) · 3.79 KB
/
main.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
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"context"
"github.com/googleinterns/knative-continuous-delivery/pkg/defaults"
"k8s.io/apimachinery/pkg/runtime/schema"
"knative.dev/pkg/configmap"
"knative.dev/pkg/controller"
"knative.dev/pkg/injection/sharedmain"
"knative.dev/pkg/logging"
"knative.dev/pkg/signals"
"knative.dev/pkg/webhook"
"knative.dev/pkg/webhook/certificates"
"knative.dev/pkg/webhook/resourcesemantics"
"knative.dev/pkg/webhook/resourcesemantics/defaulting"
"knative.dev/pkg/webhook/resourcesemantics/validation"
deliveryv1alpha1 "github.com/googleinterns/knative-continuous-delivery/pkg/apis/delivery/v1alpha1"
defaultconfig "knative.dev/serving/pkg/apis/config"
servingv1 "knative.dev/serving/pkg/apis/serving/v1"
deliveryclient "github.com/googleinterns/knative-continuous-delivery/pkg/client/injection/client"
policystate "github.com/googleinterns/knative-continuous-delivery/pkg/client/injection/informers/delivery/v1alpha1/policystate"
)
var types = map[schema.GroupVersionKind]resourcesemantics.GenericCRD{
servingv1.SchemeGroupVersion.WithKind("Route"): &defaults.ContinuousDeploymentRoute{},
deliveryv1alpha1.SchemeGroupVersion.WithKind("Policy"): &deliveryv1alpha1.Policy{},
}
func newDefaultingAdmissionController(ctx context.Context, cmw configmap.Watcher) *controller.Impl {
// Decorate contexts with the current state of the config.
store := defaultconfig.NewStore(logging.FromContext(ctx).Named("config-store"))
store.WatchConfigs(cmw)
return defaulting.NewAdmissionController(ctx,
// Name of the resource webhook.
"webhook.continuous-delivery.knative.dev",
// The path on which to serve the webhook.
"/defaulting",
// The resources to default.
types,
// A function that infuses the context passed to Validate/SetDefaults with custom metadata.
func(c context.Context) context.Context {
inf := policystate.Get(ctx)
clt := deliveryclient.Get(ctx)
c = context.WithValue(c, policystate.Key{}, inf)
c = context.WithValue(c, deliveryclient.Key{}, clt)
return c
},
// Whether to disallow unknown fields.
true,
)
}
func newValidationAdmissionController(ctx context.Context, cmw configmap.Watcher) *controller.Impl {
// Decorate contexts with the current state of the config.
store := defaultconfig.NewStore(logging.FromContext(ctx).Named("config-store"))
store.WatchConfigs(cmw)
return validation.NewAdmissionController(ctx,
// Name of the resource webhook.
"validation.webhook.continuous-delivery.knative.dev",
// The path on which to serve the webhook.
"/resource-validation",
// The resources to validate.
types,
// A function that infuses the context passed to Validate/SetDefaults with custom metadata.
func(ctx context.Context) context.Context {
return ctx
},
// Whether to disallow unknown fields.
true,
)
}
func main() {
// Set up a signal context with our webhook options
ctx := webhook.WithOptions(signals.NewContext(), webhook.Options{
ServiceName: "continuous-delivery-webhook",
Port: webhook.PortFromEnv(8443),
SecretName: "continuous-delivery-webhook-certs",
})
sharedmain.WebhookMainWithContext(ctx,
"continuous-delivery-webhook",
certificates.NewController,
newDefaultingAdmissionController,
newValidationAdmissionController)
}