Skip to content

Commit e511b1a

Browse files
committed
wip
1 parent b39cafe commit e511b1a

File tree

5 files changed

+99
-27
lines changed

5 files changed

+99
-27
lines changed

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/ResourceIDProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
* io.javaoperatorsdk.operator.api.reconciler.Context#getSecondaryResources(Class)}`. But also for
2222
* {@link ResourceIDMapper} for event sources in external resources.
2323
*
24-
* @param <T>
24+
* @param <ID>
2525
*/
26-
public interface ResourceIDProvider<T> {
26+
public interface ResourceIDProvider<ID> {
2727

28-
T resourceId();
28+
ID resourceId();
2929
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright Java Operator SDK Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.javaoperatorsdk.operator.processing.dependent;
17+
18+
import io.fabric8.kubernetes.api.model.HasMetadata;
19+
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
20+
import io.javaoperatorsdk.operator.processing.ResourceIDProvider;
21+
22+
public interface CRUDExternalBulkDependentResource<
23+
R extends ResourceIDProvider<ID>, P extends HasMetadata, ID>
24+
extends ExternalBulkDependentResource<R, P, ID>, Creator<R, P>, BulkUpdater<R, P>, Deleter<P> {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright Java Operator SDK Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.javaoperatorsdk.operator.processing.dependent;
17+
18+
import java.util.Map;
19+
import java.util.function.Function;
20+
import java.util.function.Predicate;
21+
import java.util.stream.Collectors;
22+
23+
import io.fabric8.kubernetes.api.model.HasMetadata;
24+
import io.javaoperatorsdk.operator.api.reconciler.Context;
25+
import io.javaoperatorsdk.operator.api.reconciler.dependent.DependentResource;
26+
import io.javaoperatorsdk.operator.processing.ResourceIDMapper;
27+
import io.javaoperatorsdk.operator.processing.ResourceIDProvider;
28+
29+
public interface ExternalBulkDependentResource<
30+
R extends ResourceIDProvider<ID>, P extends HasMetadata, ID>
31+
extends BulkDependentResource<R, P, ID>, DependentResource<R, P> {
32+
33+
/**
34+
* Since we can list all the related resources and by assuming the resource extends {{@link
35+
* ResourceIDProvider}} it is trivial to create the target map. The only issue is if there are
36+
* other secondary resources of the target type which are not managed by this bulk dependent
37+
* resources, for those it is enough to override secondaryResourceFilter method.
38+
*/
39+
@Override
40+
default Map<ID, R> getSecondaryResources(P primary, Context<P> context) {
41+
return context
42+
.getSecondaryResourcesAsStream(resourceType())
43+
.filter(secondaryResourceFilter(primary, context))
44+
.collect(
45+
Collectors.toMap(
46+
cm -> ResourceIDMapper.<R, ID>resourceIdProviderMapper().idFor(cm),
47+
Function.identity()));
48+
}
49+
50+
/**
51+
* Override if not all the secondary resources of target type are managed by the bulk dependent
52+
* resource.
53+
*/
54+
default Predicate<R> secondaryResourceFilter(P primary, Context<P> context) {
55+
return r -> true;
56+
}
57+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/dependent/bulkdependent/external/ExternalBulkResourceReconciler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent;
2020
import io.javaoperatorsdk.operator.dependent.bulkdependent.BulkDependentTestCustomResource;
2121

22-
@Workflow(dependents = @Dependent(type = ExternalBulkDependentResource.class))
22+
@Workflow(dependents = @Dependent(type = SampleExternalBulkDependentResource.class))
2323
@ControllerConfiguration()
2424
public class ExternalBulkResourceReconciler implements Reconciler<BulkDependentTestCustomResource> {
2525

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,24 @@
1919
import java.util.HashSet;
2020
import java.util.Map;
2121
import java.util.Set;
22-
import java.util.stream.Collectors;
22+
import java.util.function.Predicate;
2323

2424
import io.javaoperatorsdk.operator.api.reconciler.Context;
25-
import io.javaoperatorsdk.operator.api.reconciler.dependent.Deleter;
2625
import io.javaoperatorsdk.operator.dependent.bulkdependent.BulkDependentTestCustomResource;
27-
import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource;
28-
import io.javaoperatorsdk.operator.processing.dependent.BulkUpdater;
29-
import io.javaoperatorsdk.operator.processing.dependent.Creator;
26+
import io.javaoperatorsdk.operator.processing.dependent.CRUDExternalBulkDependentResource;
3027
import io.javaoperatorsdk.operator.processing.dependent.external.PollingDependentResource;
3128
import io.javaoperatorsdk.operator.processing.event.ResourceID;
3229

33-
public class ExternalBulkDependentResource
30+
public class SampleExternalBulkDependentResource
3431
extends PollingDependentResource<ExternalResource, BulkDependentTestCustomResource, String>
35-
implements BulkDependentResource<ExternalResource, BulkDependentTestCustomResource, String>,
36-
Creator<ExternalResource, BulkDependentTestCustomResource>,
37-
Deleter<BulkDependentTestCustomResource>,
38-
BulkUpdater<ExternalResource, BulkDependentTestCustomResource> {
32+
implements CRUDExternalBulkDependentResource<
33+
ExternalResource, BulkDependentTestCustomResource, String> {
3934

4035
public static final String EXTERNAL_RESOURCE_NAME_DELIMITER = "#";
4136

4237
private final ExternalServiceMock externalServiceMock = ExternalServiceMock.getInstance();
4338

44-
public ExternalBulkDependentResource() {
39+
public SampleExternalBulkDependentResource() {
4540
super(ExternalResource.class, ExternalResource::getId);
4641
}
4742

@@ -104,19 +99,15 @@ public Map<String, ExternalResource> desiredResources(
10499
}
105100

106101
@Override
107-
public Map<String, ExternalResource> getSecondaryResources(
102+
public Predicate<ExternalResource> secondaryResourceFilter(
108103
BulkDependentTestCustomResource primary, Context<BulkDependentTestCustomResource> context) {
109-
return context
110-
.getSecondaryResourcesAsStream(resourceType())
111-
.filter(
112-
r ->
113-
r.getId()
114-
.startsWith(
115-
primary.getMetadata().getName()
116-
+ EXTERNAL_RESOURCE_NAME_DELIMITER
117-
+ primary.getMetadata().getNamespace()
118-
+ EXTERNAL_RESOURCE_NAME_DELIMITER))
119-
.collect(Collectors.toMap(r -> getResourceIDMapper().idFor(r), r -> r));
104+
return r ->
105+
r.getId()
106+
.startsWith(
107+
primary.getMetadata().getName()
108+
+ EXTERNAL_RESOURCE_NAME_DELIMITER
109+
+ primary.getMetadata().getNamespace()
110+
+ EXTERNAL_RESOURCE_NAME_DELIMITER);
120111
}
121112

122113
@Override

0 commit comments

Comments
 (0)