Skip to content

Commit a7019c6

Browse files
authored
Remove workaround for handling Syslog counting framing (#40989)
Closes #40683 Signed-off-by: Martin Bartoš <[email protected]>
1 parent 6c7be65 commit a7019c6

File tree

6 files changed

+47
-46
lines changed

6 files changed

+47
-46
lines changed

quarkus/config-api/src/main/java/org/keycloak/config/LoggingOptions.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.keycloak.config;
22

3+
import io.quarkus.runtime.logging.LogRuntimeConfig;
34
import org.jboss.logmanager.handlers.SyslogHandler;
45

56
import java.io.File;
@@ -296,14 +297,12 @@ public String toString() {
296297
.description("Set the Syslog output to JSON or default (plain) unstructured logging.")
297298
.build();
298299

299-
// we can use SyslogConfig.CountingFraming type once https://github.com/quarkusio/quarkus/pull/48479 is present
300-
public static final String SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT = "protocol-dependent";
301-
public static final Option<String> LOG_SYSLOG_COUNTING_FRAMING = new OptionBuilder<>("log-syslog-counting-framing", String.class)
300+
public static final Option<LogRuntimeConfig.SyslogConfig.CountingFraming> LOG_SYSLOG_COUNTING_FRAMING = new OptionBuilder<>("log-syslog-counting-framing", LogRuntimeConfig.SyslogConfig.CountingFraming.class)
302301
.category(OptionCategory.LOGGING)
303-
.expectedValues(Boolean.TRUE.toString(), Boolean.FALSE.toString(), SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT)
304-
.defaultValue(SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT)
302+
.transformEnumValues(true)
303+
.defaultValue(LogRuntimeConfig.SyslogConfig.CountingFraming.PROTOCOL_DEPENDENT)
305304
.description("If 'true', the message being sent is prefixed with the size of the message. If '%s', the default value is 'true' when '%s' is 'tcp' or 'ssl-tcp', otherwise 'false'."
306-
.formatted(SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT, LOG_SYSLOG_PROTOCOL.getKey()))
305+
.formatted(Option.transformEnumValue(LogRuntimeConfig.SyslogConfig.CountingFraming.PROTOCOL_DEPENDENT.name()), LOG_SYSLOG_PROTOCOL.getKey()))
307306
.build();
308307

309308
// Syslog async

quarkus/config-api/src/main/java/org/keycloak/config/Option.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.keycloak.config;
22

3+
import com.google.common.base.CaseFormat;
4+
35
import java.util.List;
46
import java.util.Optional;
57
import java.util.stream.Collectors;
@@ -128,4 +130,12 @@ public static String getDefaultValueString(Object value) {
128130
}
129131
return String.valueOf(value);
130132
}
133+
134+
/**
135+
* Transform enum values from upper underscore to lower hyphen
136+
* Transform enum type HAS_SOMETHING -> has-something
137+
*/
138+
public static String transformEnumValue(String value) {
139+
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, value);
140+
}
131141
}

quarkus/config-api/src/main/java/org/keycloak/config/OptionBuilder.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class OptionBuilder<T> {
2323
private String description;
2424
private Optional<T> defaultValue;
2525
private List<String> expectedValues;
26+
private boolean transformEnumValues;
2627
// Denotes whether a custom value can be provided among the expected values
2728
private boolean strictExpectedValues;
2829
private boolean caseInsensitiveExpectedValues;
@@ -100,6 +101,14 @@ public OptionBuilder<T> expectedValues(T ... expected) {
100101
return expectedValues(Stream.of(expected).map(Object::toString).collect(Collectors.toList()));
101102
}
102103

104+
/**
105+
* For more details, see the {@link Option#transformEnumValue(String)}
106+
*/
107+
public OptionBuilder<T> transformEnumValues(boolean transform) {
108+
this.transformEnumValues = transform;
109+
return this;
110+
}
111+
103112
public OptionBuilder<T> strictExpectedValues(boolean strictExpectedValues) {
104113
this.strictExpectedValues = strictExpectedValues;
105114
return this;
@@ -135,10 +144,12 @@ public Option<T> build() {
135144
expected = auxiliaryType;
136145
}
137146

147+
boolean isEnumType = Enum.class.isAssignableFrom(expected);
148+
138149
if (expectedValues == null) {
139150
if (Boolean.class.equals(expected)) {
140151
expectedValues(BOOLEAN_TYPE_VALUES);
141-
} else if (Enum.class.isAssignableFrom(expected)) {
152+
} else if (isEnumType) {
142153
expectedValues((Class<? extends Enum>) expected);
143154
} else {
144155
expectedValues = List.of();
@@ -149,6 +160,15 @@ public Option<T> build() {
149160
defaultValue = Optional.of((T) Boolean.FALSE);
150161
}
151162

163+
if (transformEnumValues) {
164+
if (isEnumType) {
165+
expectedValues(expectedValues.stream().map(Option::transformEnumValue).toList());
166+
defaultValue.ifPresent(t -> defaultValue(Optional.of((T) Option.transformEnumValue(t.toString()))));
167+
} else {
168+
throw new IllegalArgumentException("You can use 'transformEnumValues' only for Enum types");
169+
}
170+
}
171+
152172
return new Option<T>(type, key, category, hidden, build, description, defaultValue, expectedValues, strictExpectedValues, caseInsensitiveExpectedValues, deprecatedMetadata);
153173
}
154174

quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/LoggingPropertyMappers.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import static org.keycloak.config.LoggingOptions.LOG_CONSOLE_ENABLED;
55
import static org.keycloak.config.LoggingOptions.LOG_FILE_ENABLED;
66
import static org.keycloak.config.LoggingOptions.LOG_SYSLOG_ENABLED;
7-
import static org.keycloak.config.LoggingOptions.SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT;
87
import static org.keycloak.quarkus.runtime.configuration.Configuration.isSet;
98
import static org.keycloak.quarkus.runtime.configuration.Configuration.isTrue;
109
import static org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper.fromOption;
@@ -236,7 +235,6 @@ public static PropertyMapper<?>[] getMappers() {
236235
.build(),
237236
fromOption(LoggingOptions.LOG_SYSLOG_COUNTING_FRAMING)
238237
.isEnabled(LoggingPropertyMappers::isSyslogEnabled, SYSLOG_ENABLED_MSG)
239-
.transformer(LoggingPropertyMappers::resolveSyslogCountingFraming)
240238
.to("quarkus.log.syslog.use-counting-framing")
241239
.paramLabel("strategy")
242240
.build(),
@@ -440,20 +438,4 @@ private static void validateSyslogMaxLength(String value) {
440438
throw new PropertyException(String.format("Invalid value for option '--log-syslog-max-length': %s", e.getMessage()));
441439
}
442440
}
443-
444-
// Workaround BEGIN - for https://github.com/keycloak/keycloak/issues/39893
445-
// Remove once the https://github.com/quarkusio/quarkus/issues/48036 is included in Keycloak as Quarkus might handle it on its own
446-
private static String resolveSyslogCountingFraming(String value, ConfigSourceInterceptorContext context) {
447-
if (SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT.equals(value)) {
448-
return Configuration.getOptionalKcValue(LoggingOptions.LOG_SYSLOG_PROTOCOL)
449-
.map(protocol -> switch (protocol) {
450-
case "tcp", "ssl-tcp" -> Boolean.TRUE.toString();
451-
case "udp" -> Boolean.FALSE.toString();
452-
default -> throw new PropertyException("Invalid Syslog protocol: " + protocol);
453-
})
454-
.orElse(Boolean.FALSE.toString());
455-
}
456-
return value;
457-
}
458-
// Workaround END
459441
}

quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/cli/PicocliTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ public void syslogCountingFraming() {
549549
onAfter();
550550
nonRunningPicocli = pseudoLaunch("start-dev", "--log=syslog", "--log-syslog-protocol=ssl-tcp", "--log-syslog-counting-framing=protocol-dependent");
551551
assertThat(nonRunningPicocli.exitCode, is(CommandLine.ExitCode.OK));
552-
assertThat(nonRunningPicocli.config.getConfigValue("quarkus.log.syslog.use-counting-framing").getValue(), is("true"));
552+
assertThat(nonRunningPicocli.config.getConfigValue("quarkus.log.syslog.use-counting-framing").getValue(), is("protocol-dependent"));
553553

554554
onAfter();
555555
nonRunningPicocli = pseudoLaunch("start-dev", "--log=syslog", "--log-syslog-counting-framing=wrong");

quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/LoggingConfigurationTest.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,20 @@
1717

1818
package org.keycloak.quarkus.runtime.configuration;
1919

20-
import static org.hamcrest.CoreMatchers.containsString;
2120
import static org.hamcrest.MatcherAssert.assertThat;
2221
import static org.junit.Assert.assertEquals;
2322
import static org.junit.Assert.assertFalse;
2423
import static org.junit.Assert.assertNull;
2524
import static org.junit.Assert.assertTrue;
26-
import static org.junit.Assert.fail;
2725
import static org.keycloak.config.LoggingOptions.DEFAULT_LOG_FORMAT;
2826
import static org.keycloak.config.LoggingOptions.DEFAULT_SYSLOG_OUTPUT;
29-
import static org.keycloak.config.LoggingOptions.SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT;
3027

3128
import java.util.Map;
3229
import java.util.Set;
3330
import java.util.stream.Collectors;
3431
import java.util.stream.StreamSupport;
3532

33+
import io.quarkus.runtime.logging.LogRuntimeConfig;
3634
import org.hamcrest.CoreMatchers;
3735
import org.junit.Test;
3836
import org.keycloak.config.LoggingOptions;
@@ -87,7 +85,7 @@ public void syslogDefaults() {
8785
"log-syslog-protocol", "tcp",
8886
"log-syslog-format", DEFAULT_LOG_FORMAT,
8987
"log-syslog-output", DEFAULT_SYSLOG_OUTPUT.toString(),
90-
"log-syslog-counting-framing", SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT
88+
"log-syslog-counting-framing", "protocol-dependent"
9189
));
9290
assertThat(Configuration.getOptionalKcValue(LoggingOptions.LOG_SYSLOG_MAX_LENGTH).orElse(null), CoreMatchers.nullValue());
9391

@@ -97,7 +95,7 @@ public void syslogDefaults() {
9795
"quarkus.log.syslog.syslog-type", "rfc5424",
9896
"quarkus.log.syslog.app-name", "keycloak",
9997
"quarkus.log.syslog.protocol", "tcp",
100-
"quarkus.log.syslog.use-counting-framing", "true",
98+
"quarkus.log.syslog.use-counting-framing", "protocol-dependent",
10199
"quarkus.log.syslog.format", DEFAULT_LOG_FORMAT,
102100
"quarkus.log.syslog.json.enabled", "false"
103101
));
@@ -175,34 +173,26 @@ public void syslogMaxLength() {
175173

176174
@Test
177175
public void syslogCountingFraming() {
178-
assertSyslogCountingFramingProtocolDependent("tcp", true);
179-
assertSyslogCountingFramingProtocolDependent("udp", false);
180-
assertSyslogCountingFramingProtocolDependent("ssl-tcp", true);
181-
try {
182-
assertSyslogCountingFramingProtocolDependent("error", false);
183-
fail("Wrong protocol name should throw an error");
184-
} catch (PropertyException expected) {
185-
assertThat(expected.getMessage(), containsString("Invalid Syslog protocol: error"));
186-
}
176+
assertSyslogCountingFraming(LogRuntimeConfig.SyslogConfig.CountingFraming.TRUE);
177+
assertSyslogCountingFraming(LogRuntimeConfig.SyslogConfig.CountingFraming.FALSE);
178+
assertSyslogCountingFraming(LogRuntimeConfig.SyslogConfig.CountingFraming.PROTOCOL_DEPENDENT);
187179
}
188180

189-
protected void assertSyslogCountingFramingProtocolDependent(String protocol, boolean expectedCountingFraming) {
181+
protected void assertSyslogCountingFraming(LogRuntimeConfig.SyslogConfig.CountingFraming countingFraming) {
190182
putEnvVars(Map.of(
191183
"KC_LOG", "syslog",
192-
"KC_LOG_SYSLOG_PROTOCOL", protocol
184+
"KC_LOG_SYSLOG_COUNTING_FRAMING", countingFraming.toString()
193185
));
194186

195187
initConfig();
196188

197189
assertConfig(Map.of(
198190
"log-syslog-enabled", "true",
199-
"log-syslog-protocol", protocol,
200-
"log-syslog-counting-framing", SYSLOG_COUNTING_FRAMING_PROTOCOL_DEPENDENT
191+
"log-syslog-counting-framing", countingFraming.toString()
201192
));
202193
assertExternalConfig(Map.of(
203194
"quarkus.log.syslog.enable", "true",
204-
"quarkus.log.syslog.protocol", protocol,
205-
"quarkus.log.syslog.use-counting-framing", Boolean.toString(expectedCountingFraming)
195+
"quarkus.log.syslog.use-counting-framing", countingFraming.toString()
206196
));
207197
onAfter();
208198
}

0 commit comments

Comments
 (0)