Skip to content

Commit dd7cefe

Browse files
committed
yaml config provider
Signed-off-by: Attila Mészáros <a_meszaros@apple.com>
1 parent 7a49788 commit dd7cefe

File tree

5 files changed

+99
-10
lines changed

5 files changed

+99
-10
lines changed

operator-framework/src/main/java/io/javaoperatorsdk/operator/config/loader/ConfigLoader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import io.fabric8.kubernetes.api.model.HasMetadata;
2727
import io.javaoperatorsdk.operator.api.config.ConfigurationServiceOverrider;
2828
import io.javaoperatorsdk.operator.api.config.ControllerConfigurationOverrider;
29+
import io.javaoperatorsdk.operator.config.loader.provider.AgregatePrirityListConfigProvider;
2930
import io.javaoperatorsdk.operator.config.loader.provider.EnvVarConfigProvider;
30-
import io.javaoperatorsdk.operator.config.loader.provider.PrirityListConfigProvider;
3131
import io.javaoperatorsdk.operator.config.loader.provider.SystemPropertyConfigProvider;
3232
import io.javaoperatorsdk.operator.processing.retry.GenericRetry;
3333

@@ -143,7 +143,7 @@ public static ConfigLoader getDefault() {
143143

144144
public ConfigLoader() {
145145
this(
146-
new PrirityListConfigProvider(
146+
new AgregatePrirityListConfigProvider(
147147
List.of(new EnvVarConfigProvider(), new SystemPropertyConfigProvider())),
148148
DEFAULT_CONTROLLER_KEY_PREFIX,
149149
DEFAULT_OPERATOR_KEY_PREFIX);

operator-framework/src/main/java/io/javaoperatorsdk/operator/config/loader/provider/PrirityListConfigProvider.java renamed to operator-framework/src/main/java/io/javaoperatorsdk/operator/config/loader/provider/AgregatePrirityListConfigProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
* A {@link ConfigProvider} that delegates to an ordered list of providers. Providers are queried in
2525
* list order; the first non-empty result wins.
2626
*/
27-
public class PrirityListConfigProvider implements ConfigProvider {
27+
public class AgregatePrirityListConfigProvider implements ConfigProvider {
2828

2929
private final List<ConfigProvider> providers;
3030

31-
public PrirityListConfigProvider(List<ConfigProvider> providers) {
31+
public AgregatePrirityListConfigProvider(List<ConfigProvider> providers) {
3232
this.providers = List.copyOf(providers);
3333
}
3434

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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.config.loader.provider;
17+
18+
import java.io.IOException;
19+
import java.io.InputStream;
20+
import java.io.UncheckedIOException;
21+
import java.nio.file.Files;
22+
import java.nio.file.Path;
23+
import java.util.Map;
24+
import java.util.Optional;
25+
26+
import io.javaoperatorsdk.operator.config.loader.ConfigProvider;
27+
28+
import com.fasterxml.jackson.databind.ObjectMapper;
29+
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
30+
31+
/**
32+
* A {@link ConfigProvider} that resolves configuration values from a YAML file.
33+
*
34+
* <p>Keys use dot-separated notation to address nested YAML mappings (e.g. {@code
35+
* josdk.cache-sync.timeout} maps to {@code josdk → cache-sync → timeout} in the YAML document).
36+
* Leaf values are converted to the requested type via {@link ConfigValueConverter}. Supported value
37+
* types are: {@link String}, {@link Boolean}, {@link Integer}, {@link Long}, {@link Double}, and
38+
* {@link java.time.Duration} (ISO-8601 format, e.g. {@code PT30S}).
39+
*/
40+
public class YamlConfigProvider implements ConfigProvider {
41+
42+
private static final ObjectMapper MAPPER = new ObjectMapper(new YAMLFactory());
43+
44+
private final Map<String, Object> data;
45+
46+
/**
47+
* Loads YAML from the given file path.
48+
*
49+
* @throws UncheckedIOException if the file cannot be read
50+
*/
51+
public YamlConfigProvider(Path path) {
52+
this.data = load(path);
53+
}
54+
55+
/** Uses the supplied map directly (useful for testing). */
56+
public YamlConfigProvider(Map<String, Object> data) {
57+
this.data = data;
58+
}
59+
60+
@Override
61+
@SuppressWarnings("unchecked")
62+
public <T> Optional<T> getValue(String key, Class<T> type) {
63+
if (key == null) {
64+
return Optional.empty();
65+
}
66+
String[] parts = key.split("\\.", -1);
67+
Object current = data;
68+
for (String part : parts) {
69+
if (!(current instanceof Map)) {
70+
return Optional.empty();
71+
}
72+
current = ((Map<String, Object>) current).get(part);
73+
if (current == null) {
74+
return Optional.empty();
75+
}
76+
}
77+
return Optional.of(ConfigValueConverter.convert(current.toString(), type));
78+
}
79+
80+
@SuppressWarnings("unchecked")
81+
private static Map<String, Object> load(Path path) {
82+
try (InputStream in = Files.newInputStream(path)) {
83+
Map<String, Object> result = MAPPER.readValue(in, Map.class);
84+
return result != null ? result : Map.of();
85+
} catch (IOException e) {
86+
throw new UncheckedIOException("Failed to load config YAML from " + path, e);
87+
}
88+
}
89+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/config/loader/ConfigLoaderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ void controllerKeyPrefixIsJosdkControllerDot() {
216216
// -- binding coverage -------------------------------------------------------
217217

218218
/**
219-
* Supported scalar types that PrirityListConfigProvider can parse from a string. Every binding's
220-
* type must be one of these.
219+
* Supported scalar types that AgregatePrirityListConfigProvider can parse from a string. Every
220+
* binding's type must be one of these.
221221
*/
222222
private static final Set<Class<?>> SUPPORTED_TYPES =
223223
Set.of(

operator-framework/src/test/java/io/javaoperatorsdk/operator/config/loader/provider/PriorityListConfigProviderTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PriorityListConfigProviderTest {
2626
@Test
2727
void returnsEmptyWhenAllProvidersReturnEmpty() {
2828
var provider =
29-
new PrirityListConfigProvider(
29+
new AgregatePrirityListConfigProvider(
3030
List.of(
3131
new EnvVarConfigProvider(k -> null), new SystemPropertyConfigProvider(k -> null)));
3232
assertThat(provider.getValue("josdk.no.such.key", String.class)).isEmpty();
@@ -35,7 +35,7 @@ void returnsEmptyWhenAllProvidersReturnEmpty() {
3535
@Test
3636
void firstProviderWins() {
3737
var provider =
38-
new PrirityListConfigProvider(
38+
new AgregatePrirityListConfigProvider(
3939
List.of(
4040
new EnvVarConfigProvider(k -> k.equals("JOSDK_TEST_KEY") ? "first" : null),
4141
new SystemPropertyConfigProvider(
@@ -46,7 +46,7 @@ void firstProviderWins() {
4646
@Test
4747
void fallsBackToLaterProviderWhenEarlierReturnsEmpty() {
4848
var provider =
49-
new PrirityListConfigProvider(
49+
new AgregatePrirityListConfigProvider(
5050
List.of(
5151
new EnvVarConfigProvider(k -> null),
5252
new SystemPropertyConfigProvider(
@@ -61,7 +61,7 @@ void respectsOrderWithThreeProviders() {
6161
new SystemPropertyConfigProvider(k -> k.equals("josdk.test.key") ? "from-second" : null);
6262
var third = new EnvVarConfigProvider(k -> k.equals("JOSDK_TEST_KEY") ? "from-third" : null);
6363

64-
var provider = new PrirityListConfigProvider(List.of(first, second, third));
64+
var provider = new AgregatePrirityListConfigProvider(List.of(first, second, third));
6565
assertThat(provider.getValue("josdk.test.key", String.class)).hasValue("from-second");
6666
}
6767
}

0 commit comments

Comments
 (0)