Skip to content

Commit f25bf16

Browse files
authored
Release/1.14 (#12)
* Removed extra = in newVersion. Added target to release action to use the correct branch (#7) Signed-off-by: Knut-Erik Johnsen <[email protected]> * Feature/update workflows (#11) * Removed extra = in newVersion. Added target to release action to use the correct branch Signed-off-by: Knut-Erik Johnsen <[email protected]> * Downgraded grpc to same version as the used springboot starter. Added javadoc. Removed componentscan since it's bad practie Signed-off-by: Knut-Erik Johnsen <[email protected]> --------- Signed-off-by: Knut-Erik Johnsen <[email protected]> --------- Signed-off-by: Knut-Erik Johnsen <[email protected]>
1 parent 22907e7 commit f25bf16

File tree

11 files changed

+195
-80
lines changed

11 files changed

+195
-80
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,48 @@
11
package io.crossplane.compositefunctions.starter.config;
22

3+
import io.crossplane.compositefunctions.starter.conversion.CrossplaneExtraResourcesService;
4+
import io.crossplane.compositefunctions.starter.conversion.CrossplaneObservableService;
5+
import io.crossplane.compositefunctions.starter.conversion.CrossplaneResourceService;
6+
import org.checkerframework.checker.units.qual.C;
37
import org.springframework.boot.autoconfigure.AutoConfiguration;
8+
import org.springframework.context.annotation.Bean;
49
import org.springframework.context.annotation.ComponentScan;
510

11+
/**
12+
* Autoconfiguration for the crossplane services.
13+
*/
614
@AutoConfiguration
7-
@ComponentScan(basePackages = {"io.crossplane.compositefunctions.starter.conversion"})
815
public class CrossplaneServiceConfiguration {
16+
17+
18+
/**
19+
* Set up services for working with extra resources
20+
* @return the crossplaneExtraResourcesService
21+
* @since 1.15
22+
*/
23+
@Bean
24+
public CrossplaneExtraResourcesService crossplaneExtraResourcesService() {
25+
return new CrossplaneExtraResourcesService();
26+
}
27+
28+
/**
29+
* Set up services for working with observed resources
30+
* @return the crossplaneObservableService
31+
* @since 1.14
32+
*/
33+
@Bean
34+
public CrossplaneObservableService crossplaneObservableService() {
35+
return new CrossplaneObservableService();
36+
}
37+
38+
/**
39+
* Set up services for working with default resources
40+
* @return the crossplaneResourceService
41+
* @since 1.15
42+
*/
43+
@Bean
44+
public CrossplaneResourceService crossplaneResourceService() {
45+
return new CrossplaneResourceService();
46+
}
47+
948
}

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/conversion/CrossplaneExtraResourcesService.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@
1010
import io.fabric8.kubernetes.client.utils.Serialization;
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
13-
import org.springframework.stereotype.Component;
1413

1514
import java.util.ArrayList;
1615
import java.util.List;
1716
import java.util.Map;
1817
import java.util.Optional;
1918

20-
21-
@Component
19+
/**
20+
* Class that helps with the extra resources map and also to create ResourceSelector in order to get extra resources
21+
* to the function
22+
*
23+
* Commented out in 1.14
24+
*
25+
* @since 1.15
26+
*/
2227
public class CrossplaneExtraResourcesService {
2328

2429
private static final Logger logger = LoggerFactory.getLogger(CrossplaneExtraResourcesService.class);

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/conversion/CrossplaneObservableService.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,25 @@
88
import io.fabric8.kubernetes.client.utils.Serialization;
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
11-
import org.springframework.stereotype.Component;
1211

1312
import java.util.Optional;
1413

15-
@Component
14+
/**
15+
* Class with helper methods for observable resources.
16+
*/
1617
public class CrossplaneObservableService {
1718

1819
private static final Logger logger = LoggerFactory.getLogger(CrossplaneObservableService.class);
1920
private final JsonFormat.Printer printer = JsonFormat.printer();
2021

22+
/**
23+
* Retrieve a resource from the observedstate and convert in into class T
24+
* @param resourceName The resource name to find in the observed state
25+
* @param observedState The observed state from the crossplane input
26+
* @param clazz The class/type to create
27+
* @return An instance of class T from the observed state
28+
* @param <T> The class/type to create
29+
*/
2130
public <T> Optional<T> getObservableResource(String resourceName, State observedState, Class<T> clazz) {
2231
Resource observedResource = observedState.getResourcesOrDefault(resourceName, null);
2332
Optional<T> result = Optional.empty();

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/conversion/CrossplaneResourceService.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,23 @@
44
import io.crossplane.compositefunctions.protobuf.State;
55
import io.crossplane.compositefunctions.starter.exception.CrossplaneUnmarshallException;
66
import io.fabric8.kubernetes.client.utils.Serialization;
7-
import org.springframework.stereotype.Component;
87

98
import java.util.Optional;
109

11-
@Component
10+
/**
11+
* Class with helper methods for default resources.
12+
*/
1213
public class CrossplaneResourceService {
1314

1415
final JsonFormat.Printer printer = JsonFormat.printer();
1516

17+
/**
18+
* Converts the incoming Composite to instance of class T
19+
* @param observedState The observed state from the crossplane input
20+
* @param clazz The class/type to create
21+
* @return An instance of class T from the observed state
22+
* @param <T> The class/type to create
23+
*/
1624
public <T> Optional<T> getResource(State observedState, Class<T> clazz) {
1725
try {
1826
String resource = printer.print(observedState.getComposite().getResource());

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/exception/CrossplaneUnexpectedItemsException.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
package io.crossplane.compositefunctions.starter.exception;
22

3+
/**
4+
* Exception for unexpected items encountered when converting
5+
*/
36
public class CrossplaneUnexpectedItemsException extends RuntimeException {
47

8+
/**
9+
* Constructor with message
10+
* @param message The exception message
11+
*/
512
public CrossplaneUnexpectedItemsException(String message) {
613
super(message);
714
}
815

16+
/**
17+
* Constructor with message and cause
18+
* @param message The exception message
19+
* @param cause The throwable that caused the exception
20+
*/
921
public CrossplaneUnexpectedItemsException(String message, Throwable cause) {
1022
super(message, cause);
1123
}

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/exception/CrossplaneUnmarshallException.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
package io.crossplane.compositefunctions.starter.exception;
22

3+
/**
4+
* Exception for errors when unmarhsalling
5+
*/
36
public class CrossplaneUnmarshallException extends RuntimeException {
47

8+
/**
9+
* Constructor with message
10+
* @param message The exception message
11+
*/
512
public CrossplaneUnmarshallException(String message) {
613
super(message);
714
}
815

16+
/**
17+
* Constructor with message and cause
18+
* @param message The exception message
19+
* @param cause The throwable that caused the exception
20+
*/
921
public CrossplaneUnmarshallException(String message, Throwable cause) {
1022
super(message, cause);
1123
}

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/registration/CrossplaneCompositeResourceMixin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import io.fabric8.kubernetes.api.model.ObjectMeta;
55

6+
/**
7+
* Class to aid in setting up autoregistration. Used to ignore the default
8+
* fields when creating the openapiv3schema
9+
*/
610
public abstract class CrossplaneCompositeResourceMixin {
711

812
@JsonIgnore

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/registration/CrossplaneCompositeResourceService.java

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,33 @@
1919
import java.util.ArrayList;
2020
import java.util.List;
2121

22-
import static io.crossplane.compositefunctions.starter.registration.CrossplanJsonSchemaGenerator.getOpenAPIV3Schema;
22+
import static io.crossplane.compositefunctions.starter.registration.CrossplaneJsonSchemaGenerator.getOpenAPIV3Schema;
2323

24+
/**
25+
* Service that can register the composite resource together with a function,
26+
* which can also add other function to the pipeline definition
27+
*/
2428
public class CrossplaneCompositeResourceService {
2529

2630

27-
28-
public static <T extends CustomResource<?, Void>> void registerOrUpdateCompositeResource(String functionName,
29-
List<String> additionalFunctions,
30-
T functionDefinition,
31+
/**
32+
* Register or update the composite resource definition using the provided client.
33+
* The client needs access to register the types
34+
*
35+
* @param pipelineFunctions A list of functionnames to add to the composition pipeline
36+
* @param compositionDefinition The object that has the composition definiton
37+
* @param kubernetesClient The client to use to register the definition
38+
* @param <T> Must extend CustomResource
39+
*/
40+
public static <T extends CustomResource<?, Void>> void registerOrUpdateCompositeResource(List<String> pipelineFunctions,
41+
T compositionDefinition,
3142
KubernetesClient kubernetesClient) {
3243

33-
CompositeResourceDefinition compositeResourceDefinition = createCompositeResourceDefinition(functionDefinition);
44+
CompositeResourceDefinition compositeResourceDefinition = createCompositeResourceDefinition(compositionDefinition);
3445

3546
registerOrUpdateCompositeResourceDefinition(compositeResourceDefinition, kubernetesClient);
3647

37-
Composition composition = createCompositionDefinition(functionName, additionalFunctions, functionDefinition);
48+
Composition composition = createCompositionDefinition(pipelineFunctions, compositionDefinition);
3849

3950
registerOrUpdateCompositeResourceDefinition(composition, kubernetesClient);
4051

@@ -52,41 +63,49 @@ private static void registerOrUpdateCompositeResourceDefinition(CompositeResourc
5263
}
5364
}
5465

55-
public static <T extends CustomResource<?, Void>> CompositeResourceDefinition createCompositeResourceDefinition(T functionDefinition) { //}, Class functionMixin) {
66+
/**
67+
* Create a CompositeResourceDefinition based on the provided CustomResource
68+
* If Namespaced, ClaimNames will be added in addition to Names.
69+
*
70+
* @param compositionDefinition The composition definition
71+
* @return A CompositeResourceDefintion based on the provided CustomResource
72+
* @param <T> Must extend CustomResource
73+
*/
74+
public static <T extends CustomResource<?, Void>> CompositeResourceDefinition createCompositeResourceDefinition(T compositionDefinition) { //}, Class functionMixin) {
5675

5776
CompositeResourceDefinition compositeResourceDefinition = new CompositeResourceDefinition();
58-
compositeResourceDefinition.setMetadata(CrossplaneMetadataBuilder.createMetadata(functionDefinition.getCRDName()));
77+
compositeResourceDefinition.setMetadata(CrossplaneMetadataBuilder.createMetadata(compositionDefinition.getCRDName()));
5978

6079
CompositeResourceDefinitionSpec spec = new CompositeResourceDefinitionSpec();
61-
spec.setGroup(functionDefinition.getGroup());
80+
spec.setGroup(compositionDefinition.getGroup());
6281

6382
String namePrefix = "";
6483

65-
if (functionDefinition instanceof Namespaced) {
84+
if (compositionDefinition instanceof Namespaced) {
6685
ClaimNames claimNames = new ClaimNames();
67-
claimNames.setKind(functionDefinition.getKind());
68-
claimNames.setPlural(functionDefinition.getPlural());
69-
claimNames.setSingular(functionDefinition.getSingular());
86+
claimNames.setKind(compositionDefinition.getKind());
87+
claimNames.setPlural(compositionDefinition.getPlural());
88+
claimNames.setSingular(compositionDefinition.getSingular());
7089
spec.setClaimNames(claimNames);
7190
namePrefix = "x";
7291
}
7392

7493
Names names = new Names();
75-
names.setKind(namePrefix + functionDefinition.getKind());
76-
names.setPlural(namePrefix + functionDefinition.getPlural());
77-
names.setSingular(namePrefix + functionDefinition.getSingular());
94+
names.setKind(namePrefix + compositionDefinition.getKind());
95+
names.setPlural(namePrefix + compositionDefinition.getPlural());
96+
names.setSingular(namePrefix + compositionDefinition.getSingular());
7897
spec.setNames(names);
7998

8099
Versions versions = new Versions();
81-
versions.setName(functionDefinition.getVersion());
100+
versions.setName(compositionDefinition.getVersion());
82101

83102
// This is not 100%. isStorage vs referencable. Need to check the crossplan docs
84-
versions.setReferenceable(functionDefinition.isStorage());
85-
versions.setServed(functionDefinition.isServed());
103+
versions.setReferenceable(compositionDefinition.isStorage());
104+
versions.setServed(compositionDefinition.isServed());
86105

87106

88107
Schema schema = new Schema();
89-
schema.setOpenAPIV3Schema(getOpenAPIV3Schema(functionDefinition.getClass(), CrossplaneCompositeResourceMixin.class));
108+
schema.setOpenAPIV3Schema(getOpenAPIV3Schema(compositionDefinition.getClass(), CrossplaneCompositeResourceMixin.class));
90109

91110
versions.setSchema(schema);
92111
spec.setVersions(List.of(versions));
@@ -108,26 +127,23 @@ private static void registerOrUpdateCompositeResourceDefinition(Composition comp
108127
}
109128

110129
private static <T extends CustomResource<?, Void>> Composition createCompositionDefinition(
111-
String functionName, List<String> additionalFunctions,
112-
T functionDefinition) {
130+
List<String> pipelineFunctions, T compositionDefinition) {
113131

114132
Composition composition = new Composition();
115133

116-
composition.setMetadata(CrossplaneMetadataBuilder.createMetadata(functionDefinition.getKind().toLowerCase() + "-composition"));
134+
composition.setMetadata(CrossplaneMetadataBuilder.createMetadata(compositionDefinition.getKind().toLowerCase() + "-composition"));
117135
CompositionSpec compositionSpec = new CompositionSpec();
118136

119137
CompositeTypeRef compositeTypeRef = new CompositeTypeRef();
120-
compositeTypeRef.setKind(functionDefinition.getKind());
121-
compositeTypeRef.setApiVersion(functionDefinition.getApiVersion());
138+
compositeTypeRef.setKind(compositionDefinition.getKind());
139+
compositeTypeRef.setApiVersion(compositionDefinition.getApiVersion());
122140

123141
compositionSpec.setCompositeTypeRef(compositeTypeRef);
124142
compositionSpec.setMode(CompositionSpec.Mode.PIPELINE);
125143

126144
List<Pipeline> pipelineList = new ArrayList<>();
127145

128-
pipelineList.add(createPipeline(functionName));
129-
130-
additionalFunctions.forEach(s -> pipelineList.add(createPipeline(s)));
146+
pipelineFunctions.forEach(s -> pipelineList.add(createPipeline(s)));
131147

132148
compositionSpec.setPipeline(pipelineList);
133149
composition.setSpec(compositionSpec);

crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/registration/CrossplanJsonSchemaGenerator.java renamed to crossplane-function-springboot-starter/src/main/java/io/crossplane/compositefunctions/starter/registration/CrossplaneJsonSchemaGenerator.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,17 @@
1212
import java.io.IOException;
1313
import java.util.stream.Stream;
1414

15-
public class CrossplanJsonSchemaGenerator {
15+
/**
16+
* Generator of OpenApiV3Schema used when creating CompositeResourceDefinition
17+
*/
18+
public class CrossplaneJsonSchemaGenerator {
1619

20+
/**
21+
* Create the OpenApiV3Schema
22+
* @param clazz The class to create the schema from
23+
* @param mixin A mixin to use when Jackson maps the class
24+
* @return A OpenAPIV3Schema based on the given class
25+
*/
1726
public static OpenAPIV3Schema getOpenAPIV3Schema(Class clazz, Class mixin) {
1827
try {
1928
ObjectMapper mapper = new ObjectMapper();
@@ -52,6 +61,11 @@ private static void removeIdField(JsonSchema jsonSchema) {
5261

5362
}
5463

64+
/**
65+
* Get the JSONSchemaProps from the class
66+
* @param clazz The class to get the schema from
67+
* @return The schemaprops based on the provided class
68+
*/
5569
public static JSONSchemaProps getJsonSchema(Class clazz) {
5670
try {
5771
ObjectMapper mapper = new ObjectMapper();
@@ -73,7 +87,9 @@ public static JSONSchemaProps getJsonSchema(Class clazz) {
7387
}
7488

7589

76-
90+
/**
91+
* Class just use to ignore the ID property that automatically gets added.
92+
*/
7793
private abstract class IdIgnorer {
7894

7995
@JsonIgnore

0 commit comments

Comments
 (0)