Skip to content

Commit a21723c

Browse files
committed
Add admission policy to deny changing an AWS LB type on an existing service
1 parent b601c17 commit a21723c

File tree

5 files changed

+43
-7
lines changed

5 files changed

+43
-7
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicyBinding
3+
metadata:
4+
name: openshift-cloud-controller-manager-cloud-provider-aws
5+
spec:
6+
policyName: openshift-cloud-controller-manager-cloud-provider-aws
7+
validationActions: ["Deny"]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: admissionregistration.k8s.io/v1
2+
kind: ValidatingAdmissionPolicy
3+
metadata:
4+
name: openshift-cloud-controller-manager-cloud-provider-aws
5+
spec:
6+
failurePolicy: Fail
7+
matchConstraints:
8+
resourceRules:
9+
- apiGroups: [""]
10+
apiVersions: ["v1"]
11+
operations: ["UPDATE"]
12+
resources: ["services"]
13+
validations:
14+
- expression: |
15+
(has(object.metadata.annotations) && 'service.beta.kubernetes.io/aws-load-balancer-type' in object.metadata.annotations) ==
16+
(has(oldObject.metadata.annotations) && 'service.beta.kubernetes.io/aws-load-balancer-type' in oldObject.metadata.annotations) &&
17+
(has(object.metadata.annotations) && 'service.beta.kubernetes.io/aws-load-balancer-type' in object.metadata.annotations ?
18+
object.metadata.annotations['service.beta.kubernetes.io/aws-load-balancer-type'] == oldObject.metadata.annotations['service.beta.kubernetes.io/aws-load-balancer-type'] : true)
19+
message: "The annotation 'service.beta.kubernetes.io/aws-load-balancer-type' may not be added, removed, or have its value changed. Changing the type of an existing load balancer is not supported."
20+
reason: Invalid

pkg/cloud/aws/aws.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
"github.com/asaskevich/govalidator"
8+
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
89
appsv1 "k8s.io/api/apps/v1"
910
"sigs.k8s.io/controller-runtime/pkg/client"
1011

@@ -20,6 +21,8 @@ var (
2021

2122
templates = []common.TemplateSource{
2223
{ReferenceObject: &appsv1.Deployment{}, EmbedFsPath: "assets/deployment.yaml"},
24+
{ReferenceObject: &admissionregistrationv1.ValidatingAdmissionPolicy{}, EmbedFsPath: "assets/validating-admission-policy.yaml"},
25+
{ReferenceObject: &admissionregistrationv1.ValidatingAdmissionPolicyBinding{}, EmbedFsPath: "assets/validating-admission-policy-binding.yaml"},
2326
}
2427
)
2528

pkg/cloud/aws/aws_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func TestResourcesRenderingSmoke(t *testing.T) {
4343
}
4444

4545
resources := assets.GetRenderedResources()
46-
assert.Len(t, resources, 1)
46+
assert.Len(t, resources, 3)
4747
})
4848
}
4949
}

pkg/cloud/cloud_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,17 +99,23 @@ func TestGetResources(t *testing.T) {
9999
}{{
100100
name: "AWS resources returned as expected",
101101
testPlatform: platformsMap[string(configv1.AWSPlatformType)],
102-
expectedResourceCount: 2,
102+
expectedResourceCount: 4,
103103
expectedResourcesKindName: []string{
104104
"Deployment/aws-cloud-controller-manager",
105+
"ValidatingAdmissionPolicy/openshift-cloud-controller-manager-cloud-provider-aws",
106+
"ValidatingAdmissionPolicyBinding/openshift-cloud-controller-manager-cloud-provider-aws",
105107
"PodDisruptionBudget/aws-cloud-controller-manager",
106108
},
107109
}, {
108-
name: "AWS resources returned as expected with single node cluster",
109-
testPlatform: platformsMap[string(configv1.AWSPlatformType)],
110-
expectedResourceCount: 1,
111-
singleReplica: true,
112-
expectedResourcesKindName: []string{"Deployment/aws-cloud-controller-manager"},
110+
name: "AWS resources returned as expected with single node cluster",
111+
testPlatform: platformsMap[string(configv1.AWSPlatformType)],
112+
expectedResourceCount: 3,
113+
singleReplica: true,
114+
expectedResourcesKindName: []string{
115+
"Deployment/aws-cloud-controller-manager",
116+
"ValidatingAdmissionPolicy/openshift-cloud-controller-manager-cloud-provider-aws",
117+
"ValidatingAdmissionPolicyBinding/openshift-cloud-controller-manager-cloud-provider-aws",
118+
},
113119
}, {
114120
name: "OpenStack resources returned as expected",
115121
testPlatform: platformsMap[string(configv1.OpenStackPlatformType)],

0 commit comments

Comments
 (0)