Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.orbitalhq.cockpit.core.connectors.redis

import com.orbitalhq.connectors.config.SourceLoaderConnectorsRegistry
import com.orbitalhq.connectors.redis.RedisConnectionsManager
import com.orbitalhq.connectors.redis.RedisOperationCacheBuilder
import com.orbitalhq.connectors.redis.RedisStateStoreProvider
import com.orbitalhq.connectors.redis.invoker.RedisInvoker
import com.orbitalhq.schema.consumer.SchemaStore
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class RedisConnectorConfig {

@Bean
fun redisConnectionsManager(connectors: SourceLoaderConnectorsRegistry): RedisConnectionsManager {
return RedisConnectionsManager(connectors)
}

@Bean
fun redisOperationCacheBuilder(
redisConnectionsManager: RedisConnectionsManager,
schemaStore: SchemaStore
): RedisOperationCacheBuilder {
return RedisOperationCacheBuilder(redisConnectionsManager, schemaStore)
}

@Bean
fun redisStateStoreProvider(redisConnectionsManager: RedisConnectionsManager): RedisStateStoreProvider {
return RedisStateStoreProvider(redisConnectionsManager)
}

@Bean
fun redisInvoker(connectionsManager: RedisConnectionsManager): RedisInvoker {
return RedisInvoker(connectionsManager)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.orbitalhq.connectors.config.hazelcast.HazelcastConfiguration
import com.orbitalhq.connectors.config.jdbc.DefaultJdbcConnectionConfiguration
import com.orbitalhq.connectors.config.kafka.KafkaConnectionConfiguration
import com.orbitalhq.connectors.config.mongodb.MongoConnectionConfiguration
import com.orbitalhq.connectors.config.redis.RedisConfiguration
import com.orbitalhq.connectors.registry.ConnectorConfiguration
import kotlinx.serialization.Serializable

Expand All @@ -28,9 +29,10 @@ data class ConnectionsConfig(
val hazelcast: Map<String,HazelcastConfiguration> = emptyMap(),
val mongo: Map<String, MongoConnectionConfiguration> = emptyMap(),
val serviceBus: Map<String, ServiceBusConnectionConfiguration> = emptyMap(),
val redis: Map<String, RedisConfiguration> = emptyMap(),
) {
fun listAll(): List<ConnectorConfiguration> {
return jdbc.values + kafka.values + aws.values + hazelcast.values + mongo.values + serviceBus.values
return jdbc.values + kafka.values + aws.values + hazelcast.values + mongo.values + serviceBus.values + redis.values
}

val jdbcConnectionsHash = jdbc.hashCode()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.orbitalhq.config.MergingHoconConfigRepository
import com.orbitalhq.config.SimpleConfigSourceWriterProvider
import com.orbitalhq.connectors.VyneConnectionsConfig
import com.orbitalhq.connectors.config.hazelcast.HazelcastConfiguration
import com.orbitalhq.connectors.config.redis.RedisConfiguration
import com.typesafe.config.Config
import com.typesafe.config.ConfigFactory
import io.github.config4k.extract
Expand Down Expand Up @@ -86,6 +87,19 @@ class SourceLoaderConnectorsRegistry(
fun hazelcastConfigurationForConnectionName(connectionName: String): HazelcastConfiguration? {
return load().hazelcast[connectionName]
}

fun defaultRedisConfiguration(): RedisConfiguration? {
val redisConnectors = load().redis
val defaultConnections = redisConnectors.values.filter { it.default }
if (defaultConnections.size > 1) {
throw IllegalArgumentException("Only one Redis connection can be defined as default - ${defaultConnections.joinToString { defaultConn -> defaultConn.connectionName }} marked as default!")
}
return defaultConnections.firstOrNull()
}

fun redisConfigurationForConnectionName(connectionName: String): RedisConfiguration? {
return load().redis[connectionName]
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.orbitalhq.connectors.config.redis

import com.google.common.base.Objects
import com.orbitalhq.connectors.ConnectionParameterName
import com.orbitalhq.connectors.config.redis.RedisConnection.REDIS_DATABASE
import com.orbitalhq.connectors.config.redis.RedisConnection.REDIS_PASSWORD
import com.orbitalhq.connectors.config.redis.RedisConnection.REDIS_SSL_ENABLED
import com.orbitalhq.connectors.config.redis.RedisConnection.REDIS_USERNAME
import com.orbitalhq.connectors.registry.ConnectorConfiguration
import com.orbitalhq.connectors.registry.ConnectorCategory
import com.orbitalhq.utils.obfuscateKeys
import kotlinx.serialization.Serializable

@Serializable
data class RedisConfiguration(
override val connectionName: String,
val addresses: List<String> = listOf("localhost:6379"),
val operationCacheTtlSeconds: Int = 120,
val connectionTimeoutSeconds: Int = 10,
val commandTimeoutSeconds: Int = 30,
val connectionParameters: Map<ConnectionParameterName, String> = emptyMap(),
override val default: Boolean = false
) : ConnectorConfiguration {

override val driverName: String = RedisConnection.DRIVER_NAME
override val type: ConnectorCategory = ConnectorCategory.CACHE

override fun hashCode(): Int {
return Objects.hashCode(addresses)
}

override fun equals(other: Any?): Boolean {
if (other == null) return false
if (this.javaClass != other.javaClass) return false
val otherConfig = other as RedisConfiguration
return Objects.equal(this.addresses, otherConfig.addresses)
}

override fun getUiDisplayProperties(): Map<String, Any> {
val baseProperties = mutableMapOf<String, Any>(
"addresses" to addresses.joinToString(",")
)

// Add database if specified
database()?.let { baseProperties["database"] = it }

// Add username if specified (but obfuscate password)
if (hasAuthentication()) {
username()?.let { baseProperties[REDIS_USERNAME] = it }
baseProperties.putAll(connectionParameters.obfuscateKeys(REDIS_PASSWORD))
}

// Add SSL status
if (isSslEnabled()) {
baseProperties[REDIS_SSL_ENABLED] = "true"
}

return baseProperties
}

fun hasAuthentication(): Boolean {
return connectionParameters.containsKey(REDIS_PASSWORD) ||
(connectionParameters.containsKey(REDIS_USERNAME) && connectionParameters.containsKey(REDIS_PASSWORD))
}

fun hasUsernamePasswordAuthentication(): Boolean {
return connectionParameters.containsKey(REDIS_USERNAME) && connectionParameters.containsKey(REDIS_PASSWORD)
}

fun isSslEnabled(): Boolean {
return connectionParameters[REDIS_SSL_ENABLED]?.toBoolean() == true
}

fun username(): String? = connectionParameters[REDIS_USERNAME]

fun password(): String? = connectionParameters[REDIS_PASSWORD]

fun database(): Int? = connectionParameters[REDIS_DATABASE]?.toIntOrNull()
}

object RedisConnection {
const val DRIVER_NAME = "redis"
const val REDIS_USERNAME = "username"
const val REDIS_PASSWORD = "password"
const val REDIS_DATABASE = "database"
const val REDIS_SSL_ENABLED = "sslEnabled"
}
1 change: 1 addition & 0 deletions connectors/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<module>connectors-calcite</module>
<module>soap-connector</module>
<module>hazelcast-connector</module>
<module>redis-connector</module>
<module>nosql-connectors</module>
</modules>

Expand Down
6 changes: 6 additions & 0 deletions connectors/redis-connector/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
target/
.idea/
*.iml
.classpath
.project
.settings/
126 changes: 126 additions & 0 deletions connectors/redis-connector/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.orbitalhq</groupId>
<artifactId>connectors</artifactId>
<version>0.37.0-SNAPSHOT</version>
</parent>

<artifactId>redis-connector</artifactId>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lettuce.version>6.3.1.RELEASE</lettuce.version>
</properties>

<dependencies>
<!-- Lettuce Redis client (reactive) -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>${lettuce.version}</version>
</dependency>

<!-- Orbital dependencies -->
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>schema-consumer-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>connectors-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>vyne-core-types</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>taxiql-query-engine</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<artifactId>log4j-to-slf4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>

<!-- Reactive support -->
<dependency>
<groupId>io.projectreactor.kotlin</groupId>
<artifactId>reactor-kotlin-extensions</artifactId>
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-kotlin</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.kotest</groupId>
<artifactId>kotest-runner-junit5-jvm</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.kotest</groupId>
<artifactId>kotest-assertions-core-jvm</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>app.cash.turbine</groupId>
<artifactId>turbine-jvm</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>taxiql-query-engine</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>log4j-to-slf4j</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.orbitalhq</groupId>
<artifactId>vyne-core-types</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>

<!-- Testcontainers for Redis integration tests -->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>

<!-- Logging for tests -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Loading