Skip to content

Commit d6e36b7

Browse files
committed
Updated podimagespec to support HCP
Requires getting kubeconfig to the KAS for the HCP, not the cluster where the webbhook pod is running.
1 parent 81099c8 commit d6e36b7

File tree

5 files changed

+83
-7
lines changed

5 files changed

+83
-7
lines changed

build/resources.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,14 @@ func createPackagedDeployment(replicas int32, phase string) *appsv1.Deployment {
465465
},
466466
},
467467
},
468+
{
469+
Name: "hosted-kubeconfig",
470+
VolumeSource: corev1.VolumeSource{
471+
Secret: &corev1.SecretVolumeSource{
472+
SecretName: "service-network-admin-kubeconfig",
473+
},
474+
},
475+
},
468476
},
469477
Containers: []corev1.Container{
470478
{
@@ -484,6 +492,11 @@ func createPackagedDeployment(replicas int32, phase string) *appsv1.Deployment {
484492
MountPath: "/service-ca",
485493
ReadOnly: true,
486494
},
495+
{
496+
Name: "hosted-kubeconfig",
497+
MountPath: "/etc/hosted-kubernetes",
498+
ReadOnly: true,
499+
},
487500
},
488501
Ports: []corev1.ContainerPort{
489502
{
@@ -497,6 +510,12 @@ func createPackagedDeployment(replicas int32, phase string) *appsv1.Deployment {
497510
"-cacert", "/service-ca/service-ca.crt",
498511
"-tls",
499512
},
513+
Env: []corev1.EnvVar{
514+
{
515+
Name: "KUBECONFIG",
516+
Value: "/etc/hosted-kubernetes/kubeconfig",
517+
},
518+
},
500519
},
501520
},
502521
},

config/package/resources.yaml.gotmpl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ spec:
9696
- -cacert
9797
- /service-ca/service-ca.crt
9898
- -tls
99+
env:
100+
- name: KUBECONFIG
101+
value: /etc/hosted-kubernetes/kubeconfig
99102
image: REPLACED_BY_PIPELINE
100103
imagePullPolicy: IfNotPresent
101104
name: webhooks
@@ -109,6 +112,9 @@ spec:
109112
- mountPath: /service-ca
110113
name: service-ca
111114
readOnly: true
115+
- mountPath: /etc/hosted-kubernetes
116+
name: hosted-kubeconfig
117+
readOnly: true
112118
restartPolicy: Always
113119
tolerations:
114120
- effect: NoSchedule
@@ -130,6 +136,9 @@ spec:
130136
- configMap:
131137
name: webhook-cert
132138
name: service-ca
139+
- name: hosted-kubeconfig
140+
secret:
141+
secretName: service-network-admin-kubeconfig
133142
status: {}
134143
---
135144
apiVersion: admissionregistration.k8s.io/v1

pkg/dispatcher/dispatcher.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ func (d *Dispatcher) HandleRequest(w http.ResponseWriter, r *http.Request) {
6666
// Valid AdmissionReview, but we can't do anything with it because we do not
6767
// think the request inside is valid.
6868
if !hook().Validate(request) {
69+
err = fmt.Errorf("not a valid webhook request")
70+
log.Error(err, "Error validaing HTTP Request Body")
6971
responsehelper.SendResponse(w,
70-
admissionctl.Errored(http.StatusBadRequest,
71-
fmt.Errorf("Not a valid webhook request")))
72+
admissionctl.Errored(http.StatusBadRequest, err))
7273
return
7374
}
7475

@@ -83,5 +84,5 @@ func (d *Dispatcher) HandleRequest(w http.ResponseWriter, r *http.Request) {
8384
w.WriteHeader(404)
8485
responsehelper.SendResponse(w,
8586
admissionctl.Errored(http.StatusBadRequest,
86-
fmt.Errorf("Request is not for a registered webhook")))
87+
fmt.Errorf("request is not for a registered webhook")))
8788
}

pkg/k8sutil/k8sutil.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"k8s.io/apimachinery/pkg/runtime"
99
"k8s.io/client-go/rest"
10+
"k8s.io/client-go/tools/clientcmd"
1011
"sigs.k8s.io/controller-runtime/pkg/client"
1112
logf "sigs.k8s.io/controller-runtime/pkg/log"
1213
)
@@ -28,9 +29,28 @@ var (
2829
ErrRunLocal = fmt.Errorf("operator run mode forced to local")
2930
)
3031

32+
func buildConfig(kubeconfig string) (*rest.Config, error) {
33+
// Try loading KUBECONFIG env var. If not set fallback on InClusterConfig
34+
35+
if kubeconfig != "" {
36+
cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
37+
if err != nil {
38+
return nil, err
39+
}
40+
return cfg, nil
41+
}
42+
43+
cfg, err := rest.InClusterConfig()
44+
if err != nil {
45+
return nil, err
46+
}
47+
return cfg, nil
48+
}
49+
3150
// KubeClient creates a new kubeclient that interacts with the Kube api with the service account secrets
3251
func KubeClient(s *runtime.Scheme) (client.Client, error) {
33-
config, err := rest.InClusterConfig()
52+
// Try loading KUBECONFIG env var. Else falls back on in-cluster config
53+
config, err := buildConfig(os.Getenv("KUBECONFIG"))
3454
if err != nil {
3555
return nil, err
3656
}

pkg/webhooks/podimagespec/podimagespec.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import (
44
"context"
55
"fmt"
66
"net/http"
7+
"os"
78
"regexp"
89

910
"github.com/openshift/managed-cluster-validating-webhooks/pkg/k8sutil"
1011
"github.com/openshift/managed-cluster-validating-webhooks/pkg/webhooks/utils"
1112

1213
imagestreamv1 "github.com/openshift/api/image/v1"
13-
configv1 "github.com/openshift/api/imageregistry/v1"
1414
registryv1 "github.com/openshift/api/imageregistry/v1"
1515
operatorv1 "github.com/openshift/api/operator/v1"
16+
admissionv1 "k8s.io/api/admission/v1"
1617
admissionregv1 "k8s.io/api/admissionregistration/v1"
1718
corev1 "k8s.io/api/core/v1"
1819
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -57,8 +58,33 @@ type PodImageSpecWebhook struct {
5758
// NewWebhook creates the new webhook
5859
func NewWebhook() *PodImageSpecWebhook {
5960
scheme := runtime.NewScheme()
60-
configv1.Install(scheme)
61-
imagestreamv1.Install(scheme)
61+
62+
err := admissionv1.AddToScheme(scheme)
63+
if err != nil {
64+
log.Error(err, "Fail adding admissionv1 scheme to PodImageSpecWebhook")
65+
os.Exit(1)
66+
}
67+
err = admissionregv1.AddToScheme(scheme)
68+
if err != nil {
69+
log.Error(err, "Fail adding admissionregv1 scheme to PodImageSpecWebhook")
70+
os.Exit(1)
71+
}
72+
err = corev1.AddToScheme(scheme)
73+
if err != nil {
74+
log.Error(err, "Fail adding corev1 scheme to PodImageSpecWebhook")
75+
os.Exit(1)
76+
}
77+
err = imagestreamv1.AddToScheme(scheme)
78+
if err != nil {
79+
log.Error(err, "Fail adding imagestreamv1 scheme to PodImageSpecWebhook")
80+
os.Exit(1)
81+
}
82+
err = registryv1.AddToScheme(scheme)
83+
if err != nil {
84+
log.Error(err, "Fail adding registryv1 scheme to PodImageSpecWebhook")
85+
os.Exit(1)
86+
}
87+
6288
return &PodImageSpecWebhook{
6389
s: scheme,
6490
}
@@ -84,6 +110,7 @@ func (s *PodImageSpecWebhook) authorized(request admissionctl.Request) admission
84110
if s.kubeClient == nil {
85111
s.kubeClient, err = k8sutil.KubeClient(s.s)
86112
if err != nil {
113+
log.Error(err, "Fail creating KubeClient for PodImageSpecWebhook")
87114
ret = admissionctl.Errored(http.StatusBadRequest, err)
88115
ret.UID = request.AdmissionRequest.UID
89116
return ret

0 commit comments

Comments
 (0)