• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SAP / sap-btp-service-operator / 14905262333

08 May 2025 11:20AM UTC coverage: 78.553% (-2.1%) from 80.652%
14905262333

Pull #520

github

I065450
bump libs
Pull Request #520: Bump go version

48 of 52 new or added lines in 6 files covered. (92.31%)

77 existing lines in 3 files now uncovered.

2747 of 3497 relevant lines covered (78.55%)

0.88 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/api/v1/webhooks/serviceinstance_mutating_webhook.go
1
package webhooks
2

3
import (
4
        "context"
5
        "encoding/json"
6
        "fmt"
7
        "net/http"
8
        "reflect"
9

10
        v1admission "k8s.io/api/admission/v1"
11
        v1 "k8s.io/api/authentication/v1"
12

13
        servicesv1 "github.com/SAP/sap-btp-service-operator/api/v1"
14
        logf "sigs.k8s.io/controller-runtime/pkg/log"
15
        "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
16
)
17

18
// +kubebuilder:webhook:path=/mutate-services-cloud-sap-com-v1-serviceinstance,mutating=true,failurePolicy=fail,groups=services.cloud.sap.com,resources=serviceinstances,verbs=create;update,versions=v1,name=mserviceinstance.kb.io,sideEffects=None,admissionReviewVersions=v1beta1;v1
19

20
var instancelog = logf.Log.WithName("serviceinstance-webhook")
21

22
type ServiceInstanceDefaulter struct {
23
        Decoder admission.Decoder
24
}
25

UNCOV
26
func (s *ServiceInstanceDefaulter) Handle(_ context.Context, req admission.Request) admission.Response {
×
UNCOV
27
        instancelog.Info("Defaulter webhook for serviceinstance")
×
UNCOV
28
        instance := &servicesv1.ServiceInstance{}
×
UNCOV
29
        if err := s.Decoder.Decode(req, instance); err != nil {
×
30
                return admission.Errored(http.StatusBadRequest, err)
×
31
        }
×
32

UNCOV
33
        if req.Operation == v1admission.Create {
×
UNCOV
34
                instance.Spec.UserInfo = &v1.UserInfo{
×
UNCOV
35
                        Username: req.UserInfo.Username,
×
UNCOV
36
                        UID:      req.UserInfo.UID,
×
UNCOV
37
                        Groups:   req.UserInfo.Groups,
×
UNCOV
38
                        Extra:    req.UserInfo.Extra,
×
UNCOV
39
                }
×
UNCOV
40
        } else {
×
UNCOV
41
                oldInstance := &servicesv1.ServiceInstance{}
×
UNCOV
42
                err := s.Decoder.DecodeRaw(req.OldObject, oldInstance)
×
UNCOV
43
                if err != nil {
×
44
                        return admission.Errored(http.StatusInternalServerError, err)
×
45
                }
×
46

UNCOV
47
                if instance.Spec.UserInfo == nil {
×
48
                        instance.Spec.UserInfo = oldInstance.Spec.UserInfo
×
UNCOV
49
                } else if !reflect.DeepEqual(instance.Spec.UserInfo, oldInstance.Spec.UserInfo) {
×
UNCOV
50
                        return admission.Errored(http.StatusBadRequest, fmt.Errorf("modifying spec.userInfo is not allowed"))
×
UNCOV
51
                }
×
UNCOV
52
                if !reflect.DeepEqual(oldInstance.Spec, instance.Spec) { //UserInfo is updated only when spec is changed
×
UNCOV
53
                        instance.Spec.UserInfo = &v1.UserInfo{
×
UNCOV
54
                                Username: req.UserInfo.Username,
×
UNCOV
55
                                UID:      req.UserInfo.UID,
×
UNCOV
56
                                Groups:   req.UserInfo.Groups,
×
UNCOV
57
                                Extra:    req.UserInfo.Extra,
×
UNCOV
58
                        }
×
UNCOV
59
                }
×
60
        }
UNCOV
61
        if len(instance.Spec.ExternalName) == 0 {
×
UNCOV
62
                instancelog.Info(fmt.Sprintf("externalName not provided, defaulting to k8s name: %s", instance.Name))
×
UNCOV
63
                instance.Spec.ExternalName = instance.Name
×
UNCOV
64
        }
×
65

UNCOV
66
        marshaledInstance, err := json.Marshal(instance)
×
UNCOV
67
        if err != nil {
×
68
                return admission.Errored(http.StatusInternalServerError, err)
×
69
        }
×
70

UNCOV
71
        return admission.PatchResponseFromRaw(req.Object.Raw, marshaledInstance)
×
72
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc