Skip to content

Commit 3a1987b

Browse files
Abstract the java types used for references between CRs (kroxylicious#1935)
* Abstract the java types used for references between CRs * Refactor ingress resolution result to use new LocalRef Keying on LocalRef and making the resolution result responsible for the lookup tidies up the ingress allocator as we can pass the Ref from the CR around without having to convert to and from a name string. Signed-off-by: Tom Bentley <tbentley@redhat.com> Signed-off-by: Robert Young <robeyoun@redhat.com> Co-authored-by: Robert Young <robeyoun@redhat.com>
1 parent 4098ae4 commit 3a1987b

34 files changed

+705
-207
lines changed

kroxylicious-operator/examples/record-encryption/04.VirtualKafkaCluster.my-cluster.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ spec:
1616
targetCluster:
1717
clusterRef:
1818
name: my-cluster
19-
filters:
20-
- group: filter.kroxylicious.io
21-
kind: KafkaProtocolFilter
22-
name: encryption
19+
filterRefs:
20+
- name: encryption
2321
ingressRefs:
2422
- name: cluster-ip

kroxylicious-operator/examples/record-validation/04.VirtualKafkaCluster.my-cluster.yaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ spec:
1616
targetCluster:
1717
clusterRef:
1818
name: my-cluster
19-
filters:
20-
- group: filter.kroxylicious.io
21-
kind: RecordValidation
22-
name: validation
19+
filterRef:
20+
- name: validation
2321
ingressRefs:
2422
- name: cluster-ip

kroxylicious-operator/pom.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,26 @@
301301
<source>src/main/resources/META-INF/fabric8</source>
302302
<extraAnnotations>true</extraAnnotations>
303303
<existingJavaTypes>
304+
<!-- From the kubernetes API -->
304305
<io.kroxylicious.kubernetes.api.v1alpha1.kafkaproxyspec.PodTemplate>
305306
io.fabric8.kubernetes.api.model.PodTemplateSpec
306307
</io.kroxylicious.kubernetes.api.v1alpha1.kafkaproxyspec.PodTemplate>
308+
<!-- Common types used across our own CRDs -->
309+
<io.kroxylicious.kubernetes.api.v1alpha1.kafkaproxyingressspec.ProxyRef>
310+
io.kroxylicious.kubernetes.api.common.ProxyRef
311+
</io.kroxylicious.kubernetes.api.v1alpha1.kafkaproxyingressspec.ProxyRef>
312+
<io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.ProxyRef>
313+
io.kroxylicious.kubernetes.api.common.ProxyRef
314+
</io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.ProxyRef>
315+
<io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.targetcluster.ClusterRef>
316+
io.kroxylicious.kubernetes.api.common.KafkaCRef
317+
</io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.targetcluster.ClusterRef>
318+
<io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.IngressRefs>
319+
io.kroxylicious.kubernetes.api.common.IngressRef
320+
</io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.IngressRefs>
321+
<io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.FilterRefs>
322+
io.kroxylicious.kubernetes.api.common.FilterRef
323+
</io.kroxylicious.kubernetes.api.v1alpha1.virtualkafkaclusterspec.FilterRefs>
307324
</existingJavaTypes>
308325
<packageOverrides>
309326
<!-- the default package name ($apiGroup.$apiVersion) doesn't work for us -->
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Copyright Kroxylicious Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
package io.kroxylicious.kubernetes.api.common;
8+
9+
import io.fabric8.kubernetes.api.model.HasMetadata;
10+
import io.fabric8.kubernetes.api.model.KubernetesResource;
11+
12+
/**
13+
* A reference, used in a kubernetes resource, to some kubernetes resource in the same namespace.
14+
* This is used for references where the kind and group are not known statically.
15+
*/
16+
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
17+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({ "group", "kind", "name" })
18+
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
19+
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
20+
@lombok.ToString()
21+
@io.sundr.builder.annotations.Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = {
22+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
23+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectReference.class),
24+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.LabelSelector.class),
25+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Container.class),
26+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.EnvVar.class),
27+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ContainerPort.class),
28+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Volume.class),
29+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.VolumeMount.class)
30+
})
31+
public class AnyLocalRef
32+
extends LocalRef<HasMetadata>
33+
implements io.fabric8.kubernetes.api.builder.Editable<AnyLocalRefBuilder>,
34+
io.fabric8.kubernetes.api.model.KubernetesResource {
35+
36+
@java.lang.Override
37+
public AnyLocalRefBuilder edit() {
38+
return new AnyLocalRefBuilder(this);
39+
}
40+
41+
@com.fasterxml.jackson.annotation.JsonProperty("group")
42+
@io.fabric8.generator.annotation.Pattern("^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$")
43+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
44+
private String group;
45+
46+
@Override
47+
public String getGroup() {
48+
return group;
49+
}
50+
51+
public void setGroup(String group) {
52+
this.group = group;
53+
}
54+
55+
@com.fasterxml.jackson.annotation.JsonProperty("kind")
56+
@io.fabric8.generator.annotation.Pattern("^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$")
57+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
58+
private String kind;
59+
60+
@Override
61+
public String getKind() {
62+
return kind;
63+
}
64+
65+
public void setKind(String kind) {
66+
this.kind = kind;
67+
}
68+
69+
@com.fasterxml.jackson.annotation.JsonProperty("name")
70+
@io.fabric8.generator.annotation.Required()
71+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
72+
private String name;
73+
74+
@Override
75+
public String getName() {
76+
return name;
77+
}
78+
79+
public void setName(String name) {
80+
this.name = name;
81+
}
82+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright Kroxylicious Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
package io.kroxylicious.kubernetes.api.common;
8+
9+
import com.fasterxml.jackson.annotation.JsonIgnore;
10+
11+
import io.fabric8.kubernetes.api.model.KubernetesResource;
12+
13+
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxy;
14+
15+
/**
16+
* A reference, used in a kubernetes resource, to a KafkaProxy resource in the same namespace.
17+
*/
18+
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
19+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({ "name" })
20+
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
21+
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
22+
@lombok.ToString()
23+
@io.sundr.builder.annotations.Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = {
24+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
25+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectReference.class),
26+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.LabelSelector.class),
27+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Container.class),
28+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.EnvVar.class),
29+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ContainerPort.class),
30+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Volume.class),
31+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.VolumeMount.class)
32+
})
33+
public class FilterRef
34+
extends LocalRef<KafkaProxy>
35+
implements io.fabric8.kubernetes.api.builder.Editable<FilterRefBuilder>,
36+
KubernetesResource {
37+
38+
@Override
39+
public FilterRefBuilder edit() {
40+
return new FilterRefBuilder(this);
41+
}
42+
43+
@JsonIgnore
44+
@Override
45+
public String getGroup() {
46+
return "filter.kroxylicious.io";
47+
}
48+
49+
@JsonIgnore
50+
@Override
51+
public String getKind() {
52+
return "KafkaProtocolFilter";
53+
}
54+
55+
@com.fasterxml.jackson.annotation.JsonProperty("name")
56+
@io.fabric8.generator.annotation.Required()
57+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
58+
private String name;
59+
60+
public String getName() {
61+
return name;
62+
}
63+
64+
public void setName(String name) {
65+
this.name = name;
66+
}
67+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright Kroxylicious Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
package io.kroxylicious.kubernetes.api.common;
8+
9+
import com.fasterxml.jackson.annotation.JsonIgnore;
10+
11+
import io.fabric8.kubernetes.api.model.KubernetesResource;
12+
13+
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaProxyIngress;
14+
15+
/**
16+
* A reference, used in a kubernetes resource, to a KafkaProxyIngress resource in the same namespace.
17+
*/
18+
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
19+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({ "name" })
20+
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
21+
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
22+
@lombok.ToString()
23+
@io.sundr.builder.annotations.Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = {
24+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
25+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectReference.class),
26+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.LabelSelector.class),
27+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Container.class),
28+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.EnvVar.class),
29+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ContainerPort.class),
30+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Volume.class),
31+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.VolumeMount.class)
32+
})
33+
public class IngressRef
34+
extends LocalRef<KafkaProxyIngress>
35+
implements io.fabric8.kubernetes.api.builder.Editable<IngressRefBuilder>,
36+
KubernetesResource {
37+
38+
@Override
39+
public IngressRefBuilder edit() {
40+
return new IngressRefBuilder(this);
41+
}
42+
43+
@JsonIgnore
44+
@Override
45+
public String getGroup() {
46+
return "kroxylicious.io";
47+
}
48+
49+
@JsonIgnore
50+
@Override
51+
public String getKind() {
52+
return "KafkaProxyIngress";
53+
}
54+
55+
@com.fasterxml.jackson.annotation.JsonProperty("name")
56+
@io.fabric8.generator.annotation.Required()
57+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
58+
private String name;
59+
60+
public String getName() {
61+
return name;
62+
}
63+
64+
public void setName(String name) {
65+
this.name = name;
66+
}
67+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright Kroxylicious Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
package io.kroxylicious.kubernetes.api.common;
8+
9+
import com.fasterxml.jackson.annotation.JsonIgnore;
10+
11+
import io.fabric8.kubernetes.api.model.KubernetesResource;
12+
13+
import io.kroxylicious.kubernetes.api.v1alpha1.KafkaClusterRef;
14+
15+
/**
16+
* A reference, used in a kubernetes resource, to a KafkaClusterRef resource in the same namespace.
17+
*/
18+
@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
19+
@com.fasterxml.jackson.annotation.JsonPropertyOrder({ "name" })
20+
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
21+
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
22+
@lombok.ToString()
23+
@io.sundr.builder.annotations.Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = {
24+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class),
25+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ObjectReference.class),
26+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.LabelSelector.class),
27+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Container.class),
28+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.EnvVar.class),
29+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.ContainerPort.class),
30+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.Volume.class),
31+
@io.sundr.builder.annotations.BuildableReference(io.fabric8.kubernetes.api.model.VolumeMount.class)
32+
})
33+
public class KafkaCRef
34+
extends LocalRef<KafkaClusterRef>
35+
implements io.fabric8.kubernetes.api.builder.Editable<KafkaCRefBuilder>,
36+
KubernetesResource {
37+
38+
@Override
39+
public KafkaCRefBuilder edit() {
40+
return new KafkaCRefBuilder(this);
41+
}
42+
43+
@JsonIgnore
44+
@Override
45+
public String getGroup() {
46+
return "kroxylicious.io";
47+
}
48+
49+
@JsonIgnore
50+
@Override
51+
public String getKind() {
52+
return "KafkaClusterRef";
53+
}
54+
55+
@com.fasterxml.jackson.annotation.JsonProperty("name")
56+
@io.fabric8.generator.annotation.Required()
57+
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
58+
private String name;
59+
60+
public String getName() {
61+
return name;
62+
}
63+
64+
public void setName(String name) {
65+
this.name = name;
66+
}
67+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright Kroxylicious Authors.
3+
*
4+
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
package io.kroxylicious.kubernetes.api.common;
8+
9+
import java.util.Objects;
10+
11+
/**
12+
* Abstraction for references in one kubernetes resource to some kubernetes resource in the same namespace.
13+
* Two LocalRefs are equal iff they have the same group, kind and name (they don't need to have the same class)
14+
* @param <T> The Java type of the resource
15+
*/
16+
public abstract class LocalRef<T> {
17+
18+
public abstract String getGroup();
19+
20+
public abstract String getKind();
21+
22+
public abstract String getName();
23+
24+
@Override
25+
public final int hashCode() {
26+
return Objects.hash(getGroup(), getKind(), getName());
27+
}
28+
29+
@Override
30+
public final boolean equals(Object obj) {
31+
if (this == obj) {
32+
return true;
33+
}
34+
if (!(obj instanceof LocalRef)) {
35+
return false;
36+
}
37+
return Objects.equals(getGroup(), ((LocalRef<?>) obj).getGroup())
38+
&& Objects.equals(getKind(), ((LocalRef<?>) obj).getKind())
39+
&& Objects.equals(getName(), ((LocalRef<?>) obj).getName());
40+
}
41+
}

0 commit comments

Comments
 (0)