|
13 | 13 | import static dev.restate.sdk.core.statemachine.ServiceProtocol.MIN_SERVICE_PROTOCOL_VERSION; |
14 | 14 |
|
15 | 15 | import com.fasterxml.jackson.core.JsonProcessingException; |
| 16 | +import dev.restate.sdk.core.generated.discovery.Discovery; |
16 | 17 | import dev.restate.sdk.core.generated.manifest.*; |
17 | 18 | import dev.restate.sdk.endpoint.definition.HandlerDefinition; |
18 | 19 | import dev.restate.sdk.endpoint.definition.HandlerType; |
19 | 20 | import dev.restate.sdk.endpoint.definition.ServiceDefinition; |
20 | 21 | import dev.restate.sdk.endpoint.definition.ServiceType; |
21 | 22 | import dev.restate.serde.Serde; |
| 23 | +import java.util.Objects; |
| 24 | +import java.util.function.Predicate; |
22 | 25 | import java.util.stream.Collectors; |
23 | 26 | import java.util.stream.Stream; |
24 | 27 |
|
@@ -83,7 +86,41 @@ final class EndpointManifest { |
83 | 86 | .collect(Collectors.toList())); |
84 | 87 | } |
85 | 88 |
|
86 | | - EndpointManifestSchema manifest() { |
| 89 | + EndpointManifestSchema manifest(Discovery.ServiceDiscoveryProtocolVersion version) { |
| 90 | + // Verify that the user didn't set fields that we don't support in the discovery version we set |
| 91 | + for (var service : this.manifest.getServices()) { |
| 92 | + if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V2.getNumber()) { |
| 93 | + verifyFieldNotSet( |
| 94 | + "metadata", |
| 95 | + service, |
| 96 | + s -> s.getMetadata() != null && !s.getMetadata().getAdditionalProperties().isEmpty()); |
| 97 | + } |
| 98 | + if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V3.getNumber()) { |
| 99 | + verifyFieldNull("idempotency retention", service.getIdempotencyRetention()); |
| 100 | + verifyFieldNull("journal retention", service.getJournalRetention()); |
| 101 | + verifyFieldNull("inactivity timeout", service.getInactivityTimeout()); |
| 102 | + verifyFieldNull("abort timeout", service.getAbortTimeout()); |
| 103 | + verifyFieldNull("enable lazy state", service.getEnableLazyState()); |
| 104 | + verifyFieldNull("ingress private", service.getIngressPrivate()); |
| 105 | + } |
| 106 | + for (var handler : service.getHandlers()) { |
| 107 | + if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V2.getNumber()) { |
| 108 | + verifyFieldNotSet( |
| 109 | + "metadata", |
| 110 | + handler, |
| 111 | + h -> h.getMetadata() != null && !h.getMetadata().getAdditionalProperties().isEmpty()); |
| 112 | + } |
| 113 | + if (version.getNumber() < Discovery.ServiceDiscoveryProtocolVersion.V3.getNumber()) { |
| 114 | + verifyFieldNull("idempotency retention", handler.getIdempotencyRetention()); |
| 115 | + verifyFieldNull("journal retention", handler.getJournalRetention()); |
| 116 | + verifyFieldNull("inactivity timeout", handler.getInactivityTimeout()); |
| 117 | + verifyFieldNull("abort timeout", handler.getAbortTimeout()); |
| 118 | + verifyFieldNull("enable lazy state", handler.getEnableLazyState()); |
| 119 | + verifyFieldNull("ingress private", handler.getIngressPrivate()); |
| 120 | + } |
| 121 | + } |
| 122 | + } |
| 123 | + |
87 | 124 | return this.manifest; |
88 | 125 | } |
89 | 126 |
|
@@ -187,4 +224,19 @@ private static Handler.Ty convertHandlerType(HandlerType handlerType) { |
187 | 224 | case SHARED -> Handler.Ty.SHARED; |
188 | 225 | }; |
189 | 226 | } |
| 227 | + |
| 228 | + private static <T> void verifyFieldNotSet( |
| 229 | + String featureName, T value, Predicate<T> isSetPredicate) { |
| 230 | + if (isSetPredicate.test(value)) { |
| 231 | + throw new ProtocolException( |
| 232 | + "The code uses the new discovery feature '" |
| 233 | + + featureName |
| 234 | + + "' but the runtime doesn't support it yet. Either remove the usage of this feature, or upgrade the runtime.", |
| 235 | + 500); |
| 236 | + } |
| 237 | + } |
| 238 | + |
| 239 | + private static <T> void verifyFieldNull(String featureName, T value) { |
| 240 | + verifyFieldNotSet(featureName, value, Objects::nonNull); |
| 241 | + } |
190 | 242 | } |
0 commit comments