2019-02-22 18:12:14 +02:00
|
|
|
package webhooks_test
|
|
|
|
|
|
|
|
import (
|
2019-03-11 19:27:22 +02:00
|
|
|
"gotest.tools/assert"
|
2019-03-11 16:17:58 +02:00
|
|
|
"testing"
|
2019-02-22 18:12:14 +02:00
|
|
|
|
2019-03-11 16:17:58 +02:00
|
|
|
types "github.com/nirmata/kube-policy/pkg/apis/policy/v1alpha1"
|
|
|
|
"github.com/nirmata/kube-policy/webhooks"
|
|
|
|
v1beta1 "k8s.io/api/admission/v1beta1"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
2019-02-22 18:12:14 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestAdmissionIsRequired(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
var request v1beta1.AdmissionRequest
|
|
|
|
request.Kind.Kind = "ConfigMap"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "CronJob"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "DaemonSet"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Deployment"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Endpoints"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "HorizontalPodAutoscaler"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Ingress"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Job"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "LimitRange"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Namespace"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "NetworkPolicy"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "PersistentVolumeClaim"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "PodDisruptionBudget"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "PodTemplate"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "ResourceQuota"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Secret"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "Service"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-03-11 16:17:58 +02:00
|
|
|
request.Kind.Kind = "StatefulSet"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.AdmissionIsRequired(&request))
|
2019-02-22 18:12:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestIsRuleResourceFitsRequest_Kind(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
resourceName := "test-config-map"
|
|
|
|
resource := types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Name: &resourceName,
|
|
|
|
}
|
|
|
|
request := v1beta1.AdmissionRequest{
|
|
|
|
Kind: metav1.GroupVersionKind{Kind: "ConfigMap"},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray := []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
|
|
|
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
resource.Kind = "Deployment"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, false == webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-02-22 18:12:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestIsRuleResourceFitsRequest_Name(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
resourceName := "test-config-map"
|
|
|
|
resource := types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Name: &resourceName,
|
|
|
|
}
|
|
|
|
request := v1beta1.AdmissionRequest{
|
|
|
|
Kind: metav1.GroupVersionKind{Kind: "ConfigMap"},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray := []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
resourceName = "test-config-map-new"
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, false == webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
|
|
|
|
objectByteArray = []byte(`{"metadata":{"name":"test-config-map-new","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
|
|
|
|
objectByteArray = []byte(`{"metadata":{"name":"","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, false == webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-02-22 18:12:14 +02:00
|
|
|
}
|
2019-02-26 20:05:07 +02:00
|
|
|
|
2019-03-01 14:16:20 +02:00
|
|
|
func TestIsRuleResourceFitsRequest_MatchExpressions(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
request := v1beta1.AdmissionRequest{
|
|
|
|
Kind: metav1.GroupVersionKind{Kind: "ConfigMap"},
|
|
|
|
}
|
|
|
|
|
|
|
|
resource := types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
MatchLabels: nil,
|
|
|
|
MatchExpressions: []metav1.LabelSelectorRequirement{
|
|
|
|
metav1.LabelSelectorRequirement{
|
|
|
|
Key: "label2",
|
|
|
|
Operator: "NotIn",
|
|
|
|
Values: []string{
|
|
|
|
"sometest1",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
metav1.LabelSelectorRequirement{
|
|
|
|
Key: "label1",
|
|
|
|
Operator: "In",
|
|
|
|
Values: []string{
|
|
|
|
"test1",
|
|
|
|
"test8",
|
|
|
|
"test201",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
metav1.LabelSelectorRequirement{
|
|
|
|
Key: "label3",
|
|
|
|
Operator: "DoesNotExist",
|
|
|
|
Values: nil,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray := []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
|
|
|
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-01 14:16:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestIsRuleResourceFitsRequest_MatchLabels(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
resource := types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
"label1": "test1",
|
|
|
|
"label2": "test2",
|
|
|
|
},
|
|
|
|
MatchExpressions: nil,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
request := v1beta1.AdmissionRequest{
|
|
|
|
Kind: metav1.GroupVersionKind{Kind: "ConfigMap"},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray := []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
|
|
|
|
objectByteArray = []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label3":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, false == webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
|
|
|
|
resource = types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
"label3": "test1",
|
|
|
|
"label2": "test2",
|
|
|
|
},
|
|
|
|
MatchExpressions: nil,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-01 14:16:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestIsRuleResourceFitsRequest_MatchLabelsAndMatchExpressions(t *testing.T) {
|
2019-03-11 16:17:58 +02:00
|
|
|
request := v1beta1.AdmissionRequest{
|
|
|
|
Kind: metav1.GroupVersionKind{Kind: "ConfigMap"},
|
|
|
|
}
|
|
|
|
|
|
|
|
resource := types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
"label1": "test1",
|
|
|
|
},
|
|
|
|
MatchExpressions: []metav1.LabelSelectorRequirement{
|
|
|
|
metav1.LabelSelectorRequirement{
|
|
|
|
Key: "label2",
|
|
|
|
Operator: "In",
|
|
|
|
Values: []string{
|
|
|
|
"test2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray := []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
|
|
|
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-11 16:17:58 +02:00
|
|
|
|
|
|
|
resource = types.PolicyResource{
|
|
|
|
Kind: "ConfigMap",
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
"label1": "test1",
|
|
|
|
},
|
|
|
|
MatchExpressions: []metav1.LabelSelectorRequirement{
|
|
|
|
metav1.LabelSelectorRequirement{
|
|
|
|
Key: "label2",
|
|
|
|
Operator: "NotIn",
|
|
|
|
Values: []string{
|
|
|
|
"sometest1",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
objectByteArray = []byte(`{"metadata":{"name":"test-config-map","namespace":"default","creationTimestamp":null,"labels":{"label1":"test1","label2":"test2"}}}`)
|
|
|
|
request.Object.Raw = objectByteArray
|
|
|
|
|
2019-03-11 19:27:22 +02:00
|
|
|
assert.Assert(t, webhooks.IsRuleApplicableToRequest(resource, &request))
|
2019-03-01 14:16:20 +02:00
|
|
|
}
|