Skip to content

Commit 0af8adb

Browse files
authored
feat: Allowing password based authentication and SSL for Redis in Java feature server
* Enabling password authentication and SSL in Redis clusters for the Java feature server Signed-off-by: Danny Chiao <danny@tecton.ai> * lint Signed-off-by: Danny Chiao <danny@tecton.ai> * add test Signed-off-by: Danny Chiao <danny@tecton.ai> * Address comments Signed-off-by: Danny Chiao <danny@tecton.ai> * Address comments Signed-off-by: Danny Chiao <danny@tecton.ai> * lint Signed-off-by: Danny Chiao <danny@tecton.ai> * lint Signed-off-by: Danny Chiao <danny@tecton.ai>
1 parent 9221624 commit 0af8adb

File tree

7 files changed

+62
-6
lines changed

7 files changed

+62
-6
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,9 @@ sdk/go/protos/
191191

192192
#benchmarks
193193
.benchmarks
194+
195+
# Examples registry
196+
**/registry.db
197+
**/*.aof
198+
**/*.rdb
199+
**/nodes.conf

java/serving/src/main/java/feast/serving/config/ApplicationProperties.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,12 @@
3333
import javax.validation.*;
3434
import javax.validation.constraints.NotBlank;
3535
import javax.validation.constraints.NotNull;
36+
import org.slf4j.Logger;
3637

3738
/** Feast Serving properties. */
3839
public class ApplicationProperties {
40+
private static final Logger log = org.slf4j.LoggerFactory.getLogger(ApplicationProperties.class);
41+
3942
public static class FeastProperties {
4043
/* Feast Serving build version */
4144
@NotBlank private String version = "unknown";
@@ -246,10 +249,33 @@ public void setType(String type) {
246249
* @return Returns the store specific configuration
247250
*/
248251
public RedisClusterStoreConfig getRedisClusterConfig() {
252+
String read_from;
253+
if (!this.config.containsKey("read_from") || this.config.get("read_from") == null) {
254+
log.info("'read_from' not defined in Redis cluster config, so setting to UPSTREAM");
255+
read_from = ReadFrom.UPSTREAM.toString();
256+
} else {
257+
read_from = this.config.get("read_from");
258+
}
259+
260+
if (!this.config.containsKey("timeout") || this.config.get("timeout") == null) {
261+
throw new IllegalArgumentException(
262+
"Redis cluster config does not have 'timeout' specified");
263+
}
264+
265+
Boolean ssl = null;
266+
if (!this.config.containsKey("ssl") || this.config.get("ssl") == null) {
267+
log.info("'ssl' not defined in Redis cluster config, so setting to false");
268+
ssl = false;
269+
} else {
270+
ssl = Boolean.parseBoolean(this.config.get("ssl"));
271+
}
272+
Duration timeout = Duration.parse(this.config.get("timeout"));
249273
return new RedisClusterStoreConfig(
250274
this.config.get("connection_string"),
251-
ReadFrom.valueOf(this.config.get("read_from")),
252-
Duration.parse(this.config.get("timeout")));
275+
ReadFrom.valueOf(read_from),
276+
timeout,
277+
ssl,
278+
this.config.getOrDefault("password", ""));
253279
}
254280

255281
public RedisStoreConfig getRedisConfig() {

java/serving/src/test/java/feast/serving/it/TestUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public static ApplicationProperties.FeastProperties createBasicFeastProperties(
8383
new ApplicationProperties.Store(
8484
"online",
8585
"REDIS",
86-
ImmutableMap.of("host", redisHost, "port", redisPort.toString()))));
86+
ImmutableMap.of(
87+
"host", redisHost, "port", redisPort.toString(), "password", "testpw"))));
8788

8889
return feastProperties;
8990
}

java/serving/src/test/resources/docker-compose/docker-compose-redis-it.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ version: '3'
33
services:
44
redis:
55
image: redis:6.2
6+
command: redis-server --requirepass testpw
67
ports:
78
- "6379:6379"
89
feast:

java/serving/src/test/resources/docker-compose/feast10/feature_store.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ registry: registry.db
33
provider: local
44
online_store:
55
type: redis
6-
connection_string: "redis:6379"
6+
connection_string: "redis:6379,password=testpw"
77
offline_store: {}
88
flags:
99
alpha_features: true

java/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisClusterClient.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,16 @@ public static RedisClientAdapter create(RedisClusterStoreConfig config) {
7171
.map(
7272
hostPort -> {
7373
String[] hostPortSplit = hostPort.trim().split(":");
74-
return RedisURI.create(hostPortSplit[0], Integer.parseInt(hostPortSplit[1]));
74+
RedisURI redisURI =
75+
RedisURI.create(hostPortSplit[0], Integer.parseInt(hostPortSplit[1]));
76+
if (!config.getPassword().isEmpty()) {
77+
redisURI.setPassword(config.getPassword());
78+
}
79+
if (config.getSsl()) {
80+
redisURI.setSsl(true);
81+
}
82+
redisURI.setTimeout(config.getTimeout());
83+
return redisURI;
7584
})
7685
.collect(Collectors.toList());
7786

java/storage/connectors/redis/src/main/java/feast/storage/connectors/redis/retriever/RedisClusterStoreConfig.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,16 @@ public class RedisClusterStoreConfig {
2323
private final String connectionString;
2424
private final ReadFrom readFrom;
2525
private final Duration timeout;
26+
private final Boolean ssl;
27+
private final String password;
2628

27-
public RedisClusterStoreConfig(String connectionString, ReadFrom readFrom, Duration timeout) {
29+
public RedisClusterStoreConfig(
30+
String connectionString, ReadFrom readFrom, Duration timeout, Boolean ssl, String password) {
2831
this.connectionString = connectionString;
2932
this.readFrom = readFrom;
3033
this.timeout = timeout;
34+
this.ssl = ssl;
35+
this.password = password;
3136
}
3237

3338
public String getConnectionString() {
@@ -41,4 +46,12 @@ public ReadFrom getReadFrom() {
4146
public Duration getTimeout() {
4247
return this.timeout;
4348
}
49+
50+
public Boolean getSsl() {
51+
return ssl;
52+
}
53+
54+
public String getPassword() {
55+
return password;
56+
}
4457
}

0 commit comments

Comments
 (0)