@@ -5,11 +5,14 @@ import (
55 "encoding/json"
66 "fmt"
77 "net/http"
8+ "reflect"
9+
10+ v1admission "k8s.io/api/admission/v1"
11+ v1 "k8s.io/api/authentication/v1"
812
913 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1014
1115 "github.com/SAP/sap-btp-service-operator/api/v1alpha1"
12- v1 "k8s.io/api/authentication/v1"
1316 "sigs.k8s.io/controller-runtime/pkg/client"
1417 logf "sigs.k8s.io/controller-runtime/pkg/log"
1518 "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -42,11 +45,10 @@ func (s *ServiceInstanceDefaulter) Handle(_ context.Context, req admission.Reque
4245 instancelog .Info ("externalName not provided, defaulting to k8s name" , "name" , instance .Name )
4346 instance .Spec .ExternalName = instance .Name
4447 }
45- instance .Spec .UserInfo = & v1.UserInfo {
46- Username : req .UserInfo .Username ,
47- UID : req .UserInfo .UID ,
48- Groups : req .UserInfo .Groups ,
49- Extra : req .UserInfo .Extra ,
48+
49+ err = s .setServiceInstanceUserInfo (req , instance )
50+ if err != nil {
51+ return admission .Errored (http .StatusInternalServerError , err )
5052 }
5153
5254 marshaledInstance , err := json .Marshal (instance )
@@ -56,6 +58,28 @@ func (s *ServiceInstanceDefaulter) Handle(_ context.Context, req admission.Reque
5658 return admission .PatchResponseFromRaw (req .Object .Raw , marshaledInstance )
5759}
5860
61+ func (s * ServiceInstanceDefaulter ) setServiceInstanceUserInfo (req admission.Request , instance * v1alpha1.ServiceInstance ) error {
62+ userInfo := & v1.UserInfo {
63+ Username : req .UserInfo .Username ,
64+ UID : req .UserInfo .UID ,
65+ Groups : req .UserInfo .Groups ,
66+ Extra : req .UserInfo .Extra ,
67+ }
68+ if req .Operation == v1admission .Create || req .Operation == v1admission .Delete {
69+ instance .Spec .UserInfo = userInfo
70+ } else if req .Operation == v1admission .Update {
71+ oldInstance := & v1alpha1.ServiceInstance {}
72+ err := s .decoder .DecodeRaw (req .OldObject , oldInstance )
73+ if err != nil {
74+ return err
75+ }
76+ if ! reflect .DeepEqual (oldInstance .Spec , instance .Spec ) {
77+ instance .Spec .UserInfo = userInfo
78+ }
79+ }
80+ return nil
81+ }
82+
5983func (s * ServiceInstanceDefaulter ) InjectDecoder (d * admission.Decoder ) error {
6084 s .decoder = d
6185 return nil
0 commit comments