Skip to content

Commit bc36bee

Browse files
authored
fix: fixing nil pointer error when converting VAPB from v1beta1 to v1, CP (#3754) (#3765)
1 parent bb0103c commit bc36bee

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

pkg/controller/constraint/constraint_controller.go

+1
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ func v1beta1ToV1(v1beta1Obj *admissionregistrationv1beta1.ValidatingAdmissionPol
737737

738738
obj.Spec.ValidationActions = actions
739739
if v1beta1Obj.Spec.MatchResources != nil {
740+
obj.Spec.MatchResources = &admissionregistrationv1.MatchResources{}
740741
if v1beta1Obj.Spec.MatchResources.ObjectSelector != nil {
741742
obj.Spec.MatchResources.ObjectSelector = v1beta1Obj.Spec.MatchResources.ObjectSelector
742743
}

pkg/controller/constraint/constraint_controller_test.go

+102
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package constraint
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"reflect"
78
"strings"
89
"testing"
@@ -14,9 +15,12 @@ import (
1415
"github.com/open-policy-agent/frameworks/constraint/pkg/core/templates"
1516
constraintstatusv1beta1 "github.com/open-policy-agent/gatekeeper/v3/apis/status/v1beta1"
1617
celSchema "github.com/open-policy-agent/gatekeeper/v3/pkg/drivers/k8scel/schema"
18+
"github.com/open-policy-agent/gatekeeper/v3/pkg/drivers/k8scel/transform"
1719
"github.com/open-policy-agent/gatekeeper/v3/pkg/metrics"
1820
"github.com/open-policy-agent/gatekeeper/v3/pkg/target"
1921
"github.com/open-policy-agent/gatekeeper/v3/pkg/util"
22+
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
23+
admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
2024
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2125
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2226
"k8s.io/utils/ptr"
@@ -619,6 +623,104 @@ func TestReportErrorOnConstraintStatus(t *testing.T) {
619623
}
620624
}
621625

626+
func TestV1beta1ToV1(t *testing.T) {
627+
tests := []struct {
628+
name string
629+
v1beta1Obj *admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding
630+
expectedObj *admissionregistrationv1.ValidatingAdmissionPolicyBinding
631+
expectedError error
632+
}{
633+
{
634+
name: "valid conversion",
635+
v1beta1Obj: &admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding{
636+
ObjectMeta: metav1.ObjectMeta{
637+
Name: "test-binding",
638+
},
639+
Spec: admissionregistrationv1beta1.ValidatingAdmissionPolicyBindingSpec{
640+
PolicyName: "test-policy",
641+
ParamRef: &admissionregistrationv1beta1.ParamRef{
642+
Name: "test-param",
643+
},
644+
ValidationActions: []admissionregistrationv1beta1.ValidationAction{
645+
admissionregistrationv1beta1.Deny,
646+
admissionregistrationv1beta1.Warn,
647+
},
648+
MatchResources: &admissionregistrationv1beta1.MatchResources{
649+
ObjectSelector: &metav1.LabelSelector{
650+
MatchLabels: map[string]string{"key": "value"},
651+
},
652+
NamespaceSelector: &metav1.LabelSelector{
653+
MatchLabels: map[string]string{"key": "value"},
654+
},
655+
},
656+
},
657+
},
658+
expectedObj: &admissionregistrationv1.ValidatingAdmissionPolicyBinding{
659+
ObjectMeta: metav1.ObjectMeta{
660+
Name: "test-binding",
661+
},
662+
Spec: admissionregistrationv1.ValidatingAdmissionPolicyBindingSpec{
663+
PolicyName: "test-policy",
664+
ParamRef: &admissionregistrationv1.ParamRef{
665+
Name: "test-param",
666+
ParameterNotFoundAction: ptr.To[admissionregistrationv1.ParameterNotFoundActionType](admissionregistrationv1.AllowAction),
667+
},
668+
ValidationActions: []admissionregistrationv1.ValidationAction{
669+
admissionregistrationv1.Deny,
670+
admissionregistrationv1.Warn,
671+
},
672+
MatchResources: &admissionregistrationv1.MatchResources{
673+
ObjectSelector: &metav1.LabelSelector{
674+
MatchLabels: map[string]string{"key": "value"},
675+
},
676+
NamespaceSelector: &metav1.LabelSelector{
677+
MatchLabels: map[string]string{"key": "value"},
678+
},
679+
},
680+
},
681+
},
682+
expectedError: nil,
683+
},
684+
{
685+
name: "unrecognized enforcement action",
686+
v1beta1Obj: &admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding{
687+
ObjectMeta: metav1.ObjectMeta{
688+
Name: "test-binding",
689+
},
690+
Spec: admissionregistrationv1beta1.ValidatingAdmissionPolicyBindingSpec{
691+
PolicyName: "test-policy",
692+
ParamRef: &admissionregistrationv1beta1.ParamRef{
693+
Name: "test-param",
694+
},
695+
ValidationActions: []admissionregistrationv1beta1.ValidationAction{
696+
"unknown",
697+
},
698+
},
699+
},
700+
expectedObj: nil,
701+
expectedError: fmt.Errorf("%w: unrecognized enforcement action unknown, must be `warn` or `deny`", transform.ErrBadEnforcementAction),
702+
},
703+
}
704+
705+
for _, tt := range tests {
706+
t.Run(tt.name, func(t *testing.T) {
707+
obj, err := v1beta1ToV1(tt.v1beta1Obj)
708+
if err != nil && tt.expectedError == nil {
709+
t.Fatalf("expected no error, got %v", err)
710+
}
711+
if err == nil && tt.expectedError != nil {
712+
t.Fatalf("expected error %v, got none", tt.expectedError)
713+
}
714+
if err != nil && tt.expectedError != nil && err.Error() != tt.expectedError.Error() {
715+
t.Fatalf("expected error %v, got %v", tt.expectedError, err)
716+
}
717+
if !reflect.DeepEqual(obj, tt.expectedObj) {
718+
t.Errorf("expected object %v, got %v", tt.expectedObj, obj)
719+
}
720+
})
721+
}
722+
}
723+
622724
type fakeWriter struct {
623725
updateErr error
624726
}

0 commit comments

Comments
 (0)