Skip to content

Commit bf51669

Browse files
authored
Merge pull request #56 from mengqiy/webhook
address the remaining comments from #22
2 parents 42c37db + 0bc743b commit bf51669

File tree

6 files changed

+27
-96
lines changed

6 files changed

+27
-96
lines changed

pkg/admission/cert/generator/certgenerator.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ package generator
1919
// Artifacts hosts a private key, its corresponding serving certificate and
2020
// the CA certificate that signs the serving certificate.
2121
type Artifacts struct {
22-
Key []byte
23-
Cert []byte
22+
// PEM encoded private key
23+
Key []byte
24+
// PEM encoded serving certificate
25+
Cert []byte
26+
// PEM encoded CA certificate
2427
CACert []byte
2528
}
2629

pkg/admission/cert/writer/doc.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ Create a SecretCertWriter
7070
// handler error
7171
}
7272
73-
Provision the certificates using the CertWriter.
73+
Provision the certificates using the CertWriter. The certificate will be available in the desired secrets or
74+
the desired path.
7475
7576
// writer can be either one of the CertWriters created above
7677
err = writer.EnsureCerts(webhookConfiguration) // webhookConfiguration is an existing runtime.Object

pkg/admission/cert/writer/multiple_test.go

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (f *fakeCertWriter) EnsureCerts(webhookConfig runtime.Object) error {
4141
return nil
4242
}
4343

44-
var _ = Describe("MultipleCertWriterProvider", func() {
44+
var _ = Describe("MultipleCertWriter", func() {
4545
It("should invoke Provide method of each Provider", func() {
4646
webhookConfig := &admissionregistration.MutatingWebhookConfiguration{}
4747
f := &fakeCertWriter{}
@@ -53,7 +53,7 @@ var _ = Describe("MultipleCertWriterProvider", func() {
5353
Expect(f.hasInvokedEnsureCerts).To(BeTrue())
5454
})
5555

56-
It("should return the error from each Provider", func() {
56+
It("should return the error from each CertWriter", func() {
5757
webhookConfig := &admissionregistration.MutatingWebhookConfiguration{}
5858
e := errors.New("this is an error")
5959
f := &fakeCertWriter{err: e}
@@ -65,26 +65,3 @@ var _ = Describe("MultipleCertWriterProvider", func() {
6565
Expect(f.hasInvokedEnsureCerts).To(BeTrue())
6666
})
6767
})
68-
69-
//var _ = Describe("multipleCertWriter", func() {
70-
// It("should invoke EnsureCert method of each Provider", func() {
71-
// f := &fakeCertWriter{}
72-
// m := &multiCertWriter{
73-
// certWriters: []CertWriter{f},
74-
// }
75-
// err := m.EnsureCert()
76-
// Expect(err).NotTo(HaveOccurred())
77-
// Expect(f.hasInvokedEnsureCert).To(BeTrue())
78-
// })
79-
//
80-
// It("should return error from each Provider", func() {
81-
// e := errors.New("this is an error")
82-
// f := &fakeCertWriter{err: e}
83-
// m := &multiCertWriter{
84-
// certWriters: []CertWriter{f},
85-
// }
86-
// err := m.EnsureCert()
87-
// Expect(f.hasInvokedEnsureCert).To(BeTrue())
88-
// Expect(err).To(MatchError(e))
89-
// })
90-
//})

pkg/admission/cert/writer/secret.go

Lines changed: 12 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ import (
2828
"k8s.io/apimachinery/pkg/runtime"
2929
"k8s.io/apimachinery/pkg/types"
3030
apitypes "k8s.io/apimachinery/pkg/types"
31-
31+
"k8s.io/client-go/kubernetes/scheme"
3232
"sigs.k8s.io/controller-runtime/pkg/admission/cert/generator"
3333
"sigs.k8s.io/controller-runtime/pkg/client"
34+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3435
)
3536

3637
const (
@@ -132,22 +133,25 @@ type webhookAndSecret struct {
132133

133134
var _ certReadWriter = &secretReadWriter{}
134135

135-
func (s *secretReadWriter) write(webhookName string) (
136-
*generator.Artifacts, error) {
136+
func (s *secretReadWriter) buildSecret(webhookName string) (*corev1.Secret, *generator.Artifacts, error) {
137137
v := s.webhookMap[webhookName]
138138

139139
webhook := v.webhook
140140
commonName, err := dnsNameForWebhook(&webhook.ClientConfig)
141141
if err != nil {
142-
return nil, err
142+
return nil, nil, err
143143
}
144144
certs, err := s.certGenerator.Generate(commonName)
145145
if err != nil {
146-
return nil, err
146+
return nil, nil, err
147147
}
148148
secret := certsToSecret(certs, v.secret)
149-
// TODO: fix it: see the TODO in the method
150-
err = setOwnerRef(secret, s.webhookConfig)
149+
err = controllerutil.SetControllerReference(s.webhookConfig.(metav1.Object), secret, scheme.Scheme)
150+
return secret, certs, err
151+
}
152+
153+
func (s *secretReadWriter) write(webhookName string) (*generator.Artifacts, error) {
154+
secret, certs, err := s.buildSecret(webhookName)
151155
if err != nil {
152156
return nil, err
153157
}
@@ -157,20 +161,7 @@ func (s *secretReadWriter) write(webhookName string) (
157161

158162
func (s *secretReadWriter) overwrite(webhookName string) (
159163
*generator.Artifacts, error) {
160-
v := s.webhookMap[webhookName]
161-
162-
webhook := v.webhook
163-
commonName, err := dnsNameForWebhook(&webhook.ClientConfig)
164-
if err != nil {
165-
return nil, err
166-
}
167-
certs, err := s.certGenerator.Generate(commonName)
168-
if err != nil {
169-
return nil, err
170-
}
171-
secret := certsToSecret(certs, v.secret)
172-
// TODO: fix it: see the TODO in the method
173-
err = setOwnerRef(secret, s.webhookConfig)
164+
secret, certs, err := s.buildSecret(webhookName)
174165
if err != nil {
175166
return nil, err
176167
}
@@ -185,37 +176,6 @@ func (s *secretReadWriter) read(webhookName string) (*generator.Artifacts, error
185176
return secretToCerts(secret), err
186177
}
187178

188-
// setOwnerRef marks the webhook as the owner of the secret by setting the ownerReference in the secret.
189-
func setOwnerRef(secret, webhookConfig runtime.Object) error {
190-
accessor, err := meta.Accessor(webhookConfig)
191-
if err != nil {
192-
return err
193-
}
194-
// TODO: typeAccessor.GetAPIVersion() and typeAccessor.GetKind() returns empty apiVersion and Kind, fix it.
195-
typeAccessor, err := meta.TypeAccessor(webhookConfig)
196-
if err != nil {
197-
return err
198-
}
199-
blockOwnerDeletion := false
200-
// Due to
201-
// https://github.com/kubernetes/kubernetes/blob/5da925ad4fd070e687dc5255c177d5e7d542edd7/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref.go#L35
202-
isController := true
203-
ownerRef := metav1.OwnerReference{
204-
APIVersion: typeAccessor.GetAPIVersion(),
205-
Kind: typeAccessor.GetKind(),
206-
Name: accessor.GetName(),
207-
UID: accessor.GetUID(),
208-
BlockOwnerDeletion: &blockOwnerDeletion,
209-
Controller: &isController,
210-
}
211-
secretAccessor, err := meta.Accessor(secret)
212-
if err != nil {
213-
return err
214-
}
215-
secretAccessor.SetOwnerReferences([]metav1.OwnerReference{ownerRef})
216-
return nil
217-
}
218-
219179
func secretToCerts(secret *corev1.Secret) *generator.Artifacts {
220180
if secret.Data == nil {
221181
return nil
@@ -229,10 +189,6 @@ func secretToCerts(secret *corev1.Secret) *generator.Artifacts {
229189

230190
func certsToSecret(certs *generator.Artifacts, sec apitypes.NamespacedName) *corev1.Secret {
231191
return &corev1.Secret{
232-
TypeMeta: metav1.TypeMeta{
233-
APIVersion: "v1",
234-
Kind: "Secret",
235-
},
236192
ObjectMeta: metav1.ObjectMeta{
237193
Namespace: sec.Namespace,
238194
Name: sec.Name,

pkg/admission/cert/writer/secret_test.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ var _ = Describe("SecretCertProvider", func() {
4848
url = "https://example.com/admission"
4949
mwc = &admissionregistration.MutatingWebhookConfiguration{
5050
TypeMeta: metav1.TypeMeta{
51-
APIVersion: "admissionregistration/v1beta1",
51+
APIVersion: "admissionregistration.k8s.io/v1beta1",
5252
Kind: "MutatingWebhookConfiguration",
5353
},
5454
ObjectMeta: metav1.ObjectMeta{
@@ -72,7 +72,7 @@ var _ = Describe("SecretCertProvider", func() {
7272
}
7373
vwc = &admissionregistration.ValidatingWebhookConfiguration{
7474
TypeMeta: metav1.TypeMeta{
75-
APIVersion: "admissionregistration/v1beta1",
75+
APIVersion: "admissionregistration.k8s.io/v1beta1",
7676
Kind: "MutatingWebhookConfiguration",
7777
},
7878
ObjectMeta: metav1.ObjectMeta{
@@ -166,21 +166,17 @@ var _ = Describe("SecretCertProvider", func() {
166166
certWriter = secretCertWriter
167167

168168
isController := true
169-
blockOwnerDeletion := false
169+
blockOwnerDeletion := true
170170
secret = &corev1.Secret{
171-
TypeMeta: metav1.TypeMeta{
172-
APIVersion: "v1",
173-
Kind: "Secret",
174-
},
175171
ObjectMeta: metav1.ObjectMeta{
176172
Namespace: "namespace-bar",
177173
Name: "secret-foo",
178174
OwnerReferences: []metav1.OwnerReference{
179175
{
180-
APIVersion: "admissionregistration/v1beta1",
176+
APIVersion: "admissionregistration.k8s.io/v1beta1",
181177
Kind: "MutatingWebhookConfiguration",
182178
Name: "test-mwc",
183-
UID: types.UID("123456"),
179+
UID: "123456",
184180
BlockOwnerDeletion: &blockOwnerDeletion,
185181
Controller: &isController,
186182
},

pkg/admission/controller.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@ limitations under the License.
1717
package admission
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122
"sync"
2223

2324
"k8s.io/apimachinery/pkg/runtime"
24-
25-
"fmt"
26-
2725
"sigs.k8s.io/controller-runtime/pkg/admission/cert/generator"
2826
"sigs.k8s.io/controller-runtime/pkg/admission/cert/writer"
2927
"sigs.k8s.io/controller-runtime/pkg/client"

0 commit comments

Comments
 (0)