Skip to content

Commit 1d5ec33

Browse files
Merge pull request #308 from jewzaam/podimagespec-kubeconfig
Updated podimagespec to support HCP
2 parents 81099c8 + d6e36b7 commit 1d5ec33

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)